From af9dd0819d62b33815cf4d6c45afe44b6fea3e8a Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 19 Dec 2021 15:17:59 +0100 Subject: [PATCH] Add isIsoLeapYear variable and fix iyl documentation --- src/eval/command/formula.rs | 3 +++ src/eval/util.rs | 1 + src/files/commands.rs | 5 ++++- src/files/grammar.pest | 2 +- src/files/parse.rs | 1 + 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/eval/command/formula.rs b/src/eval/command/formula.rs index 9b3c0f2..451db9b 100644 --- a/src/eval/command/formula.rs +++ b/src/eval/command/formula.rs @@ -43,6 +43,7 @@ pub enum Var { IsWeekday, IsWeekend, IsLeapYear, + IsIsoLeapYear, } impl Var { @@ -97,6 +98,7 @@ impl Var { b2i(wd.is_weekend()) } Var::IsLeapYear => b2i(util::is_leap_year(date.year())), + Var::IsIsoLeapYear => b2i(util::is_iso_leap_year(date.year())), }) } } @@ -162,6 +164,7 @@ impl From<&Spanned> for Expr { commands::Var::IsWeekday => Self::Var(Var::IsWeekday), commands::Var::IsWeekend => Self::Var(Var::IsWeekend), commands::Var::IsLeapYear => Self::Var(Var::IsLeapYear), + commands::Var::IsIsoLeapYear => Self::Var(Var::IsIsoLeapYear), }, commands::Expr::Paren(i) => i.as_ref().into(), commands::Expr::Neg(i) => Self::Neg(conv(i)), diff --git a/src/eval/util.rs b/src/eval/util.rs index 077d2e8..65b6ee4 100644 --- a/src/eval/util.rs +++ b/src/eval/util.rs @@ -19,6 +19,7 @@ pub fn month_length(year: i32, month: u32) -> u32 { .day() } +// Length of an ISO week year in days. pub fn iso_year_length(year: i32) -> u32 { if is_iso_leap_year(year) { 53 * 7 diff --git a/src/files/commands.rs b/src/files/commands.rs index 2604171..44f4641 100644 --- a/src/files/commands.rs +++ b/src/files/commands.rs @@ -145,7 +145,7 @@ pub enum Var { DayReverse, /// `iy`, ISO 8601 year IsoYear, - /// `iyl`, length of current ISO 8601 year **in weeks** + /// `iyl`, length of current ISO 8601 year in days IsoYearLength, /// `iw`, ISO 8601 week IsoWeek, @@ -159,6 +159,8 @@ pub enum Var { IsWeekend, /// `isLeapYear`, whether the current year is a leap year IsLeapYear, + /// `isIsoLeapYear`, whether the current year is a long year in the ISO week system + IsIsoLeapYear, } impl Var { @@ -197,6 +199,7 @@ impl Var { Var::IsWeekday => "isWeekday", Var::IsWeekend => "isWeekend", Var::IsLeapYear => "isLeapYear", + Var::IsIsoLeapYear => "isIsoLeapYear", } } } diff --git a/src/files/grammar.pest b/src/files/grammar.pest index 385ddb4..c999230 100644 --- a/src/files/grammar.pest +++ b/src/files/grammar.pest @@ -48,7 +48,7 @@ delta = { boolean = { "true" | "false" } variable = { "mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun" - | "isWeekday" | "isWeekend" | "isLeapYear" + | "isWeekday" | "isWeekend" | "isLeapYear" | "isIsoLeapYear" | "j" | "yl" | "yd" | "yD" | "yw" | "yW" | "y" | "ml" | "mw" | "mW" | "m" diff --git a/src/files/parse.rs b/src/files/parse.rs index e7a4590..bee8c15 100644 --- a/src/files/parse.rs +++ b/src/files/parse.rs @@ -348,6 +348,7 @@ fn parse_variable(p: Pair<'_, Rule>) -> Var { "isWeekday" => Var::IsWeekday, "isWeekend" => Var::IsWeekend, "isLeapYear" => Var::IsLeapYear, + "isIsoLeapYear" => Var::IsIsoLeapYear, _ => unreachable!(), } }