mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
lib: slightly better journal/time format detection
The Journal, Timelog and Timedot readers' detectors now check each line in the sample data, not just the first one. I think the sample data is only about 30 chars right now, but even so this fixed a format detection issue I was seeing.
This commit is contained in:
parent
70863ae40b
commit
a9afd7bcbe
@ -88,9 +88,8 @@ format = "journal"
|
||||
-- | Does the given file path and data look like it might be hledger's journal format ?
|
||||
detect :: FilePath -> String -> Bool
|
||||
detect f s
|
||||
| f /= "-" = takeExtension f `elem` ['.':format, ".j"] -- from a file: yes if the extension is .journal or .j
|
||||
-- from stdin: yes if we can see something that looks like a journal entry (digits in column 0 with the next line indented)
|
||||
| otherwise = regexMatches "^[0-9]+.*\n[ \t]+" s
|
||||
| f /= "-" = takeExtension f `elem` ['.':format, ".j"] -- from a known file name: yes if the extension is this format's name or .j
|
||||
| otherwise = regexMatches "(^|\n)[0-9]+.*\n[ \t]+" s -- from stdin: yes if we can see something that looks like a journal entry (digits in column 0 with the next line indented)
|
||||
|
||||
-- | Parse and post-process a "Journal" from hledger's journal file
|
||||
-- format, or give an error.
|
||||
@ -275,6 +274,7 @@ includedirectivep = do
|
||||
txt <- readFileOrError outerPos filepath
|
||||
let inIncluded = show outerPos ++ " in included file " ++ show filename ++ ":\n"
|
||||
r <- runParserT journalp outerState filepath txt
|
||||
|
||||
case r of
|
||||
Right (ju, ctx) -> do
|
||||
u <- combineJournalUpdates [ return $ journalAddFile (filepath,txt)
|
||||
|
@ -60,9 +60,9 @@ format = "timedot"
|
||||
|
||||
-- | Does the given file path and data look like it might contain this format ?
|
||||
detect :: FilePath -> String -> Bool
|
||||
detect f _s
|
||||
| f /= "-" = takeExtension f == '.':format -- from a file: yes if the extension matches the format name
|
||||
| otherwise = False -- from stdin: yes if...
|
||||
detect f s
|
||||
| f /= "-" = takeExtension f == '.':format -- from a file: yes if the extension matches the format name
|
||||
| otherwise = regexMatches "(^|\n)[0-9]" s -- from stdin: yes if we can see a possible timedot day entry (digits in column 0)
|
||||
|
||||
-- | Parse and post-process a "Journal" from the timedot format, or give an error.
|
||||
parse :: Maybe FilePath -> Bool -> FilePath -> String -> ExceptT String IO Journal
|
||||
|
@ -51,7 +51,7 @@ import Prelude ()
|
||||
import Prelude.Compat
|
||||
import Control.Monad (liftM)
|
||||
import Control.Monad.Except (ExceptT)
|
||||
import Data.List (isPrefixOf, foldl')
|
||||
import Data.List (foldl')
|
||||
import Data.Maybe (fromMaybe)
|
||||
import Test.HUnit
|
||||
import Text.Parsec hiding (parse)
|
||||
@ -75,8 +75,8 @@ format = "timelog"
|
||||
-- | Does the given file path and data look like it might be timeclock.el's timelog format ?
|
||||
detect :: FilePath -> String -> Bool
|
||||
detect f s
|
||||
| f /= "-" = takeExtension f == '.':format -- from a file: yes if the extension is .timelog
|
||||
| otherwise = "i " `isPrefixOf` s || "o " `isPrefixOf` s -- from stdin: yes if it starts with "i " or "o "
|
||||
| f /= "-" = takeExtension f == '.':format -- from a known file name: yes if the extension is this format's name
|
||||
| otherwise = regexMatches "(^|\n)[io] " s -- from stdin: yes if any line starts with "i " or "o "
|
||||
|
||||
-- | Parse and post-process a "Journal" from timeclock.el's timelog
|
||||
-- format, saving the provided file path and the current time, or give an
|
||||
|
Loading…
Reference in New Issue
Block a user