Safe Haskell | None |
---|---|
Language | Haskell2010 |
A reader for hledger's journal file format (http://hledger.org/MANUAL.html#the-journal-file). hledger's journal format is a compatible subset of c++ ledger's (http://ledger-cli.org/3.0/doc/ledger3.html#Journal-Format), so this reader should handle many ledger files as well. Example:
2012/3/24 gift expenses:gifts $10 assets:cash
Journal format supports the include directive which can read files in other formats, so the other file format readers need to be importable here. Some low-level journal syntax parsers which those readers also use are therefore defined separately in Hledger.Read.Common, avoiding import cycles.
Synopsis
- reader :: Reader
- genericSourcePos :: SourcePos -> GenericSourcePos
- parseAndFinaliseJournal :: ErroringJournalParser IO ParsedJournal -> InputOpts -> FilePath -> Text -> ExceptT String IO Journal
- runJournalParser :: Monad m => JournalParser m a -> Text -> m (Either (ParseErrorBundle Text CustomErr) a)
- rjp :: Monad m => JournalParser m a -> Text -> m (Either (ParseErrorBundle Text CustomErr) a)
- getParentAccount :: JournalParser m AccountName
- journalp :: MonadIO m => ErroringJournalParser m ParsedJournal
- directivep :: MonadIO m => ErroringJournalParser m ()
- defaultyeardirectivep :: JournalParser m ()
- marketpricedirectivep :: JournalParser m PriceDirective
- datetimep :: JournalParser m LocalTime
- datep :: JournalParser m Day
- modifiedaccountnamep :: JournalParser m AccountName
- postingp :: Maybe Year -> JournalParser m Posting
- statusp :: TextParser m Status
- emptyorcommentlinep :: TextParser m ()
- followingcommentp :: TextParser m Text
- accountaliasp :: TextParser m AccountAlias
- tests_JournalReader :: TestTree
Reader
Parsing utils
parseAndFinaliseJournal :: ErroringJournalParser IO ParsedJournal -> InputOpts -> FilePath -> Text -> ExceptT String IO Journal Source #
Given a megaparsec ParsedJournal parser, input options, file path and file content: parse and finalise a Journal, or give an error.
runJournalParser :: Monad m => JournalParser m a -> Text -> m (Either (ParseErrorBundle Text CustomErr) a) Source #
Run a journal parser in some monad. See also: parseWithState.
rjp :: Monad m => JournalParser m a -> Text -> m (Either (ParseErrorBundle Text CustomErr) a) Source #
Run a journal parser in some monad. See also: parseWithState.
Parsers used elsewhere
journalp :: MonadIO m => ErroringJournalParser m ParsedJournal Source #
A journal parser. Accumulates and returns a ParsedJournal, which should be finalised/validated before use.
>>>
rejp (journalp <* eof) "2015/1/1\n a 0\n"
Right (Right Journal with 1 transactions, 1 accounts)
directivep :: MonadIO m => ErroringJournalParser m () Source #
Parse any journal directive and update the parse state accordingly. Cf http://hledger.org/manual.html#directives, http://ledger-cli.org/3.0/doc/ledger3.html#Command-Directives
defaultyeardirectivep :: JournalParser m () Source #
datetimep :: JournalParser m LocalTime Source #
Parse a date and time in YYYYMMDD HH:MM[:SS][+-ZZZZ] format. Hyphen (-) and period (.) are also allowed as date separators. The year may be omitted if a default year has been set. Seconds are optional. The timezone is optional and ignored (the time is always interpreted as a local time). Leading zeroes may be omitted (except in a timezone).
datep :: JournalParser m Day Source #
Parse a date in YYYYMMDD format. Hyphen (-) and period (.) are also allowed as separators. The year may be omitted if a default year has been set. Leading zeroes may be omitted.
modifiedaccountnamep :: JournalParser m AccountName Source #
Parse an account name (plus one following space if present), then apply any parent account prefix and/or account aliases currently in effect, in that order. (Ie first add the parent account prefix, then rewrite with aliases).
statusp :: TextParser m Status Source #
emptyorcommentlinep :: TextParser m () Source #
followingcommentp :: TextParser m Text Source #
Parse the text of a (possibly multiline) comment following a journal item.
>>>
rtp followingcommentp "" -- no comment
Right "">>>
rtp followingcommentp ";" -- just a (empty) same-line comment. newline is added
Right "\n">>>
rtp followingcommentp "; \n"
Right "\n">>>
rtp followingcommentp ";\n ;\n" -- a same-line and a next-line comment
Right "\n\n">>>
rtp followingcommentp "\n ;\n" -- just a next-line comment. Insert an empty same-line comment so the next-line comment doesn't become a same-line comment.
Right "\n\n"