@@ -533,15 +533,15 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
533533 |_| helpers:: month ( 12 )
534534 ) ;
535535 b. rule_1_terminal ( "christmas" ,
536- b. reg ( r#"weih?nacht(?:en|s(?:feier)?tag)?"# ) ?,
536+ b. reg ( r#"christtag| weih?nacht(?:en|s(?:feier)?tag)?"# ) ?,
537537 |_| helpers:: month_day ( 12 , 25 )
538538 ) ;
539539 b. rule_1_terminal ( "christmas eve" ,
540- b. reg ( r#"heilig(er)? abend"# ) ?,
540+ b. reg ( r#"christnacht|(?: heilig(?:e[r|n])?|weihnachts) ? abend"# ) ?,
541541 |_| helpers:: month_day ( 12 , 24 )
542542 ) ;
543543 b. rule_1_terminal ( "three wise men" ,
544- b. reg ( r#"den heiligen drei k[öo]nigen"# ) ?,
544+ b. reg ( r#"(?: den ) heiligen? drei k[öo]nigen? "# ) ?,
545545 |_| helpers:: month_day ( 1 , 6 )
546546 ) ;
547547 b. rule_1_terminal ( "new year's eve" ,
@@ -576,7 +576,16 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
576576 b. reg ( r#"palmsonntag"# ) ?,
577577 |_| Ok ( helpers:: cycle_nth_after ( Grain :: Day , -7 , & helpers:: easter ( ) ?) ?. form ( Form :: Celebration ) ) ,
578578 ) ;
579-
579+ b. rule_1_terminal ( "Holy Thursday" ,
580+ b. reg ( r#"gr[üu]ndonnerstag"# ) ?,
581+ |_| Ok ( helpers:: cycle_nth_after ( Grain :: Day , -3 , & helpers:: easter ( ) ?) ?
582+ . form ( Form :: Celebration ) )
583+ ) ;
584+ b. rule_1_terminal ( "Good Friday" ,
585+ b. reg ( r#"karfreitag"# ) ?,
586+ |_| Ok ( helpers:: cycle_nth_after ( Grain :: Day , -2 , & helpers:: easter ( ) ?) ?
587+ . form ( Form :: Celebration ) )
588+ ) ;
580589 b. rule_1_terminal ( "Lent" ,
581590 b. reg ( r#"(?:in|w[aä]hrend) der fastenzeit"# ) ?,
582591 |_| Ok ( helpers:: cycle_nth_after ( Grain :: Day , -47 , & helpers:: easter ( ) ?) ?
@@ -590,6 +599,33 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
590599 . span_to ( & helpers:: cycle_nth_after ( Grain :: Day , -47 , & helpers:: easter ( ) ?) ?, false ) ?
591600 . form ( Form :: Celebration ) )
592601 ) ;
602+ b. rule_1_terminal ( "Easter" ,
603+ b. reg ( r#"oster(?:n|sonntag)"# ) ?,
604+ |_| Ok ( helpers:: easter ( ) ?
605+ . form ( Form :: Celebration ) )
606+ ) ;
607+ b. rule_1_terminal ( "Easter Monday" ,
608+ b. reg ( r#"ostermontag"# ) ?,
609+ |_| Ok ( helpers:: cycle_nth_after ( Grain :: Day , 1 , & helpers:: easter ( ) ?) ?
610+ . form ( Form :: Celebration ) )
611+ ) ;
612+ b. rule_1_terminal ( "ascension" ,
613+ b. reg ( r#"himmelfahrt|auffahrt"# ) ?,
614+ |_| Ok ( helpers:: cycle_nth_after ( Grain :: Day , 39 , & helpers:: easter ( ) ?) ?
615+ . form ( Form :: Celebration ) )
616+
617+ ) ;
618+ b. rule_1_terminal ( "Pencost" ,
619+ b. reg ( r#"pfingst(?:en|sonntag)"# ) ?,
620+ |_| Ok ( helpers:: cycle_nth_after ( Grain :: Day , 49 , & helpers:: easter ( ) ?) ?
621+ . form ( Form :: Celebration ) )
622+ ) ;
623+
624+ b. rule_1_terminal ( "Pencost Monday" ,
625+ b. reg ( r#"pfingstmontag"# ) ?,
626+ |_| Ok ( helpers:: cycle_nth_after ( Grain :: Day , 50 , & helpers:: easter ( ) ?) ?
627+ . form ( Form :: Celebration ) )
628+ ) ;
593629
594630 b. rule_1_terminal ( "valentine's day" ,
595631 b. reg ( r#"valentin'?stag"# ) ?,
@@ -619,46 +655,54 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
619655 b. reg ( r#"allerheiligen(?:tag)?"# ) ?,
620656 |_| Ok ( helpers:: month_day ( 11 , 1 ) ?. form ( Form :: Celebration ) )
621657 ) ;
622- b. rule_1_terminal ( "Saint Joseph" ,
658+ b. rule_1_terminal ( "Holy Joseph" ,
623659 b. reg ( r#"sankt josef"# ) ?,
624660 |_| Ok ( helpers:: month_day ( 3 , 19 ) ?. form ( Form :: Celebration ) )
625661 ) ;
626- b. rule_1_terminal ( "Saint Florian" ,
662+ b. rule_1_terminal ( "Holy Florian" ,
627663 b. reg ( r#"sankt florian"# ) ?,
628664 |_| Ok ( helpers:: month_day ( 5 , 4 ) ?. form ( Form :: Celebration ) )
629665 ) ;
630- b. rule_1_terminal ( "Saint Rupert" ,
666+ b. rule_1_terminal ( "Holy Rupert" ,
631667 b. reg ( r#"sankt rupert"# ) ?,
632668 |_| Ok ( helpers:: month_day ( 9 , 24 ) ?. form ( Form :: Celebration ) )
633669 ) ;
634670 b. rule_1_terminal ( "German national celebration" ,
635- b. reg ( r#"tag (?:der)? deutsc?hen? einheit"# ) ?,
671+ b. reg ( r#"tag (?:der )? deutsc?hen? einheit"# ) ?,
636672 |_| Ok ( helpers:: month_day ( 10 , 3 ) ?. form ( Form :: Celebration ) )
637673 ) ;
638674 b. rule_1_terminal ( "Day of popular vote" ,
639675 b. reg ( r#"tag der volksabtimmun"# ) ?,
640676 |_| Ok ( helpers:: month_day ( 10 , 10 ) ?. form ( Form :: Celebration ) )
641677 ) ;
642678 b. rule_1_terminal ( "Austrian national celebration" ,
643- b. reg ( r#"([öo]sterreichischer?)? nationalfeiertag|national feiertag"# ) ?,
679+ b. reg ( r#"(?: [öo]sterreichischer? )? nationalfeiertag|national feiertag"# ) ?,
644680 |_| Ok ( helpers:: month_day ( 10 , 26 ) ?. form ( Form :: Celebration ) )
645681 ) ;
646682 b. rule_1_terminal ( "Armistice Celebration" ,
647683 b. reg ( r#"waffenstillstandserkl[äa]rung"# ) ?,
648684 |_| Ok ( helpers:: month_day ( 11 , 11 ) ?. form ( Form :: Celebration ) )
649685 ) ;
650- b. rule_1_terminal ( "Saint Martin" ,
651- b. reg ( r#"sankt martin"# ) ?,
686+ b. rule_1_terminal ( "Holy Martin" ,
687+ b. reg ( r#"sankt martin|martinstag "# ) ?,
652688 |_| Ok ( helpers:: month_day ( 11 , 11 ) ?. form ( Form :: Celebration ) )
653689 ) ;
654- b. rule_1_terminal ( "Saint Leopold" ,
690+ b. rule_1_terminal ( "Holy Leopold" ,
655691 b. reg ( r#"sankt leopold"# ) ?,
656692 |_| Ok ( helpers:: month_day ( 11 , 15 ) ?. form ( Form :: Celebration ) )
657693 ) ;
694+ b. rule_1_terminal ( "Holy Joseph" ,
695+ b. reg ( r#"josefstag"# ) ?,
696+ |_| Ok ( helpers:: month_day ( 3 , 19 ) ?. form ( Form :: Celebration ) )
697+ ) ;
658698 b. rule_1_terminal ( "Switzerland national celebration" ,
659699 b. reg ( r#"an der bundesfeier"# ) ?,
660700 |_| Ok ( helpers:: month_day ( 8 , 1 ) ?. form ( Form :: Celebration ) )
661701 ) ;
702+ b. rule_1_terminal ( "Berchtoldstag" ,
703+ b. reg ( r#"berchtoldstag"# ) ?,
704+ |_| Ok ( helpers:: month_day ( 1 , 2 ) ?. form ( Form :: Celebration ) )
705+ ) ;
662706 b. rule_1_terminal ( "Immaculate conception" ,
663707 b. reg ( r#"mari[äa] empf[äa]ngnis"# ) ?,
664708 |_| Ok ( helpers:: month_day ( 12 , 8 ) ?. form ( Form :: Celebration ) )
@@ -671,19 +715,12 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
671715 b. reg ( r#"(?:internationale[rnm] )?frauentag"# ) ?,
672716 |_| Ok ( helpers:: month_day ( 3 , 8 ) ?. form ( Form :: Celebration ) )
673717 ) ;
674- // TODO needs the lunar calendar feature
675- // b.rule_1("Ascension celebration",
676- // b.reg(r#"himmelfahrt"#)?,
677- // |_|
678- // );
679718
680- // TODO in Germany it is the same day as the ascension celebration
681- // b.rule_1("Father's Day", // third Sunday of June
682- // b.reg(r#"vatt?er(?: ?tag)?|(?:herren|m[äa]nner)tag"#)?,
683- // |_| helpers::day_of_week(Weekday::Sun)?
684- // .intersect(&helpers::month(6)?)?
685- // .intersect(&helpers::cycle_nth_after(Grain::Week, 2, &helpers::month_day(6, 1)?)?)
686- // );
719+ b. rule_1 ( "Father's Day" , // third Sunday of June
720+ b. reg ( r#"vatt?er(?: ?tag)?|(?:herren|m[äa]nner)tag"# ) ?,
721+ |_| Ok ( helpers:: cycle_nth_after ( Grain :: Day , 39 , & helpers:: easter ( ) ?) ?
722+ . form ( Form :: Celebration ) )
723+ ) ;
687724 b. rule_1_terminal ( "Mother's Day" ,
688725 b. reg ( r#"mutt?ertag|mutt?er (?:tag)?"# ) ?,
689726 |_| Ok ( helpers:: day_of_week ( Weekday :: Sun ) ?
@@ -699,6 +736,13 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
699736 b. reg ( r#"allerheiligen?|aller heiligen?"# ) ?,
700737 |_| Ok ( helpers:: month_day ( 11 , 1 ) ?. form ( Form :: Celebration ) )
701738 ) ;
739+ b. rule_1_terminal ( "Sunday of the dead (German protestant)" ,
740+ b. reg ( r#"totensonntag"# ) ?,
741+ |_| Ok ( helpers:: day_of_week ( Weekday :: Sun ) ?
742+ . intersect ( & helpers:: cycle_nth_after ( Grain :: Week , 3 , & helpers:: month_day ( 11 , 1 ) ?) ?) ?
743+ . form ( Form :: Celebration ) )
744+ ) ;
745+
702746 b. rule_1_terminal ( "Nikolaus" ,
703747 b. reg ( r#"nikolaus(?: ?tag|abend)?|nikolo"# ) ?,
704748 |_| Ok ( helpers:: month_day ( 12 , 6 ) ?. form ( Form :: Celebration ) )
@@ -715,9 +759,21 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
715759 . form ( Form :: Celebration ) )
716760 }
717761 ) ;
762+ //Volkstrauertag
763+
764+ b. rule_1_terminal ( "memorial day" ,
765+ b. reg ( r#"volkstrauertag"# ) ?,
766+ |_| {
767+ let christmas = helpers:: month_day ( 12 , 25 ) ?;
768+ let offset = -6 ;
769+ Ok ( helpers:: cycle_nth_after ( Grain :: Week , offset, & christmas) ?
770+ . intersect ( & helpers:: day_of_week ( Weekday :: Sun ) ?) ?
771+ . form ( Form :: Celebration ) )
772+ }
773+ ) ;
718774
719775 b. rule_1_terminal ( "now" ,
720- b. reg ( r#"(?:genau ?)?jetzt|(?:diesen|im|in diesem) (?:moment|augenblick)|nun|sofort|gerade (?:eben|jetzt)"# ) ?,
776+ b. reg ( r#"(?:genau ?)?jetzt|aktuelle(?:r|n|s|m)?|gegenw[äa]rtige(?:r|n|s|m)?| (?:diesen|im|in diesem) (?:moment|augenblick)|nun|sofort|gerade (?:eben|jetzt)"# ) ?,
721777 |_| helpers:: cycle_nth ( Grain :: Second , 0 )
722778 ) ;
723779 b. rule_1_terminal ( "today" ,
@@ -899,10 +955,29 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
899955 ordinal_check ! ( |ordinal: & OrdinalValue | 1 <= ordinal. value && ordinal. value <= 31 ) ,
900956 |time, ordinal| time. value ( ) . intersect ( & helpers:: day_of_month ( ordinal. value ( ) . value as u32 ) ?)
901957 ) ;
902- b. rule_2 ( "<named-month> <day-of-month> (non ordinal)" ,
958+ b. rule_3 ( "<named-month> <day-of-month> (non ordinal) <time> " ,
903959 time_check ! ( form!( Form :: Month ( _) ) ) ,
904960 integer_check_by_range ! ( 1 , 31 ) ,
905- |time, integer| time. value ( ) . intersect ( & helpers:: day_of_month ( integer. value ( ) . value as u32 ) ?)
961+ time_check ! ( ) ,
962+ |month, integer, time| month. value ( )
963+ . intersect ( & helpers:: day_of_month ( integer. value ( ) . value as u32 ) ?) ?
964+ . intersect ( time. value ( ) )
965+ ) ;
966+ b. rule_3 ( "<time> <named-month> <day-of-month> (non ordinal)" ,
967+ time_check ! ( ) ,
968+ time_check ! ( form!( Form :: Month ( _) ) ) ,
969+ integer_check_by_range ! ( 1 , 31 ) ,
970+ |time, month, integer| month. value ( )
971+ . intersect ( & helpers:: day_of_month ( integer. value ( ) . value as u32 ) ?) ?
972+ . intersect ( time. value ( ) )
973+ ) ;
974+ b. rule_3 ( "<day-of-week> <named-month> <day-of-month> (non ordinal)" ,
975+ time_check ! ( form!( Form :: DayOfWeek { ..} ) ) ,
976+ time_check ! ( form!( Form :: Month ( _) ) ) ,
977+ integer_check_by_range ! ( 1 , 31 ) ,
978+ |dow, month, integer| month. value ( )
979+ . intersect ( & helpers:: day_of_month ( integer. value ( ) . value as u32 ) ?) ?
980+ . intersect ( dow. value ( ) )
906981 ) ;
907982 b. rule_3 ( "<day-of-month> (non ordinal) of <named-month>" ,
908983 integer_check_by_range ! ( 1 , 31 ) ,
@@ -1131,6 +1206,14 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
11311206 . span_to ( & helpers:: hour ( 12 , false ) ?, false ) ?
11321207 . form ( Form :: PartOfDay ( PartOfDayForm :: Morning ) ) )
11331208 ) ;
1209+
1210+ b. rule_1_terminal ( "morning (latent)" ,
1211+ b. reg ( r#"fr[üu]h"# ) ?,
1212+ |_| Ok ( helpers:: hour ( 3 , false ) ?
1213+ . span_to ( & helpers:: hour ( 12 , false ) ?, false ) ?
1214+ . latent ( )
1215+ . form ( Form :: PartOfDay ( PartOfDayForm :: Morning ) ) )
1216+ ) ;
11341217 b. rule_1_terminal ( "late morning" ,
11351218 b. reg ( r#"(?:kurz|am sp[äa]ten) vor ?mittag"# ) ?,
11361219 |_| Ok ( helpers:: hour ( 11 , false ) ?
@@ -1331,7 +1414,7 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
13311414 ) ;
13321415
13331416 b. rule_2 ( "<article> <time>" ,
1334- b. reg ( r#"a[nm]"# ) ?,
1417+ b. reg ( r#"a[nm](?: de[rn])? "# ) ?,
13351418 time_check ! ( excluding_form!( Form :: TimeOfDay ( _) ) ) ,
13361419 |_, time| Ok ( time. value ( ) . clone ( ) . not_latent ( ) )
13371420 ) ;
@@ -1735,12 +1818,12 @@ pub fn rules_temperature(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()
17351818 // );
17361819
17371820 b. rule_2 ( "<article> temp" ,
1738- b. reg ( r#"bei"# ) ?,
1739- temperature_check ! ( ) ,
1821+ b. reg ( r#"bei|auf "# ) ?,
1822+ temperature_check ! ( |temp : & TemperatureValue | !temp . latent ) ,
17401823 |_, temp| Ok ( TemperatureValue {
17411824 value : temp. value ( ) . value ,
17421825 unit : temp. value ( ) . unit ,
1743- latent : false ,
1826+ latent : temp . value ( ) . latent ,
17441827 } )
17451828 ) ;
17461829 b. rule_1 ( "number as temp" ,
@@ -1865,6 +1948,12 @@ pub fn rules_numbers(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
18651948 number_check ! ( ) ,
18661949 |a, b| helpers:: compose_numbers ( & a. value ( ) , & b. value ( ) ) ) ;
18671950
1951+ b. rule_3 ( "intersect" ,
1952+ number_check ! ( |number: & NumberValue | number. grain( ) . unwrap_or( 0 ) > 1 ) ,
1953+ b. reg ( r#"und"# ) ?,
1954+ number_check ! ( ) ,
1955+ |a, _, b| helpers:: compose_numbers ( & a. value ( ) , & b. value ( ) ) ) ;
1956+
18681957 b. rule_1_terminal ( "null" ,
18691958 b. reg ( r#"kein(?:er|en|e?s?)|null|nichts"# ) ?,
18701959 |_| IntegerValue :: new ( 0 )
0 commit comments