@@ -36,52 +36,51 @@ impl fmt::Display for Date {
36
36
}
37
37
}
38
38
39
- fn make_date_regex ( ) -> Vec < Regex > {
40
- Vec :: from ( [
41
- Regex :: new ( r"<!--\s+date-check:\s+(\D+)\s+(\d{4})\s+-->" ) . unwrap ( ) ,
42
- Regex :: new ( r"<!--\s+date-check\s+-->\s+(\D+)\s+(\d{4})\b" ) . unwrap ( ) ,
43
- ] )
39
+ fn make_date_regex ( ) -> Regex {
40
+ Regex :: new (
41
+ r"(?x)
42
+ (?:<!--\s+date-check:\s+(\D+)\s+(\d{4})\s+-->)|
43
+ (?:<!--\s+date-check\s+-->\s+(\D+)\s+(\d{4})\b)
44
+ " ,
45
+ )
46
+ . unwrap ( )
44
47
}
45
48
46
- fn collect_dates_from_file ( date_regexes : & [ Regex ] , text : & str ) -> Vec < ( usize , Date ) > {
47
- let mut output = Vec :: new ( ) ;
48
- for date_regex in date_regexes {
49
- let mut line = 1 ;
50
- let mut end_of_last_cap = 0 ;
51
- let results: Vec < _ > = date_regex
52
- . captures_iter ( text)
53
- . filter_map ( |cap| {
54
- if let ( Some ( year) , Some ( month) ) = ( cap. get ( 2 ) , cap. get ( 1 ) ) {
55
- let year = year. as_str ( ) . parse ( ) . expect ( "year" ) ;
56
- let month = Month :: from_str ( month. as_str ( ) )
57
- . expect ( "month" )
58
- . number_from_month ( ) ;
59
- Some ( ( cap. get ( 0 ) . expect ( "all" ) . range ( ) , Date { year, month } ) )
60
- } else {
61
- None
62
- }
63
- } )
64
- . map ( |( byte_range, date) | {
65
- line += text[ end_of_last_cap..byte_range. end ]
66
- . chars ( )
67
- . filter ( |c| * c == '\n' )
68
- . count ( ) ;
69
- end_of_last_cap = byte_range. end ;
70
- ( line, date)
71
- } )
72
- . collect ( ) ;
73
- output. extend ( results) ;
74
- }
75
- output. sort_by_key ( |a| a. 0 ) ;
76
- output
49
+ fn collect_dates_from_file ( date_regex : & Regex , text : & str ) -> Vec < ( usize , Date ) > {
50
+ let mut line = 1 ;
51
+ let mut end_of_last_cap = 0 ;
52
+ date_regex
53
+ . captures_iter ( text)
54
+ . filter_map ( |cap| {
55
+ if let ( Some ( month) , Some ( year) , None , None ) | ( None , None , Some ( month) , Some ( year) ) =
56
+ ( cap. get ( 1 ) , cap. get ( 2 ) , cap. get ( 3 ) , cap. get ( 4 ) )
57
+ {
58
+ let year = year. as_str ( ) . parse ( ) . expect ( "year" ) ;
59
+ let month = Month :: from_str ( month. as_str ( ) )
60
+ . expect ( "month" )
61
+ . number_from_month ( ) ;
62
+ Some ( ( cap. get ( 0 ) . expect ( "all" ) . range ( ) , Date { year, month } ) )
63
+ } else {
64
+ None
65
+ }
66
+ } )
67
+ . map ( |( byte_range, date) | {
68
+ line += text[ end_of_last_cap..byte_range. end ]
69
+ . chars ( )
70
+ . filter ( |c| * c == '\n' )
71
+ . count ( ) ;
72
+ end_of_last_cap = byte_range. end ;
73
+ ( line, date)
74
+ } )
75
+ . collect ( )
77
76
}
78
77
79
78
fn collect_dates ( paths : impl Iterator < Item = PathBuf > ) -> BTreeMap < PathBuf , Vec < ( usize , Date ) > > {
80
- let date_regexes = make_date_regex ( ) ;
79
+ let date_regex = make_date_regex ( ) ;
81
80
let mut data = BTreeMap :: new ( ) ;
82
81
for path in paths {
83
82
let text = fs:: read_to_string ( & path) . unwrap ( ) ;
84
- let dates = collect_dates_from_file ( & date_regexes , & text) ;
83
+ let dates = collect_dates_from_file ( & date_regex , & text) ;
85
84
if !dates. is_empty ( ) {
86
85
data. insert ( path, dates) ;
87
86
}
@@ -185,29 +184,29 @@ mod tests {
185
184
186
185
#[ test]
187
186
fn test_date_regex ( ) {
188
- let regexes = & make_date_regex ( ) ;
189
- assert ! ( regexes [ 0 ] . is_match( "<!-- date-check: jan 2021 -->" ) ) ;
190
- assert ! ( regexes [ 0 ] . is_match( "<!-- date-check: january 2021 -->" ) ) ;
191
- assert ! ( regexes [ 0 ] . is_match( "<!-- date-check: Jan 2021 -->" ) ) ;
192
- assert ! ( regexes [ 0 ] . is_match( "<!-- date-check: January 2021 -->" ) ) ;
193
- assert ! ( regexes [ 1 ] . is_match( "<!-- date-check --> jan 2021" ) ) ;
194
- assert ! ( regexes [ 1 ] . is_match( "<!-- date-check --> january 2021" ) ) ;
195
- assert ! ( regexes [ 1 ] . is_match( "<!-- date-check --> Jan 2021" ) ) ;
196
- assert ! ( regexes [ 1 ] . is_match( "<!-- date-check --> January 2021" ) ) ;
187
+ let regex = & make_date_regex ( ) ;
188
+ assert ! ( regex . is_match( "<!-- date-check: jan 2021 -->" ) ) ;
189
+ assert ! ( regex . is_match( "<!-- date-check: january 2021 -->" ) ) ;
190
+ assert ! ( regex . is_match( "<!-- date-check: Jan 2021 -->" ) ) ;
191
+ assert ! ( regex . is_match( "<!-- date-check: January 2021 -->" ) ) ;
192
+ assert ! ( regex . is_match( "<!-- date-check --> jan 2021" ) ) ;
193
+ assert ! ( regex . is_match( "<!-- date-check --> january 2021" ) ) ;
194
+ assert ! ( regex . is_match( "<!-- date-check --> Jan 2021" ) ) ;
195
+ assert ! ( regex . is_match( "<!-- date-check --> January 2021" ) ) ;
197
196
198
- assert ! ( regexes [ 1 ] . is_match( "<!-- date-check --> jan 2021 " ) ) ;
199
- assert ! ( regexes [ 1 ] . is_match( "<!-- date-check --> jan 2021." ) ) ;
197
+ assert ! ( regex . is_match( "<!-- date-check --> jan 2021 " ) ) ;
198
+ assert ! ( regex . is_match( "<!-- date-check --> jan 2021." ) ) ;
200
199
}
201
200
202
201
#[ test]
203
202
fn test_date_regex_fail ( ) {
204
203
let regexes = & make_date_regex ( ) ;
205
- assert ! ( !regexes[ 0 ] . is_match( "<!-- date-check: jan 221 -->" ) ) ;
206
- assert ! ( !regexes[ 0 ] . is_match( "<!-- date-check: jan 20221 -->" ) ) ;
207
- assert ! ( !regexes[ 0 ] . is_match( "<!-- date-check: 01 2021 -->" ) ) ;
208
- assert ! ( !regexes[ 1 ] . is_match( "<!-- date-check --> jan 221" ) ) ;
209
- assert ! ( !regexes[ 1 ] . is_match( "<!-- date-check --> jan 20222" ) ) ;
210
- assert ! ( !regexes[ 1 ] . is_match( "<!-- date-check --> 01 2021" ) ) ;
204
+ assert ! ( !regexes. is_match( "<!-- date-check: jan 221 -->" ) ) ;
205
+ assert ! ( !regexes. is_match( "<!-- date-check: jan 20221 -->" ) ) ;
206
+ assert ! ( !regexes. is_match( "<!-- date-check: 01 2021 -->" ) ) ;
207
+ assert ! ( !regexes. is_match( "<!-- date-check --> jan 221" ) ) ;
208
+ assert ! ( !regexes. is_match( "<!-- date-check --> jan 20222" ) ) ;
209
+ assert ! ( !regexes. is_match( "<!-- date-check --> 01 2021" ) ) ;
211
210
}
212
211
213
212
#[ test]
0 commit comments