From 77f64a7ddf6bcdf8f2e604035f77b1737e870496 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Thu, 15 Apr 2010 20:44:04 +0000 Subject: [PATCH] parsing: if there is no description, don't require a space after the transaction date --- hledger-lib/Ledger/Parse.hs | 17 +++++++++-------- tests/parse-blank-description.test | 12 ++++++++++++ 2 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 tests/parse-blank-description.test diff --git a/hledger-lib/Ledger/Parse.hs b/hledger-lib/Ledger/Parse.hs index 25619ff37..b7c0494bf 100644 --- a/hledger-lib/Ledger/Parse.hs +++ b/hledger-lib/Ledger/Parse.hs @@ -391,12 +391,13 @@ ledgerDefaultYear = do ledgerTransaction :: GenParser Char LedgerFileCtx Transaction ledgerTransaction = do date <- ledgerdate "transaction" - edate <- try (ledgereffectivedate date "effective date") <|> return Nothing - status <- ledgerstatus - code <- ledgercode - description <- many1 spacenonewline >> liftM rstrip (many (noneOf ";\n") "description") - comment <- ledgercomment <|> return "" - restofline + edate <- optionMaybe (ledgereffectivedate date) "effective date" + status <- ledgerstatus "cleared flag" + code <- ledgercode "transaction code" + (description, comment) <- + (do {many1 spacenonewline; d <- liftM rstrip (many (noneOf ";\n")); c <- ledgercomment <|> return ""; newline; return (d, c)} <|> + do {many spacenonewline; c <- ledgercomment <|> return ""; newline; return ("", c)} + ) "description and/or comment" postings <- ledgerpostings let t = txnTieKnot $ Transaction date edate status code description comment postings "" case balanceTransaction t of @@ -433,7 +434,7 @@ ledgerdatetime = do let tod = TimeOfDay (read h) (read m) (maybe 0 (fromIntegral.read) s) return $ LocalTime day tod -ledgereffectivedate :: Day -> GenParser Char LedgerFileCtx (Maybe Day) +ledgereffectivedate :: Day -> GenParser Char LedgerFileCtx Day ledgereffectivedate actualdate = do char '=' -- kludgy way to use actual date for default year @@ -444,7 +445,7 @@ ledgereffectivedate actualdate = do when (isJust y) $ setYear $ fromJust y return r edate <- withDefaultYear actualdate ledgerdate - return $ Just edate + return edate ledgerstatus :: GenParser Char st Bool ledgerstatus = try (do { many1 spacenonewline; char '*' "status"; return True } ) <|> return False diff --git a/tests/parse-blank-description.test b/tests/parse-blank-description.test new file mode 100644 index 000000000..aeb179fa3 --- /dev/null +++ b/tests/parse-blank-description.test @@ -0,0 +1,12 @@ +# 1. accept a blank description +./hledger -f- +<<< +2010/1/1 + a 1 + b +# 2. same, but no separator space after the date +./hledger -f- +<<< +2010/1/1 + a 1 + b