remember all included file paths, if any
This commit is contained in:
parent
96036e56a0
commit
8429df0f32
@ -41,6 +41,7 @@ nulljournal = Journal { jmodifiertxns = []
|
|||||||
, historical_prices = []
|
, historical_prices = []
|
||||||
, final_comment_lines = []
|
, final_comment_lines = []
|
||||||
, filepath = ""
|
, filepath = ""
|
||||||
|
, allfilepaths = []
|
||||||
, filereadtime = TOD 0 0
|
, filereadtime = TOD 0 0
|
||||||
, jtext = ""
|
, jtext = ""
|
||||||
}
|
}
|
||||||
@ -216,7 +217,7 @@ journalFinalise :: ClockTime -> LocalTime -> FilePath -> String -> Journal -> Jo
|
|||||||
journalFinalise tclock tlocal path txt j = journalCanonicaliseAmounts $
|
journalFinalise tclock tlocal path txt j = journalCanonicaliseAmounts $
|
||||||
journalApplyHistoricalPrices $
|
journalApplyHistoricalPrices $
|
||||||
journalCloseTimeLogEntries tlocal
|
journalCloseTimeLogEntries tlocal
|
||||||
j{filepath=path, filereadtime=tclock, jtext=txt}
|
j{filepath=path, allfilepaths=path:(allfilepaths j), filereadtime=tclock, jtext=txt}
|
||||||
|
|
||||||
-- | Convert all the journal's amounts to their canonical display
|
-- | Convert all the journal's amounts to their canonical display
|
||||||
-- settings. Ie, all amounts in a given commodity will use (a) the
|
-- settings. Ie, all amounts in a given commodity will use (a) the
|
||||||
|
|||||||
@ -129,6 +129,7 @@ data Journal = Journal {
|
|||||||
historical_prices :: [HistoricalPrice],
|
historical_prices :: [HistoricalPrice],
|
||||||
final_comment_lines :: String, -- ^ any trailing comments from the journal file
|
final_comment_lines :: String, -- ^ any trailing comments from the journal file
|
||||||
filepath :: FilePath, -- ^ file path of this journal
|
filepath :: FilePath, -- ^ file path of this journal
|
||||||
|
allfilepaths :: [FilePath], -- ^ file paths of this and any included journals
|
||||||
filereadtime :: ClockTime, -- ^ when this journal was read from its file
|
filereadtime :: ClockTime, -- ^ when this journal was read from its file
|
||||||
jtext :: String -- ^ the raw text read from the journal's file
|
jtext :: String -- ^ the raw text read from the journal's file
|
||||||
} deriving (Eq, Typeable)
|
} deriving (Eq, Typeable)
|
||||||
|
|||||||
@ -28,6 +28,9 @@ data Reader = Reader {rFormat :: String
|
|||||||
-- or raise an error.
|
-- or raise an error.
|
||||||
type JournalUpdate = ErrorT String IO (Journal -> Journal)
|
type JournalUpdate = ErrorT String IO (Journal -> Journal)
|
||||||
|
|
||||||
|
juSequence :: [JournalUpdate] -> JournalUpdate
|
||||||
|
juSequence us = liftM (foldr (.) id) $ sequence us
|
||||||
|
|
||||||
-- | Given a JournalUpdate-generating parsec parser, file path and data string,
|
-- | Given a JournalUpdate-generating parsec parser, file path and data string,
|
||||||
-- parse and post-process a Journal so that it's ready to use, or give an error.
|
-- parse and post-process a Journal so that it's ready to use, or give an error.
|
||||||
parseJournalWith :: (GenParser Char JournalContext JournalUpdate) -> FilePath -> String -> ErrorT String IO Journal
|
parseJournalWith :: (GenParser Char JournalContext JournalUpdate) -> FilePath -> String -> ErrorT String IO Journal
|
||||||
|
|||||||
@ -156,9 +156,9 @@ parse = parseJournalWith journalFile
|
|||||||
-- error-raising "JournalUpdate" which can be applied to an empty journal
|
-- error-raising "JournalUpdate" which can be applied to an empty journal
|
||||||
-- to get the final result.
|
-- to get the final result.
|
||||||
journalFile :: GenParser Char JournalContext JournalUpdate
|
journalFile :: GenParser Char JournalContext JournalUpdate
|
||||||
journalFile = do items <- many journalItem
|
journalFile = do journalupdates <- many journalItem
|
||||||
eof
|
eof
|
||||||
return $ liftM (foldr (.) id) $ sequence items
|
return $ juSequence journalupdates
|
||||||
where
|
where
|
||||||
-- As all journal line types can be distinguished by the first
|
-- As all journal line types can be distinguished by the first
|
||||||
-- character, excepting transactions versus empty (blank or
|
-- character, excepting transactions versus empty (blank or
|
||||||
@ -175,6 +175,9 @@ journalFile = do items <- many journalItem
|
|||||||
, emptyLine >> return (return id)
|
, emptyLine >> return (return id)
|
||||||
] <?> "journal transaction or directive"
|
] <?> "journal transaction or directive"
|
||||||
|
|
||||||
|
journalAddFilePath :: FilePath -> Journal -> Journal
|
||||||
|
journalAddFilePath f j@Journal{allfilepaths=fs} = j{allfilepaths=fs++[f]}
|
||||||
|
|
||||||
emptyLine :: GenParser Char st ()
|
emptyLine :: GenParser Char st ()
|
||||||
emptyLine = do many spacenonewline
|
emptyLine = do many spacenonewline
|
||||||
optional $ (char ';' <?> "comment") >> many (noneOf "\n")
|
optional $ (char ';' <?> "comment") >> many (noneOf "\n")
|
||||||
@ -217,7 +220,7 @@ ledgerInclude = do
|
|||||||
contents <- readFileOrError outerPos filepath
|
contents <- readFileOrError outerPos filepath
|
||||||
let inIncluded = show outerPos ++ " in included file " ++ show filename ++ ":\n"
|
let inIncluded = show outerPos ++ " in included file " ++ show filename ++ ":\n"
|
||||||
case runParser journalFile outerState filepath contents of
|
case runParser journalFile outerState filepath contents of
|
||||||
Right ju -> ju `catchError` (throwError . (inIncluded ++))
|
Right ju -> juSequence [return $ journalAddFilePath filepath, ju] `catchError` (throwError . (inIncluded ++))
|
||||||
Left err -> throwError $ inIncluded ++ show err
|
Left err -> throwError $ inIncluded ++ show err
|
||||||
where readFileOrError pos fp =
|
where readFileOrError pos fp =
|
||||||
ErrorT $ liftM Right (readFile fp) `catch`
|
ErrorT $ liftM Right (readFile fp) `catch`
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user