diff --git a/src/PDF.hs b/src/PDF.hs index 755365f..d140e1e 100644 --- a/src/PDF.hs +++ b/src/PDF.hs @@ -21,7 +21,7 @@ import PDF.Object ( ) import qualified PDF.Output as Output (render, line) import PDF.Output (Output(..)) -import PDF.Parser (Parser, runParser, string, takeAll) +import PDF.Parser (Parser, evalParser, string, takeAll) import Text.Printf (printf) data Document = Document { @@ -83,7 +83,7 @@ findNextSection offset input = readStructures :: Int -> ByteString -> Either String [InputStructure] readStructures startXref input = - runParser structure () (BS.drop startXref input) >>= stopOrFollow + evalParser structure () (BS.drop startXref input) >>= stopOrFollow where stopOrFollow s@(Structure {trailer}) = case Map.lookup (Name "Prev") trailer of @@ -96,7 +96,7 @@ readStructures startXref input = parseDocument :: ByteString -> Either String Document parseDocument input = do - (pdfVersion, eolStyle) <- runParser ((,) <$> version <*> EOL.parser) () input + (pdfVersion, eolStyle) <- evalParser ((,) <$> version <*> EOL.parser) () input startXref <- readStartXref eolStyle input structuresRead <- readStructures startXref input let updates = populate input <$> structuresRead diff --git a/src/PDF/Body.hs b/src/PDF/Body.hs index e1e1175..5b0063a 100644 --- a/src/PDF/Body.hs +++ b/src/PDF/Body.hs @@ -18,7 +18,7 @@ import PDF.Object ( , blank, dictionary, directObject, integer, line ) import PDF.Output (ObjectId(..), Offset(..)) -import PDF.Parser (Parser, (), block, char, on, option, runParser, takeAll) +import PDF.Parser (Parser, (), block, char, evalParser, on, option, takeAll) data UserState = UserState { input :: ByteString @@ -109,7 +109,7 @@ occurrence = populate :: ByteString -> InputStructure -> Content populate input structure = let bodyInput = BS.drop (startOffset structure) input in - case runParser recurseOnOccurrences initialState bodyInput of + case evalParser recurseOnOccurrences initialState bodyInput of Left _ -> Content {occurrences = [], objects = Map.empty, docStructure} Right finalState -> let Flow {occurrencesStack, tmpObjects} = flow finalState in diff --git a/src/PDF/Parser.hs b/src/PDF/Parser.hs index 3f170e7..f8cd7af 100644 --- a/src/PDF/Parser.hs +++ b/src/PDF/Parser.hs @@ -13,6 +13,7 @@ module PDF.Parser ( , oneOf , option , runParser + , evalParser , sepBy , string , takeAll @@ -80,9 +81,11 @@ oneOf charSet = lift $ Atto.satisfy (`elem` charSet) option :: a -> Parser s a -> Parser s a option defaultValue p = p <|> pure defaultValue -runParser :: Parser s a -> s -> ByteString -> Either String a -runParser parser initState = - Atto.parseOnly (evalStateT parser initState) +runParser :: Parser s a -> s -> ByteString -> Either String (a, s) +runParser parser initState = Atto.parseOnly (runStateT parser initState) + +evalParser :: Parser s a -> s -> ByteString -> Either String a +evalParser parser initState = Atto.parseOnly (evalStateT parser initState) sepBy :: Parser s a -> Parser s b -> Parser s [a] sepBy parser separator =