From 0cff1634be309954c3f1b6d3efab785914d40e11 Mon Sep 17 00:00:00 2001 From: Alex Chen Date: Wed, 16 May 2018 09:28:06 -0600 Subject: [PATCH] lib: refactor: make the bracketed datetags parser a SimpleTextParser in all but type --- hledger-lib/Hledger/Read/Common.hs | 44 ++++++++++-------------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/hledger-lib/Hledger/Read/Common.hs b/hledger-lib/Hledger/Read/Common.hs index 469036246..6a1e32584 100644 --- a/hledger-lib/Hledger/Read/Common.hs +++ b/hledger-lib/Hledger/Read/Common.hs @@ -1022,7 +1022,7 @@ bracketedpostingdatesp mdefdate = do -- pdbg 0 $ "bracketedpostingdatesp" skipMany $ noneOf ['['] fmap concat - $ sepEndBy (try (bracketeddatetagsp mdefdate) <|> char '[' *> pure []) + $ sepEndBy (bracketeddatetagsp mdefdate <|> char '[' *> pure []) (skipMany $ noneOf ['[']) -- using noneOf ['['] in place of notChar '[' for backwards compatibility @@ -1059,33 +1059,19 @@ bracketedpostingdatesp mdefdate = do -- Left ...1:15:...bad date, different separators... -- bracketeddatetagsp :: Monad m => Maybe Day -> ErroringJournalParser m [(TagName, Day)] -bracketeddatetagsp mdefdate = do +bracketeddatetagsp mdefdate = lift $ do -- pdbg 0 "bracketeddatetagsp" - char '[' - startpos <- getPosition - let digits = "0123456789" - s <- some (oneOf $ '=':digits++datesepchars) - char ']' - unless (any (`elem` s) digits && any (`elem` datesepchars) s) $ - fail "not a bracketed date" - - -- looks sufficiently like a bracketed date, now we - -- re-parse as dates and throw any errors - j <- get - let ep :: Either (ParseError Char MPErr) (Maybe Day, Maybe Day) - ep = parseWithState' - j{jparsedefaultyear=first3.toGregorian <$> mdefdate} - (do - setPosition startpos - md1 <- optional datep - maybe (return ()) (setYear.first3.toGregorian) md1 - md2 <- optional $ char '=' >> datep - eof - return (md1,md2) - ) - (T.pack s) - case ep - of Left e -> throwError $ parseErrorPretty e - Right (md1,md2) -> return $ catMaybes - [("date",) <$> md1, ("date2",) <$> md2] + try $ do + let digits = "0123456789" + s <- lookAhead $ between (char '[') (char ']') + (some (oneOf $ '=':digits++datesepchars)) + unless (any (`elem` s) digits && any (`elem` datesepchars) s) $ + fail "not a bracketed date" + -- Looks sufficiently like a bracketed date to commit to parsing a date + between (char '[') (char ']') $ do + let myear1 = fmap (first3 . toGregorian) mdefdate + md1 <- optional $ datep' myear1 + let myear2 = fmap (first3 . toGregorian) md1 <|> myear1 + md2 <- optional $ char '=' *> (datep' myear2) + pure $ catMaybes [("date",) <$> md1, ("date2",) <$> md2]