packages feed

hpdft-0.4.6.0: src/PDF/Type1.hs

{-# LANGUAGE OverloadedStrings #-}

module PDF.Type1 (encoding) where

import Numeric (readInt)
import Data.Char (chr)

import Data.Word
import Data.Bits

import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as BSC
import qualified Data.ByteString.Lazy as BSL

import Data.Attoparsec.ByteString.Char8
import qualified Data.Attoparsec.ByteString as AP
import Data.Attoparsec.Combinator

import Control.Applicative

import qualified Data.Map as Map
import qualified Data.Text as T

import PDF.Definition

test f = do
  c <- BS.readFile f
  return $ encoding c

spaces = skipMany (oneOf " \n\r") --skipSpace
oneOf = satisfy . inClass
noneOf = satisfy . notInClass

encoding :: ByteString -> Encoding
encoding c = case parseOnly encodingArray c of
  Right ss -> Encoding $ Map.fromListWith (flip const) ss
  Left _   -> NullMap

encodingArray :: Parser [(Char,T.Text)]
encodingArray = do
  manyTill anyChar (try $ lookAhead $ string "/Encoding")
  string "/Encoding"
  spaces
  choice [ [] <$ (string "StandardEncoding"
                   >> spaces >> string "def")
         , (skipFor >> spaces 
             *> manyTill specialEncodings
             (try $ string "readonly" <|> string "def"))
         ]
    where
      skipFor = manyTill anyChar (try $ string "for")

specialEncodings :: Parser (Char, T.Text)
specialEncodings = do
  spaces 
  (,) <$> (spaces >> string "dup" >> spaces *> index)
    <*> (spaces >> charName <* spaces)
  where
    index = (chr . read) <$> many1 digit
    charName = T.pack <$> manyTill anyChar (try $ (spaces >> string "put"))