From be25fe360e39e3c526f0f366ed8b68dc7494fcf9 Mon Sep 17 00:00:00 2001 From: Stephen Morgan Date: Fri, 5 Jun 2020 11:45:03 +1000 Subject: [PATCH] lib: Parser now accepts .. as a synonym for to in date ranges. --- hledger-lib/Hledger/Data/Dates.hs | 18 +++++++++-------- hledger/hledger.m4.md | 32 +++++++++++++++---------------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/hledger-lib/Hledger/Data/Dates.hs b/hledger-lib/Hledger/Data/Dates.hs index 0f9609ac0..2c07a9ab0 100644 --- a/hledger-lib/Hledger/Data/Dates.hs +++ b/hledger-lib/Hledger/Data/Dates.hs @@ -912,7 +912,7 @@ lastthisnextthing = do -- resolving any relative start/end dates (only; it is not needed for -- parsing the reporting interval). -- --- >>> let p = parsePeriodExpr (parsedate "2008/11/26") +-- >>> let p = parsePeriodExpr (parsedate "2008-11-26") -- >>> p "from Aug to Oct" -- Right (NoInterval,DateSpan 2008-08-01..2008-09-30) -- >>> p "aug to oct" @@ -927,15 +927,17 @@ lastthisnextthing = do -- Right (DayOfMonth 2,DateSpan ..) -- >>> p "every 2nd day" -- Right (DayOfMonth 2,DateSpan ..) +-- >>> p "every 2nd day 2009.." +-- Right (DayOfMonth 2,DateSpan 2009-01-01..) -- >>> p "every 2nd day 2009-" -- Right (DayOfMonth 2,DateSpan 2009-01-01..) -- >>> p "every 29th Nov" -- Right (DayOfYear 11 29,DateSpan ..) --- >>> p "every 29th nov -2009" +-- >>> p "every 29th nov ..2009" -- Right (DayOfYear 11 29,DateSpan ..2008-12-31) -- >>> p "every nov 29th" -- Right (DayOfYear 11 29,DateSpan ..) --- >>> p "every Nov 29th 2009-" +-- >>> p "every Nov 29th 2009.." -- Right (DayOfYear 11 29,DateSpan 2009-01-01..) -- >>> p "every 11/29 from 2009" -- Right (DayOfYear 11 29,DateSpan 2009-01-01..) @@ -951,9 +953,9 @@ lastthisnextthing = do -- Right (DayOfMonth 2,DateSpan ..) -- >>> p "every 2nd day" -- Right (DayOfMonth 2,DateSpan ..) --- >>> p "every 2nd day 2009-" +-- >>> p "every 2nd day 2009.." -- Right (DayOfMonth 2,DateSpan 2009-01-01..) --- >>> p "every 2nd day of month 2009-" +-- >>> p "every 2nd day of month 2009.." -- Right (DayOfMonth 2,DateSpan 2009-01-01..) periodexprp :: Day -> TextParser m (Interval, DateSpan) periodexprp rdate = do @@ -1072,7 +1074,7 @@ doubledatespanp rdate = do optional (string' "from" >> skipMany spacenonewline) b <- smartdate skipMany spacenonewline - optional (choice [string' "to", string' "-"] >> skipMany spacenonewline) + optional (choice [string' "to", string "..", string' "-"] >> skipMany spacenonewline) DateSpan (Just $ fixSmartDate rdate b) . Just . fixSmartDate rdate <$> smartdate fromdatespanp :: Day -> TextParser m DateSpan @@ -1084,14 +1086,14 @@ fromdatespanp rdate = do , do d <- smartdate - string' "-" + choice [string "..", string' "-"] return d ] return $ DateSpan (Just $ fixSmartDate rdate b) Nothing todatespanp :: Day -> TextParser m DateSpan todatespanp rdate = do - choice [string' "to", string' "until", string' "-"] >> skipMany spacenonewline + choice [string' "to", string' "until", string "..", string' "-"] >> skipMany spacenonewline DateSpan Nothing . Just . fixSmartDate rdate <$> smartdate justdatespanp :: Day -> TextParser m DateSpan diff --git a/hledger/hledger.m4.md b/hledger/hledger.m4.md index af2605ede..e7bc75134 100644 --- a/hledger/hledger.m4.md +++ b/hledger/hledger.m4.md @@ -918,16 +918,16 @@ Some notes: Examples: -| | | -|-------------------|---------------------------------------------------------------------------------------------| -| `-b 2016/3/17` | begin on St. Patrick’s day 2016 | -| `-e 12/1` | end at the start of december 1st of the current year (11/30 will be the last date included) | -| `-b thismonth` | all transactions on or after the 1st of the current month | -| `-p thismonth` | all transactions in the current month | -| `date:2016/3/17-` | the above written as queries instead | -| `date:-12/1` | | -| `date:thismonth-` | | -| `date:thismonth` | | +| | | +|--------------------|---------------------------------------------------------------------------------------------| +| `-b 2016/3/17` | begin on St. Patrick’s day 2016 | +| `-e 12/1` | end at the start of december 1st of the current year (11/30 will be the last date included) | +| `-b thismonth` | all transactions on or after the 1st of the current month | +| `-p thismonth` | all transactions in the current month | +| `date:2016/3/17..` | the above written as queries instead (`..` can also be replaced with `-`) | +| `date:..12/1` | | +| `date:thismonth..` | | +| `date:thismonth` | | ## Report intervals @@ -951,14 +951,14 @@ hledger always treats start dates as inclusive and end dates as exclusive: `-p "from 2009/1/1 to 2009/4/1"` Keywords like "from" and "to" are optional, and so are the spaces, as long -as you don't run two dates together. "to" can also be written as "-". +as you don't run two dates together. "to" can also be written as ".." or "-". These are equivalent to the above: -| | -|--------------------------| -| `-p "2009/1/1 2009/4/1"` | -| `-p2009/1/1to2009/4/1` | -| `-p2009/1/1-2009/4/1` | +| | +|---------------------------| +| `-p "2009/1/1 2009/4/1"` | +| `-p2009/1/1to2009/4/1` | +| `-p2009/1/1..2009/4/1` | Dates are [smart dates](#smart-dates), so if the current year is 2009, the above can also be written as: