diff --git a/src/PDF/CMap.hs b/src/PDF/CMap.hs index 729ff1d..97549d6 100644 --- a/src/PDF/CMap.hs +++ b/src/PDF/CMap.hs @@ -18,12 +18,12 @@ import Data.ByteString.Char8 (unpack) import Data.ByteString.Char8.Util ( B16Int(..), b16ToBytes, b16ToInt, toBytes, utf16BEToutf8 ) -import Data.Map (Map, union) +import Data.Map (Map, mapWithKey, union) import qualified Data.Map as Map ( adjust, empty, fromList, insert, insertWith, lookup, toList ) import Data.Text (Text) -import qualified Data.Text as Text (length) +import qualified Data.Text as Text (length, null, splitAt) import qualified PDF.EOL as EOL (charset, parser) import PDF.Font (Decoder, Encoder, Font(..)) import PDF.Object ( @@ -72,7 +72,16 @@ decoder rangesBySize input outputSequence -> outputSequence encoder :: Map Size FromUnicode -> Encoder -encoder = undefined +encoder fromUnicodes input + | Text.null input = Right "" + | otherwise = + foldl (<>) (Left "No encoding found") $ mapWithKey tryOn fromUnicodes + where + tryOn size fromUnicode = + let (prefix, end) = Text.splitAt size input in + case Map.lookup prefix fromUnicode of + Nothing -> Left "" + Just code -> (code <>) <$> encoder fromUnicodes end matches :: ByteString -> CRange -> Bool matches code (CRange {fromSequence, toSequence}) =