lib: refactor: weaken types of comment parsers
This commit is contained in:
parent
d1b9d9dfe6
commit
09fd8132b7
@ -810,30 +810,30 @@ whitespaceChar = charCategory Space
|
|||||||
|
|
||||||
--- ** comments
|
--- ** comments
|
||||||
|
|
||||||
multilinecommentp :: JournalParser m ()
|
multilinecommentp :: TextParser m ()
|
||||||
multilinecommentp = startComment *> anyLine `skipManyTill` endComment
|
multilinecommentp = startComment *> anyLine `skipManyTill` endComment
|
||||||
where
|
where
|
||||||
startComment = string "comment" >> emptyLine
|
startComment = string "comment" >> emptyLine
|
||||||
endComment = eof <|> (string "end comment" >> emptyLine)
|
endComment = eof <|> (string "end comment" >> emptyLine)
|
||||||
emptyLine = void $ lift (skipMany spacenonewline) *> newline
|
emptyLine = void $ skipMany spacenonewline *> newline
|
||||||
anyLine = anyChar `manyTill` newline
|
anyLine = anyChar `manyTill` newline
|
||||||
|
|
||||||
emptyorcommentlinep :: JournalParser m ()
|
emptyorcommentlinep :: TextParser m ()
|
||||||
emptyorcommentlinep = do
|
emptyorcommentlinep = do
|
||||||
lift $ skipMany spacenonewline
|
skipMany spacenonewline
|
||||||
void linecommentp <|> void newline
|
void linecommentp <|> void newline
|
||||||
|
|
||||||
-- | Parse a possibly multi-line comment following a semicolon.
|
-- | Parse a possibly multi-line comment following a semicolon.
|
||||||
followingcommentp :: JournalParser m Text
|
followingcommentp :: TextParser m Text
|
||||||
followingcommentp = T.unlines . map snd <$> followingcommentlinesp
|
followingcommentp = T.unlines . map snd <$> followingcommentlinesp
|
||||||
|
|
||||||
followingcommentlinesp :: JournalParser m [(SourcePos, Text)]
|
followingcommentlinesp :: TextParser m [(SourcePos, Text)]
|
||||||
followingcommentlinesp = do
|
followingcommentlinesp = do
|
||||||
lift $ skipMany spacenonewline
|
lift $ skipMany spacenonewline
|
||||||
samelineComment@(_, samelineCommentText)
|
samelineComment@(_, samelineCommentText)
|
||||||
<- try commentp <|> (,) <$> (getPosition <* newline) <*> pure ""
|
<- try commentp <|> (,) <$> (getPosition <* newline) <*> pure ""
|
||||||
newlineComments <- many $ try $ do
|
newlineComments <- many $ try $ do
|
||||||
lift $ skipSome spacenonewline -- leading whitespace is required
|
skipSome spacenonewline -- leading whitespace is required
|
||||||
commentp
|
commentp
|
||||||
if T.null samelineCommentText && null newlineComments
|
if T.null samelineCommentText && null newlineComments
|
||||||
then pure []
|
then pure []
|
||||||
@ -858,12 +858,12 @@ followingcommentlinesp = do
|
|||||||
-- >>> rejp (followingcommentandtagsp (Just $ fromGregorian 2000 1 2)) "; date:3/4=5/6"
|
-- >>> rejp (followingcommentandtagsp (Just $ fromGregorian 2000 1 2)) "; date:3/4=5/6"
|
||||||
-- Right ("date:3/4=5/6\n",[("date","3/4=5/6")],Just 2000-03-04,Nothing)
|
-- Right ("date:3/4=5/6\n",[("date","3/4=5/6")],Just 2000-03-04,Nothing)
|
||||||
--
|
--
|
||||||
followingcommentandtagsp :: MonadIO m => Maybe Day
|
followingcommentandtagsp
|
||||||
-> ErroringJournalParser m (Text, [Tag], Maybe Day, Maybe Day)
|
:: Monad m => Maybe Day -> ErroringJournalParser m (Text, [Tag], Maybe Day, Maybe Day)
|
||||||
followingcommentandtagsp mdefdate = do
|
followingcommentandtagsp mdefdate = do
|
||||||
-- pdbg 0 "followingcommentandtagsp"
|
-- pdbg 0 "followingcommentandtagsp"
|
||||||
|
|
||||||
commentLines <- followingcommentlinesp
|
commentLines <- lift followingcommentlinesp
|
||||||
-- pdbg 0 $ "commentws:" ++ show commentLines
|
-- pdbg 0 $ "commentws:" ++ show commentLines
|
||||||
|
|
||||||
-- Reparse the comment for any tags.
|
-- Reparse the comment for any tags.
|
||||||
@ -925,23 +925,23 @@ followingcommentandtagsp mdefdate = do
|
|||||||
-- A transaction/posting comment must start with a semicolon.
|
-- A transaction/posting comment must start with a semicolon.
|
||||||
-- This parser discards the leading whitespace of the comment
|
-- This parser discards the leading whitespace of the comment
|
||||||
-- and returns the source position of the comment's first non-whitespace character.
|
-- and returns the source position of the comment's first non-whitespace character.
|
||||||
commentp :: JournalParser m (SourcePos, Text)
|
commentp :: TextParser m (SourcePos, Text)
|
||||||
commentp = commentStartingWithp ";"
|
commentp = commentStartingWithp ";"
|
||||||
|
|
||||||
-- A line (file-level) comment can start with a semicolon, hash,
|
-- A line (file-level) comment can start with a semicolon, hash,
|
||||||
-- or star (allowing org nodes).
|
-- or star (allowing org nodes).
|
||||||
-- This parser discards the leading whitespace of the comment
|
-- This parser discards the leading whitespace of the comment
|
||||||
-- and returns the source position of the comment's first non-whitespace character.
|
-- and returns the source position of the comment's first non-whitespace character.
|
||||||
linecommentp :: JournalParser m (SourcePos, Text)
|
linecommentp :: TextParser m (SourcePos, Text)
|
||||||
linecommentp = commentStartingWithp ";#*"
|
linecommentp = commentStartingWithp ";#*"
|
||||||
|
|
||||||
commentStartingWithp :: [Char] -> JournalParser m (SourcePos, Text)
|
commentStartingWithp :: [Char] -> TextParser m (SourcePos, Text)
|
||||||
commentStartingWithp cs = do
|
commentStartingWithp cs = do
|
||||||
-- ptrace "commentStartingWith"
|
-- ptrace "commentStartingWith"
|
||||||
oneOf cs
|
oneOf cs
|
||||||
lift (skipMany spacenonewline)
|
skipMany spacenonewline
|
||||||
startPos <- getPosition
|
startPos <- getPosition
|
||||||
content <- T.pack <$> anyChar `manyTill` (lift eolof)
|
content <- T.pack <$> anyChar `manyTill` eolof
|
||||||
optional newline
|
optional newline
|
||||||
return (startPos, content)
|
return (startPos, content)
|
||||||
|
|
||||||
|
|||||||
@ -158,8 +158,8 @@ addJournalItemP =
|
|||||||
, modifiertransactionp >>= modify' . addModifierTransaction
|
, modifiertransactionp >>= modify' . addModifierTransaction
|
||||||
, periodictransactionp >>= modify' . addPeriodicTransaction
|
, periodictransactionp >>= modify' . addPeriodicTransaction
|
||||||
, marketpricedirectivep >>= modify' . addMarketPrice
|
, marketpricedirectivep >>= modify' . addMarketPrice
|
||||||
, void emptyorcommentlinep
|
, void (lift emptyorcommentlinep)
|
||||||
, void multilinecommentp
|
, void (lift multilinecommentp)
|
||||||
] <?> "transaction or directive"
|
] <?> "transaction or directive"
|
||||||
|
|
||||||
--- ** directives
|
--- ** directives
|
||||||
@ -281,7 +281,7 @@ commoditydirectiveonelinep = do
|
|||||||
pos <- getPosition
|
pos <- getPosition
|
||||||
Amount{acommodity,astyle} <- amountp
|
Amount{acommodity,astyle} <- amountp
|
||||||
lift (skipMany spacenonewline)
|
lift (skipMany spacenonewline)
|
||||||
_ <- followingcommentp <|> (lift eolof >> return "")
|
_ <- lift followingcommentp <|> (lift eolof >> return "")
|
||||||
let comm = Commodity{csymbol=acommodity, cformat=Just $ dbg2 "style from commodity directive" astyle}
|
let comm = Commodity{csymbol=acommodity, cformat=Just $ dbg2 "style from commodity directive" astyle}
|
||||||
if asdecimalpoint astyle == Nothing
|
if asdecimalpoint astyle == Nothing
|
||||||
then parserErrorAt pos pleaseincludedecimalpoint
|
then parserErrorAt pos pleaseincludedecimalpoint
|
||||||
@ -298,7 +298,7 @@ commoditydirectivemultilinep = do
|
|||||||
string "commodity"
|
string "commodity"
|
||||||
lift (skipSome spacenonewline)
|
lift (skipSome spacenonewline)
|
||||||
sym <- lift commoditysymbolp
|
sym <- lift commoditysymbolp
|
||||||
_ <- followingcommentp <|> (lift eolof >> return "")
|
_ <- lift followingcommentp <|> (lift eolof >> return "")
|
||||||
mformat <- lastMay <$> many (indented $ formatdirectivep sym)
|
mformat <- lastMay <$> many (indented $ formatdirectivep sym)
|
||||||
let comm = Commodity{csymbol=sym, cformat=mformat}
|
let comm = Commodity{csymbol=sym, cformat=mformat}
|
||||||
modify' (\j -> j{jcommodities=M.insert sym comm $ jcommodities j})
|
modify' (\j -> j{jcommodities=M.insert sym comm $ jcommodities j})
|
||||||
@ -313,7 +313,7 @@ formatdirectivep expectedsym = do
|
|||||||
lift (skipSome spacenonewline)
|
lift (skipSome spacenonewline)
|
||||||
pos <- getPosition
|
pos <- getPosition
|
||||||
Amount{acommodity,astyle} <- amountp
|
Amount{acommodity,astyle} <- amountp
|
||||||
_ <- followingcommentp <|> (lift eolof >> return "")
|
_ <- lift followingcommentp <|> (lift eolof >> return "")
|
||||||
if acommodity==expectedsym
|
if acommodity==expectedsym
|
||||||
then
|
then
|
||||||
if asdecimalpoint astyle == Nothing
|
if asdecimalpoint astyle == Nothing
|
||||||
@ -463,7 +463,7 @@ periodictransactionp = do
|
|||||||
char '~' <?> "periodic transaction"
|
char '~' <?> "periodic transaction"
|
||||||
lift (skipMany spacenonewline)
|
lift (skipMany spacenonewline)
|
||||||
periodexpr <- T.pack . strip <$> descriptionp
|
periodexpr <- T.pack . strip <$> descriptionp
|
||||||
_ <- try followingcommentp <|> (newline >> return "")
|
_ <- try (lift followingcommentp) <|> (newline >> return "")
|
||||||
postings <- postingsp Nothing
|
postings <- postingsp Nothing
|
||||||
return $ PeriodicTransaction periodexpr postings
|
return $ PeriodicTransaction periodexpr postings
|
||||||
|
|
||||||
@ -478,7 +478,7 @@ transactionp = do
|
|||||||
status <- lift statusp <?> "cleared status"
|
status <- lift statusp <?> "cleared status"
|
||||||
code <- T.pack <$> lift codep <?> "transaction code"
|
code <- T.pack <$> lift codep <?> "transaction code"
|
||||||
description <- T.pack . strip <$> descriptionp
|
description <- T.pack . strip <$> descriptionp
|
||||||
comment <- try followingcommentp <|> (newline >> return "")
|
comment <- try (lift followingcommentp) <|> (newline >> return "")
|
||||||
let tags = commentTags comment
|
let tags = commentTags comment
|
||||||
postings <- postingsp (Just date)
|
postings <- postingsp (Just date)
|
||||||
pos' <- getPosition
|
pos' <- getPosition
|
||||||
|
|||||||
@ -100,7 +100,7 @@ timeclockfilep = do many timeclockitemp
|
|||||||
-- character, excepting transactions versus empty (blank or
|
-- character, excepting transactions versus empty (blank or
|
||||||
-- comment-only) lines, can use choice w/o try
|
-- comment-only) lines, can use choice w/o try
|
||||||
timeclockitemp = choice [
|
timeclockitemp = choice [
|
||||||
void emptyorcommentlinep
|
void (lift emptyorcommentlinep)
|
||||||
, timeclockentryp >>= \e -> modify' (\j -> j{jparsetimeclockentries = e : jparsetimeclockentries j})
|
, timeclockentryp >>= \e -> modify' (\j -> j{jparsetimeclockentries = e : jparsetimeclockentries j})
|
||||||
] <?> "timeclock entry, or default year or historical price directive"
|
] <?> "timeclock entry, or default year or historical price directive"
|
||||||
|
|
||||||
|
|||||||
@ -77,7 +77,7 @@ timedotfilep = do many timedotfileitemp
|
|||||||
timedotfileitemp = do
|
timedotfileitemp = do
|
||||||
ptrace "timedotfileitemp"
|
ptrace "timedotfileitemp"
|
||||||
choice [
|
choice [
|
||||||
void emptyorcommentlinep
|
void $ lift emptyorcommentlinep
|
||||||
,timedotdayp >>= \ts -> modify' (addTransactions ts)
|
,timedotdayp >>= \ts -> modify' (addTransactions ts)
|
||||||
] <?> "timedot day entry, or default year or comment line or blank line"
|
] <?> "timedot day entry, or default year or comment line or blank line"
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ timedotdayp :: JournalParser m [Transaction]
|
|||||||
timedotdayp = do
|
timedotdayp = do
|
||||||
ptrace " timedotdayp"
|
ptrace " timedotdayp"
|
||||||
d <- datep <* lift eolof
|
d <- datep <* lift eolof
|
||||||
es <- catMaybes <$> many (const Nothing <$> try emptyorcommentlinep <|>
|
es <- catMaybes <$> many (const Nothing <$> try (lift emptyorcommentlinep) <|>
|
||||||
Just <$> (notFollowedBy datep >> timedotentryp))
|
Just <$> (notFollowedBy datep >> timedotentryp))
|
||||||
return $ map (\t -> t{tdate=d}) es -- <$> many timedotentryp
|
return $ map (\t -> t{tdate=d}) es -- <$> many timedotentryp
|
||||||
|
|
||||||
@ -111,9 +111,9 @@ timedotentryp = do
|
|||||||
a <- modifiedaccountnamep
|
a <- modifiedaccountnamep
|
||||||
lift (skipMany spacenonewline)
|
lift (skipMany spacenonewline)
|
||||||
hours <-
|
hours <-
|
||||||
try (followingcommentp >> return 0)
|
try (lift followingcommentp >> return 0)
|
||||||
<|> (timedotdurationp <*
|
<|> (timedotdurationp <*
|
||||||
(try followingcommentp <|> (newline >> return "")))
|
(try (lift followingcommentp) <|> (newline >> return "")))
|
||||||
let t = nulltransaction{
|
let t = nulltransaction{
|
||||||
tsourcepos = pos,
|
tsourcepos = pos,
|
||||||
tstatus = Cleared,
|
tstatus = Cleared,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user