parsing: read files in universal newline mode
Line endings other than the unix style, are now accepted in journal and rules files.
This commit is contained in:
parent
7b6a59123d
commit
af5c0e80e0
@ -63,7 +63,6 @@ import System.Time (getClockTime)
|
|||||||
import Hledger.Data
|
import Hledger.Data
|
||||||
import Hledger.Utils
|
import Hledger.Utils
|
||||||
import Prelude hiding (readFile)
|
import Prelude hiding (readFile)
|
||||||
import Hledger.Utils.UTF8IOCompat (readFile)
|
|
||||||
|
|
||||||
|
|
||||||
-- standard reader exports
|
-- standard reader exports
|
||||||
@ -196,7 +195,7 @@ includedirective = do
|
|||||||
Right (ju,_) -> combineJournalUpdates [return $ journalAddFile (filepath,txt), ju] `catchError` (throwError . (inIncluded ++))
|
Right (ju,_) -> combineJournalUpdates [return $ journalAddFile (filepath,txt), 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) `C.catch`
|
ErrorT $ liftM Right (readFile' fp) `C.catch`
|
||||||
\e -> return $ Left $ printf "%s reading %s:\n%s" (show pos) fp (show (e::C.IOException))
|
\e -> return $ Left $ printf "%s reading %s:\n%s" (show pos) fp (show (e::C.IOException))
|
||||||
|
|
||||||
journalAddFile :: (FilePath,String) -> Journal -> Journal
|
journalAddFile :: (FilePath,String) -> Journal -> Journal
|
||||||
|
|||||||
@ -40,6 +40,7 @@ import Data.Tree
|
|||||||
import Debug.Trace
|
import Debug.Trace
|
||||||
import System.Directory (getHomeDirectory)
|
import System.Directory (getHomeDirectory)
|
||||||
import System.FilePath((</>), isRelative)
|
import System.FilePath((</>), isRelative)
|
||||||
|
import System.IO
|
||||||
import Test.HUnit
|
import Test.HUnit
|
||||||
import Text.ParserCombinators.Parsec
|
import Text.ParserCombinators.Parsec
|
||||||
import Text.Printf
|
import Text.Printf
|
||||||
@ -490,3 +491,10 @@ expandPath curdir p = (if isRelative p then (curdir </>) else id) `liftM` expand
|
|||||||
firstJust ms = case dropWhile (==Nothing) ms of
|
firstJust ms = case dropWhile (==Nothing) ms of
|
||||||
[] -> Nothing
|
[] -> Nothing
|
||||||
(md:_) -> md
|
(md:_) -> md
|
||||||
|
|
||||||
|
-- | Read a file in universal newline mode, handling whatever newline convention it may contain.
|
||||||
|
readFile' :: FilePath -> IO String
|
||||||
|
readFile' name = do
|
||||||
|
h <- openFile name ReadMode
|
||||||
|
hSetNewlineMode h universalNewlineMode
|
||||||
|
hGetContents h
|
||||||
|
|||||||
@ -141,7 +141,7 @@ openBrowserOn u = trybrowsers browsers u
|
|||||||
-- indicating whether we did anything.
|
-- indicating whether we did anything.
|
||||||
writeFileWithBackupIfChanged :: FilePath -> String -> IO Bool
|
writeFileWithBackupIfChanged :: FilePath -> String -> IO Bool
|
||||||
writeFileWithBackupIfChanged f t = do
|
writeFileWithBackupIfChanged f t = do
|
||||||
s <- readFile f
|
s <- readFile' f
|
||||||
if t == s then return False
|
if t == s then return False
|
||||||
else backUpFile f >> writeFile f t >> return True
|
else backUpFile f >> writeFile f t >> return True
|
||||||
|
|
||||||
@ -151,7 +151,7 @@ writeFileWithBackup :: FilePath -> String -> IO ()
|
|||||||
writeFileWithBackup f t = backUpFile f >> writeFile f t
|
writeFileWithBackup f t = backUpFile f >> writeFile f t
|
||||||
|
|
||||||
readFileStrictly :: FilePath -> IO String
|
readFileStrictly :: FilePath -> IO String
|
||||||
readFileStrictly f = readFile f >>= \s -> C.evaluate (length s) >> return s
|
readFileStrictly f = readFile' f >>= \s -> C.evaluate (length s) >> return s
|
||||||
|
|
||||||
-- | Back up this file with a (incrementing) numbered suffix, or give an error.
|
-- | Back up this file with a (incrementing) numbered suffix, or give an error.
|
||||||
backUpFile :: FilePath -> IO ()
|
backUpFile :: FilePath -> IO ()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user