diff --git a/src/PDF/Object.hs b/src/PDF/Object.hs index dba172d..32f62ce 100644 --- a/src/PDF/Object.hs +++ b/src/PDF/Object.hs @@ -220,16 +220,18 @@ instance Output DirectObject where Output.string (printf "%d %d R" (getObjectId objectId) versionNumber) directObject :: MonadParser m => m DirectObject -directObject = - Boolean <$> boolean - <|> Reference <$> reference {- defined before Number because Number is a prefix of it -} - <|> NumberObject <$> number - <|> StringObject <$> stringObject - <|> NameObject <$> name - <|> Array <$> array - <|> Dictionary <$> dictionary - <|> const Null <$> nullObject - "direct object" +directObject = (peek >>= dispatch) "direct object" + where + dispatch 't' = Boolean <$> boolean + dispatch 'f' = Boolean <$> boolean + dispatch '(' = StringObject <$> stringObject + dispatch '<' = StringObject <$> stringObject <|> Dictionary <$> dictionary + dispatch '/' = NameObject <$> name + dispatch '[' = Array <$> array + dispatch 'n' = nullObject *> return Null + dispatch _ = + Reference <$> reference {- defined before Number because Number is a prefix of it -} + <|> NumberObject <$> number -- -- Object diff --git a/src/PDF/Parser.hs b/src/PDF/Parser.hs index 8dc0fc0..34a0432 100644 --- a/src/PDF/Parser.hs +++ b/src/PDF/Parser.hs @@ -17,8 +17,8 @@ import Control.Monad.Fail (MonadFail(..)) import Control.Monad.State (StateT(..), evalStateT) import Control.Monad.Trans (MonadTrans(..)) import qualified Data.Attoparsec.ByteString.Char8 as Atto ( - Parser, char, endOfInput, parseOnly, satisfy, string, take, takeWhile - , takeWhile1 + Parser, char, endOfInput, parseOnly, peekChar', satisfy, string, take + , takeWhile, takeWhile1 ) import Data.ByteString (ByteString) import Data.ByteString.Char8.Util (B16Int(..)) @@ -36,6 +36,7 @@ class MonadDeps m => MonadParser m where endOfInput :: m () hexNumber :: m B16Int oneOf :: String -> m Char + peek :: m Char string :: ByteString -> m ByteString takeAll :: (Char -> Bool) -> m ByteString takeAll1 :: (Char -> Bool) -> m ByteString @@ -47,6 +48,7 @@ instance MonadParser Atto.Parser where decNumber = Atto.takeWhile1 (`Set.member` digits) hexNumber = B16Int <$> Atto.takeWhile1 (`Set.member` hexDigits) oneOf charSet = Atto.satisfy (`elem` charSet) + peek = Atto.peekChar' string s = Atto.string s show s takeAll = Atto.takeWhile takeAll1 = Atto.takeWhile1 @@ -58,6 +60,7 @@ instance (MonadParser m, MonadTrans t, MonadDeps (t m)) => MonadParser (t m) whe decNumber = lift $ decNumber hexNumber = lift $ hexNumber oneOf = lift . oneOf + peek = lift $ peek string = lift . string takeAll = lift . takeAll takeAll1 = lift . takeAll1