1
- mod blogs;
2
- mod posts;
1
+ use std:: convert:: AsRef ;
2
+ use std:: error:: Error ;
3
+ use std:: fs:: { self , File } ;
4
+ use std:: io:: Write ;
5
+ use std:: path:: { Path , PathBuf } ;
3
6
4
- use crate :: blogs:: Blog ;
5
- use crate :: posts:: Post ;
6
7
use chrono:: Timelike ;
7
8
use handlebars:: { handlebars_helper, Handlebars } ;
8
9
use sass_rs:: { compile_file, Options } ;
9
10
use serde_derive:: Serialize ;
10
11
use serde_json:: json;
11
- use std:: convert:: AsRef ;
12
- use std:: error:: Error ;
13
- use std:: fs:: { self , File } ;
14
- use std:: io:: Write ;
15
- use std:: path:: { Path , PathBuf } ;
12
+
13
+ use crate :: blogs:: Blog ;
14
+ use crate :: posts:: Post ;
15
+
16
+ mod blogs;
17
+ mod posts;
16
18
17
19
struct Generator < ' a > {
18
20
handlebars : Handlebars < ' a > ,
@@ -30,7 +32,33 @@ struct Releases {
30
32
struct ReleasePost {
31
33
title : String ,
32
34
url : String ,
35
+ version : String ,
36
+ }
37
+
38
+ impl ReleasePost {
39
+ fn new ( title : String , url : String ) -> ReleasePost {
40
+ let version = ReleasePost :: parse_version_from_url ( & url) . unwrap ( ) ;
41
+ ReleasePost {
42
+ url,
43
+ title,
44
+ version,
45
+ }
46
+ }
47
+
48
+ fn parse_version_from_url ( url : & str ) -> Option < String > {
49
+ // Normalize special cases, such as /2020/05/07/Rust.1.43.1.html
50
+ let url = url. to_lowercase ( ) . replacen ( "rust." , "rust-" , 1 ) ;
51
+ let mut split = url. split ( '-' ) ;
52
+ split. nth ( 1 ) . map ( |v| {
53
+ let mut v = v. replace ( ".html" , "" ) ;
54
+ if v. matches ( '.' ) . count ( ) == 1 {
55
+ v. push_str ( ".0" ) ;
56
+ }
57
+ v
58
+ } )
59
+ }
33
60
}
61
+
34
62
handlebars_helper ! ( hb_month_name_helper: |month_num: u64 | match month_num {
35
63
1 => "Jan." ,
36
64
2 => "Feb." ,
@@ -175,13 +203,14 @@ impl<'a> Generator<'a> {
175
203
let is_released: Vec < & Post > = posts. iter ( ) . filter ( |post| post. release ) . collect ( ) ;
176
204
let releases: Vec < ReleasePost > = is_released
177
205
. iter ( )
178
- . map ( |post| ReleasePost {
179
- title : post. title . clone ( ) ,
180
- url : blog
181
- . prefix ( )
182
- . join ( post. url . clone ( ) )
183
- . to_string_lossy ( )
184
- . to_string ( ) ,
206
+ . map ( |post| {
207
+ ReleasePost :: new (
208
+ post. title . clone ( ) ,
209
+ blog. prefix ( )
210
+ . join ( post. url . clone ( ) )
211
+ . to_string_lossy ( )
212
+ . to_string ( ) ,
213
+ )
185
214
} )
186
215
. collect ( ) ;
187
216
let data = Releases {
0 commit comments