lib: Parser now accepts .. as a synonym for to in date ranges.

This commit is contained in:
Stephen Morgan 2020-06-05 11:45:03 +10:00 committed by Simon Michael
parent 935abd1842
commit be25fe360e
2 changed files with 26 additions and 24 deletions

View File

@ -912,7 +912,7 @@ lastthisnextthing = do
-- resolving any relative start/end dates (only; it is not needed for -- resolving any relative start/end dates (only; it is not needed for
-- parsing the reporting interval). -- parsing the reporting interval).
-- --
-- >>> let p = parsePeriodExpr (parsedate "2008/11/26") -- >>> let p = parsePeriodExpr (parsedate "2008-11-26")
-- >>> p "from Aug to Oct" -- >>> p "from Aug to Oct"
-- Right (NoInterval,DateSpan 2008-08-01..2008-09-30) -- Right (NoInterval,DateSpan 2008-08-01..2008-09-30)
-- >>> p "aug to oct" -- >>> p "aug to oct"
@ -927,15 +927,17 @@ lastthisnextthing = do
-- Right (DayOfMonth 2,DateSpan ..) -- Right (DayOfMonth 2,DateSpan ..)
-- >>> p "every 2nd day" -- >>> p "every 2nd day"
-- Right (DayOfMonth 2,DateSpan ..) -- Right (DayOfMonth 2,DateSpan ..)
-- >>> p "every 2nd day 2009.."
-- Right (DayOfMonth 2,DateSpan 2009-01-01..)
-- >>> p "every 2nd day 2009-" -- >>> p "every 2nd day 2009-"
-- Right (DayOfMonth 2,DateSpan 2009-01-01..) -- Right (DayOfMonth 2,DateSpan 2009-01-01..)
-- >>> p "every 29th Nov" -- >>> p "every 29th Nov"
-- Right (DayOfYear 11 29,DateSpan ..) -- Right (DayOfYear 11 29,DateSpan ..)
-- >>> p "every 29th nov -2009" -- >>> p "every 29th nov ..2009"
-- Right (DayOfYear 11 29,DateSpan ..2008-12-31) -- Right (DayOfYear 11 29,DateSpan ..2008-12-31)
-- >>> p "every nov 29th" -- >>> p "every nov 29th"
-- Right (DayOfYear 11 29,DateSpan ..) -- Right (DayOfYear 11 29,DateSpan ..)
-- >>> p "every Nov 29th 2009-" -- >>> p "every Nov 29th 2009.."
-- Right (DayOfYear 11 29,DateSpan 2009-01-01..) -- Right (DayOfYear 11 29,DateSpan 2009-01-01..)
-- >>> p "every 11/29 from 2009" -- >>> p "every 11/29 from 2009"
-- Right (DayOfYear 11 29,DateSpan 2009-01-01..) -- Right (DayOfYear 11 29,DateSpan 2009-01-01..)
@ -951,9 +953,9 @@ lastthisnextthing = do
-- Right (DayOfMonth 2,DateSpan ..) -- Right (DayOfMonth 2,DateSpan ..)
-- >>> p "every 2nd day" -- >>> p "every 2nd day"
-- Right (DayOfMonth 2,DateSpan ..) -- Right (DayOfMonth 2,DateSpan ..)
-- >>> p "every 2nd day 2009-" -- >>> p "every 2nd day 2009.."
-- Right (DayOfMonth 2,DateSpan 2009-01-01..) -- 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..) -- Right (DayOfMonth 2,DateSpan 2009-01-01..)
periodexprp :: Day -> TextParser m (Interval, DateSpan) periodexprp :: Day -> TextParser m (Interval, DateSpan)
periodexprp rdate = do periodexprp rdate = do
@ -1072,7 +1074,7 @@ doubledatespanp rdate = do
optional (string' "from" >> skipMany spacenonewline) optional (string' "from" >> skipMany spacenonewline)
b <- smartdate b <- smartdate
skipMany spacenonewline 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 DateSpan (Just $ fixSmartDate rdate b) . Just . fixSmartDate rdate <$> smartdate
fromdatespanp :: Day -> TextParser m DateSpan fromdatespanp :: Day -> TextParser m DateSpan
@ -1084,14 +1086,14 @@ fromdatespanp rdate = do
, ,
do do
d <- smartdate d <- smartdate
string' "-" choice [string "..", string' "-"]
return d return d
] ]
return $ DateSpan (Just $ fixSmartDate rdate b) Nothing return $ DateSpan (Just $ fixSmartDate rdate b) Nothing
todatespanp :: Day -> TextParser m DateSpan todatespanp :: Day -> TextParser m DateSpan
todatespanp rdate = do 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 DateSpan Nothing . Just . fixSmartDate rdate <$> smartdate
justdatespanp :: Day -> TextParser m DateSpan justdatespanp :: Day -> TextParser m DateSpan

View File

@ -918,16 +918,16 @@ Some notes:
Examples: Examples:
| | | | | |
|-------------------|---------------------------------------------------------------------------------------------| |--------------------|---------------------------------------------------------------------------------------------|
| `-b 2016/3/17` | begin on St. Patricks day 2016 | | `-b 2016/3/17` | begin on St. Patricks day 2016 |
| `-e 12/1` | end at the start of december 1st of the current year (11/30 will be the last date included) | | `-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 | | `-b thismonth` | all transactions on or after the 1st of the current month |
| `-p thismonth` | all transactions in the current month | | `-p thismonth` | all transactions in the current month |
| `date:2016/3/17-` | the above written as queries instead | | `date:2016/3/17..` | the above written as queries instead (`..` can also be replaced with `-`) |
| `date:-12/1` | | | `date:..12/1` | |
| `date:thismonth-` | | | `date:thismonth..` | |
| `date:thismonth` | | | `date:thismonth` | |
## Report intervals ## 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"` `-p "from 2009/1/1 to 2009/4/1"`
Keywords like "from" and "to" are optional, and so are the spaces, as long 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: These are equivalent to the above:
| | | |
|--------------------------| |---------------------------|
| `-p "2009/1/1 2009/4/1"` | | `-p "2009/1/1 2009/4/1"` |
| `-p2009/1/1to2009/4/1` | | `-p2009/1/1to2009/4/1` |
| `-p2009/1/1-2009/4/1` | | `-p2009/1/1..2009/4/1` |
Dates are [smart dates](#smart-dates), so if the current year is 2009, the Dates are [smart dates](#smart-dates), so if the current year is 2009, the
above can also be written as: above can also be written as: