@@ -36,52 +36,51 @@ impl fmt::Display for Date {
3636 }
3737}
3838
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 ( )
4447}
4548
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 ( )
7776}
7877
7978fn 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 ( ) ;
8180 let mut data = BTreeMap :: new ( ) ;
8281 for path in paths {
8382 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) ;
8584 if !dates. is_empty ( ) {
8685 data. insert ( path, dates) ;
8786 }
@@ -185,29 +184,29 @@ mod tests {
185184
186185 #[ test]
187186 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" ) ) ;
197196
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." ) ) ;
200199 }
201200
202201 #[ test]
203202 fn test_date_regex_fail ( ) {
204203 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" ) ) ;
211210 }
212211
213212 #[ test]
0 commit comments