pdf-toolbox-content 0.0.5.1 → 0.1.1
raw patch · 31 files changed
+7369/−6653 lines, 31 filesdep +hspecdep +pdf-toolbox-contentdep +scientificdep ~attoparsecdep ~basedep ~base16-bytestringPVP ok
version bump matches the API change (PVP)
Dependencies added: hspec, pdf-toolbox-content, scientific, vector
Dependency ranges changed: attoparsec, base, base16-bytestring, pdf-toolbox-core
API changes (from Hackage documentation)
- Pdf.Toolbox.Content.Encoding.MacRoman: encoding :: Map Word8 Text
- Pdf.Toolbox.Content.Encoding.WinAnsi: encoding :: Map Word8 Text
- Pdf.Toolbox.Content.FontInfo: CIDFontWidths :: Map Int Double -> [(Int, Int, Double)] -> CIDFontWidths
- Pdf.Toolbox.Content.FontInfo: FIComposite :: Maybe UnicodeCMap -> CIDFontWidths -> Double -> FIComposite
- Pdf.Toolbox.Content.FontInfo: FISimple :: Maybe UnicodeCMap -> Maybe SimpleFontEncoding -> Maybe (Int, Int, [Double]) -> Transform Double -> FISimple
- Pdf.Toolbox.Content.FontInfo: FontBaseEncodingMacRoman :: FontBaseEncoding
- Pdf.Toolbox.Content.FontInfo: FontBaseEncodingWinAnsi :: FontBaseEncoding
- Pdf.Toolbox.Content.FontInfo: FontInfoComposite :: FIComposite -> FontInfo
- Pdf.Toolbox.Content.FontInfo: FontInfoSimple :: FISimple -> FontInfo
- Pdf.Toolbox.Content.FontInfo: SimpleFontEncoding :: FontBaseEncoding -> [(Word8, ByteString)] -> SimpleFontEncoding
- Pdf.Toolbox.Content.FontInfo: [cidFontWidthsChars] :: CIDFontWidths -> Map Int Double
- Pdf.Toolbox.Content.FontInfo: [cidFontWidthsRanges] :: CIDFontWidths -> [(Int, Int, Double)]
- Pdf.Toolbox.Content.FontInfo: [fiCompositeDefaultWidth] :: FIComposite -> Double
- Pdf.Toolbox.Content.FontInfo: [fiCompositeUnicodeCMap] :: FIComposite -> Maybe UnicodeCMap
- Pdf.Toolbox.Content.FontInfo: [fiCompositeWidths] :: FIComposite -> CIDFontWidths
- Pdf.Toolbox.Content.FontInfo: [fiSimpleEncoding] :: FISimple -> Maybe SimpleFontEncoding
- Pdf.Toolbox.Content.FontInfo: [fiSimpleFontMatrix] :: FISimple -> Transform Double
- Pdf.Toolbox.Content.FontInfo: [fiSimpleUnicodeCMap] :: FISimple -> Maybe UnicodeCMap
- Pdf.Toolbox.Content.FontInfo: [fiSimpleWidths] :: FISimple -> Maybe (Int, Int, [Double])
- Pdf.Toolbox.Content.FontInfo: [simpleFontBaseEncoding] :: SimpleFontEncoding -> FontBaseEncoding
- Pdf.Toolbox.Content.FontInfo: [simpleFontDifferences] :: SimpleFontEncoding -> [(Word8, ByteString)]
- Pdf.Toolbox.Content.FontInfo: cidFontGetWidth :: CIDFontWidths -> Int -> Maybe Double
- Pdf.Toolbox.Content.FontInfo: data CIDFontWidths
- Pdf.Toolbox.Content.FontInfo: data FIComposite
- Pdf.Toolbox.Content.FontInfo: data FISimple
- Pdf.Toolbox.Content.FontInfo: data FontBaseEncoding
- Pdf.Toolbox.Content.FontInfo: data FontInfo
- Pdf.Toolbox.Content.FontInfo: data SimpleFontEncoding
- Pdf.Toolbox.Content.FontInfo: fontInfoDecodeGlyphs :: FontInfo -> Str -> [(Glyph, Double)]
- Pdf.Toolbox.Content.FontInfo: instance GHC.Base.Monoid Pdf.Toolbox.Content.FontInfo.CIDFontWidths
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.CIDFontWidths
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.FIComposite
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.FISimple
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.FontBaseEncoding
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.FontInfo
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.SimpleFontEncoding
- Pdf.Toolbox.Content.FontInfo: makeCIDFontWidths :: Monad m => Array -> PdfE m CIDFontWidths
- Pdf.Toolbox.Content.GlyphList: adobeGlyphList :: Map ByteString Char
- Pdf.Toolbox.Content.Ops: Obj :: (Object ()) -> Expr
- Pdf.Toolbox.Content.Ops: Op :: Op -> Expr
- Pdf.Toolbox.Content.Ops: Op_B :: Op
- Pdf.Toolbox.Content.Ops: Op_BDC :: Op
- Pdf.Toolbox.Content.Ops: Op_BI :: Op
- Pdf.Toolbox.Content.Ops: Op_BMC :: Op
- Pdf.Toolbox.Content.Ops: Op_BT :: Op
- Pdf.Toolbox.Content.Ops: Op_BX :: Op
- Pdf.Toolbox.Content.Ops: Op_B_star :: Op
- Pdf.Toolbox.Content.Ops: Op_CS :: Op
- Pdf.Toolbox.Content.Ops: Op_DP :: Op
- Pdf.Toolbox.Content.Ops: Op_Do :: Op
- Pdf.Toolbox.Content.Ops: Op_EI :: Op
- Pdf.Toolbox.Content.Ops: Op_EMC :: Op
- Pdf.Toolbox.Content.Ops: Op_ET :: Op
- Pdf.Toolbox.Content.Ops: Op_EX :: Op
- Pdf.Toolbox.Content.Ops: Op_F :: Op
- Pdf.Toolbox.Content.Ops: Op_G :: Op
- Pdf.Toolbox.Content.Ops: Op_ID :: Op
- Pdf.Toolbox.Content.Ops: Op_J :: Op
- Pdf.Toolbox.Content.Ops: Op_K :: Op
- Pdf.Toolbox.Content.Ops: Op_M :: Op
- Pdf.Toolbox.Content.Ops: Op_MP :: Op
- Pdf.Toolbox.Content.Ops: Op_Q :: Op
- Pdf.Toolbox.Content.Ops: Op_RG :: Op
- Pdf.Toolbox.Content.Ops: Op_S :: Op
- Pdf.Toolbox.Content.Ops: Op_SC :: Op
- Pdf.Toolbox.Content.Ops: Op_SCN :: Op
- Pdf.Toolbox.Content.Ops: Op_TD :: Op
- Pdf.Toolbox.Content.Ops: Op_TJ :: Op
- Pdf.Toolbox.Content.Ops: Op_TL :: Op
- Pdf.Toolbox.Content.Ops: Op_T_star :: Op
- Pdf.Toolbox.Content.Ops: Op_Tc :: Op
- Pdf.Toolbox.Content.Ops: Op_Td :: Op
- Pdf.Toolbox.Content.Ops: Op_Tf :: Op
- Pdf.Toolbox.Content.Ops: Op_Tj :: Op
- Pdf.Toolbox.Content.Ops: Op_Tm :: Op
- Pdf.Toolbox.Content.Ops: Op_Tr :: Op
- Pdf.Toolbox.Content.Ops: Op_Ts :: Op
- Pdf.Toolbox.Content.Ops: Op_Tw :: Op
- Pdf.Toolbox.Content.Ops: Op_Tz :: Op
- Pdf.Toolbox.Content.Ops: Op_W :: Op
- Pdf.Toolbox.Content.Ops: Op_W_star :: Op
- Pdf.Toolbox.Content.Ops: Op_apostrophe :: Op
- Pdf.Toolbox.Content.Ops: Op_b :: Op
- Pdf.Toolbox.Content.Ops: Op_b_star :: Op
- Pdf.Toolbox.Content.Ops: Op_c :: Op
- Pdf.Toolbox.Content.Ops: Op_cm :: Op
- Pdf.Toolbox.Content.Ops: Op_cs :: Op
- Pdf.Toolbox.Content.Ops: Op_d :: Op
- Pdf.Toolbox.Content.Ops: Op_d0 :: Op
- Pdf.Toolbox.Content.Ops: Op_d1 :: Op
- Pdf.Toolbox.Content.Ops: Op_f :: Op
- Pdf.Toolbox.Content.Ops: Op_f_star :: Op
- Pdf.Toolbox.Content.Ops: Op_g :: Op
- Pdf.Toolbox.Content.Ops: Op_gs :: Op
- Pdf.Toolbox.Content.Ops: Op_h :: Op
- Pdf.Toolbox.Content.Ops: Op_i :: Op
- Pdf.Toolbox.Content.Ops: Op_j :: Op
- Pdf.Toolbox.Content.Ops: Op_k :: Op
- Pdf.Toolbox.Content.Ops: Op_l :: Op
- Pdf.Toolbox.Content.Ops: Op_m :: Op
- Pdf.Toolbox.Content.Ops: Op_n :: Op
- Pdf.Toolbox.Content.Ops: Op_q :: Op
- Pdf.Toolbox.Content.Ops: Op_quote :: Op
- Pdf.Toolbox.Content.Ops: Op_re :: Op
- Pdf.Toolbox.Content.Ops: Op_rg :: Op
- Pdf.Toolbox.Content.Ops: Op_ri :: Op
- Pdf.Toolbox.Content.Ops: Op_s :: Op
- Pdf.Toolbox.Content.Ops: Op_sc :: Op
- Pdf.Toolbox.Content.Ops: Op_scn :: Op
- Pdf.Toolbox.Content.Ops: Op_sh :: Op
- Pdf.Toolbox.Content.Ops: Op_v :: Op
- Pdf.Toolbox.Content.Ops: Op_w :: Op
- Pdf.Toolbox.Content.Ops: Op_y :: Op
- Pdf.Toolbox.Content.Ops: UnknownOp :: ByteString -> Op
- Pdf.Toolbox.Content.Ops: data Expr
- Pdf.Toolbox.Content.Ops: data Op
- Pdf.Toolbox.Content.Ops: instance GHC.Classes.Eq Pdf.Toolbox.Content.Ops.Expr
- Pdf.Toolbox.Content.Ops: instance GHC.Classes.Eq Pdf.Toolbox.Content.Ops.Op
- Pdf.Toolbox.Content.Ops: instance GHC.Show.Show Pdf.Toolbox.Content.Ops.Expr
- Pdf.Toolbox.Content.Ops: instance GHC.Show.Show Pdf.Toolbox.Content.Ops.Op
- Pdf.Toolbox.Content.Ops: toOp :: ByteString -> Op
- Pdf.Toolbox.Content.Ops: type Operator = (Op, [Object ()])
- Pdf.Toolbox.Content.Parser: parseContent :: Parser (Maybe Expr)
- Pdf.Toolbox.Content.Parser: parseContentStream :: MonadIO m => RIS -> [StreamFilter] -> (Ref -> IS -> IO IS) -> [(Stream Int64, Ref, Int)] -> PdfE m (InputStream Expr)
- Pdf.Toolbox.Content.Parser: readNextOperator :: MonadIO m => InputStream Expr -> PdfE m (Maybe Operator)
- Pdf.Toolbox.Content.Processor: Glyph :: Int -> Vector Double -> Vector Double -> Maybe Text -> Glyph
- Pdf.Toolbox.Content.Processor: GraphicsState :: Bool -> Transform Double -> Maybe Name -> Maybe Double -> Transform Double -> Transform Double -> Double -> Double -> Double -> GraphicsState
- Pdf.Toolbox.Content.Processor: Processor :: GraphicsState -> [GraphicsState] -> GlyphDecoder -> [[Glyph]] -> Processor
- Pdf.Toolbox.Content.Processor: [glyphBottomRight] :: Glyph -> Vector Double
- Pdf.Toolbox.Content.Processor: [glyphCode] :: Glyph -> Int
- Pdf.Toolbox.Content.Processor: [glyphText] :: Glyph -> Maybe Text
- Pdf.Toolbox.Content.Processor: [glyphTopLeft] :: Glyph -> Vector Double
- Pdf.Toolbox.Content.Processor: [gsCurrentTransformMatrix] :: GraphicsState -> Transform Double
- Pdf.Toolbox.Content.Processor: [gsFontSize] :: GraphicsState -> Maybe Double
- Pdf.Toolbox.Content.Processor: [gsFont] :: GraphicsState -> Maybe Name
- Pdf.Toolbox.Content.Processor: [gsInText] :: GraphicsState -> Bool
- Pdf.Toolbox.Content.Processor: [gsTextCharSpacing] :: GraphicsState -> Double
- Pdf.Toolbox.Content.Processor: [gsTextLeading] :: GraphicsState -> Double
- Pdf.Toolbox.Content.Processor: [gsTextLineMatrix] :: GraphicsState -> Transform Double
- Pdf.Toolbox.Content.Processor: [gsTextMatrix] :: GraphicsState -> Transform Double
- Pdf.Toolbox.Content.Processor: [gsTextWordSpacing] :: GraphicsState -> Double
- Pdf.Toolbox.Content.Processor: [prGlyphDecoder] :: Processor -> GlyphDecoder
- Pdf.Toolbox.Content.Processor: [prGlyphs] :: Processor -> [[Glyph]]
- Pdf.Toolbox.Content.Processor: [prStateStack] :: Processor -> [GraphicsState]
- Pdf.Toolbox.Content.Processor: [prState] :: Processor -> GraphicsState
- Pdf.Toolbox.Content.Processor: data Glyph
- Pdf.Toolbox.Content.Processor: data GraphicsState
- Pdf.Toolbox.Content.Processor: data Processor
- Pdf.Toolbox.Content.Processor: initialGraphicsState :: GraphicsState
- Pdf.Toolbox.Content.Processor: instance GHC.Show.Show Pdf.Toolbox.Content.Processor.Glyph
- Pdf.Toolbox.Content.Processor: instance GHC.Show.Show Pdf.Toolbox.Content.Processor.GraphicsState
- Pdf.Toolbox.Content.Processor: mkProcessor :: Processor
- Pdf.Toolbox.Content.Processor: processOp :: Monad m => Operator -> Processor -> PdfE m Processor
- Pdf.Toolbox.Content.Processor: type GlyphDecoder = Name -> Str -> [(Glyph, Double)]
- Pdf.Toolbox.Content.TexGlyphList: texGlyphList :: Map ByteString Char
- Pdf.Toolbox.Content.Transform: Transform :: a -> a -> a -> a -> a -> a -> Transform a
- Pdf.Toolbox.Content.Transform: Vector :: a -> a -> Vector a
- Pdf.Toolbox.Content.Transform: data Transform a
- Pdf.Toolbox.Content.Transform: data Vector a
- Pdf.Toolbox.Content.Transform: identity :: Num a => Transform a
- Pdf.Toolbox.Content.Transform: instance GHC.Show.Show a => GHC.Show.Show (Pdf.Toolbox.Content.Transform.Transform a)
- Pdf.Toolbox.Content.Transform: instance GHC.Show.Show a => GHC.Show.Show (Pdf.Toolbox.Content.Transform.Vector a)
- Pdf.Toolbox.Content.Transform: multiply :: Num a => Transform a -> Transform a -> Transform a
- Pdf.Toolbox.Content.Transform: scale :: Num a => a -> a -> Transform a
- Pdf.Toolbox.Content.Transform: transform :: Num a => Transform a -> Vector a -> Vector a
- Pdf.Toolbox.Content.Transform: translate :: Num a => a -> a -> Transform a -> Transform a
- Pdf.Toolbox.Content.Transform: translation :: Num a => a -> a -> Transform a
- Pdf.Toolbox.Content.UnicodeCMap: UnicodeCMap :: [(ByteString, ByteString)] -> Map Int Text -> [(Int, Int, Char)] -> UnicodeCMap
- Pdf.Toolbox.Content.UnicodeCMap: [unicodeCMapChars] :: UnicodeCMap -> Map Int Text
- Pdf.Toolbox.Content.UnicodeCMap: [unicodeCMapCodeRanges] :: UnicodeCMap -> [(ByteString, ByteString)]
- Pdf.Toolbox.Content.UnicodeCMap: [unicodeCMapRanges] :: UnicodeCMap -> [(Int, Int, Char)]
- Pdf.Toolbox.Content.UnicodeCMap: data UnicodeCMap
- Pdf.Toolbox.Content.UnicodeCMap: instance GHC.Show.Show Pdf.Toolbox.Content.UnicodeCMap.UnicodeCMap
- Pdf.Toolbox.Content.UnicodeCMap: parseUnicodeCMap :: ByteString -> Either String UnicodeCMap
- Pdf.Toolbox.Content.UnicodeCMap: unicodeCMapDecodeGlyph :: UnicodeCMap -> Int -> Maybe Text
- Pdf.Toolbox.Content.UnicodeCMap: unicodeCMapNextGlyph :: UnicodeCMap -> ByteString -> Maybe (Int, ByteString)
+ Pdf.Content.Encoding.MacRoman: encoding :: Map Word8 Text
+ Pdf.Content.Encoding.PdfDoc: encoding :: Map Word8 Text
+ Pdf.Content.Encoding.WinAnsi: encoding :: Map Word8 Text
+ Pdf.Content.FontDescriptor: AllCap :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: FixedPitch :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: FontDescriptor :: ByteString -> Maybe ByteString -> Maybe ByteString -> Maybe Int -> Int64 -> Maybe (Rectangle Double) -> Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe ByteString -> FontDescriptor
+ Pdf.Content.FontDescriptor: ForceBold :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: Italic :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: NonSymbolic :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: Script :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: Serif :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: SmallCap :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: Symbolic :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: [fdAscent] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdAvgWidth] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdCapHeight] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdCharSet] :: FontDescriptor -> Maybe ByteString
+ Pdf.Content.FontDescriptor: [fdDescent] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdFlags] :: FontDescriptor -> Int64
+ Pdf.Content.FontDescriptor: [fdFontBBox] :: FontDescriptor -> Maybe (Rectangle Double)
+ Pdf.Content.FontDescriptor: [fdFontFamily] :: FontDescriptor -> Maybe ByteString
+ Pdf.Content.FontDescriptor: [fdFontName] :: FontDescriptor -> ByteString
+ Pdf.Content.FontDescriptor: [fdFontStretch] :: FontDescriptor -> Maybe ByteString
+ Pdf.Content.FontDescriptor: [fdFontWeight] :: FontDescriptor -> Maybe Int
+ Pdf.Content.FontDescriptor: [fdItalicAngle] :: FontDescriptor -> Double
+ Pdf.Content.FontDescriptor: [fdLeading] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdMaxWidth] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdMissingWidth] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdStemH] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdStemV] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdXHeight] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: data FontDescriptor
+ Pdf.Content.FontDescriptor: data FontDescriptorFlag
+ Pdf.Content.FontDescriptor: flagSet :: FontDescriptor -> FontDescriptorFlag -> Bool
+ Pdf.Content.FontDescriptor: instance GHC.Show.Show Pdf.Content.FontDescriptor.FontDescriptor
+ Pdf.Content.FontInfo: CIDFontWidths :: Map Int Double -> [(Int, Int, Double)] -> CIDFontWidths
+ Pdf.Content.FontInfo: FIComposite :: Maybe UnicodeCMap -> CIDFontWidths -> Double -> Maybe FontDescriptor -> FIComposite
+ Pdf.Content.FontInfo: FISimple :: Maybe UnicodeCMap -> Maybe SimpleFontEncoding -> Maybe (Int, Int, [Double]) -> Transform Double -> Maybe FontDescriptor -> FISimple
+ Pdf.Content.FontInfo: FontBaseEncodingMacRoman :: FontBaseEncoding
+ Pdf.Content.FontInfo: FontBaseEncodingWinAnsi :: FontBaseEncoding
+ Pdf.Content.FontInfo: FontInfoComposite :: FIComposite -> FontInfo
+ Pdf.Content.FontInfo: FontInfoSimple :: FISimple -> FontInfo
+ Pdf.Content.FontInfo: SimpleFontEncoding :: FontBaseEncoding -> [(Word8, ByteString)] -> SimpleFontEncoding
+ Pdf.Content.FontInfo: [cidFontWidthsChars] :: CIDFontWidths -> Map Int Double
+ Pdf.Content.FontInfo: [cidFontWidthsRanges] :: CIDFontWidths -> [(Int, Int, Double)]
+ Pdf.Content.FontInfo: [fiCompositeDefaultWidth] :: FIComposite -> Double
+ Pdf.Content.FontInfo: [fiCompositeFontDescriptor] :: FIComposite -> Maybe FontDescriptor
+ Pdf.Content.FontInfo: [fiCompositeUnicodeCMap] :: FIComposite -> Maybe UnicodeCMap
+ Pdf.Content.FontInfo: [fiCompositeWidths] :: FIComposite -> CIDFontWidths
+ Pdf.Content.FontInfo: [fiSimpleEncoding] :: FISimple -> Maybe SimpleFontEncoding
+ Pdf.Content.FontInfo: [fiSimpleFontDescriptor] :: FISimple -> Maybe FontDescriptor
+ Pdf.Content.FontInfo: [fiSimpleFontMatrix] :: FISimple -> Transform Double
+ Pdf.Content.FontInfo: [fiSimpleUnicodeCMap] :: FISimple -> Maybe UnicodeCMap
+ Pdf.Content.FontInfo: [fiSimpleWidths] :: FISimple -> Maybe (Int, Int, [Double])
+ Pdf.Content.FontInfo: [simpleFontBaseEncoding] :: SimpleFontEncoding -> FontBaseEncoding
+ Pdf.Content.FontInfo: [simpleFontDifferences] :: SimpleFontEncoding -> [(Word8, ByteString)]
+ Pdf.Content.FontInfo: cidFontGetWidth :: CIDFontWidths -> Int -> Maybe Double
+ Pdf.Content.FontInfo: data CIDFontWidths
+ Pdf.Content.FontInfo: data FIComposite
+ Pdf.Content.FontInfo: data FISimple
+ Pdf.Content.FontInfo: data FontBaseEncoding
+ Pdf.Content.FontInfo: data FontInfo
+ Pdf.Content.FontInfo: data SimpleFontEncoding
+ Pdf.Content.FontInfo: fontInfoDecodeGlyphs :: FontInfo -> ByteString -> [(Glyph, Double)]
+ Pdf.Content.FontInfo: instance GHC.Base.Monoid Pdf.Content.FontInfo.CIDFontWidths
+ Pdf.Content.FontInfo: instance GHC.Base.Semigroup Pdf.Content.FontInfo.CIDFontWidths
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.CIDFontWidths
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.FIComposite
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.FISimple
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.FontBaseEncoding
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.FontInfo
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.SimpleFontEncoding
+ Pdf.Content.FontInfo: makeCIDFontWidths :: Array -> Either String CIDFontWidths
+ Pdf.Content.GlyphList: adobeGlyphList :: Map ByteString Char
+ Pdf.Content.Ops: Obj :: Object -> Expr
+ Pdf.Content.Ops: Op :: Op -> Expr
+ Pdf.Content.Ops: Op_B :: Op
+ Pdf.Content.Ops: Op_BDC :: Op
+ Pdf.Content.Ops: Op_BI :: Op
+ Pdf.Content.Ops: Op_BMC :: Op
+ Pdf.Content.Ops: Op_BT :: Op
+ Pdf.Content.Ops: Op_BX :: Op
+ Pdf.Content.Ops: Op_B_star :: Op
+ Pdf.Content.Ops: Op_CS :: Op
+ Pdf.Content.Ops: Op_DP :: Op
+ Pdf.Content.Ops: Op_Do :: Op
+ Pdf.Content.Ops: Op_EI :: Op
+ Pdf.Content.Ops: Op_EMC :: Op
+ Pdf.Content.Ops: Op_ET :: Op
+ Pdf.Content.Ops: Op_EX :: Op
+ Pdf.Content.Ops: Op_F :: Op
+ Pdf.Content.Ops: Op_G :: Op
+ Pdf.Content.Ops: Op_ID :: Op
+ Pdf.Content.Ops: Op_J :: Op
+ Pdf.Content.Ops: Op_K :: Op
+ Pdf.Content.Ops: Op_M :: Op
+ Pdf.Content.Ops: Op_MP :: Op
+ Pdf.Content.Ops: Op_Q :: Op
+ Pdf.Content.Ops: Op_RG :: Op
+ Pdf.Content.Ops: Op_S :: Op
+ Pdf.Content.Ops: Op_SC :: Op
+ Pdf.Content.Ops: Op_SCN :: Op
+ Pdf.Content.Ops: Op_TD :: Op
+ Pdf.Content.Ops: Op_TJ :: Op
+ Pdf.Content.Ops: Op_TL :: Op
+ Pdf.Content.Ops: Op_T_star :: Op
+ Pdf.Content.Ops: Op_Tc :: Op
+ Pdf.Content.Ops: Op_Td :: Op
+ Pdf.Content.Ops: Op_Tf :: Op
+ Pdf.Content.Ops: Op_Tj :: Op
+ Pdf.Content.Ops: Op_Tm :: Op
+ Pdf.Content.Ops: Op_Tr :: Op
+ Pdf.Content.Ops: Op_Ts :: Op
+ Pdf.Content.Ops: Op_Tw :: Op
+ Pdf.Content.Ops: Op_Tz :: Op
+ Pdf.Content.Ops: Op_W :: Op
+ Pdf.Content.Ops: Op_W_star :: Op
+ Pdf.Content.Ops: Op_apostrophe :: Op
+ Pdf.Content.Ops: Op_b :: Op
+ Pdf.Content.Ops: Op_b_star :: Op
+ Pdf.Content.Ops: Op_c :: Op
+ Pdf.Content.Ops: Op_cm :: Op
+ Pdf.Content.Ops: Op_cs :: Op
+ Pdf.Content.Ops: Op_d :: Op
+ Pdf.Content.Ops: Op_d0 :: Op
+ Pdf.Content.Ops: Op_d1 :: Op
+ Pdf.Content.Ops: Op_f :: Op
+ Pdf.Content.Ops: Op_f_star :: Op
+ Pdf.Content.Ops: Op_g :: Op
+ Pdf.Content.Ops: Op_gs :: Op
+ Pdf.Content.Ops: Op_h :: Op
+ Pdf.Content.Ops: Op_i :: Op
+ Pdf.Content.Ops: Op_j :: Op
+ Pdf.Content.Ops: Op_k :: Op
+ Pdf.Content.Ops: Op_l :: Op
+ Pdf.Content.Ops: Op_m :: Op
+ Pdf.Content.Ops: Op_n :: Op
+ Pdf.Content.Ops: Op_q :: Op
+ Pdf.Content.Ops: Op_quote :: Op
+ Pdf.Content.Ops: Op_re :: Op
+ Pdf.Content.Ops: Op_rg :: Op
+ Pdf.Content.Ops: Op_ri :: Op
+ Pdf.Content.Ops: Op_s :: Op
+ Pdf.Content.Ops: Op_sc :: Op
+ Pdf.Content.Ops: Op_scn :: Op
+ Pdf.Content.Ops: Op_sh :: Op
+ Pdf.Content.Ops: Op_v :: Op
+ Pdf.Content.Ops: Op_w :: Op
+ Pdf.Content.Ops: Op_y :: Op
+ Pdf.Content.Ops: UnknownOp :: ByteString -> Op
+ Pdf.Content.Ops: data Expr
+ Pdf.Content.Ops: data Op
+ Pdf.Content.Ops: instance GHC.Classes.Eq Pdf.Content.Ops.Expr
+ Pdf.Content.Ops: instance GHC.Classes.Eq Pdf.Content.Ops.Op
+ Pdf.Content.Ops: instance GHC.Show.Show Pdf.Content.Ops.Expr
+ Pdf.Content.Ops: instance GHC.Show.Show Pdf.Content.Ops.Op
+ Pdf.Content.Ops: toOp :: ByteString -> Op
+ Pdf.Content.Ops: type Operator = (Op, [Object])
+ Pdf.Content.Parser: parseContent :: Parser (Maybe Expr)
+ Pdf.Content.Parser: readNextOperator :: InputStream Expr -> IO (Maybe Operator)
+ Pdf.Content.Processor: Glyph :: Int -> Vector Double -> Vector Double -> Maybe Text -> Glyph
+ Pdf.Content.Processor: GraphicsState :: Bool -> Transform Double -> Maybe Name -> Maybe Double -> Transform Double -> Transform Double -> Double -> Double -> Double -> GraphicsState
+ Pdf.Content.Processor: Processor :: GraphicsState -> [GraphicsState] -> GlyphDecoder -> [Span] -> Processor
+ Pdf.Content.Processor: Span :: [Glyph] -> Name -> Span
+ Pdf.Content.Processor: [glyphBottomRight] :: Glyph -> Vector Double
+ Pdf.Content.Processor: [glyphCode] :: Glyph -> Int
+ Pdf.Content.Processor: [glyphText] :: Glyph -> Maybe Text
+ Pdf.Content.Processor: [glyphTopLeft] :: Glyph -> Vector Double
+ Pdf.Content.Processor: [gsCurrentTransformMatrix] :: GraphicsState -> Transform Double
+ Pdf.Content.Processor: [gsFontSize] :: GraphicsState -> Maybe Double
+ Pdf.Content.Processor: [gsFont] :: GraphicsState -> Maybe Name
+ Pdf.Content.Processor: [gsInText] :: GraphicsState -> Bool
+ Pdf.Content.Processor: [gsTextCharSpacing] :: GraphicsState -> Double
+ Pdf.Content.Processor: [gsTextLeading] :: GraphicsState -> Double
+ Pdf.Content.Processor: [gsTextLineMatrix] :: GraphicsState -> Transform Double
+ Pdf.Content.Processor: [gsTextMatrix] :: GraphicsState -> Transform Double
+ Pdf.Content.Processor: [gsTextWordSpacing] :: GraphicsState -> Double
+ Pdf.Content.Processor: [prGlyphDecoder] :: Processor -> GlyphDecoder
+ Pdf.Content.Processor: [prSpans] :: Processor -> [Span]
+ Pdf.Content.Processor: [prStateStack] :: Processor -> [GraphicsState]
+ Pdf.Content.Processor: [prState] :: Processor -> GraphicsState
+ Pdf.Content.Processor: [spFontName] :: Span -> Name
+ Pdf.Content.Processor: [spGlyphs] :: Span -> [Glyph]
+ Pdf.Content.Processor: data Glyph
+ Pdf.Content.Processor: data GraphicsState
+ Pdf.Content.Processor: data Processor
+ Pdf.Content.Processor: data Span
+ Pdf.Content.Processor: initialGraphicsState :: GraphicsState
+ Pdf.Content.Processor: instance GHC.Show.Show Pdf.Content.Processor.Glyph
+ Pdf.Content.Processor: instance GHC.Show.Show Pdf.Content.Processor.GraphicsState
+ Pdf.Content.Processor: mkProcessor :: Processor
+ Pdf.Content.Processor: processOp :: Operator -> Processor -> Either String Processor
+ Pdf.Content.Processor: type GlyphDecoder = Name -> ByteString -> [(Glyph, Double)]
+ Pdf.Content.TexGlyphList: texGlyphList :: Map ByteString Char
+ Pdf.Content.Transform: Transform :: a -> a -> a -> a -> a -> a -> Transform a
+ Pdf.Content.Transform: Vector :: a -> a -> Vector a
+ Pdf.Content.Transform: data Transform a
+ Pdf.Content.Transform: data Vector a
+ Pdf.Content.Transform: identity :: Num a => Transform a
+ Pdf.Content.Transform: instance GHC.Show.Show a => GHC.Show.Show (Pdf.Content.Transform.Transform a)
+ Pdf.Content.Transform: instance GHC.Show.Show a => GHC.Show.Show (Pdf.Content.Transform.Vector a)
+ Pdf.Content.Transform: multiply :: Num a => Transform a -> Transform a -> Transform a
+ Pdf.Content.Transform: scale :: Num a => a -> a -> Transform a
+ Pdf.Content.Transform: transform :: Num a => Transform a -> Vector a -> Vector a
+ Pdf.Content.Transform: translate :: Num a => a -> a -> Transform a -> Transform a
+ Pdf.Content.Transform: translation :: Num a => a -> a -> Transform a
+ Pdf.Content.UnicodeCMap: UnicodeCMap :: [(ByteString, ByteString)] -> Map Int Text -> [(Int, Int, Char)] -> UnicodeCMap
+ Pdf.Content.UnicodeCMap: [unicodeCMapChars] :: UnicodeCMap -> Map Int Text
+ Pdf.Content.UnicodeCMap: [unicodeCMapCodeRanges] :: UnicodeCMap -> [(ByteString, ByteString)]
+ Pdf.Content.UnicodeCMap: [unicodeCMapRanges] :: UnicodeCMap -> [(Int, Int, Char)]
+ Pdf.Content.UnicodeCMap: data UnicodeCMap
+ Pdf.Content.UnicodeCMap: instance GHC.Show.Show Pdf.Content.UnicodeCMap.UnicodeCMap
+ Pdf.Content.UnicodeCMap: parseUnicodeCMap :: ByteString -> Either String UnicodeCMap
+ Pdf.Content.UnicodeCMap: unicodeCMapDecodeGlyph :: UnicodeCMap -> Int -> Maybe Text
+ Pdf.Content.UnicodeCMap: unicodeCMapNextGlyph :: UnicodeCMap -> ByteString -> Maybe (Int, ByteString)
Files
- changelog.md +5/−18
- compat/Prelude.hs +4/−12
- lib/Pdf/Content.hs +21/−0
- lib/Pdf/Content/Encoding/MacRoman.hs +437/−0
- lib/Pdf/Content/Encoding/PdfDoc.hs +271/−0
- lib/Pdf/Content/Encoding/WinAnsi.hs +455/−0
- lib/Pdf/Content/FontDescriptor.hs +60/−0
- lib/Pdf/Content/FontInfo.hs +277/−0
- lib/Pdf/Content/GlyphList.hs +4299/−0
- lib/Pdf/Content/Ops.hs +196/−0
- lib/Pdf/Content/Parser.hs +55/−0
- lib/Pdf/Content/Processor.hs +354/−0
- lib/Pdf/Content/TexGlyphList.hs +304/−0
- lib/Pdf/Content/Transform.hs +56/−0
- lib/Pdf/Content/UnicodeCMap.hs +204/−0
- lib/Pdf/Toolbox/Content.hs +0/−20
- lib/Pdf/Toolbox/Content/Encoding/MacRoman.hs +0/−437
- lib/Pdf/Toolbox/Content/Encoding/WinAnsi.hs +0/−455
- lib/Pdf/Toolbox/Content/FontInfo.hs +0/−223
- lib/Pdf/Toolbox/Content/GlyphList.hs +0/−4299
- lib/Pdf/Toolbox/Content/Ops.hs +0/−196
- lib/Pdf/Toolbox/Content/Parser.hs +0/−119
- lib/Pdf/Toolbox/Content/Processor.hs +0/−298
- lib/Pdf/Toolbox/Content/TexGlyphList.hs +0/−304
- lib/Pdf/Toolbox/Content/Transform.hs +0/−54
- lib/Pdf/Toolbox/Content/UnicodeCMap.hs +0/−203
- pdf-toolbox-content.cabal +43/−15
- test/Test/FontDescriptor.hs +73/−0
- test/Test/Parser.hs +73/−0
- test/Test/UnicodeCMap.hs +164/−0
- test/test.hs +18/−0
changelog.md view
@@ -1,23 +1,10 @@-0.0.5.1--* fix compilation on ghc 7.4, 7.6 and 7.8--0.0.5.0--* add support for multiple bfrange and bfchars sections in CMap-* support spaces inside hex numbers in CMap--0.0.4.0--* switch to errors-2.0-* workaround for parse error on inline image in content stream--0.0.3.3--* support ghc-7.10.1+unreleased -0.0.3.2+0.1.1 +* rework API+* support ghc from 8.0 to 8.10 and drop older versions+* lots of improvements to text extraction * support array ranges in unicode cmap (#15) * support Op\_apostrophe content operator (#16)
compat/Prelude.hs view
@@ -5,24 +5,16 @@ ( module P, -#if MIN_VERSION_base(4,8,0)+#if MIN_VERSION_base(4,11,0) #else- (<$>),- Monoid(..),- Applicative(..),+ Semigroup(..), #endif ) where -#if MIN_VERSION_base(4,6,0) import "base" Prelude as P-#else-import "base" Prelude as P hiding (catch)-#endif -#if MIN_VERSION_base(4,8,0)+#if MIN_VERSION_base(4,11,0) #else-import Data.Functor ((<$>))-import Data.Monoid(Monoid(..))-import Control.Applicative (Applicative(..))+import Data.Semigroup(Semigroup(..)) #endif
+ lib/Pdf/Content.hs view
@@ -0,0 +1,21 @@++-- | Low level tools for processing PDF page content stream.++module Pdf.Content+( module Pdf.Content.Ops+, module Pdf.Content.Parser+, module Pdf.Content.UnicodeCMap+, module Pdf.Content.Processor+, module Pdf.Content.Transform+, module Pdf.Content.FontInfo+, module Pdf.Content.FontDescriptor+)+where++import Pdf.Content.Ops+import Pdf.Content.Parser+import Pdf.Content.UnicodeCMap+import Pdf.Content.Processor+import Pdf.Content.Transform+import Pdf.Content.FontInfo+import Pdf.Content.FontDescriptor
+ lib/Pdf/Content/Encoding/MacRoman.hs view
@@ -0,0 +1,437 @@+{-# LANGUAGE OverloadedStrings #-}++module Pdf.Content.Encoding.MacRoman+(+ encoding+)+where++import Data.Word+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Text (Text)++encoding :: Map Word8 Text+encoding = Map.fromList $ zip codes chars++chars :: [Text]+chars = [+ "A",+ "Æ",+ "Á",+ "Â",+ "Ä",+ "À",+ "Å",+ "Ã",+ "B",+ "C",+ "Ç",+ "D",+ "E",+ "É",+ "Ê",+ "Ë",+ "È",+ "F",+ "G",+ "H",+ "I",+ "Í",+ "Î",+ "Ï",+ "Ì",+ "J",+ "K",+ "L",+ "M",+ "N",+ "Ñ",+ "O",+ "Œ",+ "Ó",+ "Ô",+ "Ö",+ "Ò",+ "Ø",+ "Õ",+ "P",+ "Q",+ "R",+ "S",+ "T",+ "U",+ "Ú",+ "Û",+ "Ü",+ "Ù",+ "V",+ "W",+ "X",+ "Y",+ "Ÿ",+ "Z",+ "a",+ "á",+ "â",+ "´",+ "ä",+ "æ",+ "à",+ "&",+ "å",+ "^",+ "~",+ "*",+ "@",+ "ã",+ "b",+ "\\",+ "|",+ "{",+ "}",+ "[",+ "]",+ "˘",+ "•",+ "c",+ "ˇ",+ "ç",+ " ̧",+ "¢",+ "ˆ",+ ":",+ ",",+ "©",+ "¤",+ "d",+ "†",+ "‡",+ "°",+ "¨",+ "÷",+ "$",+ "˙",+ "ı",+ "e",+ "é",+ "ê",+ "ë",+ "è",+ "8",+ "…",+ "—",+ "–",+ "=",+ "!",+ "¡",+ "f",+ "fi",+ "5",+ "fl",+ "ƒ",+ "4",+ "⁄",+ "g",+ "ß",+ "`",+ ">",+ "«",+ "»",+ "‹",+ "›",+ "h",+ "˝",+ "-",+ "i",+ "í",+ "î",+ "ï",+ "ì",+ "j",+ "k",+ "l",+ "<",+ "¬",+ "m",+ " ̄",+ "μ",+ "n",+ "9",+ "ñ",+ "#",+ "o",+ "ó",+ "ô",+ "ö",+ "œ",+ "˛",+ "ò",+ "1",+ "ª",+ "º",+ "ø",+ "õ",+ "p",+ "¶",+ "(",+ ")",+ "%",+ ".",+ "·",+ "‰",+ "+",+ "±",+ "q",+ "?",+ "¿",+ "\"",+ "„",+ "“",+ "”",+ "‘",+ "’",+ "‚",+ "'",+ "r",+ "®",+ "∘",+ "s",+ "§",+ ";",+ "7",+ "6",+ "/",+ " ",+ "£",+ "t",+ "3",+ "~",+ "™",+ "2",+ "u",+ "ú",+ "û",+ "ü",+ "ù",+ "_",+ "v",+ "w",+ "x",+ "y",+ "ÿ",+ "¥",+ "z",+ "0"+ ]++codes :: [Word8]+codes = [+ 0o101,+ 0o256,+ 0o347,+ 0o345,+ 0o200,+ 0o313,+ 0o201,+ 0o314,+ 0o102,+ 0o103,+ 0o202,+ 0o104,+ 0o105,+ 0o203,+ 0o346,+ 0o350,+ 0o351,+ 0o106,+ 0o107,+ 0o110,+ 0o111,+ 0o352,+ 0o353,+ 0o354,+ 0o355,+ 0o112,+ 0o113,+ 0o114,+ 0o115,+ 0o116,+ 0o204,+ 0o117,+ 0o316,+ 0o356,+ 0o357,+ 0o205,+ 0o361,+ 0o257,+ 0o315,+ 0o120,+ 0o121,+ 0o122,+ 0o123,+ 0o124,+ 0o125,+ 0o362,+ 0o363,+ 0o206,+ 0o364,+ 0o126,+ 0o127,+ 0o130,+ 0o131,+ 0o331,+ 0o132,+ 0o141,+ 0o207,+ 0o211,+ 0o253,+ 0o212,+ 0o276,+ 0o210,+ 0o046,+ 0o214,+ 0o136,+ 0o176,+ 0o052,+ 0o100,+ 0o213,+ 0o142,+ 0o134,+ 0o174,+ 0o173,+ 0o175,+ 0o133,+ 0o135,+ 0o371,+ 0o245,+ 0o143,+ 0o377,+ 0o215,+ 0o374,+ 0o242,+ 0o366,+ 0o072,+ 0o054,+ 0o251,+ 0o333,+ 0o144,+ 0o240,+ 0o340,+ 0o241,+ 0o254,+ 0o326,+ 0o044,+ 0o372,+ 0o365,+ 0o145,+ 0o216,+ 0o220,+ 0o221,+ 0o217,+ 0o070,+ 0o311,+ 0o321,+ 0o320,+ 0o075,+ 0o041,+ 0o301,+ 0o146,+ 0o336,+ 0o065,+ 0o337,+ 0o304,+ 0o064,+ 0o332,+ 0o147,+ 0o247,+ 0o140,+ 0o076,+ 0o307,+ 0o310,+ 0o334,+ 0o335,+ 0o150,+ 0o375,+ 0o055,+ 0o151,+ 0o222,+ 0o224,+ 0o225,+ 0o223,+ 0o152,+ 0o153,+ 0o154,+ 0o074,+ 0o302,+ 0o155,+ 0o370,+ 0o265,+ 0o156,+ 0o071,+ 0o226,+ 0o043,+ 0o157,+ 0o227,+ 0o231,+ 0o232,+ 0o317,+ 0o376,+ 0o230,+ 0o061,+ 0o273,+ 0o274,+ 0o277,+ 0o233,+ 0o160,+ 0o246,+ 0o050,+ 0o051,+ 0o045,+ 0o056,+ 0o341,+ 0o344,+ 0o053,+ 0o261,+ 0o161,+ 0o077,+ 0o300,+ 0o042,+ 0o343,+ 0o322,+ 0o323,+ 0o324,+ 0o325,+ 0o342,+ 0o047,+ 0o162,+ 0o250,+ 0o373,+ 0o163,+ 0o244,+ 0o073,+ 0o067,+ 0o066,+ 0o057,+ 0o040,+ 0o243,+ 0o164,+ 0o063,+ 0o367,+ 0o252,+ 0o062,+ 0o165,+ 0o234,+ 0o236,+ 0o237,+ 0o235,+ 0o137,+ 0o166,+ 0o167,+ 0o170,+ 0o171,+ 0o330,+ 0o264,+ 0o172,+ 0o060+ ]
+ lib/Pdf/Content/Encoding/PdfDoc.hs view
@@ -0,0 +1,271 @@+{-# LANGUAGE OverloadedStrings #-}++module Pdf.Content.Encoding.PdfDoc+( encoding+)+where++import Data.Word+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Text (Text)++encoding :: Map Word8 Text+encoding = Map.fromList+ [ (0, "\x0000")+ , (1, "\x0001")+ , (2, "\x0002")+ , (3, "\x0003")+ , (4, "\x0004")+ , (5, "\x0005")+ , (6, "\x0006")+ , (7, "\x0007")+ , (8, "\x0008")+ , (9, "\x0009")+ , (10, "\x000A")+ , (11, "\x000B")+ , (12, "\x000C")+ , (13, "\x000D")+ , (14, "\x000E")+ , (15, "\x000F")+ , (16, "\x0010")+ , (17, "\x0011")+ , (18, "\x0012")+ , (19, "\x0013")+ , (20, "\x0014")+ , (21, "\x0015")+ , (22, "\x0017")+ , (23, "\x0017")+ , (24, "\x02D8")+ , (25, "\x02C7")+ , (26, "\x02C6")+ , (27, "\x02D9")+ , (28, "\x02DD")+ , (29, "\x02DB")+ , (30, "\x02DA")+ , (31, "\x02DC")+ , (32, "\x0020")+ , (33, "\x0021")+ , (34, "\x0022")+ , (35, "\x0023")+ , (36, "\x0024")+ , (37, "\x0025")+ , (38, "\x0026")+ , (39, "\x0027")+ , (40, "\x0028")+ , (41, "\x0029")+ , (42, "\x002A")+ , (43, "\x002B")+ , (44, "\x002C")+ , (45, "\x002D")+ , (46, "\x002E")+ , (47, "\x002F")+ , (48, "\x0030")+ , (49, "\x0031")+ , (50, "\x0032")+ , (51, "\x0033")+ , (52, "\x0034")+ , (53, "\x0035")+ , (54, "\x0036")+ , (55, "\x0037")+ , (56, "\x0038")+ , (57, "\x0039")+ , (58, "\x003A")+ , (59, "\x003B")+ , (60, "\x003C")+ , (61, "\x003D")+ , (62, "\x003E")+ , (63, "\x003F")+ , (64, "\x0040")+ , (65, "\x0041")+ , (66, "\x0042")+ , (67, "\x0043")+ , (68, "\x0044")+ , (69, "\x0045")+ , (70, "\x0046")+ , (71, "\x0047")+ , (72, "\x0048")+ , (73, "\x0049")+ , (74, "\x004A")+ , (75, "\x004B")+ , (76, "\x004C")+ , (77, "\x004D")+ , (78, "\x004E")+ , (79, "\x004F")+ , (80, "\x0050")+ , (81, "\x0051")+ , (82, "\x0052")+ , (83, "\x0053")+ , (84, "\x0054")+ , (85, "\x0055")+ , (86, "\x0056")+ , (87, "\x0057")+ , (88, "\x0058")+ , (89, "\x0059")+ , (90, "\x005A")+ , (91, "\x005B")+ , (92, "\x005C")+ , (93, "\x005D")+ , (94, "\x005E")+ , (95, "\x005F")+ , (96, "\x0060")+ , (97, "\x0061")+ , (98, "\x0062")+ , (99, "\x0063")+ , (100, "\x0064")+ , (101, "\x0065")+ , (102, "\x0066")+ , (103, "\x0067")+ , (104, "\x0068")+ , (105, "\x0069")+ , (106, "\x006A")+ , (107, "\x006B")+ , (108, "\x006C")+ , (109, "\x006D")+ , (110, "\x006E")+ , (111, "\x006F")+ , (112, "\x0070")+ , (113, "\x0071")+ , (114, "\x0072")+ , (115, "\x0073")+ , (116, "\x0074")+ , (117, "\x0075")+ , (118, "\x0076")+ , (119, "\x0077")+ , (120, "\x0078")+ , (121, "\x0079")+ , (122, "\x007A")+ , (123, "\x007B")+ , (124, "\x007C")+ , (125, "\x007D")+ , (126, "\x007E")+ -- there is no 127+ , (128, "\x2022")+ , (129, "\x2020")+ , (130, "\x2021")+ , (131, "\x2026")+ , (132, "\x2014")+ , (133, "\x2013")+ , (134, "\x0192")+ , (135, "\x2044")+ , (136, "\x2039")+ , (137, "\x203A")+ , (138, "\x2212")+ , (139, "\x2030")+ , (140, "\x201E")+ , (141, "\x201C")+ , (142, "\x201D")+ , (143, "\x2018")+ , (144, "\x2019")+ , (145, "\x201A")+ , (146, "\x2122")+ , (147, "\xFB01")+ , (148, "\xFB02")+ , (149, "\x0141")+ , (150, "\x0152")+ , (151, "\x0160")+ , (152, "\x0178")+ , (153, "\x017D")+ , (154, "\x0131")+ , (155, "\x0142")+ , (156, "\x0153")+ , (157, "\x0161")+ , (158, "\x017E")+ -- there is no 159+ , (160, "\x20AC")+ , (161, "\x00A1")+ , (162, "\x00A2")+ , (163, "\x00A3")+ , (164, "\x00A4")+ , (165, "\x00A5")+ , (166, "\x00A6")+ , (167, "\x00A7")+ , (168, "\x00A8")+ , (169, "\x00A9")+ , (170, "\x00AA")+ , (171, "\x00AB")+ , (172, "\x00AC")+ -- there is no 173+ , (174, "\x00AE")+ , (175, "\x00AF")+ , (176, "\x00B0")+ , (177, "\x00B1")+ , (178, "\x00B2")+ , (179, "\x00B3")+ , (180, "\x00B4")+ , (181, "\x00B5")+ , (182, "\x00B6")+ , (183, "\x00B7")+ , (184, "\x00B8")+ , (185, "\x00B9")+ , (186, "\x00BA")+ , (187, "\x00BB")+ , (188, "\x00BC")+ , (189, "\x00BD")+ , (190, "\x00BE")+ , (191, "\x00BF")+ , (192, "\x00C0")+ , (193, "\x00C1")+ , (194, "\x00C2")+ , (195, "\x00C3")+ , (196, "\x00C4")+ , (197, "\x00C5")+ , (198, "\x00C6")+ , (199, "\x00C7")+ , (200, "\x00C8")+ , (201, "\x00C9")+ , (202, "\x00CA")+ , (203, "\x00CB")+ , (204, "\x00CC")+ , (205, "\x00CD")+ , (206, "\x00CE")+ , (207, "\x00CF")+ , (208, "\x00D0")+ , (209, "\x00D1")+ , (210, "\x00D2")+ , (211, "\x00D3")+ , (212, "\x00D4")+ , (213, "\x00D5")+ , (214, "\x00D6")+ , (215, "\x00D7")+ , (216, "\x00D8")+ , (217, "\x00D9")+ , (218, "\x00DA")+ , (219, "\x00DB")+ , (220, "\x00DC")+ , (221, "\x00DD")+ , (222, "\x00DE")+ , (223, "\x00DF")+ , (224, "\x00E0")+ , (225, "\x00E1")+ , (226, "\x00E2")+ , (227, "\x00E3")+ , (228, "\x00E4")+ , (229, "\x00E5")+ , (230, "\x00E6")+ , (231, "\x00E7")+ , (232, "\x00E8")+ , (233, "\x00E9")+ , (234, "\x00EA")+ , (235, "\x00EB")+ , (236, "\x00EC")+ , (237, "\x00ED")+ , (238, "\x00EE")+ , (239, "\x00EF")+ , (240, "\x00F0")+ , (241, "\x00F1")+ , (242, "\x00F2")+ , (243, "\x00F3")+ , (244, "\x00F4")+ , (245, "\x00F5")+ , (246, "\x00F6")+ , (247, "\x00F7")+ , (248, "\x00F8")+ , (249, "\x00F9")+ , (250, "\x00FA")+ , (251, "\x00FB")+ , (252, "\x00FC")+ , (253, "\x00FD")+ , (254, "\x00FE")+ , (255, "\x00FF")+ ]
+ lib/Pdf/Content/Encoding/WinAnsi.hs view
@@ -0,0 +1,455 @@+{-# LANGUAGE OverloadedStrings #-}++module Pdf.Content.Encoding.WinAnsi+(+ encoding+)+where++import Data.Word+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Text (Text)++encoding :: Map Word8 Text+encoding = Map.fromList $ zip codes chars++chars :: [Text]+chars = [+ "A",+ "Æ",+ "Á",+ "Â",+ "Ä",+ "À",+ "Å",+ "Ã",+ "B",+ "C",+ "Ç",+ "D",+ "E",+ "É",+ "Ê",+ "Ë",+ "È",+ "Ð",+ "€",+ "F",+ "G",+ "H",+ "I",+ "Í",+ "Î",+ "Ï",+ "Ì",+ "J",+ "K",+ "L",+ "M",+ "N",+ "Ñ",+ "O",+ "Œ",+ "Ó",+ "Ô",+ "Ö",+ "Ò",+ "Ø",+ "Õ",+ "P",+ "Q",+ "R",+ "S",+ "Š",+ "T",+ "Þ",+ "U",+ "Ú",+ "Û",+ "Ü",+ "Ù",+ "V",+ "W",+ "X",+ "Y",+ "Ý",+ "Ÿ",+ "Z",+ "Ž",+ "a",+ "á",+ "â",+ "´",+ "ä",+ "æ",+ "à",+ "&",+ "å",+ "^",+ "~",+ "*",+ "@",+ "ã",+ "b",+ "\\",+ "|",+ "{",+ "}",+ "[",+ "]",+ "¦",+ "•",+ "c",+ "ç",+ " ̧",+ "¢",+ "ˆ",+ ":",+ ",",+ "©",+ "¤",+ "d",+ "†",+ "‡",+ "°",+ "¨",+ "÷",+ "$",+ "e",+ "é",+ "ê",+ "ë",+ "è",+ "8",+ "…",+ "—",+ "–",+ "=",+ "ð",+ "!",+ "¡",+ "f",+ "5",+ "ƒ",+ "4",+ "g",+ "ß",+ "`",+ ">",+ "«",+ "»",+ "‹",+ "›",+ "h",+ "-",+ "i",+ "í",+ "î",+ "ï",+ "ì",+ "j",+ "k",+ "l",+ "<",+ "¬",+ "m",+ " ̄",+ "μ",+ "×",+ "n",+ "9",+ "ñ",+ "#",+ "o",+ "ó",+ "ô",+ "ö",+ "œ",+ "ò",+ "1",+ "½",+ "¼",+ "¹",+ "ª",+ "º",+ "ø",+ "õ",+ "p",+ "¶",+ "(",+ ")",+ "%",+ ".",+ "·",+ "‰",+ "+",+ "±",+ "q",+ "?",+ "¿",+ "\"",+ "„",+ "“",+ "”",+ "‘",+ "’",+ "‚",+ "'",+ "r",+ "®",+ "s",+ "š",+ "§",+ ";",+ "7",+ "6",+ "/",+ " ",+ "£",+ "t",+ "þ",+ "3",+ "¾",+ "³",+ "~",+ "™",+ "2",+ "²",+ "u",+ "ú",+ "û",+ "ü",+ "ù",+ "_",+ "v",+ "w",+ "x",+ "y",+ "ý",+ "ÿ",+ "¥",+ "z",+ "ž",+ "0"+ ]++codes :: [Word8]+codes = [+ 0o101,+ 0o306,+ 0o301,+ 0o302,+ 0o304,+ 0o300,+ 0o305,+ 0o303,+ 0o102,+ 0o103,+ 0o307,+ 0o104,+ 0o105,+ 0o311,+ 0o312,+ 0o313,+ 0o310,+ 0o320,+ 0o200,+ 0o106,+ 0o107,+ 0o110,+ 0o111,+ 0o315,+ 0o316,+ 0o317,+ 0o314,+ 0o112,+ 0o113,+ 0o114,+ 0o115,+ 0o116,+ 0o321,+ 0o117,+ 0o214,+ 0o323,+ 0o324,+ 0o326,+ 0o322,+ 0o330,+ 0o325,+ 0o120,+ 0o121,+ 0o122,+ 0o123,+ 0o212,+ 0o124,+ 0o336,+ 0o125,+ 0o332,+ 0o333,+ 0o334,+ 0o331,+ 0o126,+ 0o127,+ 0o130,+ 0o131,+ 0o335,+ 0o237,+ 0o132,+ 0o216,+ 0o141,+ 0o341,+ 0o342,+ 0o264,+ 0o344,+ 0o346,+ 0o340,+ 0o046,+ 0o345,+ 0o136,+ 0o176,+ 0o052,+ 0o100,+ 0o343,+ 0o142,+ 0o134,+ 0o174,+ 0o173,+ 0o175,+ 0o133,+ 0o135,+ 0o246,+ 0o225,+ 0o143,+ 0o347,+ 0o270,+ 0o242,+ 0o210,+ 0o072,+ 0o054,+ 0o251,+ 0o244,+ 0o144,+ 0o206,+ 0o207,+ 0o260,+ 0o250,+ 0o367,+ 0o044,+ 0o145,+ 0o351,+ 0o352,+ 0o353,+ 0o350,+ 0o070,+ 0o205,+ 0o227,+ 0o226,+ 0o075,+ 0o360,+ 0o041,+ 0o241,+ 0o146,+ 0o065,+ 0o203,+ 0o064,+ 0o147,+ 0o337,+ 0o140,+ 0o076,+ 0o253,+ 0o273,+ 0o213,+ 0o233,+ 0o150,+ 0o055,+ 0o151,+ 0o355,+ 0o356,+ 0o357,+ 0o354,+ 0o152,+ 0o153,+ 0o154,+ 0o074,+ 0o254,+ 0o155,+ 0o257,+ 0o265,+ 0o327,+ 0o156,+ 0o071,+ 0o361,+ 0o043,+ 0o157,+ 0o363,+ 0o364,+ 0o366,+ 0o234,+ 0o362,+ 0o061,+ 0o275,+ 0o274,+ 0o271,+ 0o252,+ 0o272,+ 0o370,+ 0o365,+ 0o160,+ 0o266,+ 0o050,+ 0o051,+ 0o045,+ 0o056,+ 0o267,+ 0o211,+ 0o053,+ 0o261,+ 0o161,+ 0o077,+ 0o277,+ 0o042,+ 0o204,+ 0o223,+ 0o224,+ 0o221,+ 0o222,+ 0o202,+ 0o047,+ 0o162,+ 0o256,+ 0o163,+ 0o232,+ 0o247,+ 0o073,+ 0o067,+ 0o066,+ 0o057,+ 0o040,+ 0o243,+ 0o164,+ 0o376,+ 0o063,+ 0o276,+ 0o263,+ 0o230,+ 0o231,+ 0o062,+ 0o262,+ 0o165,+ 0o372,+ 0o373,+ 0o374,+ 0o371,+ 0o137,+ 0o166,+ 0o167,+ 0o170,+ 0o171,+ 0o375,+ 0o377,+ 0o245,+ 0o172,+ 0o236,+ 0o060+ ]
+ lib/Pdf/Content/FontDescriptor.hs view
@@ -0,0 +1,60 @@++-- | The FontDescriptor describes a font's other metrics than it's+-- widths, see chap. 9.8 of PDF32000:2008++module Pdf.Content.FontDescriptor+ ( FontDescriptor(..)+ , FontDescriptorFlag(..)+ , flagSet+ )+where++import Pdf.Core.Types++import Data.Int+import Data.ByteString (ByteString)++data FontDescriptor = FontDescriptor {+ fdFontName :: ByteString,+ fdFontFamily :: Maybe ByteString,+ fdFontStretch :: Maybe ByteString,+ fdFontWeight :: Maybe Int,+ fdFlags :: Int64, -- must hold at least 32 bit unsigned integers+ fdFontBBox :: Maybe (Rectangle Double),+ fdItalicAngle :: Double,+ fdAscent :: Maybe Double,+ fdDescent :: Maybe Double,+ fdLeading :: Maybe Double,+ fdCapHeight :: Maybe Double,+ fdXHeight :: Maybe Double,+ fdStemV :: Maybe Double,+ fdStemH :: Maybe Double,+ fdAvgWidth :: Maybe Double,+ fdMaxWidth :: Maybe Double,+ fdMissingWidth :: Maybe Double,+ -- FIXME: add FontFile*+ fdCharSet :: Maybe ByteString+ -- FIXME: add special fields for CIDFonts+ } deriving (Show)+++data FontDescriptorFlag =+ FixedPitch | Serif | Symbolic | Script | NonSymbolic | Italic | AllCap | SmallCap | ForceBold+++flagSet :: FontDescriptor -> FontDescriptorFlag -> Bool+flagSet fd FixedPitch = flagSet' 1 (fdFlags fd) 0+flagSet fd Serif = flagSet' 2 (fdFlags fd) 0+flagSet fd Symbolic = flagSet' 3 (fdFlags fd) 0+flagSet fd Script = flagSet' 4 (fdFlags fd) 0+flagSet fd NonSymbolic = flagSet' 6 (fdFlags fd) 0+flagSet fd Italic = flagSet' 7 (fdFlags fd) 0+flagSet fd AllCap = flagSet' 17 (fdFlags fd) 0+flagSet fd SmallCap = flagSet' 18 (fdFlags fd) 0+flagSet fd ForceBold = flagSet' 19 (fdFlags fd) 0++flagSet' :: Int -> Int64 -> Int -> Bool+flagSet' pos val expnt+ | expnt == pos - 1 = val `mod` 2 == 1+ | val == 0 = False+ | otherwise = flagSet' pos (val `div` 2) (expnt+1)
+ lib/Pdf/Content/FontInfo.hs view
@@ -0,0 +1,277 @@++-- | Font info contains information, extracted from font,+-- that may be needed when processing content stream++module Pdf.Content.FontInfo+(+ FontInfo(..),+ FISimple(..),+ FontBaseEncoding(..),+ SimpleFontEncoding(..),+ FIComposite(..),+ CIDFontWidths(..),+ makeCIDFontWidths,+ cidFontGetWidth,+ fontInfoDecodeGlyphs+)+where++import Pdf.Core+import Pdf.Core.Util+import Pdf.Core.Object.Util+import Pdf.Core.Types++import Pdf.Content.UnicodeCMap+import Pdf.Content.Transform+import Pdf.Content.Processor (Glyph(..))+import Pdf.Content.GlyphList+import Pdf.Content.TexGlyphList+import Pdf.Content.FontDescriptor+import qualified Pdf.Content.Encoding.WinAnsi as WinAnsi+import qualified Pdf.Content.Encoding.MacRoman as MacRoman++import Data.List+import Data.Maybe+import Data.Word+import Data.Map (Map)+import qualified Data.Map as Map+import Data.ByteString (ByteString)+import qualified Data.ByteString as BS+import Data.Text (Text)+import qualified Data.Text as Text+import qualified Data.Text.Encoding as Text+import qualified Data.Vector as Vector+import Control.Monad++-- | Font info+data FontInfo+ = FontInfoSimple FISimple+ | FontInfoComposite FIComposite+ deriving (Show)++-- | Font info for simple fonts+data FISimple = FISimple {+ fiSimpleUnicodeCMap :: Maybe UnicodeCMap,+ fiSimpleEncoding :: Maybe SimpleFontEncoding,+ fiSimpleWidths :: Maybe (Int, Int, [Double]),+ -- ^ FirstChar, LastChar, list of widths+ fiSimpleFontMatrix :: Transform Double,+ -- FIXME: no Maybe as soon as this library provides metrics for the+ -- 14 standard fonts+ fiSimpleFontDescriptor :: Maybe FontDescriptor+ }+ deriving (Show)++-- | Standard encoding, other encodings are based on them+data FontBaseEncoding+ = FontBaseEncodingWinAnsi+ | FontBaseEncodingMacRoman+ deriving (Show)++-- | Encoding fo simple font+data SimpleFontEncoding = SimpleFontEncoding {+ simpleFontBaseEncoding :: FontBaseEncoding,+ -- | Mapping from glyph code to glyph name for cases when it is different+ -- from base encoding+ simpleFontDifferences :: [(Word8, ByteString)]+ }+ deriving (Show)++-- | Font info for Type0 font+data FIComposite = FIComposite {+ fiCompositeUnicodeCMap :: Maybe UnicodeCMap,+ fiCompositeWidths :: CIDFontWidths,+ fiCompositeDefaultWidth :: Double,+ -- FontDescriptor is present in CIDFonts, but according to specs+ -- shall not be used with Type0 fonts+ fiCompositeFontDescriptor :: Maybe FontDescriptor+ }+ deriving (Show)++-- | Glyph widths for CID fonts+data CIDFontWidths = CIDFontWidths {+ cidFontWidthsChars :: Map Int Double,+ cidFontWidthsRanges :: [(Int, Int, Double)]+ }+ deriving (Show)++instance Monoid CIDFontWidths where+ mempty = CIDFontWidths {+ cidFontWidthsChars = mempty,+ cidFontWidthsRanges = mempty+ }+ w1 `mappend` w2 = CIDFontWidths {+ cidFontWidthsChars = cidFontWidthsChars w1+ `mappend` cidFontWidthsChars w2,+ cidFontWidthsRanges = cidFontWidthsRanges w1+ `mappend` cidFontWidthsRanges w2+ }++instance Semigroup CIDFontWidths where+ (<>) = mappend++-- | Returns the Y coordinates for a bbox of a glyph of a font, in+-- text space units. Defaults to (0,1) if no FontDescriptor is+-- present.+--+-- Maybe for vertical scripts, there are individual heights for the+-- glyphs, so this takes a glyph code as second argument.+getGlyphYCoordinates :: FontInfo -> Int -> (Double, Double)+getGlyphYCoordinates (FontInfoComposite fi) =+ const $ fromMaybe (0,1) $ join $ fmap (fdYCoordinates 1000) $ fiCompositeFontDescriptor fi+getGlyphYCoordinates (FontInfoSimple fi) =+ const $ fromMaybe (0,1) $ join $ fmap (fdYCoordinates 1000) $ fiSimpleFontDescriptor fi++fdYCoordinates :: Double -> FontDescriptor -> Maybe (Double, Double)+fdYCoordinates scaling fd =+ maybe cap Just $ -- third: try CapHeight+ maybe descAsc Just $ -- second: try Descent and Ascent+ fmap bbox $ fdFontBBox fd -- first: try FontBBox+ where+ bbox (Rectangle _ b _ t) = (b / scaling, t / scaling)+ descAsc = (,) <$> (fmap (/scaling) $ fdDescent fd) <*> (fmap (/scaling) $ fdAscent fd)+ cap = (,) <$> (Just 0.0) <*> (fmap (/scaling) $ fdCapHeight fd)++simpleFontEncodingDecode :: SimpleFontEncoding -> Word8 -> Maybe Text+simpleFontEncodingDecode enc code =+ case lookup code (simpleFontDifferences enc) of+ Nothing ->+ case simpleFontBaseEncoding enc of+ FontBaseEncodingWinAnsi -> Map.lookup code WinAnsi.encoding+ FontBaseEncodingMacRoman -> Map.lookup code MacRoman.encoding+ Just glyphName ->+ case Map.lookup glyphName adobeGlyphList of+ Just c -> Just $ Text.pack [c]+ Nothing ->+ case Map.lookup glyphName texGlyphList of+ Nothing-> Nothing+ Just c -> Just $ Text.pack [c]++-- | Make `CIDFontWidths` from value of \"W\" key in descendant font+makeCIDFontWidths :: Array -> Either String CIDFontWidths+makeCIDFontWidths vals = go mempty (Vector.toList vals)+ `notice` ("Can't parse CIDFont width " ++ show vals)+ where+ go res [] = return res+ go res (x1@Number{} : x2@Number{} : x3@Number{} : xs) = do+ n1 <- intValue x1+ n2 <- intValue x2+ n3 <- realValue x3+ go res {cidFontWidthsRanges = (n1, n2, n3) : cidFontWidthsRanges res} xs+ go res (x : Array arr : xs) = do+ n <- intValue x+ ws <- forM (Vector.toList arr) realValue+ go res {cidFontWidthsChars = Map.fromList (zip [n ..] ws)+ `mappend` cidFontWidthsChars res} xs+ go _ _ = Nothing++-- | Get glyph width by glyph code+cidFontGetWidth :: CIDFontWidths -> Int -> Maybe Double+cidFontGetWidth w code =+ case Map.lookup code (cidFontWidthsChars w) of+ Just width -> Just width+ Nothing -> case find (\(start, end, _) -> code >= start && code <= end)+ (cidFontWidthsRanges w) of+ Just (_, _, width) -> Just width+ _ -> Nothing++-- | Decode string into list of glyphs and their widths+fontInfoDecodeGlyphs :: FontInfo -> ByteString -> [(Glyph, Double)]+fontInfoDecodeGlyphs fInfo@(FontInfoSimple fi) = \bs ->+ flip map (BS.unpack bs) $ \c ->+ let code = fromIntegral c+ txt =+ case fiSimpleUnicodeCMap fi of+ Nothing ->+ case fiSimpleEncoding fi of+ Nothing ->+ case Text.decodeUtf8' (BS.pack [c]) of+ Right t -> Just t+ _ -> Nothing+ Just enc ->+ case simpleFontEncodingDecode enc c of+ Just t -> Just t+ Nothing ->+ case Text.decodeUtf8' (BS.pack [c]) of+ Right t -> Just t+ _ -> Nothing+ Just toUnicode ->+ case unicodeCMapDecodeGlyph toUnicode code of+ Just t -> Just t+ Nothing ->+ case fiSimpleEncoding fi of+ Nothing -> Nothing+ Just enc ->+ case simpleFontEncodingDecode enc c of+ Just t -> Just t+ Nothing ->+ case Text.decodeUtf8' (BS.pack [c]) of+ Right t -> Just t+ _ -> Nothing+ width =+ case fiSimpleWidths fi of+ Nothing -> 0+ Just (firstChar, lastChar, widths) ->+ if code >= firstChar && code <= lastChar+ && (code - firstChar) < length widths+ then let Vector w _ = transform (fiSimpleFontMatrix fi) $+ Vector (widths !! (code - firstChar)) 0+ in w+ else 0+ (yBottom, yTop) = getGlyphYCoordinates fInfo code+ in (Glyph {+ glyphCode = code,+ glyphTopLeft = Vector 0 yBottom,+ glyphBottomRight = Vector width yTop,+ glyphText = txt+ }, width)+fontInfoDecodeGlyphs fInfo@(FontInfoComposite fi) = \bs ->+ case fiCompositeUnicodeCMap fi of+ Nothing -> -- XXX: use encoding here+ tryDecode2byte $ BS.unpack bs+ Just toUnicode ->+ let getWidth = fromMaybe (fiCompositeDefaultWidth fi)+ . cidFontGetWidth (fiCompositeWidths fi)+ in cmapDecodeString getWidth toUnicode fInfo bs+ where+ -- Most of the time composite fonts have 2-byte encoding,+ -- so lets try that for now.+ tryDecode2byte (b1:b2:rest) =+ let code = fromIntegral b1 * 255 + fromIntegral b2+ width = (/ 1000) $ fromMaybe (fiCompositeDefaultWidth fi)+ $ cidFontGetWidth (fiCompositeWidths fi) code+ txt =+ case Text.decodeUtf8' (BS.pack [b1, b2]) of+ Right t -> Just t+ _ -> Nothing+ (yBottom, yTop) = getGlyphYCoordinates fInfo code+ g = Glyph {+ glyphCode = code,+ glyphTopLeft = Vector 0 yBottom,+ glyphBottomRight = Vector width yTop,+ glyphText = txt+ }+ in (g, width) : tryDecode2byte rest+ tryDecode2byte _ = []++cmapDecodeString+ :: (Int -> Double)+ -> UnicodeCMap+ -> FontInfo+ -> ByteString+ -> [(Glyph, Double)]+cmapDecodeString getWidth cmap fInfo str = go str+ where+ go s =+ case unicodeCMapNextGlyph cmap s of+ Nothing -> []+ Just (g, rest) ->+ let width = getWidth g / 1000+ (yBottom, yTop) = getGlyphYCoordinates fInfo g+ glyph = Glyph {+ glyphCode = g,+ glyphTopLeft = Vector 0 yBottom,+ glyphBottomRight = Vector width yTop,+ glyphText = unicodeCMapDecodeGlyph cmap g+ }+ in (glyph, width) : go rest
+ lib/Pdf/Content/GlyphList.hs view
@@ -0,0 +1,4299 @@+{-# LANGUAGE OverloadedStrings #-}++-- | Mapping from glyph names to unicode characters++module Pdf.Content.GlyphList+(+ adobeGlyphList+)+where++import Data.ByteString (ByteString)+import Data.Map (Map)+import qualified Data.Map as Map++-- | Glyph list+adobeGlyphList :: Map ByteString Char+adobeGlyphList = Map.fromList+ [("A", '\x0041')+ ,("AE", '\x00C6')+ ,("AEacute", '\x01FC')+ ,("AEmacron", '\x01E2')+ ,("AEsmall", '\xF7E6')+ ,("Aacute", '\x00C1')+ ,("Aacutesmall", '\xF7E1')+ ,("Abreve", '\x0102')+ ,("Abreveacute", '\x1EAE')+ ,("Abrevecyrillic", '\x04D0')+ ,("Abrevedotbelow", '\x1EB6')+ ,("Abrevegrave", '\x1EB0')+ ,("Abrevehookabove", '\x1EB2')+ ,("Abrevetilde", '\x1EB4')+ ,("Acaron", '\x01CD')+ ,("Acircle", '\x24B6')+ ,("Acircumflex", '\x00C2')+ ,("Acircumflexacute", '\x1EA4')+ ,("Acircumflexdotbelow", '\x1EAC')+ ,("Acircumflexgrave", '\x1EA6')+ ,("Acircumflexhookabove", '\x1EA8')+ ,("Acircumflexsmall", '\xF7E2')+ ,("Acircumflextilde", '\x1EAA')+ ,("Acute", '\xF6C9')+ ,("Acutesmall", '\xF7B4')+ ,("Acyrillic", '\x0410')+ ,("Adblgrave", '\x0200')+ ,("Adieresis", '\x00C4')+ ,("Adieresiscyrillic", '\x04D2')+ ,("Adieresismacron", '\x01DE')+ ,("Adieresissmall", '\xF7E4')+ ,("Adotbelow", '\x1EA0')+ ,("Adotmacron", '\x01E0')+ ,("Agrave", '\x00C0')+ ,("Agravesmall", '\xF7E0')+ ,("Ahookabove", '\x1EA2')+ ,("Aiecyrillic", '\x04D4')+ ,("Ainvertedbreve", '\x0202')+ ,("Alpha", '\x0391')+ ,("Alphatonos", '\x0386')+ ,("Amacron", '\x0100')+ ,("Amonospace", '\xFF21')+ ,("Aogonek", '\x0104')+ ,("Aring", '\x00C5')+ ,("Aringacute", '\x01FA')+ ,("Aringbelow", '\x1E00')+ ,("Aringsmall", '\xF7E5')+ ,("Asmall", '\xF761')+ ,("Atilde", '\x00C3')+ ,("Atildesmall", '\xF7E3')+ ,("Aybarmenian", '\x0531')+ ,("B", '\x0042')+ ,("Bcircle", '\x24B7')+ ,("Bdotaccent", '\x1E02')+ ,("Bdotbelow", '\x1E04')+ ,("Becyrillic", '\x0411')+ ,("Benarmenian", '\x0532')+ ,("Beta", '\x0392')+ ,("Bhook", '\x0181')+ ,("Blinebelow", '\x1E06')+ ,("Bmonospace", '\xFF22')+ ,("Brevesmall", '\xF6F4')+ ,("Bsmall", '\xF762')+ ,("Btopbar", '\x0182')+ ,("C", '\x0043')+ ,("Caarmenian", '\x053E')+ ,("Cacute", '\x0106')+ ,("Caron", '\xF6CA')+ ,("Caronsmall", '\xF6F5')+ ,("Ccaron", '\x010C')+ ,("Ccedilla", '\x00C7')+ ,("Ccedillaacute", '\x1E08')+ ,("Ccedillasmall", '\xF7E7')+ ,("Ccircle", '\x24B8')+ ,("Ccircumflex", '\x0108')+ ,("Cdot", '\x010A')+ ,("Cdotaccent", '\x010A')+ ,("Cedillasmall", '\xF7B8')+ ,("Chaarmenian", '\x0549')+ ,("Cheabkhasiancyrillic", '\x04BC')+ ,("Checyrillic", '\x0427')+ ,("Chedescenderabkhasiancyrillic", '\x04BE')+ ,("Chedescendercyrillic", '\x04B6')+ ,("Chedieresiscyrillic", '\x04F4')+ ,("Cheharmenian", '\x0543')+ ,("Chekhakassiancyrillic", '\x04CB')+ ,("Cheverticalstrokecyrillic", '\x04B8')+ ,("Chi", '\x03A7')+ ,("Chook", '\x0187')+ ,("Circumflexsmall", '\xF6F6')+ ,("Cmonospace", '\xFF23')+ ,("Coarmenian", '\x0551')+ ,("Csmall", '\xF763')+ ,("D", '\x0044')+ ,("DZ", '\x01F1')+ ,("DZcaron", '\x01C4')+ ,("Daarmenian", '\x0534')+ ,("Dafrican", '\x0189')+ ,("Dcaron", '\x010E')+ ,("Dcedilla", '\x1E10')+ ,("Dcircle", '\x24B9')+ ,("Dcircumflexbelow", '\x1E12')+ ,("Dcroat", '\x0110')+ ,("Ddotaccent", '\x1E0A')+ ,("Ddotbelow", '\x1E0C')+ ,("Decyrillic", '\x0414')+ ,("Deicoptic", '\x03EE')+ ,("Delta", '\x2206')+ ,("Deltagreek", '\x0394')+ ,("Dhook", '\x018A')+ ,("Dieresis", '\xF6CB')+ ,("DieresisAcute", '\xF6CC')+ ,("DieresisGrave", '\xF6CD')+ ,("Dieresissmall", '\xF7A8')+ ,("Digammagreek", '\x03DC')+ ,("Djecyrillic", '\x0402')+ ,("Dlinebelow", '\x1E0E')+ ,("Dmonospace", '\xFF24')+ ,("Dotaccentsmall", '\xF6F7')+ ,("Dslash", '\x0110')+ ,("Dsmall", '\xF764')+ ,("Dtopbar", '\x018B')+ ,("Dz", '\x01F2')+ ,("Dzcaron", '\x01C5')+ ,("Dzeabkhasiancyrillic", '\x04E0')+ ,("Dzecyrillic", '\x0405')+ ,("Dzhecyrillic", '\x040F')+ ,("E", '\x0045')+ ,("Eacute", '\x00C9')+ ,("Eacutesmall", '\xF7E9')+ ,("Ebreve", '\x0114')+ ,("Ecaron", '\x011A')+ ,("Ecedillabreve", '\x1E1C')+ ,("Echarmenian", '\x0535')+ ,("Ecircle", '\x24BA')+ ,("Ecircumflex", '\x00CA')+ ,("Ecircumflexacute", '\x1EBE')+ ,("Ecircumflexbelow", '\x1E18')+ ,("Ecircumflexdotbelow", '\x1EC6')+ ,("Ecircumflexgrave", '\x1EC0')+ ,("Ecircumflexhookabove", '\x1EC2')+ ,("Ecircumflexsmall", '\xF7EA')+ ,("Ecircumflextilde", '\x1EC4')+ ,("Ecyrillic", '\x0404')+ ,("Edblgrave", '\x0204')+ ,("Edieresis", '\x00CB')+ ,("Edieresissmall", '\xF7EB')+ ,("Edot", '\x0116')+ ,("Edotaccent", '\x0116')+ ,("Edotbelow", '\x1EB8')+ ,("Efcyrillic", '\x0424')+ ,("Egrave", '\x00C8')+ ,("Egravesmall", '\xF7E8')+ ,("Eharmenian", '\x0537')+ ,("Ehookabove", '\x1EBA')+ ,("Eightroman", '\x2167')+ ,("Einvertedbreve", '\x0206')+ ,("Eiotifiedcyrillic", '\x0464')+ ,("Elcyrillic", '\x041B')+ ,("Elevenroman", '\x216A')+ ,("Emacron", '\x0112')+ ,("Emacronacute", '\x1E16')+ ,("Emacrongrave", '\x1E14')+ ,("Emcyrillic", '\x041C')+ ,("Emonospace", '\xFF25')+ ,("Encyrillic", '\x041D')+ ,("Endescendercyrillic", '\x04A2')+ ,("Eng", '\x014A')+ ,("Enghecyrillic", '\x04A4')+ ,("Enhookcyrillic", '\x04C7')+ ,("Eogonek", '\x0118')+ ,("Eopen", '\x0190')+ ,("Epsilon", '\x0395')+ ,("Epsilontonos", '\x0388')+ ,("Ercyrillic", '\x0420')+ ,("Ereversed", '\x018E')+ ,("Ereversedcyrillic", '\x042D')+ ,("Escyrillic", '\x0421')+ ,("Esdescendercyrillic", '\x04AA')+ ,("Esh", '\x01A9')+ ,("Esmall", '\xF765')+ ,("Eta", '\x0397')+ ,("Etarmenian", '\x0538')+ ,("Etatonos", '\x0389')+ ,("Eth", '\x00D0')+ ,("Ethsmall", '\xF7F0')+ ,("Etilde", '\x1EBC')+ ,("Etildebelow", '\x1E1A')+ ,("Euro", '\x20AC')+ ,("Ezh", '\x01B7')+ ,("Ezhcaron", '\x01EE')+ ,("Ezhreversed", '\x01B8')+ ,("F", '\x0046')+ ,("Fcircle", '\x24BB')+ ,("Fdotaccent", '\x1E1E')+ ,("Feharmenian", '\x0556')+ ,("Feicoptic", '\x03E4')+ ,("Fhook", '\x0191')+ ,("Fitacyrillic", '\x0472')+ ,("Fiveroman", '\x2164')+ ,("Fmonospace", '\xFF26')+ ,("Fourroman", '\x2163')+ ,("Fsmall", '\xF766')+ ,("G", '\x0047')+ ,("GBsquare", '\x3387')+ ,("Gacute", '\x01F4')+ ,("Gamma", '\x0393')+ ,("Gammaafrican", '\x0194')+ ,("Gangiacoptic", '\x03EA')+ ,("Gbreve", '\x011E')+ ,("Gcaron", '\x01E6')+ ,("Gcedilla", '\x0122')+ ,("Gcircle", '\x24BC')+ ,("Gcircumflex", '\x011C')+ ,("Gcommaaccent", '\x0122')+ ,("Gdot", '\x0120')+ ,("Gdotaccent", '\x0120')+ ,("Gecyrillic", '\x0413')+ ,("Ghadarmenian", '\x0542')+ ,("Ghemiddlehookcyrillic", '\x0494')+ ,("Ghestrokecyrillic", '\x0492')+ ,("Gheupturncyrillic", '\x0490')+ ,("Ghook", '\x0193')+ ,("Gimarmenian", '\x0533')+ ,("Gjecyrillic", '\x0403')+ ,("Gmacron", '\x1E20')+ ,("Gmonospace", '\xFF27')+ ,("Grave", '\xF6CE')+ ,("Gravesmall", '\xF760')+ ,("Gsmall", '\xF767')+ ,("Gsmallhook", '\x029B')+ ,("Gstroke", '\x01E4')+ ,("H", '\x0048')+ ,("H18533", '\x25CF')+ ,("H18543", '\x25AA')+ ,("H18551", '\x25AB')+ ,("H22073", '\x25A1')+ ,("HPsquare", '\x33CB')+ ,("Haabkhasiancyrillic", '\x04A8')+ ,("Hadescendercyrillic", '\x04B2')+ ,("Hardsigncyrillic", '\x042A')+ ,("Hbar", '\x0126')+ ,("Hbrevebelow", '\x1E2A')+ ,("Hcedilla", '\x1E28')+ ,("Hcircle", '\x24BD')+ ,("Hcircumflex", '\x0124')+ ,("Hdieresis", '\x1E26')+ ,("Hdotaccent", '\x1E22')+ ,("Hdotbelow", '\x1E24')+ ,("Hmonospace", '\xFF28')+ ,("Hoarmenian", '\x0540')+ ,("Horicoptic", '\x03E8')+ ,("Hsmall", '\xF768')+ ,("Hungarumlaut", '\xF6CF')+ ,("Hungarumlautsmall", '\xF6F8')+ ,("Hzsquare", '\x3390')+ ,("I", '\x0049')+ ,("IAcyrillic", '\x042F')+ ,("IJ", '\x0132')+ ,("IUcyrillic", '\x042E')+ ,("Iacute", '\x00CD')+ ,("Iacutesmall", '\xF7ED')+ ,("Ibreve", '\x012C')+ ,("Icaron", '\x01CF')+ ,("Icircle", '\x24BE')+ ,("Icircumflex", '\x00CE')+ ,("Icircumflexsmall", '\xF7EE')+ ,("Icyrillic", '\x0406')+ ,("Idblgrave", '\x0208')+ ,("Idieresis", '\x00CF')+ ,("Idieresisacute", '\x1E2E')+ ,("Idieresiscyrillic", '\x04E4')+ ,("Idieresissmall", '\xF7EF')+ ,("Idot", '\x0130')+ ,("Idotaccent", '\x0130')+ ,("Idotbelow", '\x1ECA')+ ,("Iebrevecyrillic", '\x04D6')+ ,("Iecyrillic", '\x0415')+ ,("Ifraktur", '\x2111')+ ,("Igrave", '\x00CC')+ ,("Igravesmall", '\xF7EC')+ ,("Ihookabove", '\x1EC8')+ ,("Iicyrillic", '\x0418')+ ,("Iinvertedbreve", '\x020A')+ ,("Iishortcyrillic", '\x0419')+ ,("Imacron", '\x012A')+ ,("Imacroncyrillic", '\x04E2')+ ,("Imonospace", '\xFF29')+ ,("Iniarmenian", '\x053B')+ ,("Iocyrillic", '\x0401')+ ,("Iogonek", '\x012E')+ ,("Iota", '\x0399')+ ,("Iotaafrican", '\x0196')+ ,("Iotadieresis", '\x03AA')+ ,("Iotatonos", '\x038A')+ ,("Ismall", '\xF769')+ ,("Istroke", '\x0197')+ ,("Itilde", '\x0128')+ ,("Itildebelow", '\x1E2C')+ ,("Izhitsacyrillic", '\x0474')+ ,("Izhitsadblgravecyrillic", '\x0476')+ ,("J", '\x004A')+ ,("Jaarmenian", '\x0541')+ ,("Jcircle", '\x24BF')+ ,("Jcircumflex", '\x0134')+ ,("Jecyrillic", '\x0408')+ ,("Jheharmenian", '\x054B')+ ,("Jmonospace", '\xFF2A')+ ,("Jsmall", '\xF76A')+ ,("K", '\x004B')+ ,("KBsquare", '\x3385')+ ,("KKsquare", '\x33CD')+ ,("Kabashkircyrillic", '\x04A0')+ ,("Kacute", '\x1E30')+ ,("Kacyrillic", '\x041A')+ ,("Kadescendercyrillic", '\x049A')+ ,("Kahookcyrillic", '\x04C3')+ ,("Kappa", '\x039A')+ ,("Kastrokecyrillic", '\x049E')+ ,("Kaverticalstrokecyrillic", '\x049C')+ ,("Kcaron", '\x01E8')+ ,("Kcedilla", '\x0136')+ ,("Kcircle", '\x24C0')+ ,("Kcommaaccent", '\x0136')+ ,("Kdotbelow", '\x1E32')+ ,("Keharmenian", '\x0554')+ ,("Kenarmenian", '\x053F')+ ,("Khacyrillic", '\x0425')+ ,("Kheicoptic", '\x03E6')+ ,("Khook", '\x0198')+ ,("Kjecyrillic", '\x040C')+ ,("Klinebelow", '\x1E34')+ ,("Kmonospace", '\xFF2B')+ ,("Koppacyrillic", '\x0480')+ ,("Koppagreek", '\x03DE')+ ,("Ksicyrillic", '\x046E')+ ,("Ksmall", '\xF76B')+ ,("L", '\x004C')+ ,("LJ", '\x01C7')+ ,("LL", '\xF6BF')+ ,("Lacute", '\x0139')+ ,("Lambda", '\x039B')+ ,("Lcaron", '\x013D')+ ,("Lcedilla", '\x013B')+ ,("Lcircle", '\x24C1')+ ,("Lcircumflexbelow", '\x1E3C')+ ,("Lcommaaccent", '\x013B')+ ,("Ldot", '\x013F')+ ,("Ldotaccent", '\x013F')+ ,("Ldotbelow", '\x1E36')+ ,("Ldotbelowmacron", '\x1E38')+ ,("Liwnarmenian", '\x053C')+ ,("Lj", '\x01C8')+ ,("Ljecyrillic", '\x0409')+ ,("Llinebelow", '\x1E3A')+ ,("Lmonospace", '\xFF2C')+ ,("Lslash", '\x0141')+ ,("Lslashsmall", '\xF6F9')+ ,("Lsmall", '\xF76C')+ ,("M", '\x004D')+ ,("MBsquare", '\x3386')+ ,("Macron", '\xF6D0')+ ,("Macronsmall", '\xF7AF')+ ,("Macute", '\x1E3E')+ ,("Mcircle", '\x24C2')+ ,("Mdotaccent", '\x1E40')+ ,("Mdotbelow", '\x1E42')+ ,("Menarmenian", '\x0544')+ ,("Mmonospace", '\xFF2D')+ ,("Msmall", '\xF76D')+ ,("Mturned", '\x019C')+ ,("Mu", '\x039C')+ ,("N", '\x004E')+ ,("NJ", '\x01CA')+ ,("Nacute", '\x0143')+ ,("Ncaron", '\x0147')+ ,("Ncedilla", '\x0145')+ ,("Ncircle", '\x24C3')+ ,("Ncircumflexbelow", '\x1E4A')+ ,("Ncommaaccent", '\x0145')+ ,("Ndotaccent", '\x1E44')+ ,("Ndotbelow", '\x1E46')+ ,("Nhookleft", '\x019D')+ ,("Nineroman", '\x2168')+ ,("Nj", '\x01CB')+ ,("Njecyrillic", '\x040A')+ ,("Nlinebelow", '\x1E48')+ ,("Nmonospace", '\xFF2E')+ ,("Nowarmenian", '\x0546')+ ,("Nsmall", '\xF76E')+ ,("Ntilde", '\x00D1')+ ,("Ntildesmall", '\xF7F1')+ ,("Nu", '\x039D')+ ,("O", '\x004F')+ ,("OE", '\x0152')+ ,("OEsmall", '\xF6FA')+ ,("Oacute", '\x00D3')+ ,("Oacutesmall", '\xF7F3')+ ,("Obarredcyrillic", '\x04E8')+ ,("Obarreddieresiscyrillic", '\x04EA')+ ,("Obreve", '\x014E')+ ,("Ocaron", '\x01D1')+ ,("Ocenteredtilde", '\x019F')+ ,("Ocircle", '\x24C4')+ ,("Ocircumflex", '\x00D4')+ ,("Ocircumflexacute", '\x1ED0')+ ,("Ocircumflexdotbelow", '\x1ED8')+ ,("Ocircumflexgrave", '\x1ED2')+ ,("Ocircumflexhookabove", '\x1ED4')+ ,("Ocircumflexsmall", '\xF7F4')+ ,("Ocircumflextilde", '\x1ED6')+ ,("Ocyrillic", '\x041E')+ ,("Odblacute", '\x0150')+ ,("Odblgrave", '\x020C')+ ,("Odieresis", '\x00D6')+ ,("Odieresiscyrillic", '\x04E6')+ ,("Odieresissmall", '\xF7F6')+ ,("Odotbelow", '\x1ECC')+ ,("Ogoneksmall", '\xF6FB')+ ,("Ograve", '\x00D2')+ ,("Ogravesmall", '\xF7F2')+ ,("Oharmenian", '\x0555')+ ,("Ohm", '\x2126')+ ,("Ohookabove", '\x1ECE')+ ,("Ohorn", '\x01A0')+ ,("Ohornacute", '\x1EDA')+ ,("Ohorndotbelow", '\x1EE2')+ ,("Ohorngrave", '\x1EDC')+ ,("Ohornhookabove", '\x1EDE')+ ,("Ohorntilde", '\x1EE0')+ ,("Ohungarumlaut", '\x0150')+ ,("Oi", '\x01A2')+ ,("Oinvertedbreve", '\x020E')+ ,("Omacron", '\x014C')+ ,("Omacronacute", '\x1E52')+ ,("Omacrongrave", '\x1E50')+ ,("Omega", '\x2126')+ ,("Omegacyrillic", '\x0460')+ ,("Omegagreek", '\x03A9')+ ,("Omegaroundcyrillic", '\x047A')+ ,("Omegatitlocyrillic", '\x047C')+ ,("Omegatonos", '\x038F')+ ,("Omicron", '\x039F')+ ,("Omicrontonos", '\x038C')+ ,("Omonospace", '\xFF2F')+ ,("Oneroman", '\x2160')+ ,("Oogonek", '\x01EA')+ ,("Oogonekmacron", '\x01EC')+ ,("Oopen", '\x0186')+ ,("Oslash", '\x00D8')+ ,("Oslashacute", '\x01FE')+ ,("Oslashsmall", '\xF7F8')+ ,("Osmall", '\xF76F')+ ,("Ostrokeacute", '\x01FE')+ ,("Otcyrillic", '\x047E')+ ,("Otilde", '\x00D5')+ ,("Otildeacute", '\x1E4C')+ ,("Otildedieresis", '\x1E4E')+ ,("Otildesmall", '\xF7F5')+ ,("P", '\x0050')+ ,("Pacute", '\x1E54')+ ,("Pcircle", '\x24C5')+ ,("Pdotaccent", '\x1E56')+ ,("Pecyrillic", '\x041F')+ ,("Peharmenian", '\x054A')+ ,("Pemiddlehookcyrillic", '\x04A6')+ ,("Phi", '\x03A6')+ ,("Phook", '\x01A4')+ ,("Pi", '\x03A0')+ ,("Piwrarmenian", '\x0553')+ ,("Pmonospace", '\xFF30')+ ,("Psi", '\x03A8')+ ,("Psicyrillic", '\x0470')+ ,("Psmall", '\xF770')+ ,("Q", '\x0051')+ ,("Qcircle", '\x24C6')+ ,("Qmonospace", '\xFF31')+ ,("Qsmall", '\xF771')+ ,("R", '\x0052')+ ,("Raarmenian", '\x054C')+ ,("Racute", '\x0154')+ ,("Rcaron", '\x0158')+ ,("Rcedilla", '\x0156')+ ,("Rcircle", '\x24C7')+ ,("Rcommaaccent", '\x0156')+ ,("Rdblgrave", '\x0210')+ ,("Rdotaccent", '\x1E58')+ ,("Rdotbelow", '\x1E5A')+ ,("Rdotbelowmacron", '\x1E5C')+ ,("Reharmenian", '\x0550')+ ,("Rfraktur", '\x211C')+ ,("Rho", '\x03A1')+ ,("Ringsmall", '\xF6FC')+ ,("Rinvertedbreve", '\x0212')+ ,("Rlinebelow", '\x1E5E')+ ,("Rmonospace", '\xFF32')+ ,("Rsmall", '\xF772')+ ,("Rsmallinverted", '\x0281')+ ,("Rsmallinvertedsuperior", '\x02B6')+ ,("S", '\x0053')+ ,("SF010000", '\x250C')+ ,("SF020000", '\x2514')+ ,("SF030000", '\x2510')+ ,("SF040000", '\x2518')+ ,("SF050000", '\x253C')+ ,("SF060000", '\x252C')+ ,("SF070000", '\x2534')+ ,("SF080000", '\x251C')+ ,("SF090000", '\x2524')+ ,("SF100000", '\x2500')+ ,("SF110000", '\x2502')+ ,("SF190000", '\x2561')+ ,("SF200000", '\x2562')+ ,("SF210000", '\x2556')+ ,("SF220000", '\x2555')+ ,("SF230000", '\x2563')+ ,("SF240000", '\x2551')+ ,("SF250000", '\x2557')+ ,("SF260000", '\x255D')+ ,("SF270000", '\x255C')+ ,("SF280000", '\x255B')+ ,("SF360000", '\x255E')+ ,("SF370000", '\x255F')+ ,("SF380000", '\x255A')+ ,("SF390000", '\x2554')+ ,("SF400000", '\x2569')+ ,("SF410000", '\x2566')+ ,("SF420000", '\x2560')+ ,("SF430000", '\x2550')+ ,("SF440000", '\x256C')+ ,("SF450000", '\x2567')+ ,("SF460000", '\x2568')+ ,("SF470000", '\x2564')+ ,("SF480000", '\x2565')+ ,("SF490000", '\x2559')+ ,("SF500000", '\x2558')+ ,("SF510000", '\x2552')+ ,("SF520000", '\x2553')+ ,("SF530000", '\x256B')+ ,("SF540000", '\x256A')+ ,("Sacute", '\x015A')+ ,("Sacutedotaccent", '\x1E64')+ ,("Sampigreek", '\x03E0')+ ,("Scaron", '\x0160')+ ,("Scarondotaccent", '\x1E66')+ ,("Scaronsmall", '\xF6FD')+ ,("Scedilla", '\x015E')+ ,("Schwa", '\x018F')+ ,("Schwacyrillic", '\x04D8')+ ,("Schwadieresiscyrillic", '\x04DA')+ ,("Scircle", '\x24C8')+ ,("Scircumflex", '\x015C')+ ,("Scommaaccent", '\x0218')+ ,("Sdotaccent", '\x1E60')+ ,("Sdotbelow", '\x1E62')+ ,("Sdotbelowdotaccent", '\x1E68')+ ,("Seharmenian", '\x054D')+ ,("Sevenroman", '\x2166')+ ,("Shaarmenian", '\x0547')+ ,("Shacyrillic", '\x0428')+ ,("Shchacyrillic", '\x0429')+ ,("Sheicoptic", '\x03E2')+ ,("Shhacyrillic", '\x04BA')+ ,("Shimacoptic", '\x03EC')+ ,("Sigma", '\x03A3')+ ,("Sixroman", '\x2165')+ ,("Smonospace", '\xFF33')+ ,("Softsigncyrillic", '\x042C')+ ,("Ssmall", '\xF773')+ ,("Stigmagreek", '\x03DA')+ ,("T", '\x0054')+ ,("Tau", '\x03A4')+ ,("Tbar", '\x0166')+ ,("Tcaron", '\x0164')+ ,("Tcedilla", '\x0162')+ ,("Tcircle", '\x24C9')+ ,("Tcircumflexbelow", '\x1E70')+ ,("Tcommaaccent", '\x0162')+ ,("Tdotaccent", '\x1E6A')+ ,("Tdotbelow", '\x1E6C')+ ,("Tecyrillic", '\x0422')+ ,("Tedescendercyrillic", '\x04AC')+ ,("Tenroman", '\x2169')+ ,("Tetsecyrillic", '\x04B4')+ ,("Theta", '\x0398')+ ,("Thook", '\x01AC')+ ,("Thorn", '\x00DE')+ ,("Thornsmall", '\xF7FE')+ ,("Threeroman", '\x2162')+ ,("Tildesmall", '\xF6FE')+ ,("Tiwnarmenian", '\x054F')+ ,("Tlinebelow", '\x1E6E')+ ,("Tmonospace", '\xFF34')+ ,("Toarmenian", '\x0539')+ ,("Tonefive", '\x01BC')+ ,("Tonesix", '\x0184')+ ,("Tonetwo", '\x01A7')+ ,("Tretroflexhook", '\x01AE')+ ,("Tsecyrillic", '\x0426')+ ,("Tshecyrillic", '\x040B')+ ,("Tsmall", '\xF774')+ ,("Twelveroman", '\x216B')+ ,("Tworoman", '\x2161')+ ,("U", '\x0055')+ ,("Uacute", '\x00DA')+ ,("Uacutesmall", '\xF7FA')+ ,("Ubreve", '\x016C')+ ,("Ucaron", '\x01D3')+ ,("Ucircle", '\x24CA')+ ,("Ucircumflex", '\x00DB')+ ,("Ucircumflexbelow", '\x1E76')+ ,("Ucircumflexsmall", '\xF7FB')+ ,("Ucyrillic", '\x0423')+ ,("Udblacute", '\x0170')+ ,("Udblgrave", '\x0214')+ ,("Udieresis", '\x00DC')+ ,("Udieresisacute", '\x01D7')+ ,("Udieresisbelow", '\x1E72')+ ,("Udieresiscaron", '\x01D9')+ ,("Udieresiscyrillic", '\x04F0')+ ,("Udieresisgrave", '\x01DB')+ ,("Udieresismacron", '\x01D5')+ ,("Udieresissmall", '\xF7FC')+ ,("Udotbelow", '\x1EE4')+ ,("Ugrave", '\x00D9')+ ,("Ugravesmall", '\xF7F9')+ ,("Uhookabove", '\x1EE6')+ ,("Uhorn", '\x01AF')+ ,("Uhornacute", '\x1EE8')+ ,("Uhorndotbelow", '\x1EF0')+ ,("Uhorngrave", '\x1EEA')+ ,("Uhornhookabove", '\x1EEC')+ ,("Uhorntilde", '\x1EEE')+ ,("Uhungarumlaut", '\x0170')+ ,("Uhungarumlautcyrillic", '\x04F2')+ ,("Uinvertedbreve", '\x0216')+ ,("Ukcyrillic", '\x0478')+ ,("Umacron", '\x016A')+ ,("Umacroncyrillic", '\x04EE')+ ,("Umacrondieresis", '\x1E7A')+ ,("Umonospace", '\xFF35')+ ,("Uogonek", '\x0172')+ ,("Upsilon", '\x03A5')+ ,("Upsilon1", '\x03D2')+ ,("Upsilonacutehooksymbolgreek", '\x03D3')+ ,("Upsilonafrican", '\x01B1')+ ,("Upsilondieresis", '\x03AB')+ ,("Upsilondieresishooksymbolgreek", '\x03D4')+ ,("Upsilonhooksymbol", '\x03D2')+ ,("Upsilontonos", '\x038E')+ ,("Uring", '\x016E')+ ,("Ushortcyrillic", '\x040E')+ ,("Usmall", '\xF775')+ ,("Ustraightcyrillic", '\x04AE')+ ,("Ustraightstrokecyrillic", '\x04B0')+ ,("Utilde", '\x0168')+ ,("Utildeacute", '\x1E78')+ ,("Utildebelow", '\x1E74')+ ,("V", '\x0056')+ ,("Vcircle", '\x24CB')+ ,("Vdotbelow", '\x1E7E')+ ,("Vecyrillic", '\x0412')+ ,("Vewarmenian", '\x054E')+ ,("Vhook", '\x01B2')+ ,("Vmonospace", '\xFF36')+ ,("Voarmenian", '\x0548')+ ,("Vsmall", '\xF776')+ ,("Vtilde", '\x1E7C')+ ,("W", '\x0057')+ ,("Wacute", '\x1E82')+ ,("Wcircle", '\x24CC')+ ,("Wcircumflex", '\x0174')+ ,("Wdieresis", '\x1E84')+ ,("Wdotaccent", '\x1E86')+ ,("Wdotbelow", '\x1E88')+ ,("Wgrave", '\x1E80')+ ,("Wmonospace", '\xFF37')+ ,("Wsmall", '\xF777')+ ,("X", '\x0058')+ ,("Xcircle", '\x24CD')+ ,("Xdieresis", '\x1E8C')+ ,("Xdotaccent", '\x1E8A')+ ,("Xeharmenian", '\x053D')+ ,("Xi", '\x039E')+ ,("Xmonospace", '\xFF38')+ ,("Xsmall", '\xF778')+ ,("Y", '\x0059')+ ,("Yacute", '\x00DD')+ ,("Yacutesmall", '\xF7FD')+ ,("Yatcyrillic", '\x0462')+ ,("Ycircle", '\x24CE')+ ,("Ycircumflex", '\x0176')+ ,("Ydieresis", '\x0178')+ ,("Ydieresissmall", '\xF7FF')+ ,("Ydotaccent", '\x1E8E')+ ,("Ydotbelow", '\x1EF4')+ ,("Yericyrillic", '\x042B')+ ,("Yerudieresiscyrillic", '\x04F8')+ ,("Ygrave", '\x1EF2')+ ,("Yhook", '\x01B3')+ ,("Yhookabove", '\x1EF6')+ ,("Yiarmenian", '\x0545')+ ,("Yicyrillic", '\x0407')+ ,("Yiwnarmenian", '\x0552')+ ,("Ymonospace", '\xFF39')+ ,("Ysmall", '\xF779')+ ,("Ytilde", '\x1EF8')+ ,("Yusbigcyrillic", '\x046A')+ ,("Yusbigiotifiedcyrillic", '\x046C')+ ,("Yuslittlecyrillic", '\x0466')+ ,("Yuslittleiotifiedcyrillic", '\x0468')+ ,("Z", '\x005A')+ ,("Zaarmenian", '\x0536')+ ,("Zacute", '\x0179')+ ,("Zcaron", '\x017D')+ ,("Zcaronsmall", '\xF6FF')+ ,("Zcircle", '\x24CF')+ ,("Zcircumflex", '\x1E90')+ ,("Zdot", '\x017B')+ ,("Zdotaccent", '\x017B')+ ,("Zdotbelow", '\x1E92')+ ,("Zecyrillic", '\x0417')+ ,("Zedescendercyrillic", '\x0498')+ ,("Zedieresiscyrillic", '\x04DE')+ ,("Zeta", '\x0396')+ ,("Zhearmenian", '\x053A')+ ,("Zhebrevecyrillic", '\x04C1')+ ,("Zhecyrillic", '\x0416')+ ,("Zhedescendercyrillic", '\x0496')+ ,("Zhedieresiscyrillic", '\x04DC')+ ,("Zlinebelow", '\x1E94')+ ,("Zmonospace", '\xFF3A')+ ,("Zsmall", '\xF77A')+ ,("Zstroke", '\x01B5')+ ,("a", '\x0061')+ ,("aabengali", '\x0986')+ ,("aacute", '\x00E1')+ ,("aadeva", '\x0906')+ ,("aagujarati", '\x0A86')+ ,("aagurmukhi", '\x0A06')+ ,("aamatragurmukhi", '\x0A3E')+ ,("aarusquare", '\x3303')+ ,("aavowelsignbengali", '\x09BE')+ ,("aavowelsigndeva", '\x093E')+ ,("aavowelsigngujarati", '\x0ABE')+ ,("abbreviationmarkarmenian", '\x055F')+ ,("abbreviationsigndeva", '\x0970')+ ,("abengali", '\x0985')+ ,("abopomofo", '\x311A')+ ,("abreve", '\x0103')+ ,("abreveacute", '\x1EAF')+ ,("abrevecyrillic", '\x04D1')+ ,("abrevedotbelow", '\x1EB7')+ ,("abrevegrave", '\x1EB1')+ ,("abrevehookabove", '\x1EB3')+ ,("abrevetilde", '\x1EB5')+ ,("acaron", '\x01CE')+ ,("acircle", '\x24D0')+ ,("acircumflex", '\x00E2')+ ,("acircumflexacute", '\x1EA5')+ ,("acircumflexdotbelow", '\x1EAD')+ ,("acircumflexgrave", '\x1EA7')+ ,("acircumflexhookabove", '\x1EA9')+ ,("acircumflextilde", '\x1EAB')+ ,("acute", '\x00B4')+ ,("acutebelowcmb", '\x0317')+ ,("acutecmb", '\x0301')+ ,("acutecomb", '\x0301')+ ,("acutedeva", '\x0954')+ ,("acutelowmod", '\x02CF')+ ,("acutetonecmb", '\x0341')+ ,("acyrillic", '\x0430')+ ,("adblgrave", '\x0201')+ ,("addakgurmukhi", '\x0A71')+ ,("adeva", '\x0905')+ ,("adieresis", '\x00E4')+ ,("adieresiscyrillic", '\x04D3')+ ,("adieresismacron", '\x01DF')+ ,("adotbelow", '\x1EA1')+ ,("adotmacron", '\x01E1')+ ,("ae", '\x00E6')+ ,("aeacute", '\x01FD')+ ,("aekorean", '\x3150')+ ,("aemacron", '\x01E3')+ ,("afii00208", '\x2015')+ ,("afii08941", '\x20A4')+ ,("afii10017", '\x0410')+ ,("afii10018", '\x0411')+ ,("afii10019", '\x0412')+ ,("afii10020", '\x0413')+ ,("afii10021", '\x0414')+ ,("afii10022", '\x0415')+ ,("afii10023", '\x0401')+ ,("afii10024", '\x0416')+ ,("afii10025", '\x0417')+ ,("afii10026", '\x0418')+ ,("afii10027", '\x0419')+ ,("afii10028", '\x041A')+ ,("afii10029", '\x041B')+ ,("afii10030", '\x041C')+ ,("afii10031", '\x041D')+ ,("afii10032", '\x041E')+ ,("afii10033", '\x041F')+ ,("afii10034", '\x0420')+ ,("afii10035", '\x0421')+ ,("afii10036", '\x0422')+ ,("afii10037", '\x0423')+ ,("afii10038", '\x0424')+ ,("afii10039", '\x0425')+ ,("afii10040", '\x0426')+ ,("afii10041", '\x0427')+ ,("afii10042", '\x0428')+ ,("afii10043", '\x0429')+ ,("afii10044", '\x042A')+ ,("afii10045", '\x042B')+ ,("afii10046", '\x042C')+ ,("afii10047", '\x042D')+ ,("afii10048", '\x042E')+ ,("afii10049", '\x042F')+ ,("afii10050", '\x0490')+ ,("afii10051", '\x0402')+ ,("afii10052", '\x0403')+ ,("afii10053", '\x0404')+ ,("afii10054", '\x0405')+ ,("afii10055", '\x0406')+ ,("afii10056", '\x0407')+ ,("afii10057", '\x0408')+ ,("afii10058", '\x0409')+ ,("afii10059", '\x040A')+ ,("afii10060", '\x040B')+ ,("afii10061", '\x040C')+ ,("afii10062", '\x040E')+ ,("afii10063", '\xF6C4')+ ,("afii10064", '\xF6C5')+ ,("afii10065", '\x0430')+ ,("afii10066", '\x0431')+ ,("afii10067", '\x0432')+ ,("afii10068", '\x0433')+ ,("afii10069", '\x0434')+ ,("afii10070", '\x0435')+ ,("afii10071", '\x0451')+ ,("afii10072", '\x0436')+ ,("afii10073", '\x0437')+ ,("afii10074", '\x0438')+ ,("afii10075", '\x0439')+ ,("afii10076", '\x043A')+ ,("afii10077", '\x043B')+ ,("afii10078", '\x043C')+ ,("afii10079", '\x043D')+ ,("afii10080", '\x043E')+ ,("afii10081", '\x043F')+ ,("afii10082", '\x0440')+ ,("afii10083", '\x0441')+ ,("afii10084", '\x0442')+ ,("afii10085", '\x0443')+ ,("afii10086", '\x0444')+ ,("afii10087", '\x0445')+ ,("afii10088", '\x0446')+ ,("afii10089", '\x0447')+ ,("afii10090", '\x0448')+ ,("afii10091", '\x0449')+ ,("afii10092", '\x044A')+ ,("afii10093", '\x044B')+ ,("afii10094", '\x044C')+ ,("afii10095", '\x044D')+ ,("afii10096", '\x044E')+ ,("afii10097", '\x044F')+ ,("afii10098", '\x0491')+ ,("afii10099", '\x0452')+ ,("afii10100", '\x0453')+ ,("afii10101", '\x0454')+ ,("afii10102", '\x0455')+ ,("afii10103", '\x0456')+ ,("afii10104", '\x0457')+ ,("afii10105", '\x0458')+ ,("afii10106", '\x0459')+ ,("afii10107", '\x045A')+ ,("afii10108", '\x045B')+ ,("afii10109", '\x045C')+ ,("afii10110", '\x045E')+ ,("afii10145", '\x040F')+ ,("afii10146", '\x0462')+ ,("afii10147", '\x0472')+ ,("afii10148", '\x0474')+ ,("afii10192", '\xF6C6')+ ,("afii10193", '\x045F')+ ,("afii10194", '\x0463')+ ,("afii10195", '\x0473')+ ,("afii10196", '\x0475')+ ,("afii10831", '\xF6C7')+ ,("afii10832", '\xF6C8')+ ,("afii10846", '\x04D9')+ ,("afii299", '\x200E')+ ,("afii300", '\x200F')+ ,("afii301", '\x200D')+ ,("afii57381", '\x066A')+ ,("afii57388", '\x060C')+ ,("afii57392", '\x0660')+ ,("afii57393", '\x0661')+ ,("afii57394", '\x0662')+ ,("afii57395", '\x0663')+ ,("afii57396", '\x0664')+ ,("afii57397", '\x0665')+ ,("afii57398", '\x0666')+ ,("afii57399", '\x0667')+ ,("afii57400", '\x0668')+ ,("afii57401", '\x0669')+ ,("afii57403", '\x061B')+ ,("afii57407", '\x061F')+ ,("afii57409", '\x0621')+ ,("afii57410", '\x0622')+ ,("afii57411", '\x0623')+ ,("afii57412", '\x0624')+ ,("afii57413", '\x0625')+ ,("afii57414", '\x0626')+ ,("afii57415", '\x0627')+ ,("afii57416", '\x0628')+ ,("afii57417", '\x0629')+ ,("afii57418", '\x062A')+ ,("afii57419", '\x062B')+ ,("afii57420", '\x062C')+ ,("afii57421", '\x062D')+ ,("afii57422", '\x062E')+ ,("afii57423", '\x062F')+ ,("afii57424", '\x0630')+ ,("afii57425", '\x0631')+ ,("afii57426", '\x0632')+ ,("afii57427", '\x0633')+ ,("afii57428", '\x0634')+ ,("afii57429", '\x0635')+ ,("afii57430", '\x0636')+ ,("afii57431", '\x0637')+ ,("afii57432", '\x0638')+ ,("afii57433", '\x0639')+ ,("afii57434", '\x063A')+ ,("afii57440", '\x0640')+ ,("afii57441", '\x0641')+ ,("afii57442", '\x0642')+ ,("afii57443", '\x0643')+ ,("afii57444", '\x0644')+ ,("afii57445", '\x0645')+ ,("afii57446", '\x0646')+ ,("afii57448", '\x0648')+ ,("afii57449", '\x0649')+ ,("afii57450", '\x064A')+ ,("afii57451", '\x064B')+ ,("afii57452", '\x064C')+ ,("afii57453", '\x064D')+ ,("afii57454", '\x064E')+ ,("afii57455", '\x064F')+ ,("afii57456", '\x0650')+ ,("afii57457", '\x0651')+ ,("afii57458", '\x0652')+ ,("afii57470", '\x0647')+ ,("afii57505", '\x06A4')+ ,("afii57506", '\x067E')+ ,("afii57507", '\x0686')+ ,("afii57508", '\x0698')+ ,("afii57509", '\x06AF')+ ,("afii57511", '\x0679')+ ,("afii57512", '\x0688')+ ,("afii57513", '\x0691')+ ,("afii57514", '\x06BA')+ ,("afii57519", '\x06D2')+ ,("afii57534", '\x06D5')+ ,("afii57636", '\x20AA')+ ,("afii57645", '\x05BE')+ ,("afii57658", '\x05C3')+ ,("afii57664", '\x05D0')+ ,("afii57665", '\x05D1')+ ,("afii57666", '\x05D2')+ ,("afii57667", '\x05D3')+ ,("afii57668", '\x05D4')+ ,("afii57669", '\x05D5')+ ,("afii57670", '\x05D6')+ ,("afii57671", '\x05D7')+ ,("afii57672", '\x05D8')+ ,("afii57673", '\x05D9')+ ,("afii57674", '\x05DA')+ ,("afii57675", '\x05DB')+ ,("afii57676", '\x05DC')+ ,("afii57677", '\x05DD')+ ,("afii57678", '\x05DE')+ ,("afii57679", '\x05DF')+ ,("afii57680", '\x05E0')+ ,("afii57681", '\x05E1')+ ,("afii57682", '\x05E2')+ ,("afii57683", '\x05E3')+ ,("afii57684", '\x05E4')+ ,("afii57685", '\x05E5')+ ,("afii57686", '\x05E6')+ ,("afii57687", '\x05E7')+ ,("afii57688", '\x05E8')+ ,("afii57689", '\x05E9')+ ,("afii57690", '\x05EA')+ ,("afii57694", '\xFB2A')+ ,("afii57695", '\xFB2B')+ ,("afii57700", '\xFB4B')+ ,("afii57705", '\xFB1F')+ ,("afii57716", '\x05F0')+ ,("afii57717", '\x05F1')+ ,("afii57718", '\x05F2')+ ,("afii57723", '\xFB35')+ ,("afii57793", '\x05B4')+ ,("afii57794", '\x05B5')+ ,("afii57795", '\x05B6')+ ,("afii57796", '\x05BB')+ ,("afii57797", '\x05B8')+ ,("afii57798", '\x05B7')+ ,("afii57799", '\x05B0')+ ,("afii57800", '\x05B2')+ ,("afii57801", '\x05B1')+ ,("afii57802", '\x05B3')+ ,("afii57803", '\x05C2')+ ,("afii57804", '\x05C1')+ ,("afii57806", '\x05B9')+ ,("afii57807", '\x05BC')+ ,("afii57839", '\x05BD')+ ,("afii57841", '\x05BF')+ ,("afii57842", '\x05C0')+ ,("afii57929", '\x02BC')+ ,("afii61248", '\x2105')+ ,("afii61289", '\x2113')+ ,("afii61352", '\x2116')+ ,("afii61573", '\x202C')+ ,("afii61574", '\x202D')+ ,("afii61575", '\x202E')+ ,("afii61664", '\x200C')+ ,("afii63167", '\x066D')+ ,("afii64937", '\x02BD')+ ,("agrave", '\x00E0')+ ,("agujarati", '\x0A85')+ ,("agurmukhi", '\x0A05')+ ,("ahiragana", '\x3042')+ ,("ahookabove", '\x1EA3')+ ,("aibengali", '\x0990')+ ,("aibopomofo", '\x311E')+ ,("aideva", '\x0910')+ ,("aiecyrillic", '\x04D5')+ ,("aigujarati", '\x0A90')+ ,("aigurmukhi", '\x0A10')+ ,("aimatragurmukhi", '\x0A48')+ ,("ainarabic", '\x0639')+ ,("ainfinalarabic", '\xFECA')+ ,("aininitialarabic", '\xFECB')+ ,("ainmedialarabic", '\xFECC')+ ,("ainvertedbreve", '\x0203')+ ,("aivowelsignbengali", '\x09C8')+ ,("aivowelsigndeva", '\x0948')+ ,("aivowelsigngujarati", '\x0AC8')+ ,("akatakana", '\x30A2')+ ,("akatakanahalfwidth", '\xFF71')+ ,("akorean", '\x314F')+ ,("alef", '\x05D0')+ ,("alefarabic", '\x0627')+ ,("alefdageshhebrew", '\xFB30')+ ,("aleffinalarabic", '\xFE8E')+ ,("alefhamzaabovearabic", '\x0623')+ ,("alefhamzaabovefinalarabic", '\xFE84')+ ,("alefhamzabelowarabic", '\x0625')+ ,("alefhamzabelowfinalarabic", '\xFE88')+ ,("alefhebrew", '\x05D0')+ ,("aleflamedhebrew", '\xFB4F')+ ,("alefmaddaabovearabic", '\x0622')+ ,("alefmaddaabovefinalarabic", '\xFE82')+ ,("alefmaksuraarabic", '\x0649')+ ,("alefmaksurafinalarabic", '\xFEF0')+ ,("alefmaksurainitialarabic", '\xFEF3')+ ,("alefmaksuramedialarabic", '\xFEF4')+ ,("alefpatahhebrew", '\xFB2E')+ ,("alefqamatshebrew", '\xFB2F')+ ,("aleph", '\x2135')+ ,("allequal", '\x224C')+ ,("alpha", '\x03B1')+ ,("alphatonos", '\x03AC')+ ,("amacron", '\x0101')+ ,("amonospace", '\xFF41')+ ,("ampersand", '\x0026')+ ,("ampersandmonospace", '\xFF06')+ ,("ampersandsmall", '\xF726')+ ,("amsquare", '\x33C2')+ ,("anbopomofo", '\x3122')+ ,("angbopomofo", '\x3124')+ ,("angkhankhuthai", '\x0E5A')+ ,("angle", '\x2220')+ ,("anglebracketleft", '\x3008')+ ,("anglebracketleftvertical", '\xFE3F')+ ,("anglebracketright", '\x3009')+ ,("anglebracketrightvertical", '\xFE40')+ ,("angleleft", '\x2329')+ ,("angleright", '\x232A')+ ,("angstrom", '\x212B')+ ,("anoteleia", '\x0387')+ ,("anudattadeva", '\x0952')+ ,("anusvarabengali", '\x0982')+ ,("anusvaradeva", '\x0902')+ ,("anusvaragujarati", '\x0A82')+ ,("aogonek", '\x0105')+ ,("apaatosquare", '\x3300')+ ,("aparen", '\x249C')+ ,("apostrophearmenian", '\x055A')+ ,("apostrophemod", '\x02BC')+ ,("apple", '\xF8FF')+ ,("approaches", '\x2250')+ ,("approxequal", '\x2248')+ ,("approxequalorimage", '\x2252')+ ,("approximatelyequal", '\x2245')+ ,("araeaekorean", '\x318E')+ ,("araeakorean", '\x318D')+ ,("arc", '\x2312')+ ,("arighthalfring", '\x1E9A')+ ,("aring", '\x00E5')+ ,("aringacute", '\x01FB')+ ,("aringbelow", '\x1E01')+ ,("arrowboth", '\x2194')+ ,("arrowdashdown", '\x21E3')+ ,("arrowdashleft", '\x21E0')+ ,("arrowdashright", '\x21E2')+ ,("arrowdashup", '\x21E1')+ ,("arrowdblboth", '\x21D4')+ ,("arrowdbldown", '\x21D3')+ ,("arrowdblleft", '\x21D0')+ ,("arrowdblright", '\x21D2')+ ,("arrowdblup", '\x21D1')+ ,("arrowdown", '\x2193')+ ,("arrowdownleft", '\x2199')+ ,("arrowdownright", '\x2198')+ ,("arrowdownwhite", '\x21E9')+ ,("arrowheaddownmod", '\x02C5')+ ,("arrowheadleftmod", '\x02C2')+ ,("arrowheadrightmod", '\x02C3')+ ,("arrowheadupmod", '\x02C4')+ ,("arrowhorizex", '\xF8E7')+ ,("arrowleft", '\x2190')+ ,("arrowleftdbl", '\x21D0')+ ,("arrowleftdblstroke", '\x21CD')+ ,("arrowleftoverright", '\x21C6')+ ,("arrowleftwhite", '\x21E6')+ ,("arrowright", '\x2192')+ ,("arrowrightdblstroke", '\x21CF')+ ,("arrowrightheavy", '\x279E')+ ,("arrowrightoverleft", '\x21C4')+ ,("arrowrightwhite", '\x21E8')+ ,("arrowtableft", '\x21E4')+ ,("arrowtabright", '\x21E5')+ ,("arrowup", '\x2191')+ ,("arrowupdn", '\x2195')+ ,("arrowupdnbse", '\x21A8')+ ,("arrowupdownbase", '\x21A8')+ ,("arrowupleft", '\x2196')+ ,("arrowupleftofdown", '\x21C5')+ ,("arrowupright", '\x2197')+ ,("arrowupwhite", '\x21E7')+ ,("arrowvertex", '\xF8E6')+ ,("asciicircum", '\x005E')+ ,("asciicircummonospace", '\xFF3E')+ ,("asciitilde", '\x007E')+ ,("asciitildemonospace", '\xFF5E')+ ,("ascript", '\x0251')+ ,("ascriptturned", '\x0252')+ ,("asmallhiragana", '\x3041')+ ,("asmallkatakana", '\x30A1')+ ,("asmallkatakanahalfwidth", '\xFF67')+ ,("asterisk", '\x002A')+ ,("asteriskaltonearabic", '\x066D')+ ,("asteriskarabic", '\x066D')+ ,("asteriskmath", '\x2217')+ ,("asteriskmonospace", '\xFF0A')+ ,("asterisksmall", '\xFE61')+ ,("asterism", '\x2042')+ ,("asuperior", '\xF6E9')+ ,("asymptoticallyequal", '\x2243')+ ,("at", '\x0040')+ ,("atilde", '\x00E3')+ ,("atmonospace", '\xFF20')+ ,("atsmall", '\xFE6B')+ ,("aturned", '\x0250')+ ,("aubengali", '\x0994')+ ,("aubopomofo", '\x3120')+ ,("audeva", '\x0914')+ ,("augujarati", '\x0A94')+ ,("augurmukhi", '\x0A14')+ ,("aulengthmarkbengali", '\x09D7')+ ,("aumatragurmukhi", '\x0A4C')+ ,("auvowelsignbengali", '\x09CC')+ ,("auvowelsigndeva", '\x094C')+ ,("auvowelsigngujarati", '\x0ACC')+ ,("avagrahadeva", '\x093D')+ ,("aybarmenian", '\x0561')+ ,("ayin", '\x05E2')+ ,("ayinaltonehebrew", '\xFB20')+ ,("ayinhebrew", '\x05E2')+ ,("b", '\x0062')+ ,("babengali", '\x09AC')+ ,("backslash", '\x005C')+ ,("backslashmonospace", '\xFF3C')+ ,("badeva", '\x092C')+ ,("bagujarati", '\x0AAC')+ ,("bagurmukhi", '\x0A2C')+ ,("bahiragana", '\x3070')+ ,("bahtthai", '\x0E3F')+ ,("bakatakana", '\x30D0')+ ,("bar", '\x007C')+ ,("barmonospace", '\xFF5C')+ ,("bbopomofo", '\x3105')+ ,("bcircle", '\x24D1')+ ,("bdotaccent", '\x1E03')+ ,("bdotbelow", '\x1E05')+ ,("beamedsixteenthnotes", '\x266C')+ ,("because", '\x2235')+ ,("becyrillic", '\x0431')+ ,("beharabic", '\x0628')+ ,("behfinalarabic", '\xFE90')+ ,("behinitialarabic", '\xFE91')+ ,("behiragana", '\x3079')+ ,("behmedialarabic", '\xFE92')+ ,("behmeeminitialarabic", '\xFC9F')+ ,("behmeemisolatedarabic", '\xFC08')+ ,("behnoonfinalarabic", '\xFC6D')+ ,("bekatakana", '\x30D9')+ ,("benarmenian", '\x0562')+ ,("bet", '\x05D1')+ ,("beta", '\x03B2')+ ,("betasymbolgreek", '\x03D0')+ ,("betdagesh", '\xFB31')+ ,("betdageshhebrew", '\xFB31')+ ,("bethebrew", '\x05D1')+ ,("betrafehebrew", '\xFB4C')+ ,("bhabengali", '\x09AD')+ ,("bhadeva", '\x092D')+ ,("bhagujarati", '\x0AAD')+ ,("bhagurmukhi", '\x0A2D')+ ,("bhook", '\x0253')+ ,("bihiragana", '\x3073')+ ,("bikatakana", '\x30D3')+ ,("bilabialclick", '\x0298')+ ,("bindigurmukhi", '\x0A02')+ ,("birusquare", '\x3331')+ ,("blackcircle", '\x25CF')+ ,("blackdiamond", '\x25C6')+ ,("blackdownpointingtriangle", '\x25BC')+ ,("blackleftpointingpointer", '\x25C4')+ ,("blackleftpointingtriangle", '\x25C0')+ ,("blacklenticularbracketleft", '\x3010')+ ,("blacklenticularbracketleftvertical", '\xFE3B')+ ,("blacklenticularbracketright", '\x3011')+ ,("blacklenticularbracketrightvertical", '\xFE3C')+ ,("blacklowerlefttriangle", '\x25E3')+ ,("blacklowerrighttriangle", '\x25E2')+ ,("blackrectangle", '\x25AC')+ ,("blackrightpointingpointer", '\x25BA')+ ,("blackrightpointingtriangle", '\x25B6')+ ,("blacksmallsquare", '\x25AA')+ ,("blacksmilingface", '\x263B')+ ,("blacksquare", '\x25A0')+ ,("blackstar", '\x2605')+ ,("blackupperlefttriangle", '\x25E4')+ ,("blackupperrighttriangle", '\x25E5')+ ,("blackuppointingsmalltriangle", '\x25B4')+ ,("blackuppointingtriangle", '\x25B2')+ ,("blank", '\x2423')+ ,("blinebelow", '\x1E07')+ ,("block", '\x2588')+ ,("bmonospace", '\xFF42')+ ,("bobaimaithai", '\x0E1A')+ ,("bohiragana", '\x307C')+ ,("bokatakana", '\x30DC')+ ,("bparen", '\x249D')+ ,("bqsquare", '\x33C3')+ ,("braceex", '\xF8F4')+ ,("braceleft", '\x007B')+ ,("braceleftbt", '\xF8F3')+ ,("braceleftmid", '\xF8F2')+ ,("braceleftmonospace", '\xFF5B')+ ,("braceleftsmall", '\xFE5B')+ ,("bracelefttp", '\xF8F1')+ ,("braceleftvertical", '\xFE37')+ ,("braceright", '\x007D')+ ,("bracerightbt", '\xF8FE')+ ,("bracerightmid", '\xF8FD')+ ,("bracerightmonospace", '\xFF5D')+ ,("bracerightsmall", '\xFE5C')+ ,("bracerighttp", '\xF8FC')+ ,("bracerightvertical", '\xFE38')+ ,("bracketleft", '\x005B')+ ,("bracketleftbt", '\xF8F0')+ ,("bracketleftex", '\xF8EF')+ ,("bracketleftmonospace", '\xFF3B')+ ,("bracketlefttp", '\xF8EE')+ ,("bracketright", '\x005D')+ ,("bracketrightbt", '\xF8FB')+ ,("bracketrightex", '\xF8FA')+ ,("bracketrightmonospace", '\xFF3D')+ ,("bracketrighttp", '\xF8F9')+ ,("breve", '\x02D8')+ ,("brevebelowcmb", '\x032E')+ ,("brevecmb", '\x0306')+ ,("breveinvertedbelowcmb", '\x032F')+ ,("breveinvertedcmb", '\x0311')+ ,("breveinverteddoublecmb", '\x0361')+ ,("bridgebelowcmb", '\x032A')+ ,("bridgeinvertedbelowcmb", '\x033A')+ ,("brokenbar", '\x00A6')+ ,("bstroke", '\x0180')+ ,("bsuperior", '\xF6EA')+ ,("btopbar", '\x0183')+ ,("buhiragana", '\x3076')+ ,("bukatakana", '\x30D6')+ ,("bullet", '\x2022')+ ,("bulletinverse", '\x25D8')+ ,("bulletoperator", '\x2219')+ ,("bullseye", '\x25CE')+ ,("c", '\x0063')+ ,("caarmenian", '\x056E')+ ,("cabengali", '\x099A')+ ,("cacute", '\x0107')+ ,("cadeva", '\x091A')+ ,("cagujarati", '\x0A9A')+ ,("cagurmukhi", '\x0A1A')+ ,("calsquare", '\x3388')+ ,("candrabindubengali", '\x0981')+ ,("candrabinducmb", '\x0310')+ ,("candrabindudeva", '\x0901')+ ,("candrabindugujarati", '\x0A81')+ ,("capslock", '\x21EA')+ ,("careof", '\x2105')+ ,("caron", '\x02C7')+ ,("caronbelowcmb", '\x032C')+ ,("caroncmb", '\x030C')+ ,("carriagereturn", '\x21B5')+ ,("cbopomofo", '\x3118')+ ,("ccaron", '\x010D')+ ,("ccedilla", '\x00E7')+ ,("ccedillaacute", '\x1E09')+ ,("ccircle", '\x24D2')+ ,("ccircumflex", '\x0109')+ ,("ccurl", '\x0255')+ ,("cdot", '\x010B')+ ,("cdotaccent", '\x010B')+ ,("cdsquare", '\x33C5')+ ,("cedilla", '\x00B8')+ ,("cedillacmb", '\x0327')+ ,("cent", '\x00A2')+ ,("centigrade", '\x2103')+ ,("centinferior", '\xF6DF')+ ,("centmonospace", '\xFFE0')+ ,("centoldstyle", '\xF7A2')+ ,("centsuperior", '\xF6E0')+ ,("chaarmenian", '\x0579')+ ,("chabengali", '\x099B')+ ,("chadeva", '\x091B')+ ,("chagujarati", '\x0A9B')+ ,("chagurmukhi", '\x0A1B')+ ,("chbopomofo", '\x3114')+ ,("cheabkhasiancyrillic", '\x04BD')+ ,("checkmark", '\x2713')+ ,("checyrillic", '\x0447')+ ,("chedescenderabkhasiancyrillic", '\x04BF')+ ,("chedescendercyrillic", '\x04B7')+ ,("chedieresiscyrillic", '\x04F5')+ ,("cheharmenian", '\x0573')+ ,("chekhakassiancyrillic", '\x04CC')+ ,("cheverticalstrokecyrillic", '\x04B9')+ ,("chi", '\x03C7')+ ,("chieuchacirclekorean", '\x3277')+ ,("chieuchaparenkorean", '\x3217')+ ,("chieuchcirclekorean", '\x3269')+ ,("chieuchkorean", '\x314A')+ ,("chieuchparenkorean", '\x3209')+ ,("chochangthai", '\x0E0A')+ ,("chochanthai", '\x0E08')+ ,("chochingthai", '\x0E09')+ ,("chochoethai", '\x0E0C')+ ,("chook", '\x0188')+ ,("cieucacirclekorean", '\x3276')+ ,("cieucaparenkorean", '\x3216')+ ,("cieuccirclekorean", '\x3268')+ ,("cieuckorean", '\x3148')+ ,("cieucparenkorean", '\x3208')+ ,("cieucuparenkorean", '\x321C')+ ,("circle", '\x25CB')+ ,("circlemultiply", '\x2297')+ ,("circleot", '\x2299')+ ,("circleplus", '\x2295')+ ,("circlepostalmark", '\x3036')+ ,("circlewithlefthalfblack", '\x25D0')+ ,("circlewithrighthalfblack", '\x25D1')+ ,("circumflex", '\x02C6')+ ,("circumflexbelowcmb", '\x032D')+ ,("circumflexcmb", '\x0302')+ ,("clear", '\x2327')+ ,("clickalveolar", '\x01C2')+ ,("clickdental", '\x01C0')+ ,("clicklateral", '\x01C1')+ ,("clickretroflex", '\x01C3')+ ,("club", '\x2663')+ ,("clubsuitblack", '\x2663')+ ,("clubsuitwhite", '\x2667')+ ,("cmcubedsquare", '\x33A4')+ ,("cmonospace", '\xFF43')+ ,("cmsquaredsquare", '\x33A0')+ ,("coarmenian", '\x0581')+ ,("colon", '\x003A')+ ,("colonmonetary", '\x20A1')+ ,("colonmonospace", '\xFF1A')+ ,("colonsign", '\x20A1')+ ,("colonsmall", '\xFE55')+ ,("colontriangularhalfmod", '\x02D1')+ ,("colontriangularmod", '\x02D0')+ ,("comma", '\x002C')+ ,("commaabovecmb", '\x0313')+ ,("commaaboverightcmb", '\x0315')+ ,("commaaccent", '\xF6C3')+ ,("commaarabic", '\x060C')+ ,("commaarmenian", '\x055D')+ ,("commainferior", '\xF6E1')+ ,("commamonospace", '\xFF0C')+ ,("commareversedabovecmb", '\x0314')+ ,("commareversedmod", '\x02BD')+ ,("commasmall", '\xFE50')+ ,("commasuperior", '\xF6E2')+ ,("commaturnedabovecmb", '\x0312')+ ,("commaturnedmod", '\x02BB')+ ,("compass", '\x263C')+ ,("congruent", '\x2245')+ ,("contourintegral", '\x222E')+ ,("control", '\x2303')+ ,("controlACK", '\x0006')+ ,("controlBEL", '\x0007')+ ,("controlBS", '\x0008')+ ,("controlCAN", '\x0018')+ ,("controlCR", '\x000D')+ ,("controlDC1", '\x0011')+ ,("controlDC2", '\x0012')+ ,("controlDC3", '\x0013')+ ,("controlDC4", '\x0014')+ ,("controlDEL", '\x007F')+ ,("controlDLE", '\x0010')+ ,("controlEM", '\x0019')+ ,("controlENQ", '\x0005')+ ,("controlEOT", '\x0004')+ ,("controlESC", '\x001B')+ ,("controlETB", '\x0017')+ ,("controlETX", '\x0003')+ ,("controlFF", '\x000C')+ ,("controlFS", '\x001C')+ ,("controlGS", '\x001D')+ ,("controlHT", '\x0009')+ ,("controlLF", '\x000A')+ ,("controlNAK", '\x0015')+ ,("controlRS", '\x001E')+ ,("controlSI", '\x000F')+ ,("controlSO", '\x000E')+ ,("controlSOT", '\x0002')+ ,("controlSTX", '\x0001')+ ,("controlSUB", '\x001A')+ ,("controlSYN", '\x0016')+ ,("controlUS", '\x001F')+ ,("controlVT", '\x000B')+ ,("copyright", '\x00A9')+ ,("copyrightsans", '\xF8E9')+ ,("copyrightserif", '\xF6D9')+ ,("cornerbracketleft", '\x300C')+ ,("cornerbracketlefthalfwidth", '\xFF62')+ ,("cornerbracketleftvertical", '\xFE41')+ ,("cornerbracketright", '\x300D')+ ,("cornerbracketrighthalfwidth", '\xFF63')+ ,("cornerbracketrightvertical", '\xFE42')+ ,("corporationsquare", '\x337F')+ ,("cosquare", '\x33C7')+ ,("coverkgsquare", '\x33C6')+ ,("cparen", '\x249E')+ ,("cruzeiro", '\x20A2')+ ,("cstretched", '\x0297')+ ,("curlyand", '\x22CF')+ ,("curlyor", '\x22CE')+ ,("currency", '\x00A4')+ ,("cyrBreve", '\xF6D1')+ ,("cyrFlex", '\xF6D2')+ ,("cyrbreve", '\xF6D4')+ ,("cyrflex", '\xF6D5')+ ,("d", '\x0064')+ ,("daarmenian", '\x0564')+ ,("dabengali", '\x09A6')+ ,("dadarabic", '\x0636')+ ,("dadeva", '\x0926')+ ,("dadfinalarabic", '\xFEBE')+ ,("dadinitialarabic", '\xFEBF')+ ,("dadmedialarabic", '\xFEC0')+ ,("dagesh", '\x05BC')+ ,("dageshhebrew", '\x05BC')+ ,("dagger", '\x2020')+ ,("daggerdbl", '\x2021')+ ,("dagujarati", '\x0AA6')+ ,("dagurmukhi", '\x0A26')+ ,("dahiragana", '\x3060')+ ,("dakatakana", '\x30C0')+ ,("dalarabic", '\x062F')+ ,("dalet", '\x05D3')+ ,("daletdagesh", '\xFB33')+ ,("daletdageshhebrew", '\xFB33')+ ,("dalethatafpatah", '\x05D3')+ ,("dalethatafpatahhebrew", '\x05D3')+ ,("dalethatafsegol", '\x05D3')+ ,("dalethatafsegolhebrew", '\x05D3')+ ,("dalethebrew", '\x05D3')+ ,("dalethiriq", '\x05D3')+ ,("dalethiriqhebrew", '\x05D3')+ ,("daletholam", '\x05D3')+ ,("daletholamhebrew", '\x05D3')+ ,("daletpatah", '\x05D3')+ ,("daletpatahhebrew", '\x05D3')+ ,("daletqamats", '\x05D3')+ ,("daletqamatshebrew", '\x05D3')+ ,("daletqubuts", '\x05D3')+ ,("daletqubutshebrew", '\x05D3')+ ,("daletsegol", '\x05D3')+ ,("daletsegolhebrew", '\x05D3')+ ,("daletsheva", '\x05D3')+ ,("daletshevahebrew", '\x05D3')+ ,("dalettsere", '\x05D3')+ ,("dalettserehebrew", '\x05D3')+ ,("dalfinalarabic", '\xFEAA')+ ,("dammaarabic", '\x064F')+ ,("dammalowarabic", '\x064F')+ ,("dammatanaltonearabic", '\x064C')+ ,("dammatanarabic", '\x064C')+ ,("danda", '\x0964')+ ,("dargahebrew", '\x05A7')+ ,("dargalefthebrew", '\x05A7')+ ,("dasiapneumatacyrilliccmb", '\x0485')+ ,("dblGrave", '\xF6D3')+ ,("dblanglebracketleft", '\x300A')+ ,("dblanglebracketleftvertical", '\xFE3D')+ ,("dblanglebracketright", '\x300B')+ ,("dblanglebracketrightvertical", '\xFE3E')+ ,("dblarchinvertedbelowcmb", '\x032B')+ ,("dblarrowleft", '\x21D4')+ ,("dblarrowright", '\x21D2')+ ,("dbldanda", '\x0965')+ ,("dblgrave", '\xF6D6')+ ,("dblgravecmb", '\x030F')+ ,("dblintegral", '\x222C')+ ,("dbllowline", '\x2017')+ ,("dbllowlinecmb", '\x0333')+ ,("dbloverlinecmb", '\x033F')+ ,("dblprimemod", '\x02BA')+ ,("dblverticalbar", '\x2016')+ ,("dblverticallineabovecmb", '\x030E')+ ,("dbopomofo", '\x3109')+ ,("dbsquare", '\x33C8')+ ,("dcaron", '\x010F')+ ,("dcedilla", '\x1E11')+ ,("dcircle", '\x24D3')+ ,("dcircumflexbelow", '\x1E13')+ ,("dcroat", '\x0111')+ ,("ddabengali", '\x09A1')+ ,("ddadeva", '\x0921')+ ,("ddagujarati", '\x0AA1')+ ,("ddagurmukhi", '\x0A21')+ ,("ddalarabic", '\x0688')+ ,("ddalfinalarabic", '\xFB89')+ ,("dddhadeva", '\x095C')+ ,("ddhabengali", '\x09A2')+ ,("ddhadeva", '\x0922')+ ,("ddhagujarati", '\x0AA2')+ ,("ddhagurmukhi", '\x0A22')+ ,("ddotaccent", '\x1E0B')+ ,("ddotbelow", '\x1E0D')+ ,("decimalseparatorarabic", '\x066B')+ ,("decimalseparatorpersian", '\x066B')+ ,("decyrillic", '\x0434')+ ,("degree", '\x00B0')+ ,("dehihebrew", '\x05AD')+ ,("dehiragana", '\x3067')+ ,("deicoptic", '\x03EF')+ ,("dekatakana", '\x30C7')+ ,("deleteleft", '\x232B')+ ,("deleteright", '\x2326')+ ,("delta", '\x03B4')+ ,("deltaturned", '\x018D')+ ,("denominatorminusonenumeratorbengali", '\x09F8')+ ,("dezh", '\x02A4')+ ,("dhabengali", '\x09A7')+ ,("dhadeva", '\x0927')+ ,("dhagujarati", '\x0AA7')+ ,("dhagurmukhi", '\x0A27')+ ,("dhook", '\x0257')+ ,("dialytikatonos", '\x0385')+ ,("dialytikatonoscmb", '\x0344')+ ,("diamond", '\x2666')+ ,("diamondsuitwhite", '\x2662')+ ,("dieresis", '\x00A8')+ ,("dieresisacute", '\xF6D7')+ ,("dieresisbelowcmb", '\x0324')+ ,("dieresiscmb", '\x0308')+ ,("dieresisgrave", '\xF6D8')+ ,("dieresistonos", '\x0385')+ ,("dihiragana", '\x3062')+ ,("dikatakana", '\x30C2')+ ,("dittomark", '\x3003')+ ,("divide", '\x00F7')+ ,("divides", '\x2223')+ ,("divisionslash", '\x2215')+ ,("djecyrillic", '\x0452')+ ,("dkshade", '\x2593')+ ,("dlinebelow", '\x1E0F')+ ,("dlsquare", '\x3397')+ ,("dmacron", '\x0111')+ ,("dmonospace", '\xFF44')+ ,("dnblock", '\x2584')+ ,("dochadathai", '\x0E0E')+ ,("dodekthai", '\x0E14')+ ,("dohiragana", '\x3069')+ ,("dokatakana", '\x30C9')+ ,("dollar", '\x0024')+ ,("dollarinferior", '\xF6E3')+ ,("dollarmonospace", '\xFF04')+ ,("dollaroldstyle", '\xF724')+ ,("dollarsmall", '\xFE69')+ ,("dollarsuperior", '\xF6E4')+ ,("dong", '\x20AB')+ ,("dorusquare", '\x3326')+ ,("dotaccent", '\x02D9')+ ,("dotaccentcmb", '\x0307')+ ,("dotbelowcmb", '\x0323')+ ,("dotbelowcomb", '\x0323')+ ,("dotkatakana", '\x30FB')+ ,("dotlessi", '\x0131')+ ,("dotlessj", '\xF6BE')+ ,("dotlessjstrokehook", '\x0284')+ ,("dotmath", '\x22C5')+ ,("dottedcircle", '\x25CC')+ ,("doubleyodpatah", '\xFB1F')+ ,("doubleyodpatahhebrew", '\xFB1F')+ ,("downtackbelowcmb", '\x031E')+ ,("downtackmod", '\x02D5')+ ,("dparen", '\x249F')+ ,("dsuperior", '\xF6EB')+ ,("dtail", '\x0256')+ ,("dtopbar", '\x018C')+ ,("duhiragana", '\x3065')+ ,("dukatakana", '\x30C5')+ ,("dz", '\x01F3')+ ,("dzaltone", '\x02A3')+ ,("dzcaron", '\x01C6')+ ,("dzcurl", '\x02A5')+ ,("dzeabkhasiancyrillic", '\x04E1')+ ,("dzecyrillic", '\x0455')+ ,("dzhecyrillic", '\x045F')+ ,("e", '\x0065')+ ,("eacute", '\x00E9')+ ,("earth", '\x2641')+ ,("ebengali", '\x098F')+ ,("ebopomofo", '\x311C')+ ,("ebreve", '\x0115')+ ,("ecandradeva", '\x090D')+ ,("ecandragujarati", '\x0A8D')+ ,("ecandravowelsigndeva", '\x0945')+ ,("ecandravowelsigngujarati", '\x0AC5')+ ,("ecaron", '\x011B')+ ,("ecedillabreve", '\x1E1D')+ ,("echarmenian", '\x0565')+ ,("echyiwnarmenian", '\x0587')+ ,("ecircle", '\x24D4')+ ,("ecircumflex", '\x00EA')+ ,("ecircumflexacute", '\x1EBF')+ ,("ecircumflexbelow", '\x1E19')+ ,("ecircumflexdotbelow", '\x1EC7')+ ,("ecircumflexgrave", '\x1EC1')+ ,("ecircumflexhookabove", '\x1EC3')+ ,("ecircumflextilde", '\x1EC5')+ ,("ecyrillic", '\x0454')+ ,("edblgrave", '\x0205')+ ,("edeva", '\x090F')+ ,("edieresis", '\x00EB')+ ,("edot", '\x0117')+ ,("edotaccent", '\x0117')+ ,("edotbelow", '\x1EB9')+ ,("eegurmukhi", '\x0A0F')+ ,("eematragurmukhi", '\x0A47')+ ,("efcyrillic", '\x0444')+ ,("egrave", '\x00E8')+ ,("egujarati", '\x0A8F')+ ,("eharmenian", '\x0567')+ ,("ehbopomofo", '\x311D')+ ,("ehiragana", '\x3048')+ ,("ehookabove", '\x1EBB')+ ,("eibopomofo", '\x311F')+ ,("eight", '\x0038')+ ,("eightarabic", '\x0668')+ ,("eightbengali", '\x09EE')+ ,("eightcircle", '\x2467')+ ,("eightcircleinversesansserif", '\x2791')+ ,("eightdeva", '\x096E')+ ,("eighteencircle", '\x2471')+ ,("eighteenparen", '\x2485')+ ,("eighteenperiod", '\x2499')+ ,("eightgujarati", '\x0AEE')+ ,("eightgurmukhi", '\x0A6E')+ ,("eighthackarabic", '\x0668')+ ,("eighthangzhou", '\x3028')+ ,("eighthnotebeamed", '\x266B')+ ,("eightideographicparen", '\x3227')+ ,("eightinferior", '\x2088')+ ,("eightmonospace", '\xFF18')+ ,("eightoldstyle", '\xF738')+ ,("eightparen", '\x247B')+ ,("eightperiod", '\x248F')+ ,("eightpersian", '\x06F8')+ ,("eightroman", '\x2177')+ ,("eightsuperior", '\x2078')+ ,("eightthai", '\x0E58')+ ,("einvertedbreve", '\x0207')+ ,("eiotifiedcyrillic", '\x0465')+ ,("ekatakana", '\x30A8')+ ,("ekatakanahalfwidth", '\xFF74')+ ,("ekonkargurmukhi", '\x0A74')+ ,("ekorean", '\x3154')+ ,("elcyrillic", '\x043B')+ ,("element", '\x2208')+ ,("elevencircle", '\x246A')+ ,("elevenparen", '\x247E')+ ,("elevenperiod", '\x2492')+ ,("elevenroman", '\x217A')+ ,("ellipsis", '\x2026')+ ,("ellipsisvertical", '\x22EE')+ ,("emacron", '\x0113')+ ,("emacronacute", '\x1E17')+ ,("emacrongrave", '\x1E15')+ ,("emcyrillic", '\x043C')+ ,("emdash", '\x2014')+ ,("emdashvertical", '\xFE31')+ ,("emonospace", '\xFF45')+ ,("emphasismarkarmenian", '\x055B')+ ,("emptyset", '\x2205')+ ,("enbopomofo", '\x3123')+ ,("encyrillic", '\x043D')+ ,("endash", '\x2013')+ ,("endashvertical", '\xFE32')+ ,("endescendercyrillic", '\x04A3')+ ,("eng", '\x014B')+ ,("engbopomofo", '\x3125')+ ,("enghecyrillic", '\x04A5')+ ,("enhookcyrillic", '\x04C8')+ ,("enspace", '\x2002')+ ,("eogonek", '\x0119')+ ,("eokorean", '\x3153')+ ,("eopen", '\x025B')+ ,("eopenclosed", '\x029A')+ ,("eopenreversed", '\x025C')+ ,("eopenreversedclosed", '\x025E')+ ,("eopenreversedhook", '\x025D')+ ,("eparen", '\x24A0')+ ,("epsilon", '\x03B5')+ ,("epsilontonos", '\x03AD')+ ,("equal", '\x003D')+ ,("equalmonospace", '\xFF1D')+ ,("equalsmall", '\xFE66')+ ,("equalsuperior", '\x207C')+ ,("equivalence", '\x2261')+ ,("erbopomofo", '\x3126')+ ,("ercyrillic", '\x0440')+ ,("ereversed", '\x0258')+ ,("ereversedcyrillic", '\x044D')+ ,("escyrillic", '\x0441')+ ,("esdescendercyrillic", '\x04AB')+ ,("esh", '\x0283')+ ,("eshcurl", '\x0286')+ ,("eshortdeva", '\x090E')+ ,("eshortvowelsigndeva", '\x0946')+ ,("eshreversedloop", '\x01AA')+ ,("eshsquatreversed", '\x0285')+ ,("esmallhiragana", '\x3047')+ ,("esmallkatakana", '\x30A7')+ ,("esmallkatakanahalfwidth", '\xFF6A')+ ,("estimated", '\x212E')+ ,("esuperior", '\xF6EC')+ ,("eta", '\x03B7')+ ,("etarmenian", '\x0568')+ ,("etatonos", '\x03AE')+ ,("eth", '\x00F0')+ ,("etilde", '\x1EBD')+ ,("etildebelow", '\x1E1B')+ ,("etnahtafoukhhebrew", '\x0591')+ ,("etnahtafoukhlefthebrew", '\x0591')+ ,("etnahtahebrew", '\x0591')+ ,("etnahtalefthebrew", '\x0591')+ ,("eturned", '\x01DD')+ ,("eukorean", '\x3161')+ ,("euro", '\x20AC')+ ,("evowelsignbengali", '\x09C7')+ ,("evowelsigndeva", '\x0947')+ ,("evowelsigngujarati", '\x0AC7')+ ,("exclam", '\x0021')+ ,("exclamarmenian", '\x055C')+ ,("exclamdbl", '\x203C')+ ,("exclamdown", '\x00A1')+ ,("exclamdownsmall", '\xF7A1')+ ,("exclammonospace", '\xFF01')+ ,("exclamsmall", '\xF721')+ ,("existential", '\x2203')+ ,("ezh", '\x0292')+ ,("ezhcaron", '\x01EF')+ ,("ezhcurl", '\x0293')+ ,("ezhreversed", '\x01B9')+ ,("ezhtail", '\x01BA')+ ,("f", '\x0066')+ ,("fadeva", '\x095E')+ ,("fagurmukhi", '\x0A5E')+ ,("fahrenheit", '\x2109')+ ,("fathaarabic", '\x064E')+ ,("fathalowarabic", '\x064E')+ ,("fathatanarabic", '\x064B')+ ,("fbopomofo", '\x3108')+ ,("fcircle", '\x24D5')+ ,("fdotaccent", '\x1E1F')+ ,("feharabic", '\x0641')+ ,("feharmenian", '\x0586')+ ,("fehfinalarabic", '\xFED2')+ ,("fehinitialarabic", '\xFED3')+ ,("fehmedialarabic", '\xFED4')+ ,("feicoptic", '\x03E5')+ ,("female", '\x2640')+ ,("ff", '\xFB00')+ ,("ffi", '\xFB03')+ ,("ffl", '\xFB04')+ ,("fi", '\xFB01')+ ,("fifteencircle", '\x246E')+ ,("fifteenparen", '\x2482')+ ,("fifteenperiod", '\x2496')+ ,("figuredash", '\x2012')+ ,("filledbox", '\x25A0')+ ,("filledrect", '\x25AC')+ ,("finalkaf", '\x05DA')+ ,("finalkafdagesh", '\xFB3A')+ ,("finalkafdageshhebrew", '\xFB3A')+ ,("finalkafhebrew", '\x05DA')+ ,("finalkafqamats", '\x05DA')+ ,("finalkafqamatshebrew", '\x05DA')+ ,("finalkafsheva", '\x05DA')+ ,("finalkafshevahebrew", '\x05DA')+ ,("finalmem", '\x05DD')+ ,("finalmemhebrew", '\x05DD')+ ,("finalnun", '\x05DF')+ ,("finalnunhebrew", '\x05DF')+ ,("finalpe", '\x05E3')+ ,("finalpehebrew", '\x05E3')+ ,("finaltsadi", '\x05E5')+ ,("finaltsadihebrew", '\x05E5')+ ,("firsttonechinese", '\x02C9')+ ,("fisheye", '\x25C9')+ ,("fitacyrillic", '\x0473')+ ,("five", '\x0035')+ ,("fivearabic", '\x0665')+ ,("fivebengali", '\x09EB')+ ,("fivecircle", '\x2464')+ ,("fivecircleinversesansserif", '\x278E')+ ,("fivedeva", '\x096B')+ ,("fiveeighths", '\x215D')+ ,("fivegujarati", '\x0AEB')+ ,("fivegurmukhi", '\x0A6B')+ ,("fivehackarabic", '\x0665')+ ,("fivehangzhou", '\x3025')+ ,("fiveideographicparen", '\x3224')+ ,("fiveinferior", '\x2085')+ ,("fivemonospace", '\xFF15')+ ,("fiveoldstyle", '\xF735')+ ,("fiveparen", '\x2478')+ ,("fiveperiod", '\x248C')+ ,("fivepersian", '\x06F5')+ ,("fiveroman", '\x2174')+ ,("fivesuperior", '\x2075')+ ,("fivethai", '\x0E55')+ ,("fl", '\xFB02')+ ,("florin", '\x0192')+ ,("fmonospace", '\xFF46')+ ,("fmsquare", '\x3399')+ ,("fofanthai", '\x0E1F')+ ,("fofathai", '\x0E1D')+ ,("fongmanthai", '\x0E4F')+ ,("forall", '\x2200')+ ,("four", '\x0034')+ ,("fourarabic", '\x0664')+ ,("fourbengali", '\x09EA')+ ,("fourcircle", '\x2463')+ ,("fourcircleinversesansserif", '\x278D')+ ,("fourdeva", '\x096A')+ ,("fourgujarati", '\x0AEA')+ ,("fourgurmukhi", '\x0A6A')+ ,("fourhackarabic", '\x0664')+ ,("fourhangzhou", '\x3024')+ ,("fourideographicparen", '\x3223')+ ,("fourinferior", '\x2084')+ ,("fourmonospace", '\xFF14')+ ,("fournumeratorbengali", '\x09F7')+ ,("fouroldstyle", '\xF734')+ ,("fourparen", '\x2477')+ ,("fourperiod", '\x248B')+ ,("fourpersian", '\x06F4')+ ,("fourroman", '\x2173')+ ,("foursuperior", '\x2074')+ ,("fourteencircle", '\x246D')+ ,("fourteenparen", '\x2481')+ ,("fourteenperiod", '\x2495')+ ,("fourthai", '\x0E54')+ ,("fourthtonechinese", '\x02CB')+ ,("fparen", '\x24A1')+ ,("fraction", '\x2044')+ ,("franc", '\x20A3')+ ,("g", '\x0067')+ ,("gabengali", '\x0997')+ ,("gacute", '\x01F5')+ ,("gadeva", '\x0917')+ ,("gafarabic", '\x06AF')+ ,("gaffinalarabic", '\xFB93')+ ,("gafinitialarabic", '\xFB94')+ ,("gafmedialarabic", '\xFB95')+ ,("gagujarati", '\x0A97')+ ,("gagurmukhi", '\x0A17')+ ,("gahiragana", '\x304C')+ ,("gakatakana", '\x30AC')+ ,("gamma", '\x03B3')+ ,("gammalatinsmall", '\x0263')+ ,("gammasuperior", '\x02E0')+ ,("gangiacoptic", '\x03EB')+ ,("gbopomofo", '\x310D')+ ,("gbreve", '\x011F')+ ,("gcaron", '\x01E7')+ ,("gcedilla", '\x0123')+ ,("gcircle", '\x24D6')+ ,("gcircumflex", '\x011D')+ ,("gcommaaccent", '\x0123')+ ,("gdot", '\x0121')+ ,("gdotaccent", '\x0121')+ ,("gecyrillic", '\x0433')+ ,("gehiragana", '\x3052')+ ,("gekatakana", '\x30B2')+ ,("geometricallyequal", '\x2251')+ ,("gereshaccenthebrew", '\x059C')+ ,("gereshhebrew", '\x05F3')+ ,("gereshmuqdamhebrew", '\x059D')+ ,("germandbls", '\x00DF')+ ,("gershayimaccenthebrew", '\x059E')+ ,("gershayimhebrew", '\x05F4')+ ,("getamark", '\x3013')+ ,("ghabengali", '\x0998')+ ,("ghadarmenian", '\x0572')+ ,("ghadeva", '\x0918')+ ,("ghagujarati", '\x0A98')+ ,("ghagurmukhi", '\x0A18')+ ,("ghainarabic", '\x063A')+ ,("ghainfinalarabic", '\xFECE')+ ,("ghaininitialarabic", '\xFECF')+ ,("ghainmedialarabic", '\xFED0')+ ,("ghemiddlehookcyrillic", '\x0495')+ ,("ghestrokecyrillic", '\x0493')+ ,("gheupturncyrillic", '\x0491')+ ,("ghhadeva", '\x095A')+ ,("ghhagurmukhi", '\x0A5A')+ ,("ghook", '\x0260')+ ,("ghzsquare", '\x3393')+ ,("gihiragana", '\x304E')+ ,("gikatakana", '\x30AE')+ ,("gimarmenian", '\x0563')+ ,("gimel", '\x05D2')+ ,("gimeldagesh", '\xFB32')+ ,("gimeldageshhebrew", '\xFB32')+ ,("gimelhebrew", '\x05D2')+ ,("gjecyrillic", '\x0453')+ ,("glottalinvertedstroke", '\x01BE')+ ,("glottalstop", '\x0294')+ ,("glottalstopinverted", '\x0296')+ ,("glottalstopmod", '\x02C0')+ ,("glottalstopreversed", '\x0295')+ ,("glottalstopreversedmod", '\x02C1')+ ,("glottalstopreversedsuperior", '\x02E4')+ ,("glottalstopstroke", '\x02A1')+ ,("glottalstopstrokereversed", '\x02A2')+ ,("gmacron", '\x1E21')+ ,("gmonospace", '\xFF47')+ ,("gohiragana", '\x3054')+ ,("gokatakana", '\x30B4')+ ,("gparen", '\x24A2')+ ,("gpasquare", '\x33AC')+ ,("gradient", '\x2207')+ ,("grave", '\x0060')+ ,("gravebelowcmb", '\x0316')+ ,("gravecmb", '\x0300')+ ,("gravecomb", '\x0300')+ ,("gravedeva", '\x0953')+ ,("gravelowmod", '\x02CE')+ ,("gravemonospace", '\xFF40')+ ,("gravetonecmb", '\x0340')+ ,("greater", '\x003E')+ ,("greaterequal", '\x2265')+ ,("greaterequalorless", '\x22DB')+ ,("greatermonospace", '\xFF1E')+ ,("greaterorequivalent", '\x2273')+ ,("greaterorless", '\x2277')+ ,("greateroverequal", '\x2267')+ ,("greatersmall", '\xFE65')+ ,("gscript", '\x0261')+ ,("gstroke", '\x01E5')+ ,("guhiragana", '\x3050')+ ,("guillemotleft", '\x00AB')+ ,("guillemotright", '\x00BB')+ ,("guilsinglleft", '\x2039')+ ,("guilsinglright", '\x203A')+ ,("gukatakana", '\x30B0')+ ,("guramusquare", '\x3318')+ ,("gysquare", '\x33C9')+ ,("h", '\x0068')+ ,("haabkhasiancyrillic", '\x04A9')+ ,("haaltonearabic", '\x06C1')+ ,("habengali", '\x09B9')+ ,("hadescendercyrillic", '\x04B3')+ ,("hadeva", '\x0939')+ ,("hagujarati", '\x0AB9')+ ,("hagurmukhi", '\x0A39')+ ,("haharabic", '\x062D')+ ,("hahfinalarabic", '\xFEA2')+ ,("hahinitialarabic", '\xFEA3')+ ,("hahiragana", '\x306F')+ ,("hahmedialarabic", '\xFEA4')+ ,("haitusquare", '\x332A')+ ,("hakatakana", '\x30CF')+ ,("hakatakanahalfwidth", '\xFF8A')+ ,("halantgurmukhi", '\x0A4D')+ ,("hamzaarabic", '\x0621')+ ,("hamzadammaarabic", '\x0621')+ ,("hamzadammatanarabic", '\x0621')+ ,("hamzafathaarabic", '\x0621')+ ,("hamzafathatanarabic", '\x0621')+ ,("hamzalowarabic", '\x0621')+ ,("hamzalowkasraarabic", '\x0621')+ ,("hamzalowkasratanarabic", '\x0621')+ ,("hamzasukunarabic", '\x0621')+ ,("hangulfiller", '\x3164')+ ,("hardsigncyrillic", '\x044A')+ ,("harpoonleftbarbup", '\x21BC')+ ,("harpoonrightbarbup", '\x21C0')+ ,("hasquare", '\x33CA')+ ,("hatafpatah", '\x05B2')+ ,("hatafpatah16", '\x05B2')+ ,("hatafpatah23", '\x05B2')+ ,("hatafpatah2f", '\x05B2')+ ,("hatafpatahhebrew", '\x05B2')+ ,("hatafpatahnarrowhebrew", '\x05B2')+ ,("hatafpatahquarterhebrew", '\x05B2')+ ,("hatafpatahwidehebrew", '\x05B2')+ ,("hatafqamats", '\x05B3')+ ,("hatafqamats1b", '\x05B3')+ ,("hatafqamats28", '\x05B3')+ ,("hatafqamats34", '\x05B3')+ ,("hatafqamatshebrew", '\x05B3')+ ,("hatafqamatsnarrowhebrew", '\x05B3')+ ,("hatafqamatsquarterhebrew", '\x05B3')+ ,("hatafqamatswidehebrew", '\x05B3')+ ,("hatafsegol", '\x05B1')+ ,("hatafsegol17", '\x05B1')+ ,("hatafsegol24", '\x05B1')+ ,("hatafsegol30", '\x05B1')+ ,("hatafsegolhebrew", '\x05B1')+ ,("hatafsegolnarrowhebrew", '\x05B1')+ ,("hatafsegolquarterhebrew", '\x05B1')+ ,("hatafsegolwidehebrew", '\x05B1')+ ,("hbar", '\x0127')+ ,("hbopomofo", '\x310F')+ ,("hbrevebelow", '\x1E2B')+ ,("hcedilla", '\x1E29')+ ,("hcircle", '\x24D7')+ ,("hcircumflex", '\x0125')+ ,("hdieresis", '\x1E27')+ ,("hdotaccent", '\x1E23')+ ,("hdotbelow", '\x1E25')+ ,("he", '\x05D4')+ ,("heart", '\x2665')+ ,("heartsuitblack", '\x2665')+ ,("heartsuitwhite", '\x2661')+ ,("hedagesh", '\xFB34')+ ,("hedageshhebrew", '\xFB34')+ ,("hehaltonearabic", '\x06C1')+ ,("heharabic", '\x0647')+ ,("hehebrew", '\x05D4')+ ,("hehfinalaltonearabic", '\xFBA7')+ ,("hehfinalalttwoarabic", '\xFEEA')+ ,("hehfinalarabic", '\xFEEA')+ ,("hehhamzaabovefinalarabic", '\xFBA5')+ ,("hehhamzaaboveisolatedarabic", '\xFBA4')+ ,("hehinitialaltonearabic", '\xFBA8')+ ,("hehinitialarabic", '\xFEEB')+ ,("hehiragana", '\x3078')+ ,("hehmedialaltonearabic", '\xFBA9')+ ,("hehmedialarabic", '\xFEEC')+ ,("heiseierasquare", '\x337B')+ ,("hekatakana", '\x30D8')+ ,("hekatakanahalfwidth", '\xFF8D')+ ,("hekutaarusquare", '\x3336')+ ,("henghook", '\x0267')+ ,("herutusquare", '\x3339')+ ,("het", '\x05D7')+ ,("hethebrew", '\x05D7')+ ,("hhook", '\x0266')+ ,("hhooksuperior", '\x02B1')+ ,("hieuhacirclekorean", '\x327B')+ ,("hieuhaparenkorean", '\x321B')+ ,("hieuhcirclekorean", '\x326D')+ ,("hieuhkorean", '\x314E')+ ,("hieuhparenkorean", '\x320D')+ ,("hihiragana", '\x3072')+ ,("hikatakana", '\x30D2')+ ,("hikatakanahalfwidth", '\xFF8B')+ ,("hiriq", '\x05B4')+ ,("hiriq14", '\x05B4')+ ,("hiriq21", '\x05B4')+ ,("hiriq2d", '\x05B4')+ ,("hiriqhebrew", '\x05B4')+ ,("hiriqnarrowhebrew", '\x05B4')+ ,("hiriqquarterhebrew", '\x05B4')+ ,("hiriqwidehebrew", '\x05B4')+ ,("hlinebelow", '\x1E96')+ ,("hmonospace", '\xFF48')+ ,("hoarmenian", '\x0570')+ ,("hohipthai", '\x0E2B')+ ,("hohiragana", '\x307B')+ ,("hokatakana", '\x30DB')+ ,("hokatakanahalfwidth", '\xFF8E')+ ,("holam", '\x05B9')+ ,("holam19", '\x05B9')+ ,("holam26", '\x05B9')+ ,("holam32", '\x05B9')+ ,("holamhebrew", '\x05B9')+ ,("holamnarrowhebrew", '\x05B9')+ ,("holamquarterhebrew", '\x05B9')+ ,("holamwidehebrew", '\x05B9')+ ,("honokhukthai", '\x0E2E')+ ,("hookabovecomb", '\x0309')+ ,("hookcmb", '\x0309')+ ,("hookpalatalizedbelowcmb", '\x0321')+ ,("hookretroflexbelowcmb", '\x0322')+ ,("hoonsquare", '\x3342')+ ,("horicoptic", '\x03E9')+ ,("horizontalbar", '\x2015')+ ,("horncmb", '\x031B')+ ,("hotsprings", '\x2668')+ ,("house", '\x2302')+ ,("hparen", '\x24A3')+ ,("hsuperior", '\x02B0')+ ,("hturned", '\x0265')+ ,("huhiragana", '\x3075')+ ,("huiitosquare", '\x3333')+ ,("hukatakana", '\x30D5')+ ,("hukatakanahalfwidth", '\xFF8C')+ ,("hungarumlaut", '\x02DD')+ ,("hungarumlautcmb", '\x030B')+ ,("hv", '\x0195')+ ,("hyphen", '\x002D')+ ,("hypheninferior", '\xF6E5')+ ,("hyphenmonospace", '\xFF0D')+ ,("hyphensmall", '\xFE63')+ ,("hyphensuperior", '\xF6E6')+ ,("hyphentwo", '\x2010')+ ,("i", '\x0069')+ ,("iacute", '\x00ED')+ ,("iacyrillic", '\x044F')+ ,("ibengali", '\x0987')+ ,("ibopomofo", '\x3127')+ ,("ibreve", '\x012D')+ ,("icaron", '\x01D0')+ ,("icircle", '\x24D8')+ ,("icircumflex", '\x00EE')+ ,("icyrillic", '\x0456')+ ,("idblgrave", '\x0209')+ ,("ideographearthcircle", '\x328F')+ ,("ideographfirecircle", '\x328B')+ ,("ideographicallianceparen", '\x323F')+ ,("ideographiccallparen", '\x323A')+ ,("ideographiccentrecircle", '\x32A5')+ ,("ideographicclose", '\x3006')+ ,("ideographiccomma", '\x3001')+ ,("ideographiccommaleft", '\xFF64')+ ,("ideographiccongratulationparen", '\x3237')+ ,("ideographiccorrectcircle", '\x32A3')+ ,("ideographicearthparen", '\x322F')+ ,("ideographicenterpriseparen", '\x323D')+ ,("ideographicexcellentcircle", '\x329D')+ ,("ideographicfestivalparen", '\x3240')+ ,("ideographicfinancialcircle", '\x3296')+ ,("ideographicfinancialparen", '\x3236')+ ,("ideographicfireparen", '\x322B')+ ,("ideographichaveparen", '\x3232')+ ,("ideographichighcircle", '\x32A4')+ ,("ideographiciterationmark", '\x3005')+ ,("ideographiclaborcircle", '\x3298')+ ,("ideographiclaborparen", '\x3238')+ ,("ideographicleftcircle", '\x32A7')+ ,("ideographiclowcircle", '\x32A6')+ ,("ideographicmedicinecircle", '\x32A9')+ ,("ideographicmetalparen", '\x322E')+ ,("ideographicmoonparen", '\x322A')+ ,("ideographicnameparen", '\x3234')+ ,("ideographicperiod", '\x3002')+ ,("ideographicprintcircle", '\x329E')+ ,("ideographicreachparen", '\x3243')+ ,("ideographicrepresentparen", '\x3239')+ ,("ideographicresourceparen", '\x323E')+ ,("ideographicrightcircle", '\x32A8')+ ,("ideographicsecretcircle", '\x3299')+ ,("ideographicselfparen", '\x3242')+ ,("ideographicsocietyparen", '\x3233')+ ,("ideographicspace", '\x3000')+ ,("ideographicspecialparen", '\x3235')+ ,("ideographicstockparen", '\x3231')+ ,("ideographicstudyparen", '\x323B')+ ,("ideographicsunparen", '\x3230')+ ,("ideographicsuperviseparen", '\x323C')+ ,("ideographicwaterparen", '\x322C')+ ,("ideographicwoodparen", '\x322D')+ ,("ideographiczero", '\x3007')+ ,("ideographmetalcircle", '\x328E')+ ,("ideographmooncircle", '\x328A')+ ,("ideographnamecircle", '\x3294')+ ,("ideographsuncircle", '\x3290')+ ,("ideographwatercircle", '\x328C')+ ,("ideographwoodcircle", '\x328D')+ ,("ideva", '\x0907')+ ,("idieresis", '\x00EF')+ ,("idieresisacute", '\x1E2F')+ ,("idieresiscyrillic", '\x04E5')+ ,("idotbelow", '\x1ECB')+ ,("iebrevecyrillic", '\x04D7')+ ,("iecyrillic", '\x0435')+ ,("ieungacirclekorean", '\x3275')+ ,("ieungaparenkorean", '\x3215')+ ,("ieungcirclekorean", '\x3267')+ ,("ieungkorean", '\x3147')+ ,("ieungparenkorean", '\x3207')+ ,("igrave", '\x00EC')+ ,("igujarati", '\x0A87')+ ,("igurmukhi", '\x0A07')+ ,("ihiragana", '\x3044')+ ,("ihookabove", '\x1EC9')+ ,("iibengali", '\x0988')+ ,("iicyrillic", '\x0438')+ ,("iideva", '\x0908')+ ,("iigujarati", '\x0A88')+ ,("iigurmukhi", '\x0A08')+ ,("iimatragurmukhi", '\x0A40')+ ,("iinvertedbreve", '\x020B')+ ,("iishortcyrillic", '\x0439')+ ,("iivowelsignbengali", '\x09C0')+ ,("iivowelsigndeva", '\x0940')+ ,("iivowelsigngujarati", '\x0AC0')+ ,("ij", '\x0133')+ ,("ikatakana", '\x30A4')+ ,("ikatakanahalfwidth", '\xFF72')+ ,("ikorean", '\x3163')+ ,("ilde", '\x02DC')+ ,("iluyhebrew", '\x05AC')+ ,("imacron", '\x012B')+ ,("imacroncyrillic", '\x04E3')+ ,("imageorapproximatelyequal", '\x2253')+ ,("imatragurmukhi", '\x0A3F')+ ,("imonospace", '\xFF49')+ ,("increment", '\x2206')+ ,("infinity", '\x221E')+ ,("iniarmenian", '\x056B')+ ,("integral", '\x222B')+ ,("integralbottom", '\x2321')+ ,("integralbt", '\x2321')+ ,("integralex", '\xF8F5')+ ,("integraltop", '\x2320')+ ,("integraltp", '\x2320')+ ,("intersection", '\x2229')+ ,("intisquare", '\x3305')+ ,("invbullet", '\x25D8')+ ,("invcircle", '\x25D9')+ ,("invsmileface", '\x263B')+ ,("iocyrillic", '\x0451')+ ,("iogonek", '\x012F')+ ,("iota", '\x03B9')+ ,("iotadieresis", '\x03CA')+ ,("iotadieresistonos", '\x0390')+ ,("iotalatin", '\x0269')+ ,("iotatonos", '\x03AF')+ ,("iparen", '\x24A4')+ ,("irigurmukhi", '\x0A72')+ ,("ismallhiragana", '\x3043')+ ,("ismallkatakana", '\x30A3')+ ,("ismallkatakanahalfwidth", '\xFF68')+ ,("issharbengali", '\x09FA')+ ,("istroke", '\x0268')+ ,("isuperior", '\xF6ED')+ ,("iterationhiragana", '\x309D')+ ,("iterationkatakana", '\x30FD')+ ,("itilde", '\x0129')+ ,("itildebelow", '\x1E2D')+ ,("iubopomofo", '\x3129')+ ,("iucyrillic", '\x044E')+ ,("ivowelsignbengali", '\x09BF')+ ,("ivowelsigndeva", '\x093F')+ ,("ivowelsigngujarati", '\x0ABF')+ ,("izhitsacyrillic", '\x0475')+ ,("izhitsadblgravecyrillic", '\x0477')+ ,("j", '\x006A')+ ,("jaarmenian", '\x0571')+ ,("jabengali", '\x099C')+ ,("jadeva", '\x091C')+ ,("jagujarati", '\x0A9C')+ ,("jagurmukhi", '\x0A1C')+ ,("jbopomofo", '\x3110')+ ,("jcaron", '\x01F0')+ ,("jcircle", '\x24D9')+ ,("jcircumflex", '\x0135')+ ,("jcrossedtail", '\x029D')+ ,("jdotlessstroke", '\x025F')+ ,("jecyrillic", '\x0458')+ ,("jeemarabic", '\x062C')+ ,("jeemfinalarabic", '\xFE9E')+ ,("jeeminitialarabic", '\xFE9F')+ ,("jeemmedialarabic", '\xFEA0')+ ,("jeharabic", '\x0698')+ ,("jehfinalarabic", '\xFB8B')+ ,("jhabengali", '\x099D')+ ,("jhadeva", '\x091D')+ ,("jhagujarati", '\x0A9D')+ ,("jhagurmukhi", '\x0A1D')+ ,("jheharmenian", '\x057B')+ ,("jis", '\x3004')+ ,("jmonospace", '\xFF4A')+ ,("jparen", '\x24A5')+ ,("jsuperior", '\x02B2')+ ,("k", '\x006B')+ ,("kabashkircyrillic", '\x04A1')+ ,("kabengali", '\x0995')+ ,("kacute", '\x1E31')+ ,("kacyrillic", '\x043A')+ ,("kadescendercyrillic", '\x049B')+ ,("kadeva", '\x0915')+ ,("kaf", '\x05DB')+ ,("kafarabic", '\x0643')+ ,("kafdagesh", '\xFB3B')+ ,("kafdageshhebrew", '\xFB3B')+ ,("kaffinalarabic", '\xFEDA')+ ,("kafhebrew", '\x05DB')+ ,("kafinitialarabic", '\xFEDB')+ ,("kafmedialarabic", '\xFEDC')+ ,("kafrafehebrew", '\xFB4D')+ ,("kagujarati", '\x0A95')+ ,("kagurmukhi", '\x0A15')+ ,("kahiragana", '\x304B')+ ,("kahookcyrillic", '\x04C4')+ ,("kakatakana", '\x30AB')+ ,("kakatakanahalfwidth", '\xFF76')+ ,("kappa", '\x03BA')+ ,("kappasymbolgreek", '\x03F0')+ ,("kapyeounmieumkorean", '\x3171')+ ,("kapyeounphieuphkorean", '\x3184')+ ,("kapyeounpieupkorean", '\x3178')+ ,("kapyeounssangpieupkorean", '\x3179')+ ,("karoriisquare", '\x330D')+ ,("kashidaautoarabic", '\x0640')+ ,("kashidaautonosidebearingarabic", '\x0640')+ ,("kasmallkatakana", '\x30F5')+ ,("kasquare", '\x3384')+ ,("kasraarabic", '\x0650')+ ,("kasratanarabic", '\x064D')+ ,("kastrokecyrillic", '\x049F')+ ,("katahiraprolongmarkhalfwidth", '\xFF70')+ ,("kaverticalstrokecyrillic", '\x049D')+ ,("kbopomofo", '\x310E')+ ,("kcalsquare", '\x3389')+ ,("kcaron", '\x01E9')+ ,("kcedilla", '\x0137')+ ,("kcircle", '\x24DA')+ ,("kcommaaccent", '\x0137')+ ,("kdotbelow", '\x1E33')+ ,("keharmenian", '\x0584')+ ,("kehiragana", '\x3051')+ ,("kekatakana", '\x30B1')+ ,("kekatakanahalfwidth", '\xFF79')+ ,("kenarmenian", '\x056F')+ ,("kesmallkatakana", '\x30F6')+ ,("kgreenlandic", '\x0138')+ ,("khabengali", '\x0996')+ ,("khacyrillic", '\x0445')+ ,("khadeva", '\x0916')+ ,("khagujarati", '\x0A96')+ ,("khagurmukhi", '\x0A16')+ ,("khaharabic", '\x062E')+ ,("khahfinalarabic", '\xFEA6')+ ,("khahinitialarabic", '\xFEA7')+ ,("khahmedialarabic", '\xFEA8')+ ,("kheicoptic", '\x03E7')+ ,("khhadeva", '\x0959')+ ,("khhagurmukhi", '\x0A59')+ ,("khieukhacirclekorean", '\x3278')+ ,("khieukhaparenkorean", '\x3218')+ ,("khieukhcirclekorean", '\x326A')+ ,("khieukhkorean", '\x314B')+ ,("khieukhparenkorean", '\x320A')+ ,("khokhaithai", '\x0E02')+ ,("khokhonthai", '\x0E05')+ ,("khokhuatthai", '\x0E03')+ ,("khokhwaithai", '\x0E04')+ ,("khomutthai", '\x0E5B')+ ,("khook", '\x0199')+ ,("khorakhangthai", '\x0E06')+ ,("khzsquare", '\x3391')+ ,("kihiragana", '\x304D')+ ,("kikatakana", '\x30AD')+ ,("kikatakanahalfwidth", '\xFF77')+ ,("kiroguramusquare", '\x3315')+ ,("kiromeetorusquare", '\x3316')+ ,("kirosquare", '\x3314')+ ,("kiyeokacirclekorean", '\x326E')+ ,("kiyeokaparenkorean", '\x320E')+ ,("kiyeokcirclekorean", '\x3260')+ ,("kiyeokkorean", '\x3131')+ ,("kiyeokparenkorean", '\x3200')+ ,("kiyeoksioskorean", '\x3133')+ ,("kjecyrillic", '\x045C')+ ,("klinebelow", '\x1E35')+ ,("klsquare", '\x3398')+ ,("kmcubedsquare", '\x33A6')+ ,("kmonospace", '\xFF4B')+ ,("kmsquaredsquare", '\x33A2')+ ,("kohiragana", '\x3053')+ ,("kohmsquare", '\x33C0')+ ,("kokaithai", '\x0E01')+ ,("kokatakana", '\x30B3')+ ,("kokatakanahalfwidth", '\xFF7A')+ ,("kooposquare", '\x331E')+ ,("koppacyrillic", '\x0481')+ ,("koreanstandardsymbol", '\x327F')+ ,("koroniscmb", '\x0343')+ ,("kparen", '\x24A6')+ ,("kpasquare", '\x33AA')+ ,("ksicyrillic", '\x046F')+ ,("ktsquare", '\x33CF')+ ,("kturned", '\x029E')+ ,("kuhiragana", '\x304F')+ ,("kukatakana", '\x30AF')+ ,("kukatakanahalfwidth", '\xFF78')+ ,("kvsquare", '\x33B8')+ ,("kwsquare", '\x33BE')+ ,("l", '\x006C')+ ,("labengali", '\x09B2')+ ,("lacute", '\x013A')+ ,("ladeva", '\x0932')+ ,("lagujarati", '\x0AB2')+ ,("lagurmukhi", '\x0A32')+ ,("lakkhangyaothai", '\x0E45')+ ,("lamaleffinalarabic", '\xFEFC')+ ,("lamalefhamzaabovefinalarabic", '\xFEF8')+ ,("lamalefhamzaaboveisolatedarabic", '\xFEF7')+ ,("lamalefhamzabelowfinalarabic", '\xFEFA')+ ,("lamalefhamzabelowisolatedarabic", '\xFEF9')+ ,("lamalefisolatedarabic", '\xFEFB')+ ,("lamalefmaddaabovefinalarabic", '\xFEF6')+ ,("lamalefmaddaaboveisolatedarabic", '\xFEF5')+ ,("lamarabic", '\x0644')+ ,("lambda", '\x03BB')+ ,("lambdastroke", '\x019B')+ ,("lamed", '\x05DC')+ ,("lameddagesh", '\xFB3C')+ ,("lameddageshhebrew", '\xFB3C')+ ,("lamedhebrew", '\x05DC')+ ,("lamedholam", '\x05DC')+ ,("lamedholamdagesh", '\x05DC')+ ,("lamedholamdageshhebrew", '\x05DC')+ ,("lamedholamhebrew", '\x05DC')+ ,("lamfinalarabic", '\xFEDE')+ ,("lamhahinitialarabic", '\xFCCA')+ ,("laminitialarabic", '\xFEDF')+ ,("lamjeeminitialarabic", '\xFCC9')+ ,("lamkhahinitialarabic", '\xFCCB')+ ,("lamlamhehisolatedarabic", '\xFDF2')+ ,("lammedialarabic", '\xFEE0')+ ,("lammeemhahinitialarabic", '\xFD88')+ ,("lammeeminitialarabic", '\xFCCC')+ ,("lammeemjeeminitialarabic", '\xFEDF')+ ,("lammeemkhahinitialarabic", '\xFEDF')+ ,("largecircle", '\x25EF')+ ,("lbar", '\x019A')+ ,("lbelt", '\x026C')+ ,("lbopomofo", '\x310C')+ ,("lcaron", '\x013E')+ ,("lcedilla", '\x013C')+ ,("lcircle", '\x24DB')+ ,("lcircumflexbelow", '\x1E3D')+ ,("lcommaaccent", '\x013C')+ ,("ldot", '\x0140')+ ,("ldotaccent", '\x0140')+ ,("ldotbelow", '\x1E37')+ ,("ldotbelowmacron", '\x1E39')+ ,("leftangleabovecmb", '\x031A')+ ,("lefttackbelowcmb", '\x0318')+ ,("less", '\x003C')+ ,("lessequal", '\x2264')+ ,("lessequalorgreater", '\x22DA')+ ,("lessmonospace", '\xFF1C')+ ,("lessorequivalent", '\x2272')+ ,("lessorgreater", '\x2276')+ ,("lessoverequal", '\x2266')+ ,("lesssmall", '\xFE64')+ ,("lezh", '\x026E')+ ,("lfblock", '\x258C')+ ,("lhookretroflex", '\x026D')+ ,("lira", '\x20A4')+ ,("liwnarmenian", '\x056C')+ ,("lj", '\x01C9')+ ,("ljecyrillic", '\x0459')+ ,("ll", '\xF6C0')+ ,("lladeva", '\x0933')+ ,("llagujarati", '\x0AB3')+ ,("llinebelow", '\x1E3B')+ ,("llladeva", '\x0934')+ ,("llvocalicbengali", '\x09E1')+ ,("llvocalicdeva", '\x0961')+ ,("llvocalicvowelsignbengali", '\x09E3')+ ,("llvocalicvowelsigndeva", '\x0963')+ ,("lmiddletilde", '\x026B')+ ,("lmonospace", '\xFF4C')+ ,("lmsquare", '\x33D0')+ ,("lochulathai", '\x0E2C')+ ,("logicaland", '\x2227')+ ,("logicalnot", '\x00AC')+ ,("logicalnotreversed", '\x2310')+ ,("logicalor", '\x2228')+ ,("lolingthai", '\x0E25')+ ,("longs", '\x017F')+ ,("lowlinecenterline", '\xFE4E')+ ,("lowlinecmb", '\x0332')+ ,("lowlinedashed", '\xFE4D')+ ,("lozenge", '\x25CA')+ ,("lparen", '\x24A7')+ ,("lslash", '\x0142')+ ,("lsquare", '\x2113')+ ,("lsuperior", '\xF6EE')+ ,("ltshade", '\x2591')+ ,("luthai", '\x0E26')+ ,("lvocalicbengali", '\x098C')+ ,("lvocalicdeva", '\x090C')+ ,("lvocalicvowelsignbengali", '\x09E2')+ ,("lvocalicvowelsigndeva", '\x0962')+ ,("lxsquare", '\x33D3')+ ,("m", '\x006D')+ ,("mabengali", '\x09AE')+ ,("macron", '\x00AF')+ ,("macronbelowcmb", '\x0331')+ ,("macroncmb", '\x0304')+ ,("macronlowmod", '\x02CD')+ ,("macronmonospace", '\xFFE3')+ ,("macute", '\x1E3F')+ ,("madeva", '\x092E')+ ,("magujarati", '\x0AAE')+ ,("magurmukhi", '\x0A2E')+ ,("mahapakhhebrew", '\x05A4')+ ,("mahapakhlefthebrew", '\x05A4')+ ,("mahiragana", '\x307E')+ ,("maichattawalowleftthai", '\xF895')+ ,("maichattawalowrightthai", '\xF894')+ ,("maichattawathai", '\x0E4B')+ ,("maichattawaupperleftthai", '\xF893')+ ,("maieklowleftthai", '\xF88C')+ ,("maieklowrightthai", '\xF88B')+ ,("maiekthai", '\x0E48')+ ,("maiekupperleftthai", '\xF88A')+ ,("maihanakatleftthai", '\xF884')+ ,("maihanakatthai", '\x0E31')+ ,("maitaikhuleftthai", '\xF889')+ ,("maitaikhuthai", '\x0E47')+ ,("maitholowleftthai", '\xF88F')+ ,("maitholowrightthai", '\xF88E')+ ,("maithothai", '\x0E49')+ ,("maithoupperleftthai", '\xF88D')+ ,("maitrilowleftthai", '\xF892')+ ,("maitrilowrightthai", '\xF891')+ ,("maitrithai", '\x0E4A')+ ,("maitriupperleftthai", '\xF890')+ ,("maiyamokthai", '\x0E46')+ ,("makatakana", '\x30DE')+ ,("makatakanahalfwidth", '\xFF8F')+ ,("male", '\x2642')+ ,("mansyonsquare", '\x3347')+ ,("maqafhebrew", '\x05BE')+ ,("mars", '\x2642')+ ,("masoracirclehebrew", '\x05AF')+ ,("masquare", '\x3383')+ ,("mbopomofo", '\x3107')+ ,("mbsquare", '\x33D4')+ ,("mcircle", '\x24DC')+ ,("mcubedsquare", '\x33A5')+ ,("mdotaccent", '\x1E41')+ ,("mdotbelow", '\x1E43')+ ,("meemarabic", '\x0645')+ ,("meemfinalarabic", '\xFEE2')+ ,("meeminitialarabic", '\xFEE3')+ ,("meemmedialarabic", '\xFEE4')+ ,("meemmeeminitialarabic", '\xFCD1')+ ,("meemmeemisolatedarabic", '\xFC48')+ ,("meetorusquare", '\x334D')+ ,("mehiragana", '\x3081')+ ,("meizierasquare", '\x337E')+ ,("mekatakana", '\x30E1')+ ,("mekatakanahalfwidth", '\xFF92')+ ,("mem", '\x05DE')+ ,("memdagesh", '\xFB3E')+ ,("memdageshhebrew", '\xFB3E')+ ,("memhebrew", '\x05DE')+ ,("menarmenian", '\x0574')+ ,("merkhahebrew", '\x05A5')+ ,("merkhakefulahebrew", '\x05A6')+ ,("merkhakefulalefthebrew", '\x05A6')+ ,("merkhalefthebrew", '\x05A5')+ ,("mhook", '\x0271')+ ,("mhzsquare", '\x3392')+ ,("middledotkatakanahalfwidth", '\xFF65')+ ,("middot", '\x00B7')+ ,("mieumacirclekorean", '\x3272')+ ,("mieumaparenkorean", '\x3212')+ ,("mieumcirclekorean", '\x3264')+ ,("mieumkorean", '\x3141')+ ,("mieumpansioskorean", '\x3170')+ ,("mieumparenkorean", '\x3204')+ ,("mieumpieupkorean", '\x316E')+ ,("mieumsioskorean", '\x316F')+ ,("mihiragana", '\x307F')+ ,("mikatakana", '\x30DF')+ ,("mikatakanahalfwidth", '\xFF90')+ ,("minus", '\x2212')+ ,("minusbelowcmb", '\x0320')+ ,("minuscircle", '\x2296')+ ,("minusmod", '\x02D7')+ ,("minusplus", '\x2213')+ ,("minute", '\x2032')+ ,("miribaarusquare", '\x334A')+ ,("mirisquare", '\x3349')+ ,("mlonglegturned", '\x0270')+ ,("mlsquare", '\x3396')+ ,("mmcubedsquare", '\x33A3')+ ,("mmonospace", '\xFF4D')+ ,("mmsquaredsquare", '\x339F')+ ,("mohiragana", '\x3082')+ ,("mohmsquare", '\x33C1')+ ,("mokatakana", '\x30E2')+ ,("mokatakanahalfwidth", '\xFF93')+ ,("molsquare", '\x33D6')+ ,("momathai", '\x0E21')+ ,("moverssquare", '\x33A7')+ ,("moverssquaredsquare", '\x33A8')+ ,("mparen", '\x24A8')+ ,("mpasquare", '\x33AB')+ ,("mssquare", '\x33B3')+ ,("msuperior", '\xF6EF')+ ,("mturned", '\x026F')+ ,("mu", '\x00B5')+ ,("mu1", '\x00B5')+ ,("muasquare", '\x3382')+ ,("muchgreater", '\x226B')+ ,("muchless", '\x226A')+ ,("mufsquare", '\x338C')+ ,("mugreek", '\x03BC')+ ,("mugsquare", '\x338D')+ ,("muhiragana", '\x3080')+ ,("mukatakana", '\x30E0')+ ,("mukatakanahalfwidth", '\xFF91')+ ,("mulsquare", '\x3395')+ ,("multiply", '\x00D7')+ ,("mumsquare", '\x339B')+ ,("munahhebrew", '\x05A3')+ ,("munahlefthebrew", '\x05A3')+ ,("musicalnote", '\x266A')+ ,("musicalnotedbl", '\x266B')+ ,("musicflatsign", '\x266D')+ ,("musicsharpsign", '\x266F')+ ,("mussquare", '\x33B2')+ ,("muvsquare", '\x33B6')+ ,("muwsquare", '\x33BC')+ ,("mvmegasquare", '\x33B9')+ ,("mvsquare", '\x33B7')+ ,("mwmegasquare", '\x33BF')+ ,("mwsquare", '\x33BD')+ ,("n", '\x006E')+ ,("nabengali", '\x09A8')+ ,("nabla", '\x2207')+ ,("nacute", '\x0144')+ ,("nadeva", '\x0928')+ ,("nagujarati", '\x0AA8')+ ,("nagurmukhi", '\x0A28')+ ,("nahiragana", '\x306A')+ ,("nakatakana", '\x30CA')+ ,("nakatakanahalfwidth", '\xFF85')+ ,("napostrophe", '\x0149')+ ,("nasquare", '\x3381')+ ,("nbopomofo", '\x310B')+ ,("nbspace", '\x00A0')+ ,("ncaron", '\x0148')+ ,("ncedilla", '\x0146')+ ,("ncircle", '\x24DD')+ ,("ncircumflexbelow", '\x1E4B')+ ,("ncommaaccent", '\x0146')+ ,("ndotaccent", '\x1E45')+ ,("ndotbelow", '\x1E47')+ ,("nehiragana", '\x306D')+ ,("nekatakana", '\x30CD')+ ,("nekatakanahalfwidth", '\xFF88')+ ,("newsheqelsign", '\x20AA')+ ,("nfsquare", '\x338B')+ ,("ngabengali", '\x0999')+ ,("ngadeva", '\x0919')+ ,("ngagujarati", '\x0A99')+ ,("ngagurmukhi", '\x0A19')+ ,("ngonguthai", '\x0E07')+ ,("nhiragana", '\x3093')+ ,("nhookleft", '\x0272')+ ,("nhookretroflex", '\x0273')+ ,("nieunacirclekorean", '\x326F')+ ,("nieunaparenkorean", '\x320F')+ ,("nieuncieuckorean", '\x3135')+ ,("nieuncirclekorean", '\x3261')+ ,("nieunhieuhkorean", '\x3136')+ ,("nieunkorean", '\x3134')+ ,("nieunpansioskorean", '\x3168')+ ,("nieunparenkorean", '\x3201')+ ,("nieunsioskorean", '\x3167')+ ,("nieuntikeutkorean", '\x3166')+ ,("nihiragana", '\x306B')+ ,("nikatakana", '\x30CB')+ ,("nikatakanahalfwidth", '\xFF86')+ ,("nikhahitleftthai", '\xF899')+ ,("nikhahitthai", '\x0E4D')+ ,("nine", '\x0039')+ ,("ninearabic", '\x0669')+ ,("ninebengali", '\x09EF')+ ,("ninecircle", '\x2468')+ ,("ninecircleinversesansserif", '\x2792')+ ,("ninedeva", '\x096F')+ ,("ninegujarati", '\x0AEF')+ ,("ninegurmukhi", '\x0A6F')+ ,("ninehackarabic", '\x0669')+ ,("ninehangzhou", '\x3029')+ ,("nineideographicparen", '\x3228')+ ,("nineinferior", '\x2089')+ ,("ninemonospace", '\xFF19')+ ,("nineoldstyle", '\xF739')+ ,("nineparen", '\x247C')+ ,("nineperiod", '\x2490')+ ,("ninepersian", '\x06F9')+ ,("nineroman", '\x2178')+ ,("ninesuperior", '\x2079')+ ,("nineteencircle", '\x2472')+ ,("nineteenparen", '\x2486')+ ,("nineteenperiod", '\x249A')+ ,("ninethai", '\x0E59')+ ,("nj", '\x01CC')+ ,("njecyrillic", '\x045A')+ ,("nkatakana", '\x30F3')+ ,("nkatakanahalfwidth", '\xFF9D')+ ,("nlegrightlong", '\x019E')+ ,("nlinebelow", '\x1E49')+ ,("nmonospace", '\xFF4E')+ ,("nmsquare", '\x339A')+ ,("nnabengali", '\x09A3')+ ,("nnadeva", '\x0923')+ ,("nnagujarati", '\x0AA3')+ ,("nnagurmukhi", '\x0A23')+ ,("nnnadeva", '\x0929')+ ,("nohiragana", '\x306E')+ ,("nokatakana", '\x30CE')+ ,("nokatakanahalfwidth", '\xFF89')+ ,("nonbreakingspace", '\x00A0')+ ,("nonenthai", '\x0E13')+ ,("nonuthai", '\x0E19')+ ,("noonarabic", '\x0646')+ ,("noonfinalarabic", '\xFEE6')+ ,("noonghunnaarabic", '\x06BA')+ ,("noonghunnafinalarabic", '\xFB9F')+ ,("noonhehinitialarabic", '\xFEE7')+ ,("nooninitialarabic", '\xFEE7')+ ,("noonjeeminitialarabic", '\xFCD2')+ ,("noonjeemisolatedarabic", '\xFC4B')+ ,("noonmedialarabic", '\xFEE8')+ ,("noonmeeminitialarabic", '\xFCD5')+ ,("noonmeemisolatedarabic", '\xFC4E')+ ,("noonnoonfinalarabic", '\xFC8D')+ ,("notcontains", '\x220C')+ ,("notelement", '\x2209')+ ,("notelementof", '\x2209')+ ,("notequal", '\x2260')+ ,("notgreater", '\x226F')+ ,("notgreaternorequal", '\x2271')+ ,("notgreaternorless", '\x2279')+ ,("notidentical", '\x2262')+ ,("notless", '\x226E')+ ,("notlessnorequal", '\x2270')+ ,("notparallel", '\x2226')+ ,("notprecedes", '\x2280')+ ,("notsubset", '\x2284')+ ,("notsucceeds", '\x2281')+ ,("notsuperset", '\x2285')+ ,("nowarmenian", '\x0576')+ ,("nparen", '\x24A9')+ ,("nssquare", '\x33B1')+ ,("nsuperior", '\x207F')+ ,("ntilde", '\x00F1')+ ,("nu", '\x03BD')+ ,("nuhiragana", '\x306C')+ ,("nukatakana", '\x30CC')+ ,("nukatakanahalfwidth", '\xFF87')+ ,("nuktabengali", '\x09BC')+ ,("nuktadeva", '\x093C')+ ,("nuktagujarati", '\x0ABC')+ ,("nuktagurmukhi", '\x0A3C')+ ,("numbersign", '\x0023')+ ,("numbersignmonospace", '\xFF03')+ ,("numbersignsmall", '\xFE5F')+ ,("numeralsigngreek", '\x0374')+ ,("numeralsignlowergreek", '\x0375')+ ,("numero", '\x2116')+ ,("nun", '\x05E0')+ ,("nundagesh", '\xFB40')+ ,("nundageshhebrew", '\xFB40')+ ,("nunhebrew", '\x05E0')+ ,("nvsquare", '\x33B5')+ ,("nwsquare", '\x33BB')+ ,("nyabengali", '\x099E')+ ,("nyadeva", '\x091E')+ ,("nyagujarati", '\x0A9E')+ ,("nyagurmukhi", '\x0A1E')+ ,("o", '\x006F')+ ,("oacute", '\x00F3')+ ,("oangthai", '\x0E2D')+ ,("obarred", '\x0275')+ ,("obarredcyrillic", '\x04E9')+ ,("obarreddieresiscyrillic", '\x04EB')+ ,("obengali", '\x0993')+ ,("obopomofo", '\x311B')+ ,("obreve", '\x014F')+ ,("ocandradeva", '\x0911')+ ,("ocandragujarati", '\x0A91')+ ,("ocandravowelsigndeva", '\x0949')+ ,("ocandravowelsigngujarati", '\x0AC9')+ ,("ocaron", '\x01D2')+ ,("ocircle", '\x24DE')+ ,("ocircumflex", '\x00F4')+ ,("ocircumflexacute", '\x1ED1')+ ,("ocircumflexdotbelow", '\x1ED9')+ ,("ocircumflexgrave", '\x1ED3')+ ,("ocircumflexhookabove", '\x1ED5')+ ,("ocircumflextilde", '\x1ED7')+ ,("ocyrillic", '\x043E')+ ,("odblacute", '\x0151')+ ,("odblgrave", '\x020D')+ ,("odeva", '\x0913')+ ,("odieresis", '\x00F6')+ ,("odieresiscyrillic", '\x04E7')+ ,("odotbelow", '\x1ECD')+ ,("oe", '\x0153')+ ,("oekorean", '\x315A')+ ,("ogonek", '\x02DB')+ ,("ogonekcmb", '\x0328')+ ,("ograve", '\x00F2')+ ,("ogujarati", '\x0A93')+ ,("oharmenian", '\x0585')+ ,("ohiragana", '\x304A')+ ,("ohookabove", '\x1ECF')+ ,("ohorn", '\x01A1')+ ,("ohornacute", '\x1EDB')+ ,("ohorndotbelow", '\x1EE3')+ ,("ohorngrave", '\x1EDD')+ ,("ohornhookabove", '\x1EDF')+ ,("ohorntilde", '\x1EE1')+ ,("ohungarumlaut", '\x0151')+ ,("oi", '\x01A3')+ ,("oinvertedbreve", '\x020F')+ ,("okatakana", '\x30AA')+ ,("okatakanahalfwidth", '\xFF75')+ ,("okorean", '\x3157')+ ,("olehebrew", '\x05AB')+ ,("omacron", '\x014D')+ ,("omacronacute", '\x1E53')+ ,("omacrongrave", '\x1E51')+ ,("omdeva", '\x0950')+ ,("omega", '\x03C9')+ ,("omega1", '\x03D6')+ ,("omegacyrillic", '\x0461')+ ,("omegalatinclosed", '\x0277')+ ,("omegaroundcyrillic", '\x047B')+ ,("omegatitlocyrillic", '\x047D')+ ,("omegatonos", '\x03CE')+ ,("omgujarati", '\x0AD0')+ ,("omicron", '\x03BF')+ ,("omicrontonos", '\x03CC')+ ,("omonospace", '\xFF4F')+ ,("one", '\x0031')+ ,("onearabic", '\x0661')+ ,("onebengali", '\x09E7')+ ,("onecircle", '\x2460')+ ,("onecircleinversesansserif", '\x278A')+ ,("onedeva", '\x0967')+ ,("onedotenleader", '\x2024')+ ,("oneeighth", '\x215B')+ ,("onefitted", '\xF6DC')+ ,("onegujarati", '\x0AE7')+ ,("onegurmukhi", '\x0A67')+ ,("onehackarabic", '\x0661')+ ,("onehalf", '\x00BD')+ ,("onehangzhou", '\x3021')+ ,("oneideographicparen", '\x3220')+ ,("oneinferior", '\x2081')+ ,("onemonospace", '\xFF11')+ ,("onenumeratorbengali", '\x09F4')+ ,("oneoldstyle", '\xF731')+ ,("oneparen", '\x2474')+ ,("oneperiod", '\x2488')+ ,("onepersian", '\x06F1')+ ,("onequarter", '\x00BC')+ ,("oneroman", '\x2170')+ ,("onesuperior", '\x00B9')+ ,("onethai", '\x0E51')+ ,("onethird", '\x2153')+ ,("oogonek", '\x01EB')+ ,("oogonekmacron", '\x01ED')+ ,("oogurmukhi", '\x0A13')+ ,("oomatragurmukhi", '\x0A4B')+ ,("oopen", '\x0254')+ ,("oparen", '\x24AA')+ ,("openbullet", '\x25E6')+ ,("option", '\x2325')+ ,("ordfeminine", '\x00AA')+ ,("ordmasculine", '\x00BA')+ ,("orthogonal", '\x221F')+ ,("oshortdeva", '\x0912')+ ,("oshortvowelsigndeva", '\x094A')+ ,("oslash", '\x00F8')+ ,("oslashacute", '\x01FF')+ ,("osmallhiragana", '\x3049')+ ,("osmallkatakana", '\x30A9')+ ,("osmallkatakanahalfwidth", '\xFF6B')+ ,("ostrokeacute", '\x01FF')+ ,("osuperior", '\xF6F0')+ ,("otcyrillic", '\x047F')+ ,("otilde", '\x00F5')+ ,("otildeacute", '\x1E4D')+ ,("otildedieresis", '\x1E4F')+ ,("oubopomofo", '\x3121')+ ,("overline", '\x203E')+ ,("overlinecenterline", '\xFE4A')+ ,("overlinecmb", '\x0305')+ ,("overlinedashed", '\xFE49')+ ,("overlinedblwavy", '\xFE4C')+ ,("overlinewavy", '\xFE4B')+ ,("overscore", '\x00AF')+ ,("ovowelsignbengali", '\x09CB')+ ,("ovowelsigndeva", '\x094B')+ ,("ovowelsigngujarati", '\x0ACB')+ ,("p", '\x0070')+ ,("paampssquare", '\x3380')+ ,("paasentosquare", '\x332B')+ ,("pabengali", '\x09AA')+ ,("pacute", '\x1E55')+ ,("padeva", '\x092A')+ ,("pagedown", '\x21DF')+ ,("pageup", '\x21DE')+ ,("pagujarati", '\x0AAA')+ ,("pagurmukhi", '\x0A2A')+ ,("pahiragana", '\x3071')+ ,("paiyannoithai", '\x0E2F')+ ,("pakatakana", '\x30D1')+ ,("palatalizationcyrilliccmb", '\x0484')+ ,("palochkacyrillic", '\x04C0')+ ,("pansioskorean", '\x317F')+ ,("paragraph", '\x00B6')+ ,("parallel", '\x2225')+ ,("parenleft", '\x0028')+ ,("parenleftaltonearabic", '\xFD3E')+ ,("parenleftbt", '\xF8ED')+ ,("parenleftex", '\xF8EC')+ ,("parenleftinferior", '\x208D')+ ,("parenleftmonospace", '\xFF08')+ ,("parenleftsmall", '\xFE59')+ ,("parenleftsuperior", '\x207D')+ ,("parenlefttp", '\xF8EB')+ ,("parenleftvertical", '\xFE35')+ ,("parenright", '\x0029')+ ,("parenrightaltonearabic", '\xFD3F')+ ,("parenrightbt", '\xF8F8')+ ,("parenrightex", '\xF8F7')+ ,("parenrightinferior", '\x208E')+ ,("parenrightmonospace", '\xFF09')+ ,("parenrightsmall", '\xFE5A')+ ,("parenrightsuperior", '\x207E')+ ,("parenrighttp", '\xF8F6')+ ,("parenrightvertical", '\xFE36')+ ,("partialdiff", '\x2202')+ ,("paseqhebrew", '\x05C0')+ ,("pashtahebrew", '\x0599')+ ,("pasquare", '\x33A9')+ ,("patah", '\x05B7')+ ,("patah11", '\x05B7')+ ,("patah1d", '\x05B7')+ ,("patah2a", '\x05B7')+ ,("patahhebrew", '\x05B7')+ ,("patahnarrowhebrew", '\x05B7')+ ,("patahquarterhebrew", '\x05B7')+ ,("patahwidehebrew", '\x05B7')+ ,("pazerhebrew", '\x05A1')+ ,("pbopomofo", '\x3106')+ ,("pcircle", '\x24DF')+ ,("pdotaccent", '\x1E57')+ ,("pe", '\x05E4')+ ,("pecyrillic", '\x043F')+ ,("pedagesh", '\xFB44')+ ,("pedageshhebrew", '\xFB44')+ ,("peezisquare", '\x333B')+ ,("pefinaldageshhebrew", '\xFB43')+ ,("peharabic", '\x067E')+ ,("peharmenian", '\x057A')+ ,("pehebrew", '\x05E4')+ ,("pehfinalarabic", '\xFB57')+ ,("pehinitialarabic", '\xFB58')+ ,("pehiragana", '\x307A')+ ,("pehmedialarabic", '\xFB59')+ ,("pekatakana", '\x30DA')+ ,("pemiddlehookcyrillic", '\x04A7')+ ,("perafehebrew", '\xFB4E')+ ,("percent", '\x0025')+ ,("percentarabic", '\x066A')+ ,("percentmonospace", '\xFF05')+ ,("percentsmall", '\xFE6A')+ ,("period", '\x002E')+ ,("periodarmenian", '\x0589')+ ,("periodcentered", '\x00B7')+ ,("periodhalfwidth", '\xFF61')+ ,("periodinferior", '\xF6E7')+ ,("periodmonospace", '\xFF0E')+ ,("periodsmall", '\xFE52')+ ,("periodsuperior", '\xF6E8')+ ,("perispomenigreekcmb", '\x0342')+ ,("perpendicular", '\x22A5')+ ,("perthousand", '\x2030')+ ,("peseta", '\x20A7')+ ,("pfsquare", '\x338A')+ ,("phabengali", '\x09AB')+ ,("phadeva", '\x092B')+ ,("phagujarati", '\x0AAB')+ ,("phagurmukhi", '\x0A2B')+ ,("phi", '\x03C6')+ ,("phi1", '\x03D5')+ ,("phieuphacirclekorean", '\x327A')+ ,("phieuphaparenkorean", '\x321A')+ ,("phieuphcirclekorean", '\x326C')+ ,("phieuphkorean", '\x314D')+ ,("phieuphparenkorean", '\x320C')+ ,("philatin", '\x0278')+ ,("phinthuthai", '\x0E3A')+ ,("phisymbolgreek", '\x03D5')+ ,("phook", '\x01A5')+ ,("phophanthai", '\x0E1E')+ ,("phophungthai", '\x0E1C')+ ,("phosamphaothai", '\x0E20')+ ,("pi", '\x03C0')+ ,("pieupacirclekorean", '\x3273')+ ,("pieupaparenkorean", '\x3213')+ ,("pieupcieuckorean", '\x3176')+ ,("pieupcirclekorean", '\x3265')+ ,("pieupkiyeokkorean", '\x3172')+ ,("pieupkorean", '\x3142')+ ,("pieupparenkorean", '\x3205')+ ,("pieupsioskiyeokkorean", '\x3174')+ ,("pieupsioskorean", '\x3144')+ ,("pieupsiostikeutkorean", '\x3175')+ ,("pieupthieuthkorean", '\x3177')+ ,("pieuptikeutkorean", '\x3173')+ ,("pihiragana", '\x3074')+ ,("pikatakana", '\x30D4')+ ,("pisymbolgreek", '\x03D6')+ ,("piwrarmenian", '\x0583')+ ,("plus", '\x002B')+ ,("plusbelowcmb", '\x031F')+ ,("pluscircle", '\x2295')+ ,("plusminus", '\x00B1')+ ,("plusmod", '\x02D6')+ ,("plusmonospace", '\xFF0B')+ ,("plussmall", '\xFE62')+ ,("plussuperior", '\x207A')+ ,("pmonospace", '\xFF50')+ ,("pmsquare", '\x33D8')+ ,("pohiragana", '\x307D')+ ,("pointingindexdownwhite", '\x261F')+ ,("pointingindexleftwhite", '\x261C')+ ,("pointingindexrightwhite", '\x261E')+ ,("pointingindexupwhite", '\x261D')+ ,("pokatakana", '\x30DD')+ ,("poplathai", '\x0E1B')+ ,("postalmark", '\x3012')+ ,("postalmarkface", '\x3020')+ ,("pparen", '\x24AB')+ ,("precedes", '\x227A')+ ,("prescription", '\x211E')+ ,("primemod", '\x02B9')+ ,("primereversed", '\x2035')+ ,("product", '\x220F')+ ,("projective", '\x2305')+ ,("prolongedkana", '\x30FC')+ ,("propellor", '\x2318')+ ,("propersubset", '\x2282')+ ,("propersuperset", '\x2283')+ ,("proportion", '\x2237')+ ,("proportional", '\x221D')+ ,("psi", '\x03C8')+ ,("psicyrillic", '\x0471')+ ,("psilipneumatacyrilliccmb", '\x0486')+ ,("pssquare", '\x33B0')+ ,("puhiragana", '\x3077')+ ,("pukatakana", '\x30D7')+ ,("pvsquare", '\x33B4')+ ,("pwsquare", '\x33BA')+ ,("q", '\x0071')+ ,("qadeva", '\x0958')+ ,("qadmahebrew", '\x05A8')+ ,("qafarabic", '\x0642')+ ,("qaffinalarabic", '\xFED6')+ ,("qafinitialarabic", '\xFED7')+ ,("qafmedialarabic", '\xFED8')+ ,("qamats", '\x05B8')+ ,("qamats10", '\x05B8')+ ,("qamats1a", '\x05B8')+ ,("qamats1c", '\x05B8')+ ,("qamats27", '\x05B8')+ ,("qamats29", '\x05B8')+ ,("qamats33", '\x05B8')+ ,("qamatsde", '\x05B8')+ ,("qamatshebrew", '\x05B8')+ ,("qamatsnarrowhebrew", '\x05B8')+ ,("qamatsqatanhebrew", '\x05B8')+ ,("qamatsqatannarrowhebrew", '\x05B8')+ ,("qamatsqatanquarterhebrew", '\x05B8')+ ,("qamatsqatanwidehebrew", '\x05B8')+ ,("qamatsquarterhebrew", '\x05B8')+ ,("qamatswidehebrew", '\x05B8')+ ,("qarneyparahebrew", '\x059F')+ ,("qbopomofo", '\x3111')+ ,("qcircle", '\x24E0')+ ,("qhook", '\x02A0')+ ,("qmonospace", '\xFF51')+ ,("qof", '\x05E7')+ ,("qofdagesh", '\xFB47')+ ,("qofdageshhebrew", '\xFB47')+ ,("qofhatafpatah", '\x05E7')+ ,("qofhatafpatahhebrew", '\x05E7')+ ,("qofhatafsegol", '\x05E7')+ ,("qofhatafsegolhebrew", '\x05E7')+ ,("qofhebrew", '\x05E7')+ ,("qofhiriq", '\x05E7')+ ,("qofhiriqhebrew", '\x05E7')+ ,("qofholam", '\x05E7')+ ,("qofholamhebrew", '\x05E7')+ ,("qofpatah", '\x05E7')+ ,("qofpatahhebrew", '\x05E7')+ ,("qofqamats", '\x05E7')+ ,("qofqamatshebrew", '\x05E7')+ ,("qofqubuts", '\x05E7')+ ,("qofqubutshebrew", '\x05E7')+ ,("qofsegol", '\x05E7')+ ,("qofsegolhebrew", '\x05E7')+ ,("qofsheva", '\x05E7')+ ,("qofshevahebrew", '\x05E7')+ ,("qoftsere", '\x05E7')+ ,("qoftserehebrew", '\x05E7')+ ,("qparen", '\x24AC')+ ,("quarternote", '\x2669')+ ,("qubuts", '\x05BB')+ ,("qubuts18", '\x05BB')+ ,("qubuts25", '\x05BB')+ ,("qubuts31", '\x05BB')+ ,("qubutshebrew", '\x05BB')+ ,("qubutsnarrowhebrew", '\x05BB')+ ,("qubutsquarterhebrew", '\x05BB')+ ,("qubutswidehebrew", '\x05BB')+ ,("question", '\x003F')+ ,("questionarabic", '\x061F')+ ,("questionarmenian", '\x055E')+ ,("questiondown", '\x00BF')+ ,("questiondownsmall", '\xF7BF')+ ,("questiongreek", '\x037E')+ ,("questionmonospace", '\xFF1F')+ ,("questionsmall", '\xF73F')+ ,("quotedbl", '\x0022')+ ,("quotedblbase", '\x201E')+ ,("quotedblleft", '\x201C')+ ,("quotedblmonospace", '\xFF02')+ ,("quotedblprime", '\x301E')+ ,("quotedblprimereversed", '\x301D')+ ,("quotedblright", '\x201D')+ ,("quoteleft", '\x2018')+ ,("quoteleftreversed", '\x201B')+ ,("quotereversed", '\x201B')+ ,("quoteright", '\x2019')+ ,("quoterightn", '\x0149')+ ,("quotesinglbase", '\x201A')+ ,("quotesingle", '\x0027')+ ,("quotesinglemonospace", '\xFF07')+ ,("r", '\x0072')+ ,("raarmenian", '\x057C')+ ,("rabengali", '\x09B0')+ ,("racute", '\x0155')+ ,("radeva", '\x0930')+ ,("radical", '\x221A')+ ,("radicalex", '\xF8E5')+ ,("radoverssquare", '\x33AE')+ ,("radoverssquaredsquare", '\x33AF')+ ,("radsquare", '\x33AD')+ ,("rafe", '\x05BF')+ ,("rafehebrew", '\x05BF')+ ,("ragujarati", '\x0AB0')+ ,("ragurmukhi", '\x0A30')+ ,("rahiragana", '\x3089')+ ,("rakatakana", '\x30E9')+ ,("rakatakanahalfwidth", '\xFF97')+ ,("ralowerdiagonalbengali", '\x09F1')+ ,("ramiddlediagonalbengali", '\x09F0')+ ,("ramshorn", '\x0264')+ ,("ratio", '\x2236')+ ,("rbopomofo", '\x3116')+ ,("rcaron", '\x0159')+ ,("rcedilla", '\x0157')+ ,("rcircle", '\x24E1')+ ,("rcommaaccent", '\x0157')+ ,("rdblgrave", '\x0211')+ ,("rdotaccent", '\x1E59')+ ,("rdotbelow", '\x1E5B')+ ,("rdotbelowmacron", '\x1E5D')+ ,("referencemark", '\x203B')+ ,("reflexsubset", '\x2286')+ ,("reflexsuperset", '\x2287')+ ,("registered", '\x00AE')+ ,("registersans", '\xF8E8')+ ,("registerserif", '\xF6DA')+ ,("reharabic", '\x0631')+ ,("reharmenian", '\x0580')+ ,("rehfinalarabic", '\xFEAE')+ ,("rehiragana", '\x308C')+ ,("rehyehaleflamarabic", '\x0631')+ ,("rekatakana", '\x30EC')+ ,("rekatakanahalfwidth", '\xFF9A')+ ,("resh", '\x05E8')+ ,("reshdageshhebrew", '\xFB48')+ ,("reshhatafpatah", '\x05E8')+ ,("reshhatafpatahhebrew", '\x05E8')+ ,("reshhatafsegol", '\x05E8')+ ,("reshhatafsegolhebrew", '\x05E8')+ ,("reshhebrew", '\x05E8')+ ,("reshhiriq", '\x05E8')+ ,("reshhiriqhebrew", '\x05E8')+ ,("reshholam", '\x05E8')+ ,("reshholamhebrew", '\x05E8')+ ,("reshpatah", '\x05E8')+ ,("reshpatahhebrew", '\x05E8')+ ,("reshqamats", '\x05E8')+ ,("reshqamatshebrew", '\x05E8')+ ,("reshqubuts", '\x05E8')+ ,("reshqubutshebrew", '\x05E8')+ ,("reshsegol", '\x05E8')+ ,("reshsegolhebrew", '\x05E8')+ ,("reshsheva", '\x05E8')+ ,("reshshevahebrew", '\x05E8')+ ,("reshtsere", '\x05E8')+ ,("reshtserehebrew", '\x05E8')+ ,("reversedtilde", '\x223D')+ ,("reviahebrew", '\x0597')+ ,("reviamugrashhebrew", '\x0597')+ ,("revlogicalnot", '\x2310')+ ,("rfishhook", '\x027E')+ ,("rfishhookreversed", '\x027F')+ ,("rhabengali", '\x09DD')+ ,("rhadeva", '\x095D')+ ,("rho", '\x03C1')+ ,("rhook", '\x027D')+ ,("rhookturned", '\x027B')+ ,("rhookturnedsuperior", '\x02B5')+ ,("rhosymbolgreek", '\x03F1')+ ,("rhotichookmod", '\x02DE')+ ,("rieulacirclekorean", '\x3271')+ ,("rieulaparenkorean", '\x3211')+ ,("rieulcirclekorean", '\x3263')+ ,("rieulhieuhkorean", '\x3140')+ ,("rieulkiyeokkorean", '\x313A')+ ,("rieulkiyeoksioskorean", '\x3169')+ ,("rieulkorean", '\x3139')+ ,("rieulmieumkorean", '\x313B')+ ,("rieulpansioskorean", '\x316C')+ ,("rieulparenkorean", '\x3203')+ ,("rieulphieuphkorean", '\x313F')+ ,("rieulpieupkorean", '\x313C')+ ,("rieulpieupsioskorean", '\x316B')+ ,("rieulsioskorean", '\x313D')+ ,("rieulthieuthkorean", '\x313E')+ ,("rieultikeutkorean", '\x316A')+ ,("rieulyeorinhieuhkorean", '\x316D')+ ,("rightangle", '\x221F')+ ,("righttackbelowcmb", '\x0319')+ ,("righttriangle", '\x22BF')+ ,("rihiragana", '\x308A')+ ,("rikatakana", '\x30EA')+ ,("rikatakanahalfwidth", '\xFF98')+ ,("ring", '\x02DA')+ ,("ringbelowcmb", '\x0325')+ ,("ringcmb", '\x030A')+ ,("ringhalfleft", '\x02BF')+ ,("ringhalfleftarmenian", '\x0559')+ ,("ringhalfleftbelowcmb", '\x031C')+ ,("ringhalfleftcentered", '\x02D3')+ ,("ringhalfright", '\x02BE')+ ,("ringhalfrightbelowcmb", '\x0339')+ ,("ringhalfrightcentered", '\x02D2')+ ,("rinvertedbreve", '\x0213')+ ,("rittorusquare", '\x3351')+ ,("rlinebelow", '\x1E5F')+ ,("rlongleg", '\x027C')+ ,("rlonglegturned", '\x027A')+ ,("rmonospace", '\xFF52')+ ,("rohiragana", '\x308D')+ ,("rokatakana", '\x30ED')+ ,("rokatakanahalfwidth", '\xFF9B')+ ,("roruathai", '\x0E23')+ ,("rparen", '\x24AD')+ ,("rrabengali", '\x09DC')+ ,("rradeva", '\x0931')+ ,("rragurmukhi", '\x0A5C')+ ,("rreharabic", '\x0691')+ ,("rrehfinalarabic", '\xFB8D')+ ,("rrvocalicbengali", '\x09E0')+ ,("rrvocalicdeva", '\x0960')+ ,("rrvocalicgujarati", '\x0AE0')+ ,("rrvocalicvowelsignbengali", '\x09C4')+ ,("rrvocalicvowelsigndeva", '\x0944')+ ,("rrvocalicvowelsigngujarati", '\x0AC4')+ ,("rsuperior", '\xF6F1')+ ,("rtblock", '\x2590')+ ,("rturned", '\x0279')+ ,("rturnedsuperior", '\x02B4')+ ,("ruhiragana", '\x308B')+ ,("rukatakana", '\x30EB')+ ,("rukatakanahalfwidth", '\xFF99')+ ,("rupeemarkbengali", '\x09F2')+ ,("rupeesignbengali", '\x09F3')+ ,("rupiah", '\xF6DD')+ ,("ruthai", '\x0E24')+ ,("rvocalicbengali", '\x098B')+ ,("rvocalicdeva", '\x090B')+ ,("rvocalicgujarati", '\x0A8B')+ ,("rvocalicvowelsignbengali", '\x09C3')+ ,("rvocalicvowelsigndeva", '\x0943')+ ,("rvocalicvowelsigngujarati", '\x0AC3')+ ,("s", '\x0073')+ ,("sabengali", '\x09B8')+ ,("sacute", '\x015B')+ ,("sacutedotaccent", '\x1E65')+ ,("sadarabic", '\x0635')+ ,("sadeva", '\x0938')+ ,("sadfinalarabic", '\xFEBA')+ ,("sadinitialarabic", '\xFEBB')+ ,("sadmedialarabic", '\xFEBC')+ ,("sagujarati", '\x0AB8')+ ,("sagurmukhi", '\x0A38')+ ,("sahiragana", '\x3055')+ ,("sakatakana", '\x30B5')+ ,("sakatakanahalfwidth", '\xFF7B')+ ,("sallallahoualayhewasallamarabic", '\xFDFA')+ ,("samekh", '\x05E1')+ ,("samekhdagesh", '\xFB41')+ ,("samekhdageshhebrew", '\xFB41')+ ,("samekhhebrew", '\x05E1')+ ,("saraaathai", '\x0E32')+ ,("saraaethai", '\x0E41')+ ,("saraaimaimalaithai", '\x0E44')+ ,("saraaimaimuanthai", '\x0E43')+ ,("saraamthai", '\x0E33')+ ,("saraathai", '\x0E30')+ ,("saraethai", '\x0E40')+ ,("saraiileftthai", '\xF886')+ ,("saraiithai", '\x0E35')+ ,("saraileftthai", '\xF885')+ ,("saraithai", '\x0E34')+ ,("saraothai", '\x0E42')+ ,("saraueeleftthai", '\xF888')+ ,("saraueethai", '\x0E37')+ ,("saraueleftthai", '\xF887')+ ,("sarauethai", '\x0E36')+ ,("sarauthai", '\x0E38')+ ,("sarauuthai", '\x0E39')+ ,("sbopomofo", '\x3119')+ ,("scaron", '\x0161')+ ,("scarondotaccent", '\x1E67')+ ,("scedilla", '\x015F')+ ,("schwa", '\x0259')+ ,("schwacyrillic", '\x04D9')+ ,("schwadieresiscyrillic", '\x04DB')+ ,("schwahook", '\x025A')+ ,("scircle", '\x24E2')+ ,("scircumflex", '\x015D')+ ,("scommaaccent", '\x0219')+ ,("sdotaccent", '\x1E61')+ ,("sdotbelow", '\x1E63')+ ,("sdotbelowdotaccent", '\x1E69')+ ,("seagullbelowcmb", '\x033C')+ ,("second", '\x2033')+ ,("secondtonechinese", '\x02CA')+ ,("section", '\x00A7')+ ,("seenarabic", '\x0633')+ ,("seenfinalarabic", '\xFEB2')+ ,("seeninitialarabic", '\xFEB3')+ ,("seenmedialarabic", '\xFEB4')+ ,("segol", '\x05B6')+ ,("segol13", '\x05B6')+ ,("segol1f", '\x05B6')+ ,("segol2c", '\x05B6')+ ,("segolhebrew", '\x05B6')+ ,("segolnarrowhebrew", '\x05B6')+ ,("segolquarterhebrew", '\x05B6')+ ,("segoltahebrew", '\x0592')+ ,("segolwidehebrew", '\x05B6')+ ,("seharmenian", '\x057D')+ ,("sehiragana", '\x305B')+ ,("sekatakana", '\x30BB')+ ,("sekatakanahalfwidth", '\xFF7E')+ ,("semicolon", '\x003B')+ ,("semicolonarabic", '\x061B')+ ,("semicolonmonospace", '\xFF1B')+ ,("semicolonsmall", '\xFE54')+ ,("semivoicedmarkkana", '\x309C')+ ,("semivoicedmarkkanahalfwidth", '\xFF9F')+ ,("sentisquare", '\x3322')+ ,("sentosquare", '\x3323')+ ,("seven", '\x0037')+ ,("sevenarabic", '\x0667')+ ,("sevenbengali", '\x09ED')+ ,("sevencircle", '\x2466')+ ,("sevencircleinversesansserif", '\x2790')+ ,("sevendeva", '\x096D')+ ,("seveneighths", '\x215E')+ ,("sevengujarati", '\x0AED')+ ,("sevengurmukhi", '\x0A6D')+ ,("sevenhackarabic", '\x0667')+ ,("sevenhangzhou", '\x3027')+ ,("sevenideographicparen", '\x3226')+ ,("seveninferior", '\x2087')+ ,("sevenmonospace", '\xFF17')+ ,("sevenoldstyle", '\xF737')+ ,("sevenparen", '\x247A')+ ,("sevenperiod", '\x248E')+ ,("sevenpersian", '\x06F7')+ ,("sevenroman", '\x2176')+ ,("sevensuperior", '\x2077')+ ,("seventeencircle", '\x2470')+ ,("seventeenparen", '\x2484')+ ,("seventeenperiod", '\x2498')+ ,("seventhai", '\x0E57')+ ,("sfthyphen", '\x00AD')+ ,("shaarmenian", '\x0577')+ ,("shabengali", '\x09B6')+ ,("shacyrillic", '\x0448')+ ,("shaddaarabic", '\x0651')+ ,("shaddadammaarabic", '\xFC61')+ ,("shaddadammatanarabic", '\xFC5E')+ ,("shaddafathaarabic", '\xFC60')+ ,("shaddafathatanarabic", '\x0651')+ ,("shaddakasraarabic", '\xFC62')+ ,("shaddakasratanarabic", '\xFC5F')+ ,("shade", '\x2592')+ ,("shadedark", '\x2593')+ ,("shadelight", '\x2591')+ ,("shademedium", '\x2592')+ ,("shadeva", '\x0936')+ ,("shagujarati", '\x0AB6')+ ,("shagurmukhi", '\x0A36')+ ,("shalshelethebrew", '\x0593')+ ,("shbopomofo", '\x3115')+ ,("shchacyrillic", '\x0449')+ ,("sheenarabic", '\x0634')+ ,("sheenfinalarabic", '\xFEB6')+ ,("sheeninitialarabic", '\xFEB7')+ ,("sheenmedialarabic", '\xFEB8')+ ,("sheicoptic", '\x03E3')+ ,("sheqel", '\x20AA')+ ,("sheqelhebrew", '\x20AA')+ ,("sheva", '\x05B0')+ ,("sheva115", '\x05B0')+ ,("sheva15", '\x05B0')+ ,("sheva22", '\x05B0')+ ,("sheva2e", '\x05B0')+ ,("shevahebrew", '\x05B0')+ ,("shevanarrowhebrew", '\x05B0')+ ,("shevaquarterhebrew", '\x05B0')+ ,("shevawidehebrew", '\x05B0')+ ,("shhacyrillic", '\x04BB')+ ,("shimacoptic", '\x03ED')+ ,("shin", '\x05E9')+ ,("shindagesh", '\xFB49')+ ,("shindageshhebrew", '\xFB49')+ ,("shindageshshindot", '\xFB2C')+ ,("shindageshshindothebrew", '\xFB2C')+ ,("shindageshsindot", '\xFB2D')+ ,("shindageshsindothebrew", '\xFB2D')+ ,("shindothebrew", '\x05C1')+ ,("shinhebrew", '\x05E9')+ ,("shinshindot", '\xFB2A')+ ,("shinshindothebrew", '\xFB2A')+ ,("shinsindot", '\xFB2B')+ ,("shinsindothebrew", '\xFB2B')+ ,("shook", '\x0282')+ ,("sigma", '\x03C3')+ ,("sigma1", '\x03C2')+ ,("sigmafinal", '\x03C2')+ ,("sigmalunatesymbolgreek", '\x03F2')+ ,("sihiragana", '\x3057')+ ,("sikatakana", '\x30B7')+ ,("sikatakanahalfwidth", '\xFF7C')+ ,("siluqhebrew", '\x05BD')+ ,("siluqlefthebrew", '\x05BD')+ ,("similar", '\x223C')+ ,("sindothebrew", '\x05C2')+ ,("siosacirclekorean", '\x3274')+ ,("siosaparenkorean", '\x3214')+ ,("sioscieuckorean", '\x317E')+ ,("sioscirclekorean", '\x3266')+ ,("sioskiyeokkorean", '\x317A')+ ,("sioskorean", '\x3145')+ ,("siosnieunkorean", '\x317B')+ ,("siosparenkorean", '\x3206')+ ,("siospieupkorean", '\x317D')+ ,("siostikeutkorean", '\x317C')+ ,("six", '\x0036')+ ,("sixarabic", '\x0666')+ ,("sixbengali", '\x09EC')+ ,("sixcircle", '\x2465')+ ,("sixcircleinversesansserif", '\x278F')+ ,("sixdeva", '\x096C')+ ,("sixgujarati", '\x0AEC')+ ,("sixgurmukhi", '\x0A6C')+ ,("sixhackarabic", '\x0666')+ ,("sixhangzhou", '\x3026')+ ,("sixideographicparen", '\x3225')+ ,("sixinferior", '\x2086')+ ,("sixmonospace", '\xFF16')+ ,("sixoldstyle", '\xF736')+ ,("sixparen", '\x2479')+ ,("sixperiod", '\x248D')+ ,("sixpersian", '\x06F6')+ ,("sixroman", '\x2175')+ ,("sixsuperior", '\x2076')+ ,("sixteencircle", '\x246F')+ ,("sixteencurrencydenominatorbengali", '\x09F9')+ ,("sixteenparen", '\x2483')+ ,("sixteenperiod", '\x2497')+ ,("sixthai", '\x0E56')+ ,("slash", '\x002F')+ ,("slashmonospace", '\xFF0F')+ ,("slong", '\x017F')+ ,("slongdotaccent", '\x1E9B')+ ,("smileface", '\x263A')+ ,("smonospace", '\xFF53')+ ,("sofpasuqhebrew", '\x05C3')+ ,("softhyphen", '\x00AD')+ ,("softsigncyrillic", '\x044C')+ ,("sohiragana", '\x305D')+ ,("sokatakana", '\x30BD')+ ,("sokatakanahalfwidth", '\xFF7F')+ ,("soliduslongoverlaycmb", '\x0338')+ ,("solidusshortoverlaycmb", '\x0337')+ ,("sorusithai", '\x0E29')+ ,("sosalathai", '\x0E28')+ ,("sosothai", '\x0E0B')+ ,("sosuathai", '\x0E2A')+ ,("space", '\x0020')+ ,("spacehackarabic", '\x0020')+ ,("spade", '\x2660')+ ,("spadesuitblack", '\x2660')+ ,("spadesuitwhite", '\x2664')+ ,("sparen", '\x24AE')+ ,("squarebelowcmb", '\x033B')+ ,("squarecc", '\x33C4')+ ,("squarecm", '\x339D')+ ,("squarediagonalcrosshatchfill", '\x25A9')+ ,("squarehorizontalfill", '\x25A4')+ ,("squarekg", '\x338F')+ ,("squarekm", '\x339E')+ ,("squarekmcapital", '\x33CE')+ ,("squareln", '\x33D1')+ ,("squarelog", '\x33D2')+ ,("squaremg", '\x338E')+ ,("squaremil", '\x33D5')+ ,("squaremm", '\x339C')+ ,("squaremsquared", '\x33A1')+ ,("squareorthogonalcrosshatchfill", '\x25A6')+ ,("squareupperlefttolowerrightfill", '\x25A7')+ ,("squareupperrighttolowerleftfill", '\x25A8')+ ,("squareverticalfill", '\x25A5')+ ,("squarewhitewithsmallblack", '\x25A3')+ ,("srsquare", '\x33DB')+ ,("ssabengali", '\x09B7')+ ,("ssadeva", '\x0937')+ ,("ssagujarati", '\x0AB7')+ ,("ssangcieuckorean", '\x3149')+ ,("ssanghieuhkorean", '\x3185')+ ,("ssangieungkorean", '\x3180')+ ,("ssangkiyeokkorean", '\x3132')+ ,("ssangnieunkorean", '\x3165')+ ,("ssangpieupkorean", '\x3143')+ ,("ssangsioskorean", '\x3146')+ ,("ssangtikeutkorean", '\x3138')+ ,("ssuperior", '\xF6F2')+ ,("sterling", '\x00A3')+ ,("sterlingmonospace", '\xFFE1')+ ,("strokelongoverlaycmb", '\x0336')+ ,("strokeshortoverlaycmb", '\x0335')+ ,("subset", '\x2282')+ ,("subsetnotequal", '\x228A')+ ,("subsetorequal", '\x2286')+ ,("succeeds", '\x227B')+ ,("suchthat", '\x220B')+ ,("suhiragana", '\x3059')+ ,("sukatakana", '\x30B9')+ ,("sukatakanahalfwidth", '\xFF7D')+ ,("sukunarabic", '\x0652')+ ,("summation", '\x2211')+ ,("sun", '\x263C')+ ,("superset", '\x2283')+ ,("supersetnotequal", '\x228B')+ ,("supersetorequal", '\x2287')+ ,("svsquare", '\x33DC')+ ,("syouwaerasquare", '\x337C')+ ,("t", '\x0074')+ ,("tabengali", '\x09A4')+ ,("tackdown", '\x22A4')+ ,("tackleft", '\x22A3')+ ,("tadeva", '\x0924')+ ,("tagujarati", '\x0AA4')+ ,("tagurmukhi", '\x0A24')+ ,("taharabic", '\x0637')+ ,("tahfinalarabic", '\xFEC2')+ ,("tahinitialarabic", '\xFEC3')+ ,("tahiragana", '\x305F')+ ,("tahmedialarabic", '\xFEC4')+ ,("taisyouerasquare", '\x337D')+ ,("takatakana", '\x30BF')+ ,("takatakanahalfwidth", '\xFF80')+ ,("tatweelarabic", '\x0640')+ ,("tau", '\x03C4')+ ,("tav", '\x05EA')+ ,("tavdages", '\xFB4A')+ ,("tavdagesh", '\xFB4A')+ ,("tavdageshhebrew", '\xFB4A')+ ,("tavhebrew", '\x05EA')+ ,("tbar", '\x0167')+ ,("tbopomofo", '\x310A')+ ,("tcaron", '\x0165')+ ,("tccurl", '\x02A8')+ ,("tcedilla", '\x0163')+ ,("tcheharabic", '\x0686')+ ,("tchehfinalarabic", '\xFB7B')+ ,("tchehinitialarabic", '\xFB7C')+ ,("tchehmedialarabic", '\xFB7D')+ ,("tchehmeeminitialarabic", '\xFB7C')+ ,("tcircle", '\x24E3')+ ,("tcircumflexbelow", '\x1E71')+ ,("tcommaaccent", '\x0163')+ ,("tdieresis", '\x1E97')+ ,("tdotaccent", '\x1E6B')+ ,("tdotbelow", '\x1E6D')+ ,("tecyrillic", '\x0442')+ ,("tedescendercyrillic", '\x04AD')+ ,("teharabic", '\x062A')+ ,("tehfinalarabic", '\xFE96')+ ,("tehhahinitialarabic", '\xFCA2')+ ,("tehhahisolatedarabic", '\xFC0C')+ ,("tehinitialarabic", '\xFE97')+ ,("tehiragana", '\x3066')+ ,("tehjeeminitialarabic", '\xFCA1')+ ,("tehjeemisolatedarabic", '\xFC0B')+ ,("tehmarbutaarabic", '\x0629')+ ,("tehmarbutafinalarabic", '\xFE94')+ ,("tehmedialarabic", '\xFE98')+ ,("tehmeeminitialarabic", '\xFCA4')+ ,("tehmeemisolatedarabic", '\xFC0E')+ ,("tehnoonfinalarabic", '\xFC73')+ ,("tekatakana", '\x30C6')+ ,("tekatakanahalfwidth", '\xFF83')+ ,("telephone", '\x2121')+ ,("telephoneblack", '\x260E')+ ,("telishagedolahebrew", '\x05A0')+ ,("telishaqetanahebrew", '\x05A9')+ ,("tencircle", '\x2469')+ ,("tenideographicparen", '\x3229')+ ,("tenparen", '\x247D')+ ,("tenperiod", '\x2491')+ ,("tenroman", '\x2179')+ ,("tesh", '\x02A7')+ ,("tet", '\x05D8')+ ,("tetdagesh", '\xFB38')+ ,("tetdageshhebrew", '\xFB38')+ ,("tethebrew", '\x05D8')+ ,("tetsecyrillic", '\x04B5')+ ,("tevirhebrew", '\x059B')+ ,("tevirlefthebrew", '\x059B')+ ,("thabengali", '\x09A5')+ ,("thadeva", '\x0925')+ ,("thagujarati", '\x0AA5')+ ,("thagurmukhi", '\x0A25')+ ,("thalarabic", '\x0630')+ ,("thalfinalarabic", '\xFEAC')+ ,("thanthakhatlowleftthai", '\xF898')+ ,("thanthakhatlowrightthai", '\xF897')+ ,("thanthakhatthai", '\x0E4C')+ ,("thanthakhatupperleftthai", '\xF896')+ ,("theharabic", '\x062B')+ ,("thehfinalarabic", '\xFE9A')+ ,("thehinitialarabic", '\xFE9B')+ ,("thehmedialarabic", '\xFE9C')+ ,("thereexists", '\x2203')+ ,("therefore", '\x2234')+ ,("theta", '\x03B8')+ ,("theta1", '\x03D1')+ ,("thetasymbolgreek", '\x03D1')+ ,("thieuthacirclekorean", '\x3279')+ ,("thieuthaparenkorean", '\x3219')+ ,("thieuthcirclekorean", '\x326B')+ ,("thieuthkorean", '\x314C')+ ,("thieuthparenkorean", '\x320B')+ ,("thirteencircle", '\x246C')+ ,("thirteenparen", '\x2480')+ ,("thirteenperiod", '\x2494')+ ,("thonangmonthothai", '\x0E11')+ ,("thook", '\x01AD')+ ,("thophuthaothai", '\x0E12')+ ,("thorn", '\x00FE')+ ,("thothahanthai", '\x0E17')+ ,("thothanthai", '\x0E10')+ ,("thothongthai", '\x0E18')+ ,("thothungthai", '\x0E16')+ ,("thousandcyrillic", '\x0482')+ ,("thousandsseparatorarabic", '\x066C')+ ,("thousandsseparatorpersian", '\x066C')+ ,("three", '\x0033')+ ,("threearabic", '\x0663')+ ,("threebengali", '\x09E9')+ ,("threecircle", '\x2462')+ ,("threecircleinversesansserif", '\x278C')+ ,("threedeva", '\x0969')+ ,("threeeighths", '\x215C')+ ,("threegujarati", '\x0AE9')+ ,("threegurmukhi", '\x0A69')+ ,("threehackarabic", '\x0663')+ ,("threehangzhou", '\x3023')+ ,("threeideographicparen", '\x3222')+ ,("threeinferior", '\x2083')+ ,("threemonospace", '\xFF13')+ ,("threenumeratorbengali", '\x09F6')+ ,("threeoldstyle", '\xF733')+ ,("threeparen", '\x2476')+ ,("threeperiod", '\x248A')+ ,("threepersian", '\x06F3')+ ,("threequarters", '\x00BE')+ ,("threequartersemdash", '\xF6DE')+ ,("threeroman", '\x2172')+ ,("threesuperior", '\x00B3')+ ,("threethai", '\x0E53')+ ,("thzsquare", '\x3394')+ ,("tihiragana", '\x3061')+ ,("tikatakana", '\x30C1')+ ,("tikatakanahalfwidth", '\xFF81')+ ,("tikeutacirclekorean", '\x3270')+ ,("tikeutaparenkorean", '\x3210')+ ,("tikeutcirclekorean", '\x3262')+ ,("tikeutkorean", '\x3137')+ ,("tikeutparenkorean", '\x3202')+ ,("tilde", '\x02DC')+ ,("tildebelowcmb", '\x0330')+ ,("tildecmb", '\x0303')+ ,("tildecomb", '\x0303')+ ,("tildedoublecmb", '\x0360')+ ,("tildeoperator", '\x223C')+ ,("tildeoverlaycmb", '\x0334')+ ,("tildeverticalcmb", '\x033E')+ ,("timescircle", '\x2297')+ ,("tipehahebrew", '\x0596')+ ,("tipehalefthebrew", '\x0596')+ ,("tippigurmukhi", '\x0A70')+ ,("titlocyrilliccmb", '\x0483')+ ,("tiwnarmenian", '\x057F')+ ,("tlinebelow", '\x1E6F')+ ,("tmonospace", '\xFF54')+ ,("toarmenian", '\x0569')+ ,("tohiragana", '\x3068')+ ,("tokatakana", '\x30C8')+ ,("tokatakanahalfwidth", '\xFF84')+ ,("tonebarextrahighmod", '\x02E5')+ ,("tonebarextralowmod", '\x02E9')+ ,("tonebarhighmod", '\x02E6')+ ,("tonebarlowmod", '\x02E8')+ ,("tonebarmidmod", '\x02E7')+ ,("tonefive", '\x01BD')+ ,("tonesix", '\x0185')+ ,("tonetwo", '\x01A8')+ ,("tonos", '\x0384')+ ,("tonsquare", '\x3327')+ ,("topatakthai", '\x0E0F')+ ,("tortoiseshellbracketleft", '\x3014')+ ,("tortoiseshellbracketleftsmall", '\xFE5D')+ ,("tortoiseshellbracketleftvertical", '\xFE39')+ ,("tortoiseshellbracketright", '\x3015')+ ,("tortoiseshellbracketrightsmall", '\xFE5E')+ ,("tortoiseshellbracketrightvertical", '\xFE3A')+ ,("totaothai", '\x0E15')+ ,("tpalatalhook", '\x01AB')+ ,("tparen", '\x24AF')+ ,("trademark", '\x2122')+ ,("trademarksans", '\xF8EA')+ ,("trademarkserif", '\xF6DB')+ ,("tretroflexhook", '\x0288')+ ,("triagdn", '\x25BC')+ ,("triaglf", '\x25C4')+ ,("triagrt", '\x25BA')+ ,("triagup", '\x25B2')+ ,("ts", '\x02A6')+ ,("tsadi", '\x05E6')+ ,("tsadidagesh", '\xFB46')+ ,("tsadidageshhebrew", '\xFB46')+ ,("tsadihebrew", '\x05E6')+ ,("tsecyrillic", '\x0446')+ ,("tsere", '\x05B5')+ ,("tsere12", '\x05B5')+ ,("tsere1e", '\x05B5')+ ,("tsere2b", '\x05B5')+ ,("tserehebrew", '\x05B5')+ ,("tserenarrowhebrew", '\x05B5')+ ,("tserequarterhebrew", '\x05B5')+ ,("tserewidehebrew", '\x05B5')+ ,("tshecyrillic", '\x045B')+ ,("tsuperior", '\xF6F3')+ ,("ttabengali", '\x099F')+ ,("ttadeva", '\x091F')+ ,("ttagujarati", '\x0A9F')+ ,("ttagurmukhi", '\x0A1F')+ ,("tteharabic", '\x0679')+ ,("ttehfinalarabic", '\xFB67')+ ,("ttehinitialarabic", '\xFB68')+ ,("ttehmedialarabic", '\xFB69')+ ,("tthabengali", '\x09A0')+ ,("tthadeva", '\x0920')+ ,("tthagujarati", '\x0AA0')+ ,("tthagurmukhi", '\x0A20')+ ,("tturned", '\x0287')+ ,("tuhiragana", '\x3064')+ ,("tukatakana", '\x30C4')+ ,("tukatakanahalfwidth", '\xFF82')+ ,("tusmallhiragana", '\x3063')+ ,("tusmallkatakana", '\x30C3')+ ,("tusmallkatakanahalfwidth", '\xFF6F')+ ,("twelvecircle", '\x246B')+ ,("twelveparen", '\x247F')+ ,("twelveperiod", '\x2493')+ ,("twelveroman", '\x217B')+ ,("twentycircle", '\x2473')+ ,("twentyhangzhou", '\x5344')+ ,("twentyparen", '\x2487')+ ,("twentyperiod", '\x249B')+ ,("two", '\x0032')+ ,("twoarabic", '\x0662')+ ,("twobengali", '\x09E8')+ ,("twocircle", '\x2461')+ ,("twocircleinversesansserif", '\x278B')+ ,("twodeva", '\x0968')+ ,("twodotenleader", '\x2025')+ ,("twodotleader", '\x2025')+ ,("twodotleadervertical", '\xFE30')+ ,("twogujarati", '\x0AE8')+ ,("twogurmukhi", '\x0A68')+ ,("twohackarabic", '\x0662')+ ,("twohangzhou", '\x3022')+ ,("twoideographicparen", '\x3221')+ ,("twoinferior", '\x2082')+ ,("twomonospace", '\xFF12')+ ,("twonumeratorbengali", '\x09F5')+ ,("twooldstyle", '\xF732')+ ,("twoparen", '\x2475')+ ,("twoperiod", '\x2489')+ ,("twopersian", '\x06F2')+ ,("tworoman", '\x2171')+ ,("twostroke", '\x01BB')+ ,("twosuperior", '\x00B2')+ ,("twothai", '\x0E52')+ ,("twothirds", '\x2154')+ ,("u", '\x0075')+ ,("uacute", '\x00FA')+ ,("ubar", '\x0289')+ ,("ubengali", '\x0989')+ ,("ubopomofo", '\x3128')+ ,("ubreve", '\x016D')+ ,("ucaron", '\x01D4')+ ,("ucircle", '\x24E4')+ ,("ucircumflex", '\x00FB')+ ,("ucircumflexbelow", '\x1E77')+ ,("ucyrillic", '\x0443')+ ,("udattadeva", '\x0951')+ ,("udblacute", '\x0171')+ ,("udblgrave", '\x0215')+ ,("udeva", '\x0909')+ ,("udieresis", '\x00FC')+ ,("udieresisacute", '\x01D8')+ ,("udieresisbelow", '\x1E73')+ ,("udieresiscaron", '\x01DA')+ ,("udieresiscyrillic", '\x04F1')+ ,("udieresisgrave", '\x01DC')+ ,("udieresismacron", '\x01D6')+ ,("udotbelow", '\x1EE5')+ ,("ugrave", '\x00F9')+ ,("ugujarati", '\x0A89')+ ,("ugurmukhi", '\x0A09')+ ,("uhiragana", '\x3046')+ ,("uhookabove", '\x1EE7')+ ,("uhorn", '\x01B0')+ ,("uhornacute", '\x1EE9')+ ,("uhorndotbelow", '\x1EF1')+ ,("uhorngrave", '\x1EEB')+ ,("uhornhookabove", '\x1EED')+ ,("uhorntilde", '\x1EEF')+ ,("uhungarumlaut", '\x0171')+ ,("uhungarumlautcyrillic", '\x04F3')+ ,("uinvertedbreve", '\x0217')+ ,("ukatakana", '\x30A6')+ ,("ukatakanahalfwidth", '\xFF73')+ ,("ukcyrillic", '\x0479')+ ,("ukorean", '\x315C')+ ,("umacron", '\x016B')+ ,("umacroncyrillic", '\x04EF')+ ,("umacrondieresis", '\x1E7B')+ ,("umatragurmukhi", '\x0A41')+ ,("umonospace", '\xFF55')+ ,("underscore", '\x005F')+ ,("underscoredbl", '\x2017')+ ,("underscoremonospace", '\xFF3F')+ ,("underscorevertical", '\xFE33')+ ,("underscorewavy", '\xFE4F')+ ,("union", '\x222A')+ ,("universal", '\x2200')+ ,("uogonek", '\x0173')+ ,("uparen", '\x24B0')+ ,("upblock", '\x2580')+ ,("upperdothebrew", '\x05C4')+ ,("upsilon", '\x03C5')+ ,("upsilondieresis", '\x03CB')+ ,("upsilondieresistonos", '\x03B0')+ ,("upsilonlatin", '\x028A')+ ,("upsilontonos", '\x03CD')+ ,("uptackbelowcmb", '\x031D')+ ,("uptackmod", '\x02D4')+ ,("uragurmukhi", '\x0A73')+ ,("uring", '\x016F')+ ,("ushortcyrillic", '\x045E')+ ,("usmallhiragana", '\x3045')+ ,("usmallkatakana", '\x30A5')+ ,("usmallkatakanahalfwidth", '\xFF69')+ ,("ustraightcyrillic", '\x04AF')+ ,("ustraightstrokecyrillic", '\x04B1')+ ,("utilde", '\x0169')+ ,("utildeacute", '\x1E79')+ ,("utildebelow", '\x1E75')+ ,("uubengali", '\x098A')+ ,("uudeva", '\x090A')+ ,("uugujarati", '\x0A8A')+ ,("uugurmukhi", '\x0A0A')+ ,("uumatragurmukhi", '\x0A42')+ ,("uuvowelsignbengali", '\x09C2')+ ,("uuvowelsigndeva", '\x0942')+ ,("uuvowelsigngujarati", '\x0AC2')+ ,("uvowelsignbengali", '\x09C1')+ ,("uvowelsigndeva", '\x0941')+ ,("uvowelsigngujarati", '\x0AC1')+ ,("v", '\x0076')+ ,("vadeva", '\x0935')+ ,("vagujarati", '\x0AB5')+ ,("vagurmukhi", '\x0A35')+ ,("vakatakana", '\x30F7')+ ,("vav", '\x05D5')+ ,("vavdagesh", '\xFB35')+ ,("vavdagesh65", '\xFB35')+ ,("vavdageshhebrew", '\xFB35')+ ,("vavhebrew", '\x05D5')+ ,("vavholam", '\xFB4B')+ ,("vavholamhebrew", '\xFB4B')+ ,("vavvavhebrew", '\x05F0')+ ,("vavyodhebrew", '\x05F1')+ ,("vcircle", '\x24E5')+ ,("vdotbelow", '\x1E7F')+ ,("vecyrillic", '\x0432')+ ,("veharabic", '\x06A4')+ ,("vehfinalarabic", '\xFB6B')+ ,("vehinitialarabic", '\xFB6C')+ ,("vehmedialarabic", '\xFB6D')+ ,("vekatakana", '\x30F9')+ ,("venus", '\x2640')+ ,("verticalbar", '\x007C')+ ,("verticallineabovecmb", '\x030D')+ ,("verticallinebelowcmb", '\x0329')+ ,("verticallinelowmod", '\x02CC')+ ,("verticallinemod", '\x02C8')+ ,("vewarmenian", '\x057E')+ ,("vhook", '\x028B')+ ,("vikatakana", '\x30F8')+ ,("viramabengali", '\x09CD')+ ,("viramadeva", '\x094D')+ ,("viramagujarati", '\x0ACD')+ ,("visargabengali", '\x0983')+ ,("visargadeva", '\x0903')+ ,("visargagujarati", '\x0A83')+ ,("vmonospace", '\xFF56')+ ,("voarmenian", '\x0578')+ ,("voicediterationhiragana", '\x309E')+ ,("voicediterationkatakana", '\x30FE')+ ,("voicedmarkkana", '\x309B')+ ,("voicedmarkkanahalfwidth", '\xFF9E')+ ,("vokatakana", '\x30FA')+ ,("vparen", '\x24B1')+ ,("vtilde", '\x1E7D')+ ,("vturned", '\x028C')+ ,("vuhiragana", '\x3094')+ ,("vukatakana", '\x30F4')+ ,("w", '\x0077')+ ,("wacute", '\x1E83')+ ,("waekorean", '\x3159')+ ,("wahiragana", '\x308F')+ ,("wakatakana", '\x30EF')+ ,("wakatakanahalfwidth", '\xFF9C')+ ,("wakorean", '\x3158')+ ,("wasmallhiragana", '\x308E')+ ,("wasmallkatakana", '\x30EE')+ ,("wattosquare", '\x3357')+ ,("wavedash", '\x301C')+ ,("wavyunderscorevertical", '\xFE34')+ ,("wawarabic", '\x0648')+ ,("wawfinalarabic", '\xFEEE')+ ,("wawhamzaabovearabic", '\x0624')+ ,("wawhamzaabovefinalarabic", '\xFE86')+ ,("wbsquare", '\x33DD')+ ,("wcircle", '\x24E6')+ ,("wcircumflex", '\x0175')+ ,("wdieresis", '\x1E85')+ ,("wdotaccent", '\x1E87')+ ,("wdotbelow", '\x1E89')+ ,("wehiragana", '\x3091')+ ,("weierstrass", '\x2118')+ ,("wekatakana", '\x30F1')+ ,("wekorean", '\x315E')+ ,("weokorean", '\x315D')+ ,("wgrave", '\x1E81')+ ,("whitebullet", '\x25E6')+ ,("whitecircle", '\x25CB')+ ,("whitecircleinverse", '\x25D9')+ ,("whitecornerbracketleft", '\x300E')+ ,("whitecornerbracketleftvertical", '\xFE43')+ ,("whitecornerbracketright", '\x300F')+ ,("whitecornerbracketrightvertical", '\xFE44')+ ,("whitediamond", '\x25C7')+ ,("whitediamondcontainingblacksmalldiamond", '\x25C8')+ ,("whitedownpointingsmalltriangle", '\x25BF')+ ,("whitedownpointingtriangle", '\x25BD')+ ,("whiteleftpointingsmalltriangle", '\x25C3')+ ,("whiteleftpointingtriangle", '\x25C1')+ ,("whitelenticularbracketleft", '\x3016')+ ,("whitelenticularbracketright", '\x3017')+ ,("whiterightpointingsmalltriangle", '\x25B9')+ ,("whiterightpointingtriangle", '\x25B7')+ ,("whitesmallsquare", '\x25AB')+ ,("whitesmilingface", '\x263A')+ ,("whitesquare", '\x25A1')+ ,("whitestar", '\x2606')+ ,("whitetelephone", '\x260F')+ ,("whitetortoiseshellbracketleft", '\x3018')+ ,("whitetortoiseshellbracketright", '\x3019')+ ,("whiteuppointingsmalltriangle", '\x25B5')+ ,("whiteuppointingtriangle", '\x25B3')+ ,("wihiragana", '\x3090')+ ,("wikatakana", '\x30F0')+ ,("wikorean", '\x315F')+ ,("wmonospace", '\xFF57')+ ,("wohiragana", '\x3092')+ ,("wokatakana", '\x30F2')+ ,("wokatakanahalfwidth", '\xFF66')+ ,("won", '\x20A9')+ ,("wonmonospace", '\xFFE6')+ ,("wowaenthai", '\x0E27')+ ,("wparen", '\x24B2')+ ,("wring", '\x1E98')+ ,("wsuperior", '\x02B7')+ ,("wturned", '\x028D')+ ,("wynn", '\x01BF')+ ,("x", '\x0078')+ ,("xabovecmb", '\x033D')+ ,("xbopomofo", '\x3112')+ ,("xcircle", '\x24E7')+ ,("xdieresis", '\x1E8D')+ ,("xdotaccent", '\x1E8B')+ ,("xeharmenian", '\x056D')+ ,("xi", '\x03BE')+ ,("xmonospace", '\xFF58')+ ,("xparen", '\x24B3')+ ,("xsuperior", '\x02E3')+ ,("y", '\x0079')+ ,("yaadosquare", '\x334E')+ ,("yabengali", '\x09AF')+ ,("yacute", '\x00FD')+ ,("yadeva", '\x092F')+ ,("yaekorean", '\x3152')+ ,("yagujarati", '\x0AAF')+ ,("yagurmukhi", '\x0A2F')+ ,("yahiragana", '\x3084')+ ,("yakatakana", '\x30E4')+ ,("yakatakanahalfwidth", '\xFF94')+ ,("yakorean", '\x3151')+ ,("yamakkanthai", '\x0E4E')+ ,("yasmallhiragana", '\x3083')+ ,("yasmallkatakana", '\x30E3')+ ,("yasmallkatakanahalfwidth", '\xFF6C')+ ,("yatcyrillic", '\x0463')+ ,("ycircle", '\x24E8')+ ,("ycircumflex", '\x0177')+ ,("ydieresis", '\x00FF')+ ,("ydotaccent", '\x1E8F')+ ,("ydotbelow", '\x1EF5')+ ,("yeharabic", '\x064A')+ ,("yehbarreearabic", '\x06D2')+ ,("yehbarreefinalarabic", '\xFBAF')+ ,("yehfinalarabic", '\xFEF2')+ ,("yehhamzaabovearabic", '\x0626')+ ,("yehhamzaabovefinalarabic", '\xFE8A')+ ,("yehhamzaaboveinitialarabic", '\xFE8B')+ ,("yehhamzaabovemedialarabic", '\xFE8C')+ ,("yehinitialarabic", '\xFEF3')+ ,("yehmedialarabic", '\xFEF4')+ ,("yehmeeminitialarabic", '\xFCDD')+ ,("yehmeemisolatedarabic", '\xFC58')+ ,("yehnoonfinalarabic", '\xFC94')+ ,("yehthreedotsbelowarabic", '\x06D1')+ ,("yekorean", '\x3156')+ ,("yen", '\x00A5')+ ,("yenmonospace", '\xFFE5')+ ,("yeokorean", '\x3155')+ ,("yeorinhieuhkorean", '\x3186')+ ,("yerahbenyomohebrew", '\x05AA')+ ,("yerahbenyomolefthebrew", '\x05AA')+ ,("yericyrillic", '\x044B')+ ,("yerudieresiscyrillic", '\x04F9')+ ,("yesieungkorean", '\x3181')+ ,("yesieungpansioskorean", '\x3183')+ ,("yesieungsioskorean", '\x3182')+ ,("yetivhebrew", '\x059A')+ ,("ygrave", '\x1EF3')+ ,("yhook", '\x01B4')+ ,("yhookabove", '\x1EF7')+ ,("yiarmenian", '\x0575')+ ,("yicyrillic", '\x0457')+ ,("yikorean", '\x3162')+ ,("yinyang", '\x262F')+ ,("yiwnarmenian", '\x0582')+ ,("ymonospace", '\xFF59')+ ,("yod", '\x05D9')+ ,("yoddagesh", '\xFB39')+ ,("yoddageshhebrew", '\xFB39')+ ,("yodhebrew", '\x05D9')+ ,("yodyodhebrew", '\x05F2')+ ,("yodyodpatahhebrew", '\xFB1F')+ ,("yohiragana", '\x3088')+ ,("yoikorean", '\x3189')+ ,("yokatakana", '\x30E8')+ ,("yokatakanahalfwidth", '\xFF96')+ ,("yokorean", '\x315B')+ ,("yosmallhiragana", '\x3087')+ ,("yosmallkatakana", '\x30E7')+ ,("yosmallkatakanahalfwidth", '\xFF6E')+ ,("yotgreek", '\x03F3')+ ,("yoyaekorean", '\x3188')+ ,("yoyakorean", '\x3187')+ ,("yoyakthai", '\x0E22')+ ,("yoyingthai", '\x0E0D')+ ,("yparen", '\x24B4')+ ,("ypogegrammeni", '\x037A')+ ,("ypogegrammenigreekcmb", '\x0345')+ ,("yr", '\x01A6')+ ,("yring", '\x1E99')+ ,("ysuperior", '\x02B8')+ ,("ytilde", '\x1EF9')+ ,("yturned", '\x028E')+ ,("yuhiragana", '\x3086')+ ,("yuikorean", '\x318C')+ ,("yukatakana", '\x30E6')+ ,("yukatakanahalfwidth", '\xFF95')+ ,("yukorean", '\x3160')+ ,("yusbigcyrillic", '\x046B')+ ,("yusbigiotifiedcyrillic", '\x046D')+ ,("yuslittlecyrillic", '\x0467')+ ,("yuslittleiotifiedcyrillic", '\x0469')+ ,("yusmallhiragana", '\x3085')+ ,("yusmallkatakana", '\x30E5')+ ,("yusmallkatakanahalfwidth", '\xFF6D')+ ,("yuyekorean", '\x318B')+ ,("yuyeokorean", '\x318A')+ ,("yyabengali", '\x09DF')+ ,("yyadeva", '\x095F')+ ,("z", '\x007A')+ ,("zaarmenian", '\x0566')+ ,("zacute", '\x017A')+ ,("zadeva", '\x095B')+ ,("zagurmukhi", '\x0A5B')+ ,("zaharabic", '\x0638')+ ,("zahfinalarabic", '\xFEC6')+ ,("zahinitialarabic", '\xFEC7')+ ,("zahiragana", '\x3056')+ ,("zahmedialarabic", '\xFEC8')+ ,("zainarabic", '\x0632')+ ,("zainfinalarabic", '\xFEB0')+ ,("zakatakana", '\x30B6')+ ,("zaqefgadolhebrew", '\x0595')+ ,("zaqefqatanhebrew", '\x0594')+ ,("zarqahebrew", '\x0598')+ ,("zayin", '\x05D6')+ ,("zayindagesh", '\xFB36')+ ,("zayindageshhebrew", '\xFB36')+ ,("zayinhebrew", '\x05D6')+ ,("zbopomofo", '\x3117')+ ,("zcaron", '\x017E')+ ,("zcircle", '\x24E9')+ ,("zcircumflex", '\x1E91')+ ,("zcurl", '\x0291')+ ,("zdot", '\x017C')+ ,("zdotaccent", '\x017C')+ ,("zdotbelow", '\x1E93')+ ,("zecyrillic", '\x0437')+ ,("zedescendercyrillic", '\x0499')+ ,("zedieresiscyrillic", '\x04DF')+ ,("zehiragana", '\x305C')+ ,("zekatakana", '\x30BC')+ ,("zero", '\x0030')+ ,("zeroarabic", '\x0660')+ ,("zerobengali", '\x09E6')+ ,("zerodeva", '\x0966')+ ,("zerogujarati", '\x0AE6')+ ,("zerogurmukhi", '\x0A66')+ ,("zerohackarabic", '\x0660')+ ,("zeroinferior", '\x2080')+ ,("zeromonospace", '\xFF10')+ ,("zerooldstyle", '\xF730')+ ,("zeropersian", '\x06F0')+ ,("zerosuperior", '\x2070')+ ,("zerothai", '\x0E50')+ ,("zerowidthjoiner", '\xFEFF')+ ,("zerowidthnonjoiner", '\x200C')+ ,("zerowidthspace", '\x200B')+ ,("zeta", '\x03B6')+ ,("zhbopomofo", '\x3113')+ ,("zhearmenian", '\x056A')+ ,("zhebrevecyrillic", '\x04C2')+ ,("zhecyrillic", '\x0436')+ ,("zhedescendercyrillic", '\x0497')+ ,("zhedieresiscyrillic", '\x04DD')+ ,("zihiragana", '\x3058')+ ,("zikatakana", '\x30B8')+ ,("zinorhebrew", '\x05AE')+ ,("zlinebelow", '\x1E95')+ ,("zmonospace", '\xFF5A')+ ,("zohiragana", '\x305E')+ ,("zokatakana", '\x30BE')+ ,("zparen", '\x24B5')+ ,("zretroflexhook", '\x0290')+ ,("zstroke", '\x01B6')+ ,("zuhiragana", '\x305A')+ ,("zukatakana", '\x30BA')+ ]
+ lib/Pdf/Content/Ops.hs view
@@ -0,0 +1,196 @@+{-# LANGUAGE OverloadedStrings #-}++-- | Content stream operators++module Pdf.Content.Ops+(+ Op(..),+ Expr(..),+ Operator,+ toOp+)+where++import Pdf.Core++import Data.ByteString (ByteString)++-- | Operator with arguments+type Operator = (Op, [Object])++-- | Content stream operators+data Op+ -- | Graphics State Operators+ = Op_q+ | Op_Q+ | Op_cm+ | Op_w+ | Op_J+ | Op_j+ | Op_M+ | Op_d+ | Op_ri+ | Op_i+ | Op_gs+ -- | Path Construction Operators+ | Op_m+ | Op_l+ | Op_c+ | Op_v+ | Op_y+ | Op_h+ | Op_re+ -- | Path Painting Operators+ | Op_S+ | Op_s+ | Op_f+ | Op_F+ | Op_f_star+ | Op_B+ | Op_B_star+ | Op_b+ | Op_b_star+ | Op_n+ -- | Clipping Path Operators+ | Op_W+ | Op_W_star+ -- | Text Object Operators+ | Op_BT+ | Op_ET+ -- | Text State Operators+ | Op_Tc+ | Op_Tw+ | Op_Tz+ | Op_TL+ | Op_Tf+ | Op_Tr+ | Op_Ts+ -- | Text Positioning Operators+ | Op_Td+ | Op_TD+ | Op_Tm+ | Op_T_star+ -- | Text Showing Operators+ | Op_Tj+ | Op_apostrophe+ | Op_quote+ | Op_TJ+ -- | Type 3 Font Operators+ | Op_d0+ | Op_d1+ -- | Color Operators+ | Op_CS+ | Op_cs+ | Op_SC+ | Op_SCN+ | Op_sc+ | Op_scn+ | Op_G+ | Op_g+ | Op_RG+ | Op_rg+ | Op_K+ | Op_k+ -- | Shading Operator+ | Op_sh+ -- | Inline Image Operators+ | Op_BI+ | Op_ID+ | Op_EI+ -- | XObject Operator+ | Op_Do+ -- | Marked Content Operators+ | Op_MP+ | Op_DP+ | Op_BMC+ | Op_BDC+ | Op_EMC+ -- | Compatibility Operators+ | Op_BX+ | Op_EX+ -- | Unknown+ | UnknownOp ByteString+ deriving (Show, Eq)++-- | Expression is a regular objects or an operators+data Expr+ = Obj Object+ | Op Op+ deriving (Show, Eq)++-- | Conversion to operator+toOp :: ByteString -> Op+toOp "q" = Op_q+toOp "Q" = Op_Q+toOp "cm" = Op_cm+toOp "w" = Op_w+toOp "J" = Op_J+toOp "j" = Op_j+toOp "M" = Op_M+toOp "d" = Op_d+toOp "ri" = Op_ri+toOp "i" = Op_i+toOp "gs" = Op_gs+toOp "m" = Op_m+toOp "l" = Op_l+toOp "c" = Op_c+toOp "v" = Op_v+toOp "y" = Op_y+toOp "h" = Op_h+toOp "re" = Op_re+toOp "S" = Op_S+toOp "s" = Op_s+toOp "f" = Op_f+toOp "F" = Op_F+toOp "f*" = Op_f_star+toOp "B" = Op_B+toOp "B*" = Op_B_star+toOp "b" = Op_b+toOp "b*" = Op_b_star+toOp "n" = Op_n+toOp "W" = Op_W+toOp "W*" = Op_W_star+toOp "BT" = Op_BT+toOp "ET" = Op_ET+toOp "Tc" = Op_Tc+toOp "Tw" = Op_Tw+toOp "Tz" = Op_Tz+toOp "TL" = Op_TL+toOp "Tf" = Op_Tf+toOp "Tr" = Op_Tr+toOp "Ts" = Op_Ts+toOp "Td" = Op_Td+toOp "TD" = Op_TD+toOp "Tm" = Op_Tm+toOp "T*" = Op_T_star+toOp "Tj" = Op_Tj+toOp "'" = Op_apostrophe+toOp "\"" = Op_quote+toOp "TJ" = Op_TJ+toOp "d0" = Op_d0+toOp "d1" = Op_d1+toOp "CS" = Op_CS+toOp "cs" = Op_cs+toOp "SC" = Op_SC+toOp "SCN" = Op_SCN+toOp "sc" = Op_sc+toOp "scn" = Op_scn+toOp "G" = Op_G+toOp "g" = Op_g+toOp "RG" = Op_RG+toOp "rg" = Op_rg+toOp "K" = Op_K+toOp "k" = Op_k+toOp "sh" = Op_sh+toOp "BI" = Op_BI+toOp "ID" = Op_ID+toOp "EI" = Op_EI+toOp "Do" = Op_Do+toOp "MP" = Op_MP+toOp "DP" = Op_DP+toOp "BMC" = Op_BMC+toOp "BDC" = Op_BDC+toOp "EMC" = Op_EMC+toOp "BX" = Op_BX+toOp "EX" = Op_EX+toOp str = UnknownOp str
+ lib/Pdf/Content/Parser.hs view
@@ -0,0 +1,55 @@++-- | Parse content stream++module Pdf.Content.Parser+(+ readNextOperator,+ parseContent,+)+where++import Pdf.Core.Exception+import Pdf.Core.Parsers.Object++import Pdf.Content.Ops++import Data.Attoparsec.ByteString.Char8 (Parser)+import qualified Data.Attoparsec.ByteString.Char8 as Parser+import Control.Applicative+import Control.Monad+import Control.Exception hiding (throw)+import System.IO.Streams (InputStream)+import qualified System.IO.Streams as Streams+import qualified System.IO.Streams.Attoparsec as Streams++-- | Read the next operator if any+readNextOperator :: InputStream Expr -> IO (Maybe Operator)+readNextOperator is = message "readNextOperator" $ go []+ where+ go args = do+ expr <- Streams.read is+ -- XXX: it should be handled by stream creator+ `catch` \(Streams.ParseException msg) -> throwIO (Corrupted msg [])+ case expr of+ Nothing -> case args of+ [] -> return Nothing+ _ -> throwIO $ Corrupted ("Args without op: " ++ show args) []+ Just (Obj o) -> go (o : args)+ Just (Op o) -> return $ Just (o, reverse args)++-- | Parser expression in a content stream+parseContent :: Parser (Maybe Expr)+parseContent = do+ skipSpace+ (Parser.endOfInput >> return Nothing) <|>+ fmap Just (fmap Obj parseObject <|>+ fmap (Op . toOp) (Parser.takeWhile1 isRegularChar))++-- Treat comments as spaces+skipSpace :: Parser ()+skipSpace = do+ Parser.skipSpace+ void $ many $ do+ _ <- Parser.char '%'+ Parser.skipWhile $ \c -> c /= '\n' && c /= '\r'+ Parser.skipSpace
+ lib/Pdf/Content/Processor.hs view
@@ -0,0 +1,354 @@+{-# LANGUAGE OverloadedStrings #-}++-- | Process content stream operators maintaining graphics state+--+-- It is pretty experimental++module Pdf.Content.Processor+(+ Processor(..),+ GraphicsState(..),+ GlyphDecoder,+ Glyph(..),+ Span(..),+ initialGraphicsState,+ mkProcessor,+ processOp+)+where++import Pdf.Core+import Pdf.Core.Object.Util+import Pdf.Core.Util++import Pdf.Content.Ops+import Pdf.Content.Transform++import Data.ByteString (ByteString)+import Data.Text (Text)+import qualified Data.Scientific as Scientific+import qualified Data.Vector as Vector+import Control.Monad++-- | Given font name and string, it should return list of glyphs+-- and their widths.+--+-- Note: it should not try to position or scale glyphs to user space,+-- bounding boxes should be defined in glyph space.+--+-- Note: glyph width is a distance between the glyph's origin and+-- the next glyph's origin, so it generally can't be calculated+-- from bounding box+--+-- Note: the 'Processor' actually doesn't cares about glyph's+-- bounding box, so you can return anything you want+type GlyphDecoder = Name -> ByteString -> [(Glyph, Double)]++-- | Glyph+data Glyph = Glyph {+ -- | The code as read from content stream+ glyphCode :: Int,+ -- | Top-left corner of glyph's bounding box+ glyphTopLeft :: Vector Double,+ -- | Bottom-right corner of glyph's bounding box+ glyphBottomRight :: Vector Double,+ -- | Text ectracted from the glyph+ glyphText :: Maybe Text+ }+ deriving Show++-- | Graphics state+data GraphicsState = GraphicsState {+ gsInText :: Bool, -- ^ Indicates that we are inside text object+ gsCurrentTransformMatrix :: Transform Double,+ gsFont :: Maybe Name,+ gsFontSize :: Maybe Double,+ gsTextMatrix :: Transform Double, -- ^ Defined only inside text object+ gsTextLineMatrix :: Transform Double, -- ^ Defined only inside text object+ gsTextLeading :: Double,+ gsTextCharSpacing :: Double,+ gsTextWordSpacing :: Double+ }+ deriving Show++-- | Empty graphics state+initialGraphicsState :: GraphicsState+initialGraphicsState = GraphicsState {+ gsInText = False,+ gsCurrentTransformMatrix = identity,+ gsFont = Nothing,+ gsFontSize = Nothing,+ gsTextMatrix = identity,+ gsTextLineMatrix = identity,+ gsTextLeading = 0,+ gsTextCharSpacing = 0,+ gsTextWordSpacing = 0+ }++-- | Glyphs drawn in one shot+data Span = Span+ { spGlyphs :: [Glyph]+ , spFontName :: Name+ }++-- | Processor maintains graphics state+data Processor = Processor {+ prState :: GraphicsState,+ prStateStack :: [GraphicsState],+ prGlyphDecoder :: GlyphDecoder,+ prSpans :: [Span]+ -- ^ Each element is a list of glyphs, drawn in one shot+ }++-- | Create processor in initial state+mkProcessor :: Processor+mkProcessor = Processor {+ prState = initialGraphicsState,+ prStateStack = [],+ prGlyphDecoder = \_ _ -> [],+ prSpans = mempty+ }++-- | Process one operation+processOp :: Operator -> Processor -> Either String Processor++processOp (Op_q, []) p = Right p {prStateStack = prState p : prStateStack p}+processOp (Op_q, args) _ = Left ("Op_q: wrong number of arguments: "+ ++ show args)++processOp (Op_Q, []) p =+ case prStateStack p of+ [] -> Left "Op_Q: state is empty"+ (x:xs) -> Right p {prState = x, prStateStack = xs}+processOp (Op_Q, args) _ = Left ("Op_Q: wrong number of arguments: "+ ++ show args)++processOp (Op_BT, []) p = do+ ensureInTextObject False p+ let gstate = prState p+ return p {prState = gstate {+ gsInText = True,+ gsTextMatrix = identity,+ gsTextLineMatrix = identity+ }}+processOp (Op_BT, args) _ = Left ("Op_BT: wrong number of arguments: "+ ++ show args)++processOp (Op_ET, []) p = do+ ensureInTextObject True p+ let gstate = prState p+ return p {prState = gstate {+ gsInText = False+ }}+processOp (Op_ET, args) _ = Left ("Op_ET: wrong number of arguments: "+ ++ show args)++processOp (Op_Td, [txo, tyo]) p = do+ ensureInTextObject True p+ tx <- realValue txo `notice` "Td: x should be a real value"+ ty <- realValue tyo `notice` "Td: y should be a real value"+ let gstate = prState p+ tm = translate tx ty $ gsTextLineMatrix gstate+ Right p {prState = gstate {+ gsTextMatrix = tm,+ gsTextLineMatrix = tm+ }}+processOp (Op_Td, args) _ = Left ("Op_Td: wrong number of arguments: "+ ++ show args)++processOp (Op_TD, [txo, tyo]) p = do+ l <- realValue tyo `notice` "TD: y should be a real value"+ p' <- processOp (Op_TL, [Number $ Scientific.fromFloatDigits $ negate l]) p+ processOp (Op_Td, [txo, tyo]) p'+processOp (Op_TD, args) _ = Left ("Op_TD: wrong number of arguments: "+ ++ show args)++processOp (Op_Tm, [a', b', c', d', e', f']) p = do+ ensureInTextObject True p+ a <- realValue a' `notice` "Tm: a should be a real value"+ b <- realValue b' `notice` "Tm: b should be a real value"+ c <- realValue c' `notice` "Tm: c should be a real value"+ d <- realValue d' `notice` "Tm: d should be a real value"+ e <- realValue e' `notice` "Tm: e should be a real value"+ f <- realValue f' `notice` "Tm: f should be a real value"+ let gstate = prState p+ tm = Transform a b c d e f+ return p {prState = gstate {+ gsTextMatrix = tm,+ gsTextLineMatrix = tm+ }}+processOp (Op_Tm, args) _ = Left ("Op_Tm: wrong number of arguments: "+ ++ show args)++processOp (Op_T_star, []) p = do+ ensureInTextObject True p+ let gstate = prState p+ l = gsTextLeading gstate+ processOp (Op_TD, map (Number . Scientific.fromFloatDigits) [0, negate l]) p+processOp (Op_T_star, args) _ = Left ("Op_T_star: wrong number of arguments: "+ ++ show args)++processOp (Op_TL, [lo]) p = do+ l <- realValue lo `notice` "TL: l should be a real value"+ let gstate = prState p+ return p {prState = gstate {+ gsTextLeading = l+ }}+processOp (Op_TL, args) _ = Left ("Op_TL: wrong number of arguments: "+ ++ show args)++processOp (Op_cm, [a', b', c', d', e', f']) p = do+ a <- realValue a' `notice` "cm: a should be a real value"+ b <- realValue b' `notice` "cm: b should be a real value"+ c <- realValue c' `notice` "cm: c should be a real value"+ d <- realValue d' `notice` "cm: d should be a real value"+ e <- realValue e' `notice` "cm: e should be a real value"+ f <- realValue f' `notice` "cm: f should be a real value"+ let gstate = prState p+ ctm = Transform a b c d e f `multiply` gsCurrentTransformMatrix gstate+ return p {prState = gstate {+ gsCurrentTransformMatrix = ctm+ }}+processOp (Op_cm, args) _ = Left ("Op_cm: wrong number of arguments: "+ ++ show args)++processOp (Op_Tf, [fontO, szO]) p = do+ font <- nameValue fontO `notice` "Tf: font should be a name"+ sz <- realValue szO `notice` "Tf: size should be a real value"+ let gstate = prState p+ return p {prState = gstate {+ gsFont = Just font,+ gsFontSize = Just sz+ }}+processOp (Op_Tf, args) _ = Left ("Op_Tf: wrong number of agruments: "+ ++ show args)++processOp (Op_Tj, [String str]) p = do+ let gstate = prState p+ fontName <-+ case gsFont gstate of+ Nothing -> Left "Op_Tj: font not set"+ Just fn -> return fn+ fontSize <-+ case gsFontSize gstate of+ Nothing -> Left "Op_Tj: font size not set"+ Just fs -> return fs+ let (tm, glyphs) = positionGlyghs+ fontSize+ (gsCurrentTransformMatrix gstate)+ (gsTextMatrix gstate)+ (gsTextCharSpacing gstate)+ (gsTextWordSpacing gstate)+ (prGlyphDecoder p fontName str)+ let sp = Span+ { spGlyphs = glyphs+ , spFontName = fontName+ }+ return p {+ prSpans = sp : prSpans p,+ prState = gstate {+ gsTextMatrix = tm+ }+ }+processOp (Op_Tj, args) _ = Left ("Op_Tj: wrong number of agruments:"+ ++ show args)++processOp (Op_TJ, [Array array]) p = do+ let gstate = prState p+ fontName <-+ case gsFont gstate of+ Nothing -> Left "Op_Tj: font not set"+ Just fn -> return fn+ fontSize <-+ case gsFontSize gstate of+ Nothing -> Left "Op_Tj: font size not set"+ Just fs -> return fs+ let (textMatrix, glyphs) = loop (gsTextMatrix gstate) []+ (Vector.toList array)+ where+ loop tm res [] = (tm, reverse res)+ loop tm res (String str : rest) =+ let (tm', gs) = positionGlyghs fontSize+ (gsCurrentTransformMatrix gstate)+ tm+ (gsTextCharSpacing gstate)+ (gsTextWordSpacing gstate)+ (prGlyphDecoder p fontName str)+ in loop tm' (gs : res) rest+ loop tm res (Number n : rest) =+ let d = Scientific.toRealFloat n+ in loop (translate (-d * fontSize / 1000) 0 tm) res rest+ loop tm res (_:rest) = loop tm res rest++ let mkSpan gs = Span+ { spGlyphs = gs+ , spFontName = fontName+ }+ return p {+ prSpans = reverse (map mkSpan glyphs) ++ prSpans p,+ prState = gstate {+ gsTextMatrix = textMatrix+ }+ }+processOp (Op_TJ, args) _ = Left ("Op_TJ: wrong number of agruments:"+ ++ show args)++processOp (Op_Tc, [o]) p = do+ spacing <- realValue o `notice` "Tc: spacing should be a real value"+ let gstate = prState p+ return p {+ prState = gstate {+ gsTextCharSpacing = spacing+ }+ }+processOp (Op_Tc, args) _ = Left ("Op_Tc: wrong number of agruments:"+ ++ show args)++processOp (Op_Tw, [o]) p = do+ spacing <- realValue o `notice` "Tw: spacing should be a real value"+ let gstate = prState p+ return p {+ prState = gstate {+ gsTextWordSpacing = spacing+ }+ }+processOp (Op_Tw, args) _ = Left ("Op_Tw: wrong number of agruments:"+ ++ show args)++processOp (Op_apostrophe, [o]) p = do+ p' <- processOp (Op_T_star, []) p+ processOp (Op_Tj, [o]) p'+processOp (Op_apostrophe, args) _ =+ Left ("Op_apostrophe: wrong number of agruments:" ++ show args)++processOp _ p = return p++ensureInTextObject :: Bool -> Processor -> Either String ()+ensureInTextObject inText p =+ unless (inText == gsInText (prState p)) $+ Left $ "ensureInTextObject: expected: " ++ show inText ++ ", found: "+ ++ show (gsInText $ prState p)++positionGlyghs :: Double+ -> Transform Double+ -> Transform Double+ -> Double+ -> Double+ -> [(Glyph, Double)]+ -> (Transform Double, [Glyph])+positionGlyghs fontSize ctm textMatrix charSpacing wordSpacing+ = go textMatrix []+ where+ go tm res [] = (tm, reverse res)+ go tm res ((g, width):gs) =+ let g' = g {+ glyphTopLeft = transform (multiply tm ctm) topLeft,+ glyphBottomRight = transform (multiply tm ctm) bottomRight+ }+ topLeft = transform (scale fontSize fontSize) $ glyphTopLeft g+ bottomRight = transform (scale fontSize fontSize) $ glyphBottomRight g+ spacing = charSpacing + case glyphText g of+ Just " " -> wordSpacing+ _ -> 0+ tm' = translate (width * fontSize + spacing) 0 tm+ in go tm' (g':res) gs
+ lib/Pdf/Content/TexGlyphList.hs view
@@ -0,0 +1,304 @@+{-# LANGUAGE OverloadedStrings #-}++-- | Mapping from glyph names to unicode characters+-- for TeX fonts++module Pdf.Content.TexGlyphList+(+ texGlyphList+)+where++import Data.ByteString (ByteString)+import Data.Map (Map)+import qualified Data.Map as Map++-- | Glyph list+texGlyphList :: Map ByteString Char+texGlyphList = Map.fromList+ [("Delta", '\x2206')+ ,("Ifractur", '\x2111')+ ,("FFsmall", '\xF766')+ ,("FFIsmall", '\xF766')+ ,("FFLsmall", '\xF766')+ ,("FIsmall", '\xF766')+ ,("FLsmall", '\xF766')+ ,("Germandbls", '\x0053')+ ,("Germandblssmall", '\xF773')+ ,("Ng", '\x014A')+ ,("Omega", '\x2126')+ ,("Rfractur", '\x211C')+ ,("SS", '\x0053')+ ,("SSsmall", '\xF773')+ ,("altselector", '\xD802')+ ,("angbracketleft", '\x27E8')+ ,("angbracketright", '\x27E9')+ ,("arrowbothv", '\x2195')+ ,("arrowdblbothv", '\x21D5')+ ,("arrowleftbothalf", '\x21BD')+ ,("arrowlefttophalf", '\x21BC')+ ,("arrownortheast", '\x2197')+ ,("arrownorthwest", '\x2196')+ ,("arrowrightbothalf", '\x21C1')+ ,("arrowrighttophalf", '\x21C0')+ ,("arrowsoutheast", '\x2198')+ ,("arrowsouthwest", '\x2199')+ ,("ascendercompwordmark", '\xD80A')+ ,("asteriskcentered", '\x2217')+ ,("bardbl", '\x2225')+ ,("capitalcompwordmark", '\xD809')+ ,("ceilingleft", '\x2308')+ ,("ceilingright", '\x2309')+ ,("circlecopyrt", '\x20DD')+ ,("circledivide", '\x2298')+ ,("circledot", '\x2299')+ ,("circleminus", '\x2296')+ ,("coproduct", '\x2A3F')+ ,("ct", '\x0063')+ ,("cwm", '\x200C')+ ,("dblbracketleft", '\x27E6')+ ,("dblbracketright", '\x27E7')+ ,("diamond", '\x2662')+ ,("diamondmath", '\x22C4')+ ,("dotlessj", '\x0237')+ ,("emptyset", '\x2205')+ ,("emptyslot", '\xD801')+ ,("epsilon1", '\x03F5')+ ,("epsiloninv", '\x03F6')+ ,("equivasymptotic", '\x224D')+ ,("flat", '\x266D')+ ,("floorleft", '\x230A')+ ,("floorright", '\x230B')+ ,("follows", '\x227B')+ ,("followsequal", '\x2AB0')+ ,("followsorcurly", '\x227D')+ ,("greatermuch", '\x226B')+ ,("heart", '\x2661')+ ,("interrobang", '\x203D')+ ,("interrobangdown", '\x2E18')+ ,("intersectionsq", '\x2293')+ ,("latticetop", '\x22A4')+ ,("lessmuch", '\x226A')+ ,("longdbls", '\x017F')+ ,("longsh", '\x017F')+ ,("longsi", '\x017F')+ ,("longsl", '\x017F')+ ,("longst", '\xFB05')+ ,("lscript", '\x2113')+ ,("natural", '\x266E')+ ,("negationslash", '\x0338')+ ,("ng", '\x014B')+ ,("owner", '\x220B')+ ,("pertenthousand", '\x2031')+ ,("phi", '\x03D5')+ ,("phi1", '\x03C6')+ ,("pi1", '\x03D6')+ ,("precedesequal", '\x2AAF')+ ,("precedesorcurly", '\x227C')+ ,("prime", '\x2032')+ ,("rho1", '\x03F1')+ ,("ringfitted", '\xD80D')+ ,("sharp", '\x266F')+ ,("similarequal", '\x2243')+ ,("slurabove", '\x2322')+ ,("slurbelow", '\x2323')+ ,("st", '\xFB06')+ ,("star", '\x22C6')+ ,("subsetsqequal", '\x2291')+ ,("supersetsqequal", '\x2292')+ ,("triangle", '\x25B3')+ ,("triangleinv", '\x25BD')+ ,("triangleleft", '\x25C1')+ ,("triangleright", '\x25B7')+ ,("turnstileleft", '\x22A2')+ ,("turnstileright", '\x22A3')+ ,("twelveudash", '\xD80C')+ ,("unionmulti", '\x228E')+ ,("unionsq", '\x2294')+ ,("vector", '\x20D7')+ ,("visualspace", '\x2423')+ ,("wreathproduct", '\x2240')+ ,("Dbar", '\x0110')+ ,("compwordmark", '\x200C')+ ,("dbar", '\x0111')+ ,("rangedash", '\x2013')+ ,("hyphenchar", '\x002D')+ ,("punctdash", '\x2014')+ ,("visiblespace", '\x2423')+ ,("Yen", '\x00A5')+ ,("anticlockwise", '\x27F2')+ ,("arrowparrleftright", '\x21C6')+ ,("arrowparrrightleft", '\x21C4')+ ,("arrowtailleft", '\x21A2')+ ,("arrowtailright", '\x21A3')+ ,("arrowtripleleft", '\x21DA')+ ,("arrowtripleright", '\x21DB')+ ,("between", '\x226C')+ ,("check", '\x2713')+ ,("circleR", '\x00AE')+ ,("circleS", '\x24C8')+ ,("circleasterisk", '\x229B')+ ,("circleequal", '\x229C')+ ,("circlering", '\x229A')+ ,("clockwise", '\x27F3')+ ,("complement", '\x2201')+ ,("curlyleft", '\x21AB')+ ,("curlyright", '\x21AC')+ ,("dblarrowdwn", '\x21CA')+ ,("dblarrowheadleft", '\x219E')+ ,("dblarrowheadright", '\x21A0')+ ,("dblarrowup", '\x21C8')+ ,("defines", '\x225C')+ ,("diamondsolid", '\x2666')+ ,("difference", '\x224F')+ ,("dotplus", '\x2214')+ ,("downfall", '\x22CE')+ ,("equaldotleftright", '\x2252')+ ,("equaldotrightleft", '\x2253')+ ,("equalorfollows", '\x22DF')+ ,("equalorgreater", '\x2A96')+ ,("equalorless", '\x2A95')+ ,("equalorprecedes", '\x22DE')+ ,("equalsdots", '\x2251')+ ,("followsorequal", '\x227F')+ ,("forces", '\x22A9')+ ,("forcesbar", '\x22AA')+ ,("fork", '\x22D4')+ ,("frown", '\x2322')+ ,("geomequivalent", '\x224E')+ ,("greaterdbleqlless", '\x2A8C')+ ,("greaterdblequal", '\x2267')+ ,("greaterlessequal", '\x22DB')+ ,("greaterorapproxeql", '\x2A86')+ ,("greaterorequalslant", '\x2A7E')+ ,("greaterorsimilar", '\x2273')+ ,("harpoondownleft", '\x21C3')+ ,("harpoondownright", '\x21C2')+ ,("harpoonleftright", '\x21CC')+ ,("harpoonrightleft", '\x21CB')+ ,("harpoonupleft", '\x21BF')+ ,("harpoonupright", '\x21BE')+ ,("intercal", '\x22BA')+ ,("intersectiondbl", '\x22D2')+ ,("lessdbleqlgreater", '\x2A8B')+ ,("lessdblequal", '\x2266')+ ,("lessequalgreater", '\x22DA')+ ,("lessorapproxeql", '\x2A85')+ ,("lessorequalslant", '\x2A7D')+ ,("lessorsimilar", '\x2272')+ ,("maltesecross", '\x2720')+ ,("measuredangle", '\x2221')+ ,("multimap", '\x22B8')+ ,("multiopenleft", '\x22CB')+ ,("multiopenright", '\x22CC')+ ,("nand", '\x22BC')+ ,("orunderscore", '\x22BB')+ ,("perpcorrespond", '\x2A5E')+ ,("precedesorequal", '\x227E')+ ,("primereverse", '\x2035')+ ,("revasymptequal", '\x22CD')+ ,("revsimilar", '\x223D')+ ,("rightanglene", '\x231D')+ ,("rightanglenw", '\x231C')+ ,("rightanglese", '\x231F')+ ,("rightanglesw", '\x231E')+ ,("ringinequal", '\x2256')+ ,("satisfies", '\x22A8')+ ,("shiftleft", '\x21B0')+ ,("shiftright", '\x21B1')+ ,("smile", '\x2323')+ ,("sphericalangle", '\x2222')+ ,("square", '\x25A1')+ ,("squaredot", '\x22A1')+ ,("squareimage", '\x228F')+ ,("squareminus", '\x229F')+ ,("squaremultiply", '\x22A0')+ ,("squareoriginal", '\x2290')+ ,("squareplus", '\x229E')+ ,("squaresolid", '\x25A0')+ ,("squiggleleftright", '\x21AD')+ ,("squiggleright", '\x21DD')+ ,("subsetdbl", '\x22D0')+ ,("subsetdblequal", '\x2AC5')+ ,("supersetdbl", '\x22D1')+ ,("supersetdblequal", '\x2AC6')+ ,("triangledownsld", '\x25BC')+ ,("triangleleftequal", '\x22B4')+ ,("triangleleftsld", '\x25C0')+ ,("trianglerightequal", '\x22B5')+ ,("trianglerightsld", '\x25B6')+ ,("trianglesolid", '\x25B2')+ ,("uniondbl", '\x22D3')+ ,("uprise", '\x22CF')+ ,("Digamma", '\x1D7CB')+ ,("Finv", '\x2132')+ ,("Gmir", '\x2141')+ ,("Omegainv", '\x2127')+ ,("approxorequal", '\x224A')+ ,("archleftdown", '\x21B6')+ ,("archrightdown", '\x21B7')+ ,("beth", '\x2136')+ ,("daleth", '\x2138')+ ,("dividemultiply", '\x22C7')+ ,("downslope", '\x29F9')+ ,("equalorsimilar", '\x2242')+ ,("follownotdbleqv", '\x2ABA')+ ,("follownotslnteql", '\x2AB6')+ ,("followornoteqvlnt", '\x22E9')+ ,("greaterdot", '\x22D7')+ ,("greaternotdblequal", '\x2A8A')+ ,("greaternotequal", '\x2A88')+ ,("greaterornotdbleql", '\x2269')+ ,("greaterornotequal", '\x2269')+ ,("integerdivide", '\x2216')+ ,("lessdot", '\x22D6')+ ,("lessnotdblequal", '\x2A89')+ ,("lessnotequal", '\x2A87')+ ,("lessornotdbleql", '\x2268')+ ,("lessornotequal", '\x2268')+ ,("multicloseleft", '\x22C9')+ ,("multicloseright", '\x22CA')+ ,("notapproxequal", '\x2247')+ ,("notarrowboth", '\x21AE')+ ,("notarrowleft", '\x219A')+ ,("notarrowright", '\x219B')+ ,("notbar", '\x2224')+ ,("notdblarrowboth", '\x21CE')+ ,("notdblarrowleft", '\x21CD')+ ,("notdblarrowright", '\x21CF')+ ,("notexistential", '\x2204')+ ,("notfollows", '\x2281')+ ,("notfollowsoreql", '\x2AB0')+ ,("notforces", '\x22AE')+ ,("notforcesextra", '\x22AF')+ ,("notgreaterdblequal", '\x2267')+ ,("notgreaterequal", '\x2271')+ ,("notgreaterorslnteql", '\x2A7E')+ ,("notlessdblequal", '\x2266')+ ,("notlessequal", '\x2270')+ ,("notlessorslnteql", '\x2A7D')+ ,("notprecedesoreql", '\x2AAF')+ ,("notsatisfies", '\x22AD')+ ,("notsimilar", '\x2241')+ ,("notsubseteql", '\x2288')+ ,("notsubsetordbleql", '\x2AC5')+ ,("notsubsetoreql", '\x228A')+ ,("notsuperseteql", '\x2289')+ ,("notsupersetordbleql", '\x2AC6')+ ,("notsupersetoreql", '\x228B')+ ,("nottriangeqlleft", '\x22EC')+ ,("nottriangeqlright", '\x22ED')+ ,("nottriangleleft", '\x22EA')+ ,("nottriangleright", '\x22EB')+ ,("notturnstile", '\x22AC')+ ,("planckover2pi", '\x210F')+ ,("planckover2pi1", '\x210F')+ ,("precedenotdbleqv", '\x2AB9')+ ,("precedenotslnteql", '\x2AB5')+ ,("precedeornoteqvlnt", '\x22E8')+ ,("subsetnoteql", '\x228A')+ ,("subsetornotdbleql", '\x2ACB')+ ,("supersetnoteql", '\x228B')+ ,("supersetornotdbleql", '\x2ACC')+ ,("upslope", '\x29F8')+ ]
+ lib/Pdf/Content/Transform.hs view
@@ -0,0 +1,56 @@++-- | 2d affine transform++module Pdf.Content.Transform+(+ Transform(..),+ Vector(..),+ identity,+ translation,+ scale,+ transform,+ translate,+ multiply+)+where++-- | Affine transform+data Transform a = Transform a a a a a a+ deriving Show++-- | 2d vector/point+data Vector a = Vector a a+ deriving Show++-- | Identity transform+identity :: Num a => Transform a+identity = Transform 1 0 0 1 0 0++-- | Translation+translation :: Num a => a -> a -> Transform a+translation tx ty = Transform 1 0 0 1 tx ty++-- | Scale+scale :: Num a => a -> a -> Transform a+scale sx sy = Transform sx 0 0 sy 0 0++-- | Apply transformation to vector+transform :: Num a => Transform a -> Vector a -> Vector a+transform (Transform a b c d e f) (Vector x y) =+ Vector (a * x + c * y + e) (b * x + d * y + f)++-- | Translate+translate :: Num a => a -> a -> Transform a -> Transform a+translate tx ty t = translation tx ty `multiply` t++-- | Combine two transformations+multiply :: Num a => Transform a -> Transform a -> Transform a+multiply (Transform a1 b1 c1 d1 e1 f1) (Transform a2 b2 c2 d2 e2 f2) =+ Transform a b c d e f+ where+ a = a1 * a2 + b1 * c2+ b = a1 * b2 + b1 * d2+ c = c1 * a2 + d1 * c2+ d = c1 * b2 + d1 * d2+ e = e1 * a2 + f1 * c2 + e2+ f = e1 * b2 + f1 * d2 + f2
+ lib/Pdf/Content/UnicodeCMap.hs view
@@ -0,0 +1,204 @@+{-# LANGUAGE OverloadedStrings #-}++-- | Unicode CMap defines mapping from glyphs to text++module Pdf.Content.UnicodeCMap+(+ UnicodeCMap(..),+ parseUnicodeCMap,+ unicodeCMapNextGlyph,+ unicodeCMapDecodeGlyph+)+where++import Data.Char+import qualified Data.List as List+import Data.Map (Map)+import qualified Data.Map as Map+import Data.ByteString (ByteString)+import qualified Data.ByteString as ByteString+import qualified Data.ByteString.Base16 as Base16+import Data.Text (Text)+import qualified Data.Text as Text+import qualified Data.Text.Encoding as Text+import Data.Attoparsec.ByteString.Char8 (Parser, parseOnly)+import qualified Data.Attoparsec.ByteString.Char8 as P+import Control.Monad+import qualified Control.Monad.Fail as Fail++-- | Unicode character map+--+-- Font dictionary can contain \"ToUnicode\" key -- reference+-- to a stream with unicode CMap+data UnicodeCMap = UnicodeCMap {+ unicodeCMapCodeRanges :: [(ByteString, ByteString)],+ unicodeCMapChars :: Map Int Text,+ unicodeCMapRanges :: [(Int, Int, Char)]+ }+ deriving (Show)++-- | Parse content of unicode CMap+parseUnicodeCMap :: ByteString -> Either String UnicodeCMap+parseUnicodeCMap cmap =+ case (codeRanges, chars, ranges) of+ (Right cr, Right cs, Right (rs, crs)) -> Right $ UnicodeCMap {+ unicodeCMapCodeRanges = cr,+ unicodeCMapChars = cs <> crs,+ unicodeCMapRanges = rs+ }+ (Left err, _, _) -> Left $ "CMap code ranges: " ++ err+ (_, Left err, _) -> Left $ "CMap chars: " ++ err+ (_, _, Left err) -> Left $ "CMap ranges: " ++ err+ where+ codeRanges = parseOnly codeRangesParser cmap+ chars = parseOnly charsParser cmap+ ranges = parseOnly rangesParser cmap++-- | Take the next glyph code from string, also returns the rest of the string+unicodeCMapNextGlyph :: UnicodeCMap -> ByteString -> Maybe (Int, ByteString)+unicodeCMapNextGlyph cmap = go 1+ where+ go 5 _ = Nothing+ go n str =+ let glyph = ByteString.take n str in+ if ByteString.length glyph /= n+ then Nothing+ else if any (inRange glyph) (unicodeCMapCodeRanges cmap)+ then Just (toCode glyph, ByteString.drop n str)+ else go (n + 1) str+ inRange glyph (start, end)+ = ByteString.length glyph == ByteString.length start+ && glyph >= start && glyph <= end++toCode :: ByteString -> Int+toCode bs = fst $ ByteString.foldr (\b (sm, i) ->+ (sm + fromIntegral b * i, i * 256)) (0, 1) bs++-- | Convert glyph to text+--+-- Note: one glyph can represent more then one char, e.g. for ligatures+unicodeCMapDecodeGlyph :: UnicodeCMap -> Int -> Maybe Text+unicodeCMapDecodeGlyph cmap glyph =+ case Map.lookup glyph (unicodeCMapChars cmap) of+ Just txt -> Just txt+ Nothing ->+ case filter inRange (unicodeCMapRanges cmap) of+ [(start, _, char)] -> Just (Text.singleton $ toEnum+ $ (fromEnum char) + (glyph - start))+ _ -> Nothing+ where+ inRange (start, end, _) = glyph >= start && glyph <= end++charsParser :: Parser (Map Int Text)+charsParser =+ combineChars <$> P.many' charsParser'+ where+ combineChars = List.foldl' Map.union Map.empty++charsParser' :: Parser (Map Int Text)+charsParser' = do+ n <- skipTillParser $ do+ n <- P.decimal+ P.skipSpace+ _ <- P.string "beginbfchar"+ return n++ chars <- replicateM n $ do+ P.skipSpace+ i <- parseHex+ P.skipSpace+ j <- parseHex+ return (toCode i, Text.decodeUtf16BE j)++ return $ Map.fromList chars++-- | It returns regular ranges and char map+--+-- Array ranges are converted to char map+rangesParser :: Parser ([(Int, Int, Char)], Map Int Text)+rangesParser =+ combineRanges <$> P.many' rangesParser'+ where+ combineRanges = List.foldl' combineRange ([], Map.empty)+ combineRange (ranges, rmap) (ranges', rmap') =+ (ranges ++ ranges', Map.union rmap rmap')++rangesParser' :: Parser ([(Int, Int, Char)], Map Int Text)+rangesParser' = do+ n <- skipTillParser $ do+ n <- P.decimal+ P.skipSpace+ void $ P.string "beginbfrange"+ return (n :: Int)++ let go 0 rs cs = return (rs, cs)+ go count rs cs = do+ P.skipSpace+ i <- toCode <$> parseHex+ P.skipSpace+ j <- toCode <$> parseHex+ P.skipSpace+ k <- P.eitherP parseHex parseHexArray+ case k of+ Left h -> do+ c <- case Text.uncons $ Text.decodeUtf16BE h of+ Nothing -> fail "Can't decode range"+ Just (v, _) -> return v+ go (pred count) ((i, j, c) : rs) cs+ Right hs -> do+ let cs' = zip [i..j] . map Text.decodeUtf16BE $ hs+ go (pred count) rs (cs <> Map.fromList cs')++ go n mempty mempty++codeRangesParser :: Parser [(ByteString, ByteString)]+codeRangesParser = do+ n <- skipTillParser $ do+ n <- P.decimal+ P.skipSpace+ void $ P.string "begincodespacerange"+ return n++ replicateM n $ do+ P.skipSpace+ i <- parseHex+ P.skipSpace+ j <- parseHex+ return (i, j)++parseHex :: Parser ByteString+parseHex = do+ void $ P.char '<'+ -- hex can contain spaces, lets filter them out+ res <- P.takeTill (== '>') >>= fromHex . ByteString.filter (/= 32)+ void $ P.char '>'+ return res++parseHexArray :: Parser [ByteString]+parseHexArray = do+ void $ P.char '['+ res <- P.many' $ do+ P.skipSpace+ parseHex+ P.skipSpace+ void $ P.char ']'+ return res++-- XXX: wtf?!+fromHex :: Fail.MonadFail m => ByteString -> m ByteString+fromHex hex = do+ case Base16.decode (bsToLower hex) of+ Left err -> fail err+ Right str -> return str+ where+ bsToLower = ByteString.map $ fromIntegral+ . fromEnum+ . toLower+ . toEnum+ . fromIntegral++skipTillParser :: Parser a -> Parser a+skipTillParser p = P.choice [+ p,+ P.anyChar >> skipTillParser p+ ]
− lib/Pdf/Toolbox/Content.hs
@@ -1,20 +0,0 @@---- | Low level tools for processing PDF page content stream.--module Pdf.Toolbox.Content-(- module Pdf.Toolbox.Content.Ops,- module Pdf.Toolbox.Content.Parser,- module Pdf.Toolbox.Content.UnicodeCMap,- module Pdf.Toolbox.Content.Processor,- module Pdf.Toolbox.Content.Transform,- module Pdf.Toolbox.Content.FontInfo-)-where--import Pdf.Toolbox.Content.Ops-import Pdf.Toolbox.Content.Parser-import Pdf.Toolbox.Content.UnicodeCMap-import Pdf.Toolbox.Content.Processor-import Pdf.Toolbox.Content.Transform-import Pdf.Toolbox.Content.FontInfo
− lib/Pdf/Toolbox/Content/Encoding/MacRoman.hs
@@ -1,437 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module Pdf.Toolbox.Content.Encoding.MacRoman-(- encoding-)-where--import Data.Word-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Text (Text)--encoding :: Map Word8 Text-encoding = Map.fromList $ zip codes chars--chars :: [Text]-chars = [- "A",- "Æ",- "Á",- "Â",- "Ä",- "À",- "Å",- "Ã",- "B",- "C",- "Ç",- "D",- "E",- "É",- "Ê",- "Ë",- "È",- "F",- "G",- "H",- "I",- "Í",- "Î",- "Ï",- "Ì",- "J",- "K",- "L",- "M",- "N",- "Ñ",- "O",- "Œ",- "Ó",- "Ô",- "Ö",- "Ò",- "Ø",- "Õ",- "P",- "Q",- "R",- "S",- "T",- "U",- "Ú",- "Û",- "Ü",- "Ù",- "V",- "W",- "X",- "Y",- "Ÿ",- "Z",- "a",- "á",- "â",- "´",- "ä",- "æ",- "à",- "&",- "å",- "^",- "~",- "*",- "@",- "ã",- "b",- "\\",- "|",- "{",- "}",- "[",- "]",- "˘",- "•",- "c",- "ˇ",- "ç",- " ̧",- "¢",- "ˆ",- ":",- ",",- "©",- "¤",- "d",- "†",- "‡",- "°",- "¨",- "÷",- "$",- "˙",- "ı",- "e",- "é",- "ê",- "ë",- "è",- "8",- "…",- "—",- "–",- "=",- "!",- "¡",- "f",- "fi",- "5",- "fl",- "ƒ",- "4",- "⁄",- "g",- "ß",- "`",- ">",- "«",- "»",- "‹",- "›",- "h",- "˝",- "-",- "i",- "í",- "î",- "ï",- "ì",- "j",- "k",- "l",- "<",- "¬",- "m",- " ̄",- "μ",- "n",- "9",- "ñ",- "#",- "o",- "ó",- "ô",- "ö",- "œ",- "˛",- "ò",- "1",- "ª",- "º",- "ø",- "õ",- "p",- "¶",- "(",- ")",- "%",- ".",- "·",- "‰",- "+",- "±",- "q",- "?",- "¿",- "\"",- "„",- "“",- "”",- "‘",- "’",- "‚",- "'",- "r",- "®",- "∘",- "s",- "§",- ";",- "7",- "6",- "/",- " ",- "£",- "t",- "3",- "~",- "™",- "2",- "u",- "ú",- "û",- "ü",- "ù",- "_",- "v",- "w",- "x",- "y",- "ÿ",- "¥",- "z",- "0"- ]--codes :: [Word8]-codes = [- 0o101,- 0o256,- 0o347,- 0o345,- 0o200,- 0o313,- 0o201,- 0o314,- 0o102,- 0o103,- 0o202,- 0o104,- 0o105,- 0o203,- 0o346,- 0o350,- 0o351,- 0o106,- 0o107,- 0o110,- 0o111,- 0o352,- 0o353,- 0o354,- 0o355,- 0o112,- 0o113,- 0o114,- 0o115,- 0o116,- 0o204,- 0o117,- 0o316,- 0o356,- 0o357,- 0o205,- 0o361,- 0o257,- 0o315,- 0o120,- 0o121,- 0o122,- 0o123,- 0o124,- 0o125,- 0o362,- 0o363,- 0o206,- 0o364,- 0o126,- 0o127,- 0o130,- 0o131,- 0o331,- 0o132,- 0o141,- 0o207,- 0o211,- 0o253,- 0o212,- 0o276,- 0o210,- 0o046,- 0o214,- 0o136,- 0o176,- 0o052,- 0o100,- 0o213,- 0o142,- 0o134,- 0o174,- 0o173,- 0o175,- 0o133,- 0o135,- 0o371,- 0o245,- 0o143,- 0o377,- 0o215,- 0o374,- 0o242,- 0o366,- 0o072,- 0o054,- 0o251,- 0o333,- 0o144,- 0o240,- 0o340,- 0o241,- 0o254,- 0o326,- 0o044,- 0o372,- 0o365,- 0o145,- 0o216,- 0o220,- 0o221,- 0o217,- 0o070,- 0o311,- 0o321,- 0o320,- 0o075,- 0o041,- 0o301,- 0o146,- 0o336,- 0o065,- 0o337,- 0o304,- 0o064,- 0o332,- 0o147,- 0o247,- 0o140,- 0o076,- 0o307,- 0o310,- 0o334,- 0o335,- 0o150,- 0o375,- 0o055,- 0o151,- 0o222,- 0o224,- 0o225,- 0o223,- 0o152,- 0o153,- 0o154,- 0o074,- 0o302,- 0o155,- 0o370,- 0o265,- 0o156,- 0o071,- 0o226,- 0o043,- 0o157,- 0o227,- 0o231,- 0o232,- 0o317,- 0o376,- 0o230,- 0o061,- 0o273,- 0o274,- 0o277,- 0o233,- 0o160,- 0o246,- 0o050,- 0o051,- 0o045,- 0o056,- 0o341,- 0o344,- 0o053,- 0o261,- 0o161,- 0o077,- 0o300,- 0o042,- 0o343,- 0o322,- 0o323,- 0o324,- 0o325,- 0o342,- 0o047,- 0o162,- 0o250,- 0o373,- 0o163,- 0o244,- 0o073,- 0o067,- 0o066,- 0o057,- 0o040,- 0o243,- 0o164,- 0o063,- 0o367,- 0o252,- 0o062,- 0o165,- 0o234,- 0o236,- 0o237,- 0o235,- 0o137,- 0o166,- 0o167,- 0o170,- 0o171,- 0o330,- 0o264,- 0o172,- 0o060- ]
− lib/Pdf/Toolbox/Content/Encoding/WinAnsi.hs
@@ -1,455 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module Pdf.Toolbox.Content.Encoding.WinAnsi-(- encoding-)-where--import Data.Word-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Text (Text)--encoding :: Map Word8 Text-encoding = Map.fromList $ zip codes chars--chars :: [Text]-chars = [- "A",- "Æ",- "Á",- "Â",- "Ä",- "À",- "Å",- "Ã",- "B",- "C",- "Ç",- "D",- "E",- "É",- "Ê",- "Ë",- "È",- "Ð",- "€",- "F",- "G",- "H",- "I",- "Í",- "Î",- "Ï",- "Ì",- "J",- "K",- "L",- "M",- "N",- "Ñ",- "O",- "Œ",- "Ó",- "Ô",- "Ö",- "Ò",- "Ø",- "Õ",- "P",- "Q",- "R",- "S",- "Š",- "T",- "Þ",- "U",- "Ú",- "Û",- "Ü",- "Ù",- "V",- "W",- "X",- "Y",- "Ý",- "Ÿ",- "Z",- "Ž",- "a",- "á",- "â",- "´",- "ä",- "æ",- "à",- "&",- "å",- "^",- "~",- "*",- "@",- "ã",- "b",- "\\",- "|",- "{",- "}",- "[",- "]",- "¦",- "•",- "c",- "ç",- " ̧",- "¢",- "ˆ",- ":",- ",",- "©",- "¤",- "d",- "†",- "‡",- "°",- "¨",- "÷",- "$",- "e",- "é",- "ê",- "ë",- "è",- "8",- "…",- "—",- "–",- "=",- "ð",- "!",- "¡",- "f",- "5",- "ƒ",- "4",- "g",- "ß",- "`",- ">",- "«",- "»",- "‹",- "›",- "h",- "-",- "i",- "í",- "î",- "ï",- "ì",- "j",- "k",- "l",- "<",- "¬",- "m",- " ̄",- "μ",- "×",- "n",- "9",- "ñ",- "#",- "o",- "ó",- "ô",- "ö",- "œ",- "ò",- "1",- "½",- "¼",- "¹",- "ª",- "º",- "ø",- "õ",- "p",- "¶",- "(",- ")",- "%",- ".",- "·",- "‰",- "+",- "±",- "q",- "?",- "¿",- "\"",- "„",- "“",- "”",- "‘",- "’",- "‚",- "'",- "r",- "®",- "s",- "š",- "§",- ";",- "7",- "6",- "/",- " ",- "£",- "t",- "þ",- "3",- "¾",- "³",- "~",- "™",- "2",- "²",- "u",- "ú",- "û",- "ü",- "ù",- "_",- "v",- "w",- "x",- "y",- "ý",- "ÿ",- "¥",- "z",- "ž",- "0"- ]--codes :: [Word8]-codes = [- 0o101,- 0o306,- 0o301,- 0o302,- 0o304,- 0o300,- 0o305,- 0o303,- 0o102,- 0o103,- 0o307,- 0o104,- 0o105,- 0o311,- 0o312,- 0o313,- 0o310,- 0o320,- 0o200,- 0o106,- 0o107,- 0o110,- 0o111,- 0o315,- 0o316,- 0o317,- 0o314,- 0o112,- 0o113,- 0o114,- 0o115,- 0o116,- 0o321,- 0o117,- 0o214,- 0o323,- 0o324,- 0o326,- 0o322,- 0o330,- 0o325,- 0o120,- 0o121,- 0o122,- 0o123,- 0o212,- 0o124,- 0o336,- 0o125,- 0o332,- 0o333,- 0o334,- 0o331,- 0o126,- 0o127,- 0o130,- 0o131,- 0o335,- 0o237,- 0o132,- 0o216,- 0o141,- 0o341,- 0o342,- 0o264,- 0o344,- 0o346,- 0o340,- 0o046,- 0o345,- 0o136,- 0o176,- 0o052,- 0o100,- 0o343,- 0o142,- 0o134,- 0o174,- 0o173,- 0o175,- 0o133,- 0o135,- 0o246,- 0o225,- 0o143,- 0o347,- 0o270,- 0o242,- 0o210,- 0o072,- 0o054,- 0o251,- 0o244,- 0o144,- 0o206,- 0o207,- 0o260,- 0o250,- 0o367,- 0o044,- 0o145,- 0o351,- 0o352,- 0o353,- 0o350,- 0o070,- 0o205,- 0o227,- 0o226,- 0o075,- 0o360,- 0o041,- 0o241,- 0o146,- 0o065,- 0o203,- 0o064,- 0o147,- 0o337,- 0o140,- 0o076,- 0o253,- 0o273,- 0o213,- 0o233,- 0o150,- 0o055,- 0o151,- 0o355,- 0o356,- 0o357,- 0o354,- 0o152,- 0o153,- 0o154,- 0o074,- 0o254,- 0o155,- 0o257,- 0o265,- 0o327,- 0o156,- 0o071,- 0o361,- 0o043,- 0o157,- 0o363,- 0o364,- 0o366,- 0o234,- 0o362,- 0o061,- 0o275,- 0o274,- 0o271,- 0o252,- 0o272,- 0o370,- 0o365,- 0o160,- 0o266,- 0o050,- 0o051,- 0o045,- 0o056,- 0o267,- 0o211,- 0o053,- 0o261,- 0o161,- 0o077,- 0o277,- 0o042,- 0o204,- 0o223,- 0o224,- 0o221,- 0o222,- 0o202,- 0o047,- 0o162,- 0o256,- 0o163,- 0o232,- 0o247,- 0o073,- 0o067,- 0o066,- 0o057,- 0o040,- 0o243,- 0o164,- 0o376,- 0o063,- 0o276,- 0o263,- 0o230,- 0o231,- 0o062,- 0o262,- 0o165,- 0o372,- 0o373,- 0o374,- 0o371,- 0o137,- 0o166,- 0o167,- 0o170,- 0o171,- 0o375,- 0o377,- 0o245,- 0o172,- 0o236,- 0o060- ]
− lib/Pdf/Toolbox/Content/FontInfo.hs
@@ -1,223 +0,0 @@---- | Font info contains information, extracted from font,--- that may be needed when processing content stream--module Pdf.Toolbox.Content.FontInfo-(- FontInfo(..),- FISimple(..),- FontBaseEncoding(..),- SimpleFontEncoding(..),- FIComposite(..),- CIDFontWidths(..),- makeCIDFontWidths,- cidFontGetWidth,- fontInfoDecodeGlyphs-)-where--import Data.List-import Data.Word-import Data.Map (Map)-import qualified Data.Map as Map-import Data.ByteString (ByteString)-import qualified Data.ByteString as BS-import Data.Text (Text)-import qualified Data.Text as Text-import qualified Data.Text.Encoding as Text-import Control.Monad--import Pdf.Toolbox.Core--import Pdf.Toolbox.Content.UnicodeCMap-import Pdf.Toolbox.Content.Transform-import Pdf.Toolbox.Content.Processor (Glyph(..))-import Pdf.Toolbox.Content.GlyphList-import Pdf.Toolbox.Content.TexGlyphList-import qualified Pdf.Toolbox.Content.Encoding.WinAnsi as WinAnsi-import qualified Pdf.Toolbox.Content.Encoding.MacRoman as MacRoman---- | Font info-data FontInfo- = FontInfoSimple FISimple- | FontInfoComposite FIComposite- deriving (Show)---- | Font info for simple fonts-data FISimple = FISimple {- fiSimpleUnicodeCMap :: Maybe UnicodeCMap,- fiSimpleEncoding :: Maybe SimpleFontEncoding,- fiSimpleWidths :: Maybe (Int, Int, [Double]), -- ^ FirstChar, LastChar, list of widths- fiSimpleFontMatrix :: Transform Double- }- deriving (Show)---- | Standard encoding, other encodings are based on them-data FontBaseEncoding- = FontBaseEncodingWinAnsi- | FontBaseEncodingMacRoman- deriving (Show)---- | Encoding fo simple font-data SimpleFontEncoding = SimpleFontEncoding {- simpleFontBaseEncoding :: FontBaseEncoding,- -- | Mapping from glyph code to glyph name for cases when it is different- -- from base encoding- simpleFontDifferences :: [(Word8, ByteString)]- }- deriving (Show)---- | Font info for Type0 font-data FIComposite = FIComposite {- fiCompositeUnicodeCMap :: Maybe UnicodeCMap,- fiCompositeWidths :: CIDFontWidths,- fiCompositeDefaultWidth :: Double- }- deriving (Show)---- | Glyph widths for CID fonts-data CIDFontWidths = CIDFontWidths {- cidFontWidthsChars :: Map Int Double,- cidFontWidthsRanges :: [(Int, Int, Double)]- }- deriving (Show)--instance Monoid CIDFontWidths where- mempty = CIDFontWidths {- cidFontWidthsChars = mempty,- cidFontWidthsRanges = mempty- }- w1 `mappend` w2 = CIDFontWidths {- cidFontWidthsChars = cidFontWidthsChars w1 `mappend` cidFontWidthsChars w2,- cidFontWidthsRanges = cidFontWidthsRanges w1 `mappend` cidFontWidthsRanges w2- }--simpleFontEncodingDecode :: SimpleFontEncoding -> Word8 -> Maybe Text-simpleFontEncodingDecode enc code =- case lookup code (simpleFontDifferences enc) of- Nothing ->- case simpleFontBaseEncoding enc of- FontBaseEncodingWinAnsi -> Map.lookup code WinAnsi.encoding- FontBaseEncodingMacRoman -> Map.lookup code MacRoman.encoding- Just glyphName ->- case Map.lookup glyphName adobeGlyphList of- Just c -> Just $ Text.pack [c]- Nothing ->- case Map.lookup glyphName texGlyphList of- Nothing-> Nothing- Just c -> Just $ Text.pack [c]---- | Make `CIDFontWidths` from value of \"W\" key in descendant font-makeCIDFontWidths :: Monad m => Array -> PdfE m CIDFontWidths-makeCIDFontWidths (Array vals) = go mempty vals- where- go res [] = return res- go res (ONumber x1 : ONumber x2 : ONumber x3 : xs) = do- n1 <- intValue x1- n2 <- intValue x2- n3 <- realValue x3- go res {cidFontWidthsRanges = (n1, n2, n3) : cidFontWidthsRanges res} xs- go res (ONumber x: OArray (Array arr): xs) = do- n <- intValue x- ws <- forM arr $ \w -> fromObject w >>= realValue- go res {cidFontWidthsChars = Map.fromList (zip [n ..] ws) `mappend` cidFontWidthsChars res} xs- go _ _ = throwE $ UnexpectedError "Can't parse CIDFont width"---- | Get glyph width by glyph code-cidFontGetWidth :: CIDFontWidths -> Int -> Maybe Double-cidFontGetWidth w code =- case Map.lookup code (cidFontWidthsChars w) of- Just width -> Just width- Nothing -> case find (\(start, end, _) -> code >= start && code <= end) (cidFontWidthsRanges w) of- Just (_, _, width) -> Just width- _ -> Nothing---- | Decode string into list of glyphs and their widths-fontInfoDecodeGlyphs :: FontInfo -> Str -> [(Glyph, Double)]-fontInfoDecodeGlyphs (FontInfoSimple fi) = \(Str bs) ->- flip map (BS.unpack bs) $ \c ->- let code = fromIntegral c- txt =- case fiSimpleUnicodeCMap fi of- Nothing ->- case fiSimpleEncoding fi of- Nothing ->- case Text.decodeUtf8' (BS.pack [c]) of- Right t -> Just t- _ -> Nothing- Just enc ->- case simpleFontEncodingDecode enc c of- Just t -> Just t- Nothing ->- case Text.decodeUtf8' (BS.pack [c]) of- Right t -> Just t- _ -> Nothing- Just toUnicode ->- case unicodeCMapDecodeGlyph toUnicode code of- Just t -> Just t- Nothing ->- case fiSimpleEncoding fi of- Nothing -> Nothing- Just enc ->- case simpleFontEncodingDecode enc c of- Just t -> Just t- Nothing ->- case Text.decodeUtf8' (BS.pack [c]) of- Right t -> Just t- _ -> Nothing- width =- case fiSimpleWidths fi of- Nothing -> 0- Just (firstChar, lastChar, widths) ->- if code >= firstChar && code <= lastChar && (code - firstChar) < length widths- then let Vector w _ = transform (fiSimpleFontMatrix fi) $ Vector (widths !! (code - firstChar)) 0- in w- else 0- in (Glyph {- glyphCode = code,- glyphTopLeft = Vector 0 0,- glyphBottomRight = Vector width 1,- glyphText = txt- }, width)-fontInfoDecodeGlyphs (FontInfoComposite fi) = \str ->- case fiCompositeUnicodeCMap fi of- Nothing -> -- XXX: use encoding here- let Str bs = str- in tryDecode2byte $ BS.unpack bs- Just toUnicode ->- let getWidth = fromMaybe (fiCompositeDefaultWidth fi) . cidFontGetWidth (fiCompositeWidths fi)- in cmapDecodeString getWidth toUnicode str- where- -- Most of the time composite fonts have 2-byte encoding,- -- so lets try that for now.- tryDecode2byte (b1:b2:rest) =- let code = fromIntegral b1 * 255 + fromIntegral b2- width = (/ 1000) $ fromMaybe (fiCompositeDefaultWidth fi) $ cidFontGetWidth (fiCompositeWidths fi) code- txt =- case Text.decodeUtf8' (BS.pack [b1, b2]) of- Right t -> Just t- _ -> Nothing- g = Glyph {- glyphCode = code,- glyphTopLeft = Vector 0 0,- glyphBottomRight = Vector width 1,- glyphText = txt- }- in (g, width) : tryDecode2byte rest- tryDecode2byte _ = []--cmapDecodeString :: (Int -> Double) -> UnicodeCMap -> Str -> [(Glyph, Double)]-cmapDecodeString getWidth cmap (Str str) = go str- where- go s =- case unicodeCMapNextGlyph cmap s of- Nothing -> []- Just (g, rest) ->- let width = getWidth g / 1000- glyph = Glyph {- glyphCode = g,- glyphTopLeft = Vector 0 0,- glyphBottomRight = Vector width 1,- glyphText = unicodeCMapDecodeGlyph cmap g- }- in (glyph, width) : go rest
− lib/Pdf/Toolbox/Content/GlyphList.hs
@@ -1,4299 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- | Mapping from glyph names to unicode characters--module Pdf.Toolbox.Content.GlyphList-(- adobeGlyphList-)-where--import Data.ByteString (ByteString)-import Data.Map (Map)-import qualified Data.Map as Map---- | Glyph list-adobeGlyphList :: Map ByteString Char-adobeGlyphList = Map.fromList- [("A", '\x0041')- ,("AE", '\x00C6')- ,("AEacute", '\x01FC')- ,("AEmacron", '\x01E2')- ,("AEsmall", '\xF7E6')- ,("Aacute", '\x00C1')- ,("Aacutesmall", '\xF7E1')- ,("Abreve", '\x0102')- ,("Abreveacute", '\x1EAE')- ,("Abrevecyrillic", '\x04D0')- ,("Abrevedotbelow", '\x1EB6')- ,("Abrevegrave", '\x1EB0')- ,("Abrevehookabove", '\x1EB2')- ,("Abrevetilde", '\x1EB4')- ,("Acaron", '\x01CD')- ,("Acircle", '\x24B6')- ,("Acircumflex", '\x00C2')- ,("Acircumflexacute", '\x1EA4')- ,("Acircumflexdotbelow", '\x1EAC')- ,("Acircumflexgrave", '\x1EA6')- ,("Acircumflexhookabove", '\x1EA8')- ,("Acircumflexsmall", '\xF7E2')- ,("Acircumflextilde", '\x1EAA')- ,("Acute", '\xF6C9')- ,("Acutesmall", '\xF7B4')- ,("Acyrillic", '\x0410')- ,("Adblgrave", '\x0200')- ,("Adieresis", '\x00C4')- ,("Adieresiscyrillic", '\x04D2')- ,("Adieresismacron", '\x01DE')- ,("Adieresissmall", '\xF7E4')- ,("Adotbelow", '\x1EA0')- ,("Adotmacron", '\x01E0')- ,("Agrave", '\x00C0')- ,("Agravesmall", '\xF7E0')- ,("Ahookabove", '\x1EA2')- ,("Aiecyrillic", '\x04D4')- ,("Ainvertedbreve", '\x0202')- ,("Alpha", '\x0391')- ,("Alphatonos", '\x0386')- ,("Amacron", '\x0100')- ,("Amonospace", '\xFF21')- ,("Aogonek", '\x0104')- ,("Aring", '\x00C5')- ,("Aringacute", '\x01FA')- ,("Aringbelow", '\x1E00')- ,("Aringsmall", '\xF7E5')- ,("Asmall", '\xF761')- ,("Atilde", '\x00C3')- ,("Atildesmall", '\xF7E3')- ,("Aybarmenian", '\x0531')- ,("B", '\x0042')- ,("Bcircle", '\x24B7')- ,("Bdotaccent", '\x1E02')- ,("Bdotbelow", '\x1E04')- ,("Becyrillic", '\x0411')- ,("Benarmenian", '\x0532')- ,("Beta", '\x0392')- ,("Bhook", '\x0181')- ,("Blinebelow", '\x1E06')- ,("Bmonospace", '\xFF22')- ,("Brevesmall", '\xF6F4')- ,("Bsmall", '\xF762')- ,("Btopbar", '\x0182')- ,("C", '\x0043')- ,("Caarmenian", '\x053E')- ,("Cacute", '\x0106')- ,("Caron", '\xF6CA')- ,("Caronsmall", '\xF6F5')- ,("Ccaron", '\x010C')- ,("Ccedilla", '\x00C7')- ,("Ccedillaacute", '\x1E08')- ,("Ccedillasmall", '\xF7E7')- ,("Ccircle", '\x24B8')- ,("Ccircumflex", '\x0108')- ,("Cdot", '\x010A')- ,("Cdotaccent", '\x010A')- ,("Cedillasmall", '\xF7B8')- ,("Chaarmenian", '\x0549')- ,("Cheabkhasiancyrillic", '\x04BC')- ,("Checyrillic", '\x0427')- ,("Chedescenderabkhasiancyrillic", '\x04BE')- ,("Chedescendercyrillic", '\x04B6')- ,("Chedieresiscyrillic", '\x04F4')- ,("Cheharmenian", '\x0543')- ,("Chekhakassiancyrillic", '\x04CB')- ,("Cheverticalstrokecyrillic", '\x04B8')- ,("Chi", '\x03A7')- ,("Chook", '\x0187')- ,("Circumflexsmall", '\xF6F6')- ,("Cmonospace", '\xFF23')- ,("Coarmenian", '\x0551')- ,("Csmall", '\xF763')- ,("D", '\x0044')- ,("DZ", '\x01F1')- ,("DZcaron", '\x01C4')- ,("Daarmenian", '\x0534')- ,("Dafrican", '\x0189')- ,("Dcaron", '\x010E')- ,("Dcedilla", '\x1E10')- ,("Dcircle", '\x24B9')- ,("Dcircumflexbelow", '\x1E12')- ,("Dcroat", '\x0110')- ,("Ddotaccent", '\x1E0A')- ,("Ddotbelow", '\x1E0C')- ,("Decyrillic", '\x0414')- ,("Deicoptic", '\x03EE')- ,("Delta", '\x2206')- ,("Deltagreek", '\x0394')- ,("Dhook", '\x018A')- ,("Dieresis", '\xF6CB')- ,("DieresisAcute", '\xF6CC')- ,("DieresisGrave", '\xF6CD')- ,("Dieresissmall", '\xF7A8')- ,("Digammagreek", '\x03DC')- ,("Djecyrillic", '\x0402')- ,("Dlinebelow", '\x1E0E')- ,("Dmonospace", '\xFF24')- ,("Dotaccentsmall", '\xF6F7')- ,("Dslash", '\x0110')- ,("Dsmall", '\xF764')- ,("Dtopbar", '\x018B')- ,("Dz", '\x01F2')- ,("Dzcaron", '\x01C5')- ,("Dzeabkhasiancyrillic", '\x04E0')- ,("Dzecyrillic", '\x0405')- ,("Dzhecyrillic", '\x040F')- ,("E", '\x0045')- ,("Eacute", '\x00C9')- ,("Eacutesmall", '\xF7E9')- ,("Ebreve", '\x0114')- ,("Ecaron", '\x011A')- ,("Ecedillabreve", '\x1E1C')- ,("Echarmenian", '\x0535')- ,("Ecircle", '\x24BA')- ,("Ecircumflex", '\x00CA')- ,("Ecircumflexacute", '\x1EBE')- ,("Ecircumflexbelow", '\x1E18')- ,("Ecircumflexdotbelow", '\x1EC6')- ,("Ecircumflexgrave", '\x1EC0')- ,("Ecircumflexhookabove", '\x1EC2')- ,("Ecircumflexsmall", '\xF7EA')- ,("Ecircumflextilde", '\x1EC4')- ,("Ecyrillic", '\x0404')- ,("Edblgrave", '\x0204')- ,("Edieresis", '\x00CB')- ,("Edieresissmall", '\xF7EB')- ,("Edot", '\x0116')- ,("Edotaccent", '\x0116')- ,("Edotbelow", '\x1EB8')- ,("Efcyrillic", '\x0424')- ,("Egrave", '\x00C8')- ,("Egravesmall", '\xF7E8')- ,("Eharmenian", '\x0537')- ,("Ehookabove", '\x1EBA')- ,("Eightroman", '\x2167')- ,("Einvertedbreve", '\x0206')- ,("Eiotifiedcyrillic", '\x0464')- ,("Elcyrillic", '\x041B')- ,("Elevenroman", '\x216A')- ,("Emacron", '\x0112')- ,("Emacronacute", '\x1E16')- ,("Emacrongrave", '\x1E14')- ,("Emcyrillic", '\x041C')- ,("Emonospace", '\xFF25')- ,("Encyrillic", '\x041D')- ,("Endescendercyrillic", '\x04A2')- ,("Eng", '\x014A')- ,("Enghecyrillic", '\x04A4')- ,("Enhookcyrillic", '\x04C7')- ,("Eogonek", '\x0118')- ,("Eopen", '\x0190')- ,("Epsilon", '\x0395')- ,("Epsilontonos", '\x0388')- ,("Ercyrillic", '\x0420')- ,("Ereversed", '\x018E')- ,("Ereversedcyrillic", '\x042D')- ,("Escyrillic", '\x0421')- ,("Esdescendercyrillic", '\x04AA')- ,("Esh", '\x01A9')- ,("Esmall", '\xF765')- ,("Eta", '\x0397')- ,("Etarmenian", '\x0538')- ,("Etatonos", '\x0389')- ,("Eth", '\x00D0')- ,("Ethsmall", '\xF7F0')- ,("Etilde", '\x1EBC')- ,("Etildebelow", '\x1E1A')- ,("Euro", '\x20AC')- ,("Ezh", '\x01B7')- ,("Ezhcaron", '\x01EE')- ,("Ezhreversed", '\x01B8')- ,("F", '\x0046')- ,("Fcircle", '\x24BB')- ,("Fdotaccent", '\x1E1E')- ,("Feharmenian", '\x0556')- ,("Feicoptic", '\x03E4')- ,("Fhook", '\x0191')- ,("Fitacyrillic", '\x0472')- ,("Fiveroman", '\x2164')- ,("Fmonospace", '\xFF26')- ,("Fourroman", '\x2163')- ,("Fsmall", '\xF766')- ,("G", '\x0047')- ,("GBsquare", '\x3387')- ,("Gacute", '\x01F4')- ,("Gamma", '\x0393')- ,("Gammaafrican", '\x0194')- ,("Gangiacoptic", '\x03EA')- ,("Gbreve", '\x011E')- ,("Gcaron", '\x01E6')- ,("Gcedilla", '\x0122')- ,("Gcircle", '\x24BC')- ,("Gcircumflex", '\x011C')- ,("Gcommaaccent", '\x0122')- ,("Gdot", '\x0120')- ,("Gdotaccent", '\x0120')- ,("Gecyrillic", '\x0413')- ,("Ghadarmenian", '\x0542')- ,("Ghemiddlehookcyrillic", '\x0494')- ,("Ghestrokecyrillic", '\x0492')- ,("Gheupturncyrillic", '\x0490')- ,("Ghook", '\x0193')- ,("Gimarmenian", '\x0533')- ,("Gjecyrillic", '\x0403')- ,("Gmacron", '\x1E20')- ,("Gmonospace", '\xFF27')- ,("Grave", '\xF6CE')- ,("Gravesmall", '\xF760')- ,("Gsmall", '\xF767')- ,("Gsmallhook", '\x029B')- ,("Gstroke", '\x01E4')- ,("H", '\x0048')- ,("H18533", '\x25CF')- ,("H18543", '\x25AA')- ,("H18551", '\x25AB')- ,("H22073", '\x25A1')- ,("HPsquare", '\x33CB')- ,("Haabkhasiancyrillic", '\x04A8')- ,("Hadescendercyrillic", '\x04B2')- ,("Hardsigncyrillic", '\x042A')- ,("Hbar", '\x0126')- ,("Hbrevebelow", '\x1E2A')- ,("Hcedilla", '\x1E28')- ,("Hcircle", '\x24BD')- ,("Hcircumflex", '\x0124')- ,("Hdieresis", '\x1E26')- ,("Hdotaccent", '\x1E22')- ,("Hdotbelow", '\x1E24')- ,("Hmonospace", '\xFF28')- ,("Hoarmenian", '\x0540')- ,("Horicoptic", '\x03E8')- ,("Hsmall", '\xF768')- ,("Hungarumlaut", '\xF6CF')- ,("Hungarumlautsmall", '\xF6F8')- ,("Hzsquare", '\x3390')- ,("I", '\x0049')- ,("IAcyrillic", '\x042F')- ,("IJ", '\x0132')- ,("IUcyrillic", '\x042E')- ,("Iacute", '\x00CD')- ,("Iacutesmall", '\xF7ED')- ,("Ibreve", '\x012C')- ,("Icaron", '\x01CF')- ,("Icircle", '\x24BE')- ,("Icircumflex", '\x00CE')- ,("Icircumflexsmall", '\xF7EE')- ,("Icyrillic", '\x0406')- ,("Idblgrave", '\x0208')- ,("Idieresis", '\x00CF')- ,("Idieresisacute", '\x1E2E')- ,("Idieresiscyrillic", '\x04E4')- ,("Idieresissmall", '\xF7EF')- ,("Idot", '\x0130')- ,("Idotaccent", '\x0130')- ,("Idotbelow", '\x1ECA')- ,("Iebrevecyrillic", '\x04D6')- ,("Iecyrillic", '\x0415')- ,("Ifraktur", '\x2111')- ,("Igrave", '\x00CC')- ,("Igravesmall", '\xF7EC')- ,("Ihookabove", '\x1EC8')- ,("Iicyrillic", '\x0418')- ,("Iinvertedbreve", '\x020A')- ,("Iishortcyrillic", '\x0419')- ,("Imacron", '\x012A')- ,("Imacroncyrillic", '\x04E2')- ,("Imonospace", '\xFF29')- ,("Iniarmenian", '\x053B')- ,("Iocyrillic", '\x0401')- ,("Iogonek", '\x012E')- ,("Iota", '\x0399')- ,("Iotaafrican", '\x0196')- ,("Iotadieresis", '\x03AA')- ,("Iotatonos", '\x038A')- ,("Ismall", '\xF769')- ,("Istroke", '\x0197')- ,("Itilde", '\x0128')- ,("Itildebelow", '\x1E2C')- ,("Izhitsacyrillic", '\x0474')- ,("Izhitsadblgravecyrillic", '\x0476')- ,("J", '\x004A')- ,("Jaarmenian", '\x0541')- ,("Jcircle", '\x24BF')- ,("Jcircumflex", '\x0134')- ,("Jecyrillic", '\x0408')- ,("Jheharmenian", '\x054B')- ,("Jmonospace", '\xFF2A')- ,("Jsmall", '\xF76A')- ,("K", '\x004B')- ,("KBsquare", '\x3385')- ,("KKsquare", '\x33CD')- ,("Kabashkircyrillic", '\x04A0')- ,("Kacute", '\x1E30')- ,("Kacyrillic", '\x041A')- ,("Kadescendercyrillic", '\x049A')- ,("Kahookcyrillic", '\x04C3')- ,("Kappa", '\x039A')- ,("Kastrokecyrillic", '\x049E')- ,("Kaverticalstrokecyrillic", '\x049C')- ,("Kcaron", '\x01E8')- ,("Kcedilla", '\x0136')- ,("Kcircle", '\x24C0')- ,("Kcommaaccent", '\x0136')- ,("Kdotbelow", '\x1E32')- ,("Keharmenian", '\x0554')- ,("Kenarmenian", '\x053F')- ,("Khacyrillic", '\x0425')- ,("Kheicoptic", '\x03E6')- ,("Khook", '\x0198')- ,("Kjecyrillic", '\x040C')- ,("Klinebelow", '\x1E34')- ,("Kmonospace", '\xFF2B')- ,("Koppacyrillic", '\x0480')- ,("Koppagreek", '\x03DE')- ,("Ksicyrillic", '\x046E')- ,("Ksmall", '\xF76B')- ,("L", '\x004C')- ,("LJ", '\x01C7')- ,("LL", '\xF6BF')- ,("Lacute", '\x0139')- ,("Lambda", '\x039B')- ,("Lcaron", '\x013D')- ,("Lcedilla", '\x013B')- ,("Lcircle", '\x24C1')- ,("Lcircumflexbelow", '\x1E3C')- ,("Lcommaaccent", '\x013B')- ,("Ldot", '\x013F')- ,("Ldotaccent", '\x013F')- ,("Ldotbelow", '\x1E36')- ,("Ldotbelowmacron", '\x1E38')- ,("Liwnarmenian", '\x053C')- ,("Lj", '\x01C8')- ,("Ljecyrillic", '\x0409')- ,("Llinebelow", '\x1E3A')- ,("Lmonospace", '\xFF2C')- ,("Lslash", '\x0141')- ,("Lslashsmall", '\xF6F9')- ,("Lsmall", '\xF76C')- ,("M", '\x004D')- ,("MBsquare", '\x3386')- ,("Macron", '\xF6D0')- ,("Macronsmall", '\xF7AF')- ,("Macute", '\x1E3E')- ,("Mcircle", '\x24C2')- ,("Mdotaccent", '\x1E40')- ,("Mdotbelow", '\x1E42')- ,("Menarmenian", '\x0544')- ,("Mmonospace", '\xFF2D')- ,("Msmall", '\xF76D')- ,("Mturned", '\x019C')- ,("Mu", '\x039C')- ,("N", '\x004E')- ,("NJ", '\x01CA')- ,("Nacute", '\x0143')- ,("Ncaron", '\x0147')- ,("Ncedilla", '\x0145')- ,("Ncircle", '\x24C3')- ,("Ncircumflexbelow", '\x1E4A')- ,("Ncommaaccent", '\x0145')- ,("Ndotaccent", '\x1E44')- ,("Ndotbelow", '\x1E46')- ,("Nhookleft", '\x019D')- ,("Nineroman", '\x2168')- ,("Nj", '\x01CB')- ,("Njecyrillic", '\x040A')- ,("Nlinebelow", '\x1E48')- ,("Nmonospace", '\xFF2E')- ,("Nowarmenian", '\x0546')- ,("Nsmall", '\xF76E')- ,("Ntilde", '\x00D1')- ,("Ntildesmall", '\xF7F1')- ,("Nu", '\x039D')- ,("O", '\x004F')- ,("OE", '\x0152')- ,("OEsmall", '\xF6FA')- ,("Oacute", '\x00D3')- ,("Oacutesmall", '\xF7F3')- ,("Obarredcyrillic", '\x04E8')- ,("Obarreddieresiscyrillic", '\x04EA')- ,("Obreve", '\x014E')- ,("Ocaron", '\x01D1')- ,("Ocenteredtilde", '\x019F')- ,("Ocircle", '\x24C4')- ,("Ocircumflex", '\x00D4')- ,("Ocircumflexacute", '\x1ED0')- ,("Ocircumflexdotbelow", '\x1ED8')- ,("Ocircumflexgrave", '\x1ED2')- ,("Ocircumflexhookabove", '\x1ED4')- ,("Ocircumflexsmall", '\xF7F4')- ,("Ocircumflextilde", '\x1ED6')- ,("Ocyrillic", '\x041E')- ,("Odblacute", '\x0150')- ,("Odblgrave", '\x020C')- ,("Odieresis", '\x00D6')- ,("Odieresiscyrillic", '\x04E6')- ,("Odieresissmall", '\xF7F6')- ,("Odotbelow", '\x1ECC')- ,("Ogoneksmall", '\xF6FB')- ,("Ograve", '\x00D2')- ,("Ogravesmall", '\xF7F2')- ,("Oharmenian", '\x0555')- ,("Ohm", '\x2126')- ,("Ohookabove", '\x1ECE')- ,("Ohorn", '\x01A0')- ,("Ohornacute", '\x1EDA')- ,("Ohorndotbelow", '\x1EE2')- ,("Ohorngrave", '\x1EDC')- ,("Ohornhookabove", '\x1EDE')- ,("Ohorntilde", '\x1EE0')- ,("Ohungarumlaut", '\x0150')- ,("Oi", '\x01A2')- ,("Oinvertedbreve", '\x020E')- ,("Omacron", '\x014C')- ,("Omacronacute", '\x1E52')- ,("Omacrongrave", '\x1E50')- ,("Omega", '\x2126')- ,("Omegacyrillic", '\x0460')- ,("Omegagreek", '\x03A9')- ,("Omegaroundcyrillic", '\x047A')- ,("Omegatitlocyrillic", '\x047C')- ,("Omegatonos", '\x038F')- ,("Omicron", '\x039F')- ,("Omicrontonos", '\x038C')- ,("Omonospace", '\xFF2F')- ,("Oneroman", '\x2160')- ,("Oogonek", '\x01EA')- ,("Oogonekmacron", '\x01EC')- ,("Oopen", '\x0186')- ,("Oslash", '\x00D8')- ,("Oslashacute", '\x01FE')- ,("Oslashsmall", '\xF7F8')- ,("Osmall", '\xF76F')- ,("Ostrokeacute", '\x01FE')- ,("Otcyrillic", '\x047E')- ,("Otilde", '\x00D5')- ,("Otildeacute", '\x1E4C')- ,("Otildedieresis", '\x1E4E')- ,("Otildesmall", '\xF7F5')- ,("P", '\x0050')- ,("Pacute", '\x1E54')- ,("Pcircle", '\x24C5')- ,("Pdotaccent", '\x1E56')- ,("Pecyrillic", '\x041F')- ,("Peharmenian", '\x054A')- ,("Pemiddlehookcyrillic", '\x04A6')- ,("Phi", '\x03A6')- ,("Phook", '\x01A4')- ,("Pi", '\x03A0')- ,("Piwrarmenian", '\x0553')- ,("Pmonospace", '\xFF30')- ,("Psi", '\x03A8')- ,("Psicyrillic", '\x0470')- ,("Psmall", '\xF770')- ,("Q", '\x0051')- ,("Qcircle", '\x24C6')- ,("Qmonospace", '\xFF31')- ,("Qsmall", '\xF771')- ,("R", '\x0052')- ,("Raarmenian", '\x054C')- ,("Racute", '\x0154')- ,("Rcaron", '\x0158')- ,("Rcedilla", '\x0156')- ,("Rcircle", '\x24C7')- ,("Rcommaaccent", '\x0156')- ,("Rdblgrave", '\x0210')- ,("Rdotaccent", '\x1E58')- ,("Rdotbelow", '\x1E5A')- ,("Rdotbelowmacron", '\x1E5C')- ,("Reharmenian", '\x0550')- ,("Rfraktur", '\x211C')- ,("Rho", '\x03A1')- ,("Ringsmall", '\xF6FC')- ,("Rinvertedbreve", '\x0212')- ,("Rlinebelow", '\x1E5E')- ,("Rmonospace", '\xFF32')- ,("Rsmall", '\xF772')- ,("Rsmallinverted", '\x0281')- ,("Rsmallinvertedsuperior", '\x02B6')- ,("S", '\x0053')- ,("SF010000", '\x250C')- ,("SF020000", '\x2514')- ,("SF030000", '\x2510')- ,("SF040000", '\x2518')- ,("SF050000", '\x253C')- ,("SF060000", '\x252C')- ,("SF070000", '\x2534')- ,("SF080000", '\x251C')- ,("SF090000", '\x2524')- ,("SF100000", '\x2500')- ,("SF110000", '\x2502')- ,("SF190000", '\x2561')- ,("SF200000", '\x2562')- ,("SF210000", '\x2556')- ,("SF220000", '\x2555')- ,("SF230000", '\x2563')- ,("SF240000", '\x2551')- ,("SF250000", '\x2557')- ,("SF260000", '\x255D')- ,("SF270000", '\x255C')- ,("SF280000", '\x255B')- ,("SF360000", '\x255E')- ,("SF370000", '\x255F')- ,("SF380000", '\x255A')- ,("SF390000", '\x2554')- ,("SF400000", '\x2569')- ,("SF410000", '\x2566')- ,("SF420000", '\x2560')- ,("SF430000", '\x2550')- ,("SF440000", '\x256C')- ,("SF450000", '\x2567')- ,("SF460000", '\x2568')- ,("SF470000", '\x2564')- ,("SF480000", '\x2565')- ,("SF490000", '\x2559')- ,("SF500000", '\x2558')- ,("SF510000", '\x2552')- ,("SF520000", '\x2553')- ,("SF530000", '\x256B')- ,("SF540000", '\x256A')- ,("Sacute", '\x015A')- ,("Sacutedotaccent", '\x1E64')- ,("Sampigreek", '\x03E0')- ,("Scaron", '\x0160')- ,("Scarondotaccent", '\x1E66')- ,("Scaronsmall", '\xF6FD')- ,("Scedilla", '\x015E')- ,("Schwa", '\x018F')- ,("Schwacyrillic", '\x04D8')- ,("Schwadieresiscyrillic", '\x04DA')- ,("Scircle", '\x24C8')- ,("Scircumflex", '\x015C')- ,("Scommaaccent", '\x0218')- ,("Sdotaccent", '\x1E60')- ,("Sdotbelow", '\x1E62')- ,("Sdotbelowdotaccent", '\x1E68')- ,("Seharmenian", '\x054D')- ,("Sevenroman", '\x2166')- ,("Shaarmenian", '\x0547')- ,("Shacyrillic", '\x0428')- ,("Shchacyrillic", '\x0429')- ,("Sheicoptic", '\x03E2')- ,("Shhacyrillic", '\x04BA')- ,("Shimacoptic", '\x03EC')- ,("Sigma", '\x03A3')- ,("Sixroman", '\x2165')- ,("Smonospace", '\xFF33')- ,("Softsigncyrillic", '\x042C')- ,("Ssmall", '\xF773')- ,("Stigmagreek", '\x03DA')- ,("T", '\x0054')- ,("Tau", '\x03A4')- ,("Tbar", '\x0166')- ,("Tcaron", '\x0164')- ,("Tcedilla", '\x0162')- ,("Tcircle", '\x24C9')- ,("Tcircumflexbelow", '\x1E70')- ,("Tcommaaccent", '\x0162')- ,("Tdotaccent", '\x1E6A')- ,("Tdotbelow", '\x1E6C')- ,("Tecyrillic", '\x0422')- ,("Tedescendercyrillic", '\x04AC')- ,("Tenroman", '\x2169')- ,("Tetsecyrillic", '\x04B4')- ,("Theta", '\x0398')- ,("Thook", '\x01AC')- ,("Thorn", '\x00DE')- ,("Thornsmall", '\xF7FE')- ,("Threeroman", '\x2162')- ,("Tildesmall", '\xF6FE')- ,("Tiwnarmenian", '\x054F')- ,("Tlinebelow", '\x1E6E')- ,("Tmonospace", '\xFF34')- ,("Toarmenian", '\x0539')- ,("Tonefive", '\x01BC')- ,("Tonesix", '\x0184')- ,("Tonetwo", '\x01A7')- ,("Tretroflexhook", '\x01AE')- ,("Tsecyrillic", '\x0426')- ,("Tshecyrillic", '\x040B')- ,("Tsmall", '\xF774')- ,("Twelveroman", '\x216B')- ,("Tworoman", '\x2161')- ,("U", '\x0055')- ,("Uacute", '\x00DA')- ,("Uacutesmall", '\xF7FA')- ,("Ubreve", '\x016C')- ,("Ucaron", '\x01D3')- ,("Ucircle", '\x24CA')- ,("Ucircumflex", '\x00DB')- ,("Ucircumflexbelow", '\x1E76')- ,("Ucircumflexsmall", '\xF7FB')- ,("Ucyrillic", '\x0423')- ,("Udblacute", '\x0170')- ,("Udblgrave", '\x0214')- ,("Udieresis", '\x00DC')- ,("Udieresisacute", '\x01D7')- ,("Udieresisbelow", '\x1E72')- ,("Udieresiscaron", '\x01D9')- ,("Udieresiscyrillic", '\x04F0')- ,("Udieresisgrave", '\x01DB')- ,("Udieresismacron", '\x01D5')- ,("Udieresissmall", '\xF7FC')- ,("Udotbelow", '\x1EE4')- ,("Ugrave", '\x00D9')- ,("Ugravesmall", '\xF7F9')- ,("Uhookabove", '\x1EE6')- ,("Uhorn", '\x01AF')- ,("Uhornacute", '\x1EE8')- ,("Uhorndotbelow", '\x1EF0')- ,("Uhorngrave", '\x1EEA')- ,("Uhornhookabove", '\x1EEC')- ,("Uhorntilde", '\x1EEE')- ,("Uhungarumlaut", '\x0170')- ,("Uhungarumlautcyrillic", '\x04F2')- ,("Uinvertedbreve", '\x0216')- ,("Ukcyrillic", '\x0478')- ,("Umacron", '\x016A')- ,("Umacroncyrillic", '\x04EE')- ,("Umacrondieresis", '\x1E7A')- ,("Umonospace", '\xFF35')- ,("Uogonek", '\x0172')- ,("Upsilon", '\x03A5')- ,("Upsilon1", '\x03D2')- ,("Upsilonacutehooksymbolgreek", '\x03D3')- ,("Upsilonafrican", '\x01B1')- ,("Upsilondieresis", '\x03AB')- ,("Upsilondieresishooksymbolgreek", '\x03D4')- ,("Upsilonhooksymbol", '\x03D2')- ,("Upsilontonos", '\x038E')- ,("Uring", '\x016E')- ,("Ushortcyrillic", '\x040E')- ,("Usmall", '\xF775')- ,("Ustraightcyrillic", '\x04AE')- ,("Ustraightstrokecyrillic", '\x04B0')- ,("Utilde", '\x0168')- ,("Utildeacute", '\x1E78')- ,("Utildebelow", '\x1E74')- ,("V", '\x0056')- ,("Vcircle", '\x24CB')- ,("Vdotbelow", '\x1E7E')- ,("Vecyrillic", '\x0412')- ,("Vewarmenian", '\x054E')- ,("Vhook", '\x01B2')- ,("Vmonospace", '\xFF36')- ,("Voarmenian", '\x0548')- ,("Vsmall", '\xF776')- ,("Vtilde", '\x1E7C')- ,("W", '\x0057')- ,("Wacute", '\x1E82')- ,("Wcircle", '\x24CC')- ,("Wcircumflex", '\x0174')- ,("Wdieresis", '\x1E84')- ,("Wdotaccent", '\x1E86')- ,("Wdotbelow", '\x1E88')- ,("Wgrave", '\x1E80')- ,("Wmonospace", '\xFF37')- ,("Wsmall", '\xF777')- ,("X", '\x0058')- ,("Xcircle", '\x24CD')- ,("Xdieresis", '\x1E8C')- ,("Xdotaccent", '\x1E8A')- ,("Xeharmenian", '\x053D')- ,("Xi", '\x039E')- ,("Xmonospace", '\xFF38')- ,("Xsmall", '\xF778')- ,("Y", '\x0059')- ,("Yacute", '\x00DD')- ,("Yacutesmall", '\xF7FD')- ,("Yatcyrillic", '\x0462')- ,("Ycircle", '\x24CE')- ,("Ycircumflex", '\x0176')- ,("Ydieresis", '\x0178')- ,("Ydieresissmall", '\xF7FF')- ,("Ydotaccent", '\x1E8E')- ,("Ydotbelow", '\x1EF4')- ,("Yericyrillic", '\x042B')- ,("Yerudieresiscyrillic", '\x04F8')- ,("Ygrave", '\x1EF2')- ,("Yhook", '\x01B3')- ,("Yhookabove", '\x1EF6')- ,("Yiarmenian", '\x0545')- ,("Yicyrillic", '\x0407')- ,("Yiwnarmenian", '\x0552')- ,("Ymonospace", '\xFF39')- ,("Ysmall", '\xF779')- ,("Ytilde", '\x1EF8')- ,("Yusbigcyrillic", '\x046A')- ,("Yusbigiotifiedcyrillic", '\x046C')- ,("Yuslittlecyrillic", '\x0466')- ,("Yuslittleiotifiedcyrillic", '\x0468')- ,("Z", '\x005A')- ,("Zaarmenian", '\x0536')- ,("Zacute", '\x0179')- ,("Zcaron", '\x017D')- ,("Zcaronsmall", '\xF6FF')- ,("Zcircle", '\x24CF')- ,("Zcircumflex", '\x1E90')- ,("Zdot", '\x017B')- ,("Zdotaccent", '\x017B')- ,("Zdotbelow", '\x1E92')- ,("Zecyrillic", '\x0417')- ,("Zedescendercyrillic", '\x0498')- ,("Zedieresiscyrillic", '\x04DE')- ,("Zeta", '\x0396')- ,("Zhearmenian", '\x053A')- ,("Zhebrevecyrillic", '\x04C1')- ,("Zhecyrillic", '\x0416')- ,("Zhedescendercyrillic", '\x0496')- ,("Zhedieresiscyrillic", '\x04DC')- ,("Zlinebelow", '\x1E94')- ,("Zmonospace", '\xFF3A')- ,("Zsmall", '\xF77A')- ,("Zstroke", '\x01B5')- ,("a", '\x0061')- ,("aabengali", '\x0986')- ,("aacute", '\x00E1')- ,("aadeva", '\x0906')- ,("aagujarati", '\x0A86')- ,("aagurmukhi", '\x0A06')- ,("aamatragurmukhi", '\x0A3E')- ,("aarusquare", '\x3303')- ,("aavowelsignbengali", '\x09BE')- ,("aavowelsigndeva", '\x093E')- ,("aavowelsigngujarati", '\x0ABE')- ,("abbreviationmarkarmenian", '\x055F')- ,("abbreviationsigndeva", '\x0970')- ,("abengali", '\x0985')- ,("abopomofo", '\x311A')- ,("abreve", '\x0103')- ,("abreveacute", '\x1EAF')- ,("abrevecyrillic", '\x04D1')- ,("abrevedotbelow", '\x1EB7')- ,("abrevegrave", '\x1EB1')- ,("abrevehookabove", '\x1EB3')- ,("abrevetilde", '\x1EB5')- ,("acaron", '\x01CE')- ,("acircle", '\x24D0')- ,("acircumflex", '\x00E2')- ,("acircumflexacute", '\x1EA5')- ,("acircumflexdotbelow", '\x1EAD')- ,("acircumflexgrave", '\x1EA7')- ,("acircumflexhookabove", '\x1EA9')- ,("acircumflextilde", '\x1EAB')- ,("acute", '\x00B4')- ,("acutebelowcmb", '\x0317')- ,("acutecmb", '\x0301')- ,("acutecomb", '\x0301')- ,("acutedeva", '\x0954')- ,("acutelowmod", '\x02CF')- ,("acutetonecmb", '\x0341')- ,("acyrillic", '\x0430')- ,("adblgrave", '\x0201')- ,("addakgurmukhi", '\x0A71')- ,("adeva", '\x0905')- ,("adieresis", '\x00E4')- ,("adieresiscyrillic", '\x04D3')- ,("adieresismacron", '\x01DF')- ,("adotbelow", '\x1EA1')- ,("adotmacron", '\x01E1')- ,("ae", '\x00E6')- ,("aeacute", '\x01FD')- ,("aekorean", '\x3150')- ,("aemacron", '\x01E3')- ,("afii00208", '\x2015')- ,("afii08941", '\x20A4')- ,("afii10017", '\x0410')- ,("afii10018", '\x0411')- ,("afii10019", '\x0412')- ,("afii10020", '\x0413')- ,("afii10021", '\x0414')- ,("afii10022", '\x0415')- ,("afii10023", '\x0401')- ,("afii10024", '\x0416')- ,("afii10025", '\x0417')- ,("afii10026", '\x0418')- ,("afii10027", '\x0419')- ,("afii10028", '\x041A')- ,("afii10029", '\x041B')- ,("afii10030", '\x041C')- ,("afii10031", '\x041D')- ,("afii10032", '\x041E')- ,("afii10033", '\x041F')- ,("afii10034", '\x0420')- ,("afii10035", '\x0421')- ,("afii10036", '\x0422')- ,("afii10037", '\x0423')- ,("afii10038", '\x0424')- ,("afii10039", '\x0425')- ,("afii10040", '\x0426')- ,("afii10041", '\x0427')- ,("afii10042", '\x0428')- ,("afii10043", '\x0429')- ,("afii10044", '\x042A')- ,("afii10045", '\x042B')- ,("afii10046", '\x042C')- ,("afii10047", '\x042D')- ,("afii10048", '\x042E')- ,("afii10049", '\x042F')- ,("afii10050", '\x0490')- ,("afii10051", '\x0402')- ,("afii10052", '\x0403')- ,("afii10053", '\x0404')- ,("afii10054", '\x0405')- ,("afii10055", '\x0406')- ,("afii10056", '\x0407')- ,("afii10057", '\x0408')- ,("afii10058", '\x0409')- ,("afii10059", '\x040A')- ,("afii10060", '\x040B')- ,("afii10061", '\x040C')- ,("afii10062", '\x040E')- ,("afii10063", '\xF6C4')- ,("afii10064", '\xF6C5')- ,("afii10065", '\x0430')- ,("afii10066", '\x0431')- ,("afii10067", '\x0432')- ,("afii10068", '\x0433')- ,("afii10069", '\x0434')- ,("afii10070", '\x0435')- ,("afii10071", '\x0451')- ,("afii10072", '\x0436')- ,("afii10073", '\x0437')- ,("afii10074", '\x0438')- ,("afii10075", '\x0439')- ,("afii10076", '\x043A')- ,("afii10077", '\x043B')- ,("afii10078", '\x043C')- ,("afii10079", '\x043D')- ,("afii10080", '\x043E')- ,("afii10081", '\x043F')- ,("afii10082", '\x0440')- ,("afii10083", '\x0441')- ,("afii10084", '\x0442')- ,("afii10085", '\x0443')- ,("afii10086", '\x0444')- ,("afii10087", '\x0445')- ,("afii10088", '\x0446')- ,("afii10089", '\x0447')- ,("afii10090", '\x0448')- ,("afii10091", '\x0449')- ,("afii10092", '\x044A')- ,("afii10093", '\x044B')- ,("afii10094", '\x044C')- ,("afii10095", '\x044D')- ,("afii10096", '\x044E')- ,("afii10097", '\x044F')- ,("afii10098", '\x0491')- ,("afii10099", '\x0452')- ,("afii10100", '\x0453')- ,("afii10101", '\x0454')- ,("afii10102", '\x0455')- ,("afii10103", '\x0456')- ,("afii10104", '\x0457')- ,("afii10105", '\x0458')- ,("afii10106", '\x0459')- ,("afii10107", '\x045A')- ,("afii10108", '\x045B')- ,("afii10109", '\x045C')- ,("afii10110", '\x045E')- ,("afii10145", '\x040F')- ,("afii10146", '\x0462')- ,("afii10147", '\x0472')- ,("afii10148", '\x0474')- ,("afii10192", '\xF6C6')- ,("afii10193", '\x045F')- ,("afii10194", '\x0463')- ,("afii10195", '\x0473')- ,("afii10196", '\x0475')- ,("afii10831", '\xF6C7')- ,("afii10832", '\xF6C8')- ,("afii10846", '\x04D9')- ,("afii299", '\x200E')- ,("afii300", '\x200F')- ,("afii301", '\x200D')- ,("afii57381", '\x066A')- ,("afii57388", '\x060C')- ,("afii57392", '\x0660')- ,("afii57393", '\x0661')- ,("afii57394", '\x0662')- ,("afii57395", '\x0663')- ,("afii57396", '\x0664')- ,("afii57397", '\x0665')- ,("afii57398", '\x0666')- ,("afii57399", '\x0667')- ,("afii57400", '\x0668')- ,("afii57401", '\x0669')- ,("afii57403", '\x061B')- ,("afii57407", '\x061F')- ,("afii57409", '\x0621')- ,("afii57410", '\x0622')- ,("afii57411", '\x0623')- ,("afii57412", '\x0624')- ,("afii57413", '\x0625')- ,("afii57414", '\x0626')- ,("afii57415", '\x0627')- ,("afii57416", '\x0628')- ,("afii57417", '\x0629')- ,("afii57418", '\x062A')- ,("afii57419", '\x062B')- ,("afii57420", '\x062C')- ,("afii57421", '\x062D')- ,("afii57422", '\x062E')- ,("afii57423", '\x062F')- ,("afii57424", '\x0630')- ,("afii57425", '\x0631')- ,("afii57426", '\x0632')- ,("afii57427", '\x0633')- ,("afii57428", '\x0634')- ,("afii57429", '\x0635')- ,("afii57430", '\x0636')- ,("afii57431", '\x0637')- ,("afii57432", '\x0638')- ,("afii57433", '\x0639')- ,("afii57434", '\x063A')- ,("afii57440", '\x0640')- ,("afii57441", '\x0641')- ,("afii57442", '\x0642')- ,("afii57443", '\x0643')- ,("afii57444", '\x0644')- ,("afii57445", '\x0645')- ,("afii57446", '\x0646')- ,("afii57448", '\x0648')- ,("afii57449", '\x0649')- ,("afii57450", '\x064A')- ,("afii57451", '\x064B')- ,("afii57452", '\x064C')- ,("afii57453", '\x064D')- ,("afii57454", '\x064E')- ,("afii57455", '\x064F')- ,("afii57456", '\x0650')- ,("afii57457", '\x0651')- ,("afii57458", '\x0652')- ,("afii57470", '\x0647')- ,("afii57505", '\x06A4')- ,("afii57506", '\x067E')- ,("afii57507", '\x0686')- ,("afii57508", '\x0698')- ,("afii57509", '\x06AF')- ,("afii57511", '\x0679')- ,("afii57512", '\x0688')- ,("afii57513", '\x0691')- ,("afii57514", '\x06BA')- ,("afii57519", '\x06D2')- ,("afii57534", '\x06D5')- ,("afii57636", '\x20AA')- ,("afii57645", '\x05BE')- ,("afii57658", '\x05C3')- ,("afii57664", '\x05D0')- ,("afii57665", '\x05D1')- ,("afii57666", '\x05D2')- ,("afii57667", '\x05D3')- ,("afii57668", '\x05D4')- ,("afii57669", '\x05D5')- ,("afii57670", '\x05D6')- ,("afii57671", '\x05D7')- ,("afii57672", '\x05D8')- ,("afii57673", '\x05D9')- ,("afii57674", '\x05DA')- ,("afii57675", '\x05DB')- ,("afii57676", '\x05DC')- ,("afii57677", '\x05DD')- ,("afii57678", '\x05DE')- ,("afii57679", '\x05DF')- ,("afii57680", '\x05E0')- ,("afii57681", '\x05E1')- ,("afii57682", '\x05E2')- ,("afii57683", '\x05E3')- ,("afii57684", '\x05E4')- ,("afii57685", '\x05E5')- ,("afii57686", '\x05E6')- ,("afii57687", '\x05E7')- ,("afii57688", '\x05E8')- ,("afii57689", '\x05E9')- ,("afii57690", '\x05EA')- ,("afii57694", '\xFB2A')- ,("afii57695", '\xFB2B')- ,("afii57700", '\xFB4B')- ,("afii57705", '\xFB1F')- ,("afii57716", '\x05F0')- ,("afii57717", '\x05F1')- ,("afii57718", '\x05F2')- ,("afii57723", '\xFB35')- ,("afii57793", '\x05B4')- ,("afii57794", '\x05B5')- ,("afii57795", '\x05B6')- ,("afii57796", '\x05BB')- ,("afii57797", '\x05B8')- ,("afii57798", '\x05B7')- ,("afii57799", '\x05B0')- ,("afii57800", '\x05B2')- ,("afii57801", '\x05B1')- ,("afii57802", '\x05B3')- ,("afii57803", '\x05C2')- ,("afii57804", '\x05C1')- ,("afii57806", '\x05B9')- ,("afii57807", '\x05BC')- ,("afii57839", '\x05BD')- ,("afii57841", '\x05BF')- ,("afii57842", '\x05C0')- ,("afii57929", '\x02BC')- ,("afii61248", '\x2105')- ,("afii61289", '\x2113')- ,("afii61352", '\x2116')- ,("afii61573", '\x202C')- ,("afii61574", '\x202D')- ,("afii61575", '\x202E')- ,("afii61664", '\x200C')- ,("afii63167", '\x066D')- ,("afii64937", '\x02BD')- ,("agrave", '\x00E0')- ,("agujarati", '\x0A85')- ,("agurmukhi", '\x0A05')- ,("ahiragana", '\x3042')- ,("ahookabove", '\x1EA3')- ,("aibengali", '\x0990')- ,("aibopomofo", '\x311E')- ,("aideva", '\x0910')- ,("aiecyrillic", '\x04D5')- ,("aigujarati", '\x0A90')- ,("aigurmukhi", '\x0A10')- ,("aimatragurmukhi", '\x0A48')- ,("ainarabic", '\x0639')- ,("ainfinalarabic", '\xFECA')- ,("aininitialarabic", '\xFECB')- ,("ainmedialarabic", '\xFECC')- ,("ainvertedbreve", '\x0203')- ,("aivowelsignbengali", '\x09C8')- ,("aivowelsigndeva", '\x0948')- ,("aivowelsigngujarati", '\x0AC8')- ,("akatakana", '\x30A2')- ,("akatakanahalfwidth", '\xFF71')- ,("akorean", '\x314F')- ,("alef", '\x05D0')- ,("alefarabic", '\x0627')- ,("alefdageshhebrew", '\xFB30')- ,("aleffinalarabic", '\xFE8E')- ,("alefhamzaabovearabic", '\x0623')- ,("alefhamzaabovefinalarabic", '\xFE84')- ,("alefhamzabelowarabic", '\x0625')- ,("alefhamzabelowfinalarabic", '\xFE88')- ,("alefhebrew", '\x05D0')- ,("aleflamedhebrew", '\xFB4F')- ,("alefmaddaabovearabic", '\x0622')- ,("alefmaddaabovefinalarabic", '\xFE82')- ,("alefmaksuraarabic", '\x0649')- ,("alefmaksurafinalarabic", '\xFEF0')- ,("alefmaksurainitialarabic", '\xFEF3')- ,("alefmaksuramedialarabic", '\xFEF4')- ,("alefpatahhebrew", '\xFB2E')- ,("alefqamatshebrew", '\xFB2F')- ,("aleph", '\x2135')- ,("allequal", '\x224C')- ,("alpha", '\x03B1')- ,("alphatonos", '\x03AC')- ,("amacron", '\x0101')- ,("amonospace", '\xFF41')- ,("ampersand", '\x0026')- ,("ampersandmonospace", '\xFF06')- ,("ampersandsmall", '\xF726')- ,("amsquare", '\x33C2')- ,("anbopomofo", '\x3122')- ,("angbopomofo", '\x3124')- ,("angkhankhuthai", '\x0E5A')- ,("angle", '\x2220')- ,("anglebracketleft", '\x3008')- ,("anglebracketleftvertical", '\xFE3F')- ,("anglebracketright", '\x3009')- ,("anglebracketrightvertical", '\xFE40')- ,("angleleft", '\x2329')- ,("angleright", '\x232A')- ,("angstrom", '\x212B')- ,("anoteleia", '\x0387')- ,("anudattadeva", '\x0952')- ,("anusvarabengali", '\x0982')- ,("anusvaradeva", '\x0902')- ,("anusvaragujarati", '\x0A82')- ,("aogonek", '\x0105')- ,("apaatosquare", '\x3300')- ,("aparen", '\x249C')- ,("apostrophearmenian", '\x055A')- ,("apostrophemod", '\x02BC')- ,("apple", '\xF8FF')- ,("approaches", '\x2250')- ,("approxequal", '\x2248')- ,("approxequalorimage", '\x2252')- ,("approximatelyequal", '\x2245')- ,("araeaekorean", '\x318E')- ,("araeakorean", '\x318D')- ,("arc", '\x2312')- ,("arighthalfring", '\x1E9A')- ,("aring", '\x00E5')- ,("aringacute", '\x01FB')- ,("aringbelow", '\x1E01')- ,("arrowboth", '\x2194')- ,("arrowdashdown", '\x21E3')- ,("arrowdashleft", '\x21E0')- ,("arrowdashright", '\x21E2')- ,("arrowdashup", '\x21E1')- ,("arrowdblboth", '\x21D4')- ,("arrowdbldown", '\x21D3')- ,("arrowdblleft", '\x21D0')- ,("arrowdblright", '\x21D2')- ,("arrowdblup", '\x21D1')- ,("arrowdown", '\x2193')- ,("arrowdownleft", '\x2199')- ,("arrowdownright", '\x2198')- ,("arrowdownwhite", '\x21E9')- ,("arrowheaddownmod", '\x02C5')- ,("arrowheadleftmod", '\x02C2')- ,("arrowheadrightmod", '\x02C3')- ,("arrowheadupmod", '\x02C4')- ,("arrowhorizex", '\xF8E7')- ,("arrowleft", '\x2190')- ,("arrowleftdbl", '\x21D0')- ,("arrowleftdblstroke", '\x21CD')- ,("arrowleftoverright", '\x21C6')- ,("arrowleftwhite", '\x21E6')- ,("arrowright", '\x2192')- ,("arrowrightdblstroke", '\x21CF')- ,("arrowrightheavy", '\x279E')- ,("arrowrightoverleft", '\x21C4')- ,("arrowrightwhite", '\x21E8')- ,("arrowtableft", '\x21E4')- ,("arrowtabright", '\x21E5')- ,("arrowup", '\x2191')- ,("arrowupdn", '\x2195')- ,("arrowupdnbse", '\x21A8')- ,("arrowupdownbase", '\x21A8')- ,("arrowupleft", '\x2196')- ,("arrowupleftofdown", '\x21C5')- ,("arrowupright", '\x2197')- ,("arrowupwhite", '\x21E7')- ,("arrowvertex", '\xF8E6')- ,("asciicircum", '\x005E')- ,("asciicircummonospace", '\xFF3E')- ,("asciitilde", '\x007E')- ,("asciitildemonospace", '\xFF5E')- ,("ascript", '\x0251')- ,("ascriptturned", '\x0252')- ,("asmallhiragana", '\x3041')- ,("asmallkatakana", '\x30A1')- ,("asmallkatakanahalfwidth", '\xFF67')- ,("asterisk", '\x002A')- ,("asteriskaltonearabic", '\x066D')- ,("asteriskarabic", '\x066D')- ,("asteriskmath", '\x2217')- ,("asteriskmonospace", '\xFF0A')- ,("asterisksmall", '\xFE61')- ,("asterism", '\x2042')- ,("asuperior", '\xF6E9')- ,("asymptoticallyequal", '\x2243')- ,("at", '\x0040')- ,("atilde", '\x00E3')- ,("atmonospace", '\xFF20')- ,("atsmall", '\xFE6B')- ,("aturned", '\x0250')- ,("aubengali", '\x0994')- ,("aubopomofo", '\x3120')- ,("audeva", '\x0914')- ,("augujarati", '\x0A94')- ,("augurmukhi", '\x0A14')- ,("aulengthmarkbengali", '\x09D7')- ,("aumatragurmukhi", '\x0A4C')- ,("auvowelsignbengali", '\x09CC')- ,("auvowelsigndeva", '\x094C')- ,("auvowelsigngujarati", '\x0ACC')- ,("avagrahadeva", '\x093D')- ,("aybarmenian", '\x0561')- ,("ayin", '\x05E2')- ,("ayinaltonehebrew", '\xFB20')- ,("ayinhebrew", '\x05E2')- ,("b", '\x0062')- ,("babengali", '\x09AC')- ,("backslash", '\x005C')- ,("backslashmonospace", '\xFF3C')- ,("badeva", '\x092C')- ,("bagujarati", '\x0AAC')- ,("bagurmukhi", '\x0A2C')- ,("bahiragana", '\x3070')- ,("bahtthai", '\x0E3F')- ,("bakatakana", '\x30D0')- ,("bar", '\x007C')- ,("barmonospace", '\xFF5C')- ,("bbopomofo", '\x3105')- ,("bcircle", '\x24D1')- ,("bdotaccent", '\x1E03')- ,("bdotbelow", '\x1E05')- ,("beamedsixteenthnotes", '\x266C')- ,("because", '\x2235')- ,("becyrillic", '\x0431')- ,("beharabic", '\x0628')- ,("behfinalarabic", '\xFE90')- ,("behinitialarabic", '\xFE91')- ,("behiragana", '\x3079')- ,("behmedialarabic", '\xFE92')- ,("behmeeminitialarabic", '\xFC9F')- ,("behmeemisolatedarabic", '\xFC08')- ,("behnoonfinalarabic", '\xFC6D')- ,("bekatakana", '\x30D9')- ,("benarmenian", '\x0562')- ,("bet", '\x05D1')- ,("beta", '\x03B2')- ,("betasymbolgreek", '\x03D0')- ,("betdagesh", '\xFB31')- ,("betdageshhebrew", '\xFB31')- ,("bethebrew", '\x05D1')- ,("betrafehebrew", '\xFB4C')- ,("bhabengali", '\x09AD')- ,("bhadeva", '\x092D')- ,("bhagujarati", '\x0AAD')- ,("bhagurmukhi", '\x0A2D')- ,("bhook", '\x0253')- ,("bihiragana", '\x3073')- ,("bikatakana", '\x30D3')- ,("bilabialclick", '\x0298')- ,("bindigurmukhi", '\x0A02')- ,("birusquare", '\x3331')- ,("blackcircle", '\x25CF')- ,("blackdiamond", '\x25C6')- ,("blackdownpointingtriangle", '\x25BC')- ,("blackleftpointingpointer", '\x25C4')- ,("blackleftpointingtriangle", '\x25C0')- ,("blacklenticularbracketleft", '\x3010')- ,("blacklenticularbracketleftvertical", '\xFE3B')- ,("blacklenticularbracketright", '\x3011')- ,("blacklenticularbracketrightvertical", '\xFE3C')- ,("blacklowerlefttriangle", '\x25E3')- ,("blacklowerrighttriangle", '\x25E2')- ,("blackrectangle", '\x25AC')- ,("blackrightpointingpointer", '\x25BA')- ,("blackrightpointingtriangle", '\x25B6')- ,("blacksmallsquare", '\x25AA')- ,("blacksmilingface", '\x263B')- ,("blacksquare", '\x25A0')- ,("blackstar", '\x2605')- ,("blackupperlefttriangle", '\x25E4')- ,("blackupperrighttriangle", '\x25E5')- ,("blackuppointingsmalltriangle", '\x25B4')- ,("blackuppointingtriangle", '\x25B2')- ,("blank", '\x2423')- ,("blinebelow", '\x1E07')- ,("block", '\x2588')- ,("bmonospace", '\xFF42')- ,("bobaimaithai", '\x0E1A')- ,("bohiragana", '\x307C')- ,("bokatakana", '\x30DC')- ,("bparen", '\x249D')- ,("bqsquare", '\x33C3')- ,("braceex", '\xF8F4')- ,("braceleft", '\x007B')- ,("braceleftbt", '\xF8F3')- ,("braceleftmid", '\xF8F2')- ,("braceleftmonospace", '\xFF5B')- ,("braceleftsmall", '\xFE5B')- ,("bracelefttp", '\xF8F1')- ,("braceleftvertical", '\xFE37')- ,("braceright", '\x007D')- ,("bracerightbt", '\xF8FE')- ,("bracerightmid", '\xF8FD')- ,("bracerightmonospace", '\xFF5D')- ,("bracerightsmall", '\xFE5C')- ,("bracerighttp", '\xF8FC')- ,("bracerightvertical", '\xFE38')- ,("bracketleft", '\x005B')- ,("bracketleftbt", '\xF8F0')- ,("bracketleftex", '\xF8EF')- ,("bracketleftmonospace", '\xFF3B')- ,("bracketlefttp", '\xF8EE')- ,("bracketright", '\x005D')- ,("bracketrightbt", '\xF8FB')- ,("bracketrightex", '\xF8FA')- ,("bracketrightmonospace", '\xFF3D')- ,("bracketrighttp", '\xF8F9')- ,("breve", '\x02D8')- ,("brevebelowcmb", '\x032E')- ,("brevecmb", '\x0306')- ,("breveinvertedbelowcmb", '\x032F')- ,("breveinvertedcmb", '\x0311')- ,("breveinverteddoublecmb", '\x0361')- ,("bridgebelowcmb", '\x032A')- ,("bridgeinvertedbelowcmb", '\x033A')- ,("brokenbar", '\x00A6')- ,("bstroke", '\x0180')- ,("bsuperior", '\xF6EA')- ,("btopbar", '\x0183')- ,("buhiragana", '\x3076')- ,("bukatakana", '\x30D6')- ,("bullet", '\x2022')- ,("bulletinverse", '\x25D8')- ,("bulletoperator", '\x2219')- ,("bullseye", '\x25CE')- ,("c", '\x0063')- ,("caarmenian", '\x056E')- ,("cabengali", '\x099A')- ,("cacute", '\x0107')- ,("cadeva", '\x091A')- ,("cagujarati", '\x0A9A')- ,("cagurmukhi", '\x0A1A')- ,("calsquare", '\x3388')- ,("candrabindubengali", '\x0981')- ,("candrabinducmb", '\x0310')- ,("candrabindudeva", '\x0901')- ,("candrabindugujarati", '\x0A81')- ,("capslock", '\x21EA')- ,("careof", '\x2105')- ,("caron", '\x02C7')- ,("caronbelowcmb", '\x032C')- ,("caroncmb", '\x030C')- ,("carriagereturn", '\x21B5')- ,("cbopomofo", '\x3118')- ,("ccaron", '\x010D')- ,("ccedilla", '\x00E7')- ,("ccedillaacute", '\x1E09')- ,("ccircle", '\x24D2')- ,("ccircumflex", '\x0109')- ,("ccurl", '\x0255')- ,("cdot", '\x010B')- ,("cdotaccent", '\x010B')- ,("cdsquare", '\x33C5')- ,("cedilla", '\x00B8')- ,("cedillacmb", '\x0327')- ,("cent", '\x00A2')- ,("centigrade", '\x2103')- ,("centinferior", '\xF6DF')- ,("centmonospace", '\xFFE0')- ,("centoldstyle", '\xF7A2')- ,("centsuperior", '\xF6E0')- ,("chaarmenian", '\x0579')- ,("chabengali", '\x099B')- ,("chadeva", '\x091B')- ,("chagujarati", '\x0A9B')- ,("chagurmukhi", '\x0A1B')- ,("chbopomofo", '\x3114')- ,("cheabkhasiancyrillic", '\x04BD')- ,("checkmark", '\x2713')- ,("checyrillic", '\x0447')- ,("chedescenderabkhasiancyrillic", '\x04BF')- ,("chedescendercyrillic", '\x04B7')- ,("chedieresiscyrillic", '\x04F5')- ,("cheharmenian", '\x0573')- ,("chekhakassiancyrillic", '\x04CC')- ,("cheverticalstrokecyrillic", '\x04B9')- ,("chi", '\x03C7')- ,("chieuchacirclekorean", '\x3277')- ,("chieuchaparenkorean", '\x3217')- ,("chieuchcirclekorean", '\x3269')- ,("chieuchkorean", '\x314A')- ,("chieuchparenkorean", '\x3209')- ,("chochangthai", '\x0E0A')- ,("chochanthai", '\x0E08')- ,("chochingthai", '\x0E09')- ,("chochoethai", '\x0E0C')- ,("chook", '\x0188')- ,("cieucacirclekorean", '\x3276')- ,("cieucaparenkorean", '\x3216')- ,("cieuccirclekorean", '\x3268')- ,("cieuckorean", '\x3148')- ,("cieucparenkorean", '\x3208')- ,("cieucuparenkorean", '\x321C')- ,("circle", '\x25CB')- ,("circlemultiply", '\x2297')- ,("circleot", '\x2299')- ,("circleplus", '\x2295')- ,("circlepostalmark", '\x3036')- ,("circlewithlefthalfblack", '\x25D0')- ,("circlewithrighthalfblack", '\x25D1')- ,("circumflex", '\x02C6')- ,("circumflexbelowcmb", '\x032D')- ,("circumflexcmb", '\x0302')- ,("clear", '\x2327')- ,("clickalveolar", '\x01C2')- ,("clickdental", '\x01C0')- ,("clicklateral", '\x01C1')- ,("clickretroflex", '\x01C3')- ,("club", '\x2663')- ,("clubsuitblack", '\x2663')- ,("clubsuitwhite", '\x2667')- ,("cmcubedsquare", '\x33A4')- ,("cmonospace", '\xFF43')- ,("cmsquaredsquare", '\x33A0')- ,("coarmenian", '\x0581')- ,("colon", '\x003A')- ,("colonmonetary", '\x20A1')- ,("colonmonospace", '\xFF1A')- ,("colonsign", '\x20A1')- ,("colonsmall", '\xFE55')- ,("colontriangularhalfmod", '\x02D1')- ,("colontriangularmod", '\x02D0')- ,("comma", '\x002C')- ,("commaabovecmb", '\x0313')- ,("commaaboverightcmb", '\x0315')- ,("commaaccent", '\xF6C3')- ,("commaarabic", '\x060C')- ,("commaarmenian", '\x055D')- ,("commainferior", '\xF6E1')- ,("commamonospace", '\xFF0C')- ,("commareversedabovecmb", '\x0314')- ,("commareversedmod", '\x02BD')- ,("commasmall", '\xFE50')- ,("commasuperior", '\xF6E2')- ,("commaturnedabovecmb", '\x0312')- ,("commaturnedmod", '\x02BB')- ,("compass", '\x263C')- ,("congruent", '\x2245')- ,("contourintegral", '\x222E')- ,("control", '\x2303')- ,("controlACK", '\x0006')- ,("controlBEL", '\x0007')- ,("controlBS", '\x0008')- ,("controlCAN", '\x0018')- ,("controlCR", '\x000D')- ,("controlDC1", '\x0011')- ,("controlDC2", '\x0012')- ,("controlDC3", '\x0013')- ,("controlDC4", '\x0014')- ,("controlDEL", '\x007F')- ,("controlDLE", '\x0010')- ,("controlEM", '\x0019')- ,("controlENQ", '\x0005')- ,("controlEOT", '\x0004')- ,("controlESC", '\x001B')- ,("controlETB", '\x0017')- ,("controlETX", '\x0003')- ,("controlFF", '\x000C')- ,("controlFS", '\x001C')- ,("controlGS", '\x001D')- ,("controlHT", '\x0009')- ,("controlLF", '\x000A')- ,("controlNAK", '\x0015')- ,("controlRS", '\x001E')- ,("controlSI", '\x000F')- ,("controlSO", '\x000E')- ,("controlSOT", '\x0002')- ,("controlSTX", '\x0001')- ,("controlSUB", '\x001A')- ,("controlSYN", '\x0016')- ,("controlUS", '\x001F')- ,("controlVT", '\x000B')- ,("copyright", '\x00A9')- ,("copyrightsans", '\xF8E9')- ,("copyrightserif", '\xF6D9')- ,("cornerbracketleft", '\x300C')- ,("cornerbracketlefthalfwidth", '\xFF62')- ,("cornerbracketleftvertical", '\xFE41')- ,("cornerbracketright", '\x300D')- ,("cornerbracketrighthalfwidth", '\xFF63')- ,("cornerbracketrightvertical", '\xFE42')- ,("corporationsquare", '\x337F')- ,("cosquare", '\x33C7')- ,("coverkgsquare", '\x33C6')- ,("cparen", '\x249E')- ,("cruzeiro", '\x20A2')- ,("cstretched", '\x0297')- ,("curlyand", '\x22CF')- ,("curlyor", '\x22CE')- ,("currency", '\x00A4')- ,("cyrBreve", '\xF6D1')- ,("cyrFlex", '\xF6D2')- ,("cyrbreve", '\xF6D4')- ,("cyrflex", '\xF6D5')- ,("d", '\x0064')- ,("daarmenian", '\x0564')- ,("dabengali", '\x09A6')- ,("dadarabic", '\x0636')- ,("dadeva", '\x0926')- ,("dadfinalarabic", '\xFEBE')- ,("dadinitialarabic", '\xFEBF')- ,("dadmedialarabic", '\xFEC0')- ,("dagesh", '\x05BC')- ,("dageshhebrew", '\x05BC')- ,("dagger", '\x2020')- ,("daggerdbl", '\x2021')- ,("dagujarati", '\x0AA6')- ,("dagurmukhi", '\x0A26')- ,("dahiragana", '\x3060')- ,("dakatakana", '\x30C0')- ,("dalarabic", '\x062F')- ,("dalet", '\x05D3')- ,("daletdagesh", '\xFB33')- ,("daletdageshhebrew", '\xFB33')- ,("dalethatafpatah", '\x05D3')- ,("dalethatafpatahhebrew", '\x05D3')- ,("dalethatafsegol", '\x05D3')- ,("dalethatafsegolhebrew", '\x05D3')- ,("dalethebrew", '\x05D3')- ,("dalethiriq", '\x05D3')- ,("dalethiriqhebrew", '\x05D3')- ,("daletholam", '\x05D3')- ,("daletholamhebrew", '\x05D3')- ,("daletpatah", '\x05D3')- ,("daletpatahhebrew", '\x05D3')- ,("daletqamats", '\x05D3')- ,("daletqamatshebrew", '\x05D3')- ,("daletqubuts", '\x05D3')- ,("daletqubutshebrew", '\x05D3')- ,("daletsegol", '\x05D3')- ,("daletsegolhebrew", '\x05D3')- ,("daletsheva", '\x05D3')- ,("daletshevahebrew", '\x05D3')- ,("dalettsere", '\x05D3')- ,("dalettserehebrew", '\x05D3')- ,("dalfinalarabic", '\xFEAA')- ,("dammaarabic", '\x064F')- ,("dammalowarabic", '\x064F')- ,("dammatanaltonearabic", '\x064C')- ,("dammatanarabic", '\x064C')- ,("danda", '\x0964')- ,("dargahebrew", '\x05A7')- ,("dargalefthebrew", '\x05A7')- ,("dasiapneumatacyrilliccmb", '\x0485')- ,("dblGrave", '\xF6D3')- ,("dblanglebracketleft", '\x300A')- ,("dblanglebracketleftvertical", '\xFE3D')- ,("dblanglebracketright", '\x300B')- ,("dblanglebracketrightvertical", '\xFE3E')- ,("dblarchinvertedbelowcmb", '\x032B')- ,("dblarrowleft", '\x21D4')- ,("dblarrowright", '\x21D2')- ,("dbldanda", '\x0965')- ,("dblgrave", '\xF6D6')- ,("dblgravecmb", '\x030F')- ,("dblintegral", '\x222C')- ,("dbllowline", '\x2017')- ,("dbllowlinecmb", '\x0333')- ,("dbloverlinecmb", '\x033F')- ,("dblprimemod", '\x02BA')- ,("dblverticalbar", '\x2016')- ,("dblverticallineabovecmb", '\x030E')- ,("dbopomofo", '\x3109')- ,("dbsquare", '\x33C8')- ,("dcaron", '\x010F')- ,("dcedilla", '\x1E11')- ,("dcircle", '\x24D3')- ,("dcircumflexbelow", '\x1E13')- ,("dcroat", '\x0111')- ,("ddabengali", '\x09A1')- ,("ddadeva", '\x0921')- ,("ddagujarati", '\x0AA1')- ,("ddagurmukhi", '\x0A21')- ,("ddalarabic", '\x0688')- ,("ddalfinalarabic", '\xFB89')- ,("dddhadeva", '\x095C')- ,("ddhabengali", '\x09A2')- ,("ddhadeva", '\x0922')- ,("ddhagujarati", '\x0AA2')- ,("ddhagurmukhi", '\x0A22')- ,("ddotaccent", '\x1E0B')- ,("ddotbelow", '\x1E0D')- ,("decimalseparatorarabic", '\x066B')- ,("decimalseparatorpersian", '\x066B')- ,("decyrillic", '\x0434')- ,("degree", '\x00B0')- ,("dehihebrew", '\x05AD')- ,("dehiragana", '\x3067')- ,("deicoptic", '\x03EF')- ,("dekatakana", '\x30C7')- ,("deleteleft", '\x232B')- ,("deleteright", '\x2326')- ,("delta", '\x03B4')- ,("deltaturned", '\x018D')- ,("denominatorminusonenumeratorbengali", '\x09F8')- ,("dezh", '\x02A4')- ,("dhabengali", '\x09A7')- ,("dhadeva", '\x0927')- ,("dhagujarati", '\x0AA7')- ,("dhagurmukhi", '\x0A27')- ,("dhook", '\x0257')- ,("dialytikatonos", '\x0385')- ,("dialytikatonoscmb", '\x0344')- ,("diamond", '\x2666')- ,("diamondsuitwhite", '\x2662')- ,("dieresis", '\x00A8')- ,("dieresisacute", '\xF6D7')- ,("dieresisbelowcmb", '\x0324')- ,("dieresiscmb", '\x0308')- ,("dieresisgrave", '\xF6D8')- ,("dieresistonos", '\x0385')- ,("dihiragana", '\x3062')- ,("dikatakana", '\x30C2')- ,("dittomark", '\x3003')- ,("divide", '\x00F7')- ,("divides", '\x2223')- ,("divisionslash", '\x2215')- ,("djecyrillic", '\x0452')- ,("dkshade", '\x2593')- ,("dlinebelow", '\x1E0F')- ,("dlsquare", '\x3397')- ,("dmacron", '\x0111')- ,("dmonospace", '\xFF44')- ,("dnblock", '\x2584')- ,("dochadathai", '\x0E0E')- ,("dodekthai", '\x0E14')- ,("dohiragana", '\x3069')- ,("dokatakana", '\x30C9')- ,("dollar", '\x0024')- ,("dollarinferior", '\xF6E3')- ,("dollarmonospace", '\xFF04')- ,("dollaroldstyle", '\xF724')- ,("dollarsmall", '\xFE69')- ,("dollarsuperior", '\xF6E4')- ,("dong", '\x20AB')- ,("dorusquare", '\x3326')- ,("dotaccent", '\x02D9')- ,("dotaccentcmb", '\x0307')- ,("dotbelowcmb", '\x0323')- ,("dotbelowcomb", '\x0323')- ,("dotkatakana", '\x30FB')- ,("dotlessi", '\x0131')- ,("dotlessj", '\xF6BE')- ,("dotlessjstrokehook", '\x0284')- ,("dotmath", '\x22C5')- ,("dottedcircle", '\x25CC')- ,("doubleyodpatah", '\xFB1F')- ,("doubleyodpatahhebrew", '\xFB1F')- ,("downtackbelowcmb", '\x031E')- ,("downtackmod", '\x02D5')- ,("dparen", '\x249F')- ,("dsuperior", '\xF6EB')- ,("dtail", '\x0256')- ,("dtopbar", '\x018C')- ,("duhiragana", '\x3065')- ,("dukatakana", '\x30C5')- ,("dz", '\x01F3')- ,("dzaltone", '\x02A3')- ,("dzcaron", '\x01C6')- ,("dzcurl", '\x02A5')- ,("dzeabkhasiancyrillic", '\x04E1')- ,("dzecyrillic", '\x0455')- ,("dzhecyrillic", '\x045F')- ,("e", '\x0065')- ,("eacute", '\x00E9')- ,("earth", '\x2641')- ,("ebengali", '\x098F')- ,("ebopomofo", '\x311C')- ,("ebreve", '\x0115')- ,("ecandradeva", '\x090D')- ,("ecandragujarati", '\x0A8D')- ,("ecandravowelsigndeva", '\x0945')- ,("ecandravowelsigngujarati", '\x0AC5')- ,("ecaron", '\x011B')- ,("ecedillabreve", '\x1E1D')- ,("echarmenian", '\x0565')- ,("echyiwnarmenian", '\x0587')- ,("ecircle", '\x24D4')- ,("ecircumflex", '\x00EA')- ,("ecircumflexacute", '\x1EBF')- ,("ecircumflexbelow", '\x1E19')- ,("ecircumflexdotbelow", '\x1EC7')- ,("ecircumflexgrave", '\x1EC1')- ,("ecircumflexhookabove", '\x1EC3')- ,("ecircumflextilde", '\x1EC5')- ,("ecyrillic", '\x0454')- ,("edblgrave", '\x0205')- ,("edeva", '\x090F')- ,("edieresis", '\x00EB')- ,("edot", '\x0117')- ,("edotaccent", '\x0117')- ,("edotbelow", '\x1EB9')- ,("eegurmukhi", '\x0A0F')- ,("eematragurmukhi", '\x0A47')- ,("efcyrillic", '\x0444')- ,("egrave", '\x00E8')- ,("egujarati", '\x0A8F')- ,("eharmenian", '\x0567')- ,("ehbopomofo", '\x311D')- ,("ehiragana", '\x3048')- ,("ehookabove", '\x1EBB')- ,("eibopomofo", '\x311F')- ,("eight", '\x0038')- ,("eightarabic", '\x0668')- ,("eightbengali", '\x09EE')- ,("eightcircle", '\x2467')- ,("eightcircleinversesansserif", '\x2791')- ,("eightdeva", '\x096E')- ,("eighteencircle", '\x2471')- ,("eighteenparen", '\x2485')- ,("eighteenperiod", '\x2499')- ,("eightgujarati", '\x0AEE')- ,("eightgurmukhi", '\x0A6E')- ,("eighthackarabic", '\x0668')- ,("eighthangzhou", '\x3028')- ,("eighthnotebeamed", '\x266B')- ,("eightideographicparen", '\x3227')- ,("eightinferior", '\x2088')- ,("eightmonospace", '\xFF18')- ,("eightoldstyle", '\xF738')- ,("eightparen", '\x247B')- ,("eightperiod", '\x248F')- ,("eightpersian", '\x06F8')- ,("eightroman", '\x2177')- ,("eightsuperior", '\x2078')- ,("eightthai", '\x0E58')- ,("einvertedbreve", '\x0207')- ,("eiotifiedcyrillic", '\x0465')- ,("ekatakana", '\x30A8')- ,("ekatakanahalfwidth", '\xFF74')- ,("ekonkargurmukhi", '\x0A74')- ,("ekorean", '\x3154')- ,("elcyrillic", '\x043B')- ,("element", '\x2208')- ,("elevencircle", '\x246A')- ,("elevenparen", '\x247E')- ,("elevenperiod", '\x2492')- ,("elevenroman", '\x217A')- ,("ellipsis", '\x2026')- ,("ellipsisvertical", '\x22EE')- ,("emacron", '\x0113')- ,("emacronacute", '\x1E17')- ,("emacrongrave", '\x1E15')- ,("emcyrillic", '\x043C')- ,("emdash", '\x2014')- ,("emdashvertical", '\xFE31')- ,("emonospace", '\xFF45')- ,("emphasismarkarmenian", '\x055B')- ,("emptyset", '\x2205')- ,("enbopomofo", '\x3123')- ,("encyrillic", '\x043D')- ,("endash", '\x2013')- ,("endashvertical", '\xFE32')- ,("endescendercyrillic", '\x04A3')- ,("eng", '\x014B')- ,("engbopomofo", '\x3125')- ,("enghecyrillic", '\x04A5')- ,("enhookcyrillic", '\x04C8')- ,("enspace", '\x2002')- ,("eogonek", '\x0119')- ,("eokorean", '\x3153')- ,("eopen", '\x025B')- ,("eopenclosed", '\x029A')- ,("eopenreversed", '\x025C')- ,("eopenreversedclosed", '\x025E')- ,("eopenreversedhook", '\x025D')- ,("eparen", '\x24A0')- ,("epsilon", '\x03B5')- ,("epsilontonos", '\x03AD')- ,("equal", '\x003D')- ,("equalmonospace", '\xFF1D')- ,("equalsmall", '\xFE66')- ,("equalsuperior", '\x207C')- ,("equivalence", '\x2261')- ,("erbopomofo", '\x3126')- ,("ercyrillic", '\x0440')- ,("ereversed", '\x0258')- ,("ereversedcyrillic", '\x044D')- ,("escyrillic", '\x0441')- ,("esdescendercyrillic", '\x04AB')- ,("esh", '\x0283')- ,("eshcurl", '\x0286')- ,("eshortdeva", '\x090E')- ,("eshortvowelsigndeva", '\x0946')- ,("eshreversedloop", '\x01AA')- ,("eshsquatreversed", '\x0285')- ,("esmallhiragana", '\x3047')- ,("esmallkatakana", '\x30A7')- ,("esmallkatakanahalfwidth", '\xFF6A')- ,("estimated", '\x212E')- ,("esuperior", '\xF6EC')- ,("eta", '\x03B7')- ,("etarmenian", '\x0568')- ,("etatonos", '\x03AE')- ,("eth", '\x00F0')- ,("etilde", '\x1EBD')- ,("etildebelow", '\x1E1B')- ,("etnahtafoukhhebrew", '\x0591')- ,("etnahtafoukhlefthebrew", '\x0591')- ,("etnahtahebrew", '\x0591')- ,("etnahtalefthebrew", '\x0591')- ,("eturned", '\x01DD')- ,("eukorean", '\x3161')- ,("euro", '\x20AC')- ,("evowelsignbengali", '\x09C7')- ,("evowelsigndeva", '\x0947')- ,("evowelsigngujarati", '\x0AC7')- ,("exclam", '\x0021')- ,("exclamarmenian", '\x055C')- ,("exclamdbl", '\x203C')- ,("exclamdown", '\x00A1')- ,("exclamdownsmall", '\xF7A1')- ,("exclammonospace", '\xFF01')- ,("exclamsmall", '\xF721')- ,("existential", '\x2203')- ,("ezh", '\x0292')- ,("ezhcaron", '\x01EF')- ,("ezhcurl", '\x0293')- ,("ezhreversed", '\x01B9')- ,("ezhtail", '\x01BA')- ,("f", '\x0066')- ,("fadeva", '\x095E')- ,("fagurmukhi", '\x0A5E')- ,("fahrenheit", '\x2109')- ,("fathaarabic", '\x064E')- ,("fathalowarabic", '\x064E')- ,("fathatanarabic", '\x064B')- ,("fbopomofo", '\x3108')- ,("fcircle", '\x24D5')- ,("fdotaccent", '\x1E1F')- ,("feharabic", '\x0641')- ,("feharmenian", '\x0586')- ,("fehfinalarabic", '\xFED2')- ,("fehinitialarabic", '\xFED3')- ,("fehmedialarabic", '\xFED4')- ,("feicoptic", '\x03E5')- ,("female", '\x2640')- ,("ff", '\xFB00')- ,("ffi", '\xFB03')- ,("ffl", '\xFB04')- ,("fi", '\xFB01')- ,("fifteencircle", '\x246E')- ,("fifteenparen", '\x2482')- ,("fifteenperiod", '\x2496')- ,("figuredash", '\x2012')- ,("filledbox", '\x25A0')- ,("filledrect", '\x25AC')- ,("finalkaf", '\x05DA')- ,("finalkafdagesh", '\xFB3A')- ,("finalkafdageshhebrew", '\xFB3A')- ,("finalkafhebrew", '\x05DA')- ,("finalkafqamats", '\x05DA')- ,("finalkafqamatshebrew", '\x05DA')- ,("finalkafsheva", '\x05DA')- ,("finalkafshevahebrew", '\x05DA')- ,("finalmem", '\x05DD')- ,("finalmemhebrew", '\x05DD')- ,("finalnun", '\x05DF')- ,("finalnunhebrew", '\x05DF')- ,("finalpe", '\x05E3')- ,("finalpehebrew", '\x05E3')- ,("finaltsadi", '\x05E5')- ,("finaltsadihebrew", '\x05E5')- ,("firsttonechinese", '\x02C9')- ,("fisheye", '\x25C9')- ,("fitacyrillic", '\x0473')- ,("five", '\x0035')- ,("fivearabic", '\x0665')- ,("fivebengali", '\x09EB')- ,("fivecircle", '\x2464')- ,("fivecircleinversesansserif", '\x278E')- ,("fivedeva", '\x096B')- ,("fiveeighths", '\x215D')- ,("fivegujarati", '\x0AEB')- ,("fivegurmukhi", '\x0A6B')- ,("fivehackarabic", '\x0665')- ,("fivehangzhou", '\x3025')- ,("fiveideographicparen", '\x3224')- ,("fiveinferior", '\x2085')- ,("fivemonospace", '\xFF15')- ,("fiveoldstyle", '\xF735')- ,("fiveparen", '\x2478')- ,("fiveperiod", '\x248C')- ,("fivepersian", '\x06F5')- ,("fiveroman", '\x2174')- ,("fivesuperior", '\x2075')- ,("fivethai", '\x0E55')- ,("fl", '\xFB02')- ,("florin", '\x0192')- ,("fmonospace", '\xFF46')- ,("fmsquare", '\x3399')- ,("fofanthai", '\x0E1F')- ,("fofathai", '\x0E1D')- ,("fongmanthai", '\x0E4F')- ,("forall", '\x2200')- ,("four", '\x0034')- ,("fourarabic", '\x0664')- ,("fourbengali", '\x09EA')- ,("fourcircle", '\x2463')- ,("fourcircleinversesansserif", '\x278D')- ,("fourdeva", '\x096A')- ,("fourgujarati", '\x0AEA')- ,("fourgurmukhi", '\x0A6A')- ,("fourhackarabic", '\x0664')- ,("fourhangzhou", '\x3024')- ,("fourideographicparen", '\x3223')- ,("fourinferior", '\x2084')- ,("fourmonospace", '\xFF14')- ,("fournumeratorbengali", '\x09F7')- ,("fouroldstyle", '\xF734')- ,("fourparen", '\x2477')- ,("fourperiod", '\x248B')- ,("fourpersian", '\x06F4')- ,("fourroman", '\x2173')- ,("foursuperior", '\x2074')- ,("fourteencircle", '\x246D')- ,("fourteenparen", '\x2481')- ,("fourteenperiod", '\x2495')- ,("fourthai", '\x0E54')- ,("fourthtonechinese", '\x02CB')- ,("fparen", '\x24A1')- ,("fraction", '\x2044')- ,("franc", '\x20A3')- ,("g", '\x0067')- ,("gabengali", '\x0997')- ,("gacute", '\x01F5')- ,("gadeva", '\x0917')- ,("gafarabic", '\x06AF')- ,("gaffinalarabic", '\xFB93')- ,("gafinitialarabic", '\xFB94')- ,("gafmedialarabic", '\xFB95')- ,("gagujarati", '\x0A97')- ,("gagurmukhi", '\x0A17')- ,("gahiragana", '\x304C')- ,("gakatakana", '\x30AC')- ,("gamma", '\x03B3')- ,("gammalatinsmall", '\x0263')- ,("gammasuperior", '\x02E0')- ,("gangiacoptic", '\x03EB')- ,("gbopomofo", '\x310D')- ,("gbreve", '\x011F')- ,("gcaron", '\x01E7')- ,("gcedilla", '\x0123')- ,("gcircle", '\x24D6')- ,("gcircumflex", '\x011D')- ,("gcommaaccent", '\x0123')- ,("gdot", '\x0121')- ,("gdotaccent", '\x0121')- ,("gecyrillic", '\x0433')- ,("gehiragana", '\x3052')- ,("gekatakana", '\x30B2')- ,("geometricallyequal", '\x2251')- ,("gereshaccenthebrew", '\x059C')- ,("gereshhebrew", '\x05F3')- ,("gereshmuqdamhebrew", '\x059D')- ,("germandbls", '\x00DF')- ,("gershayimaccenthebrew", '\x059E')- ,("gershayimhebrew", '\x05F4')- ,("getamark", '\x3013')- ,("ghabengali", '\x0998')- ,("ghadarmenian", '\x0572')- ,("ghadeva", '\x0918')- ,("ghagujarati", '\x0A98')- ,("ghagurmukhi", '\x0A18')- ,("ghainarabic", '\x063A')- ,("ghainfinalarabic", '\xFECE')- ,("ghaininitialarabic", '\xFECF')- ,("ghainmedialarabic", '\xFED0')- ,("ghemiddlehookcyrillic", '\x0495')- ,("ghestrokecyrillic", '\x0493')- ,("gheupturncyrillic", '\x0491')- ,("ghhadeva", '\x095A')- ,("ghhagurmukhi", '\x0A5A')- ,("ghook", '\x0260')- ,("ghzsquare", '\x3393')- ,("gihiragana", '\x304E')- ,("gikatakana", '\x30AE')- ,("gimarmenian", '\x0563')- ,("gimel", '\x05D2')- ,("gimeldagesh", '\xFB32')- ,("gimeldageshhebrew", '\xFB32')- ,("gimelhebrew", '\x05D2')- ,("gjecyrillic", '\x0453')- ,("glottalinvertedstroke", '\x01BE')- ,("glottalstop", '\x0294')- ,("glottalstopinverted", '\x0296')- ,("glottalstopmod", '\x02C0')- ,("glottalstopreversed", '\x0295')- ,("glottalstopreversedmod", '\x02C1')- ,("glottalstopreversedsuperior", '\x02E4')- ,("glottalstopstroke", '\x02A1')- ,("glottalstopstrokereversed", '\x02A2')- ,("gmacron", '\x1E21')- ,("gmonospace", '\xFF47')- ,("gohiragana", '\x3054')- ,("gokatakana", '\x30B4')- ,("gparen", '\x24A2')- ,("gpasquare", '\x33AC')- ,("gradient", '\x2207')- ,("grave", '\x0060')- ,("gravebelowcmb", '\x0316')- ,("gravecmb", '\x0300')- ,("gravecomb", '\x0300')- ,("gravedeva", '\x0953')- ,("gravelowmod", '\x02CE')- ,("gravemonospace", '\xFF40')- ,("gravetonecmb", '\x0340')- ,("greater", '\x003E')- ,("greaterequal", '\x2265')- ,("greaterequalorless", '\x22DB')- ,("greatermonospace", '\xFF1E')- ,("greaterorequivalent", '\x2273')- ,("greaterorless", '\x2277')- ,("greateroverequal", '\x2267')- ,("greatersmall", '\xFE65')- ,("gscript", '\x0261')- ,("gstroke", '\x01E5')- ,("guhiragana", '\x3050')- ,("guillemotleft", '\x00AB')- ,("guillemotright", '\x00BB')- ,("guilsinglleft", '\x2039')- ,("guilsinglright", '\x203A')- ,("gukatakana", '\x30B0')- ,("guramusquare", '\x3318')- ,("gysquare", '\x33C9')- ,("h", '\x0068')- ,("haabkhasiancyrillic", '\x04A9')- ,("haaltonearabic", '\x06C1')- ,("habengali", '\x09B9')- ,("hadescendercyrillic", '\x04B3')- ,("hadeva", '\x0939')- ,("hagujarati", '\x0AB9')- ,("hagurmukhi", '\x0A39')- ,("haharabic", '\x062D')- ,("hahfinalarabic", '\xFEA2')- ,("hahinitialarabic", '\xFEA3')- ,("hahiragana", '\x306F')- ,("hahmedialarabic", '\xFEA4')- ,("haitusquare", '\x332A')- ,("hakatakana", '\x30CF')- ,("hakatakanahalfwidth", '\xFF8A')- ,("halantgurmukhi", '\x0A4D')- ,("hamzaarabic", '\x0621')- ,("hamzadammaarabic", '\x0621')- ,("hamzadammatanarabic", '\x0621')- ,("hamzafathaarabic", '\x0621')- ,("hamzafathatanarabic", '\x0621')- ,("hamzalowarabic", '\x0621')- ,("hamzalowkasraarabic", '\x0621')- ,("hamzalowkasratanarabic", '\x0621')- ,("hamzasukunarabic", '\x0621')- ,("hangulfiller", '\x3164')- ,("hardsigncyrillic", '\x044A')- ,("harpoonleftbarbup", '\x21BC')- ,("harpoonrightbarbup", '\x21C0')- ,("hasquare", '\x33CA')- ,("hatafpatah", '\x05B2')- ,("hatafpatah16", '\x05B2')- ,("hatafpatah23", '\x05B2')- ,("hatafpatah2f", '\x05B2')- ,("hatafpatahhebrew", '\x05B2')- ,("hatafpatahnarrowhebrew", '\x05B2')- ,("hatafpatahquarterhebrew", '\x05B2')- ,("hatafpatahwidehebrew", '\x05B2')- ,("hatafqamats", '\x05B3')- ,("hatafqamats1b", '\x05B3')- ,("hatafqamats28", '\x05B3')- ,("hatafqamats34", '\x05B3')- ,("hatafqamatshebrew", '\x05B3')- ,("hatafqamatsnarrowhebrew", '\x05B3')- ,("hatafqamatsquarterhebrew", '\x05B3')- ,("hatafqamatswidehebrew", '\x05B3')- ,("hatafsegol", '\x05B1')- ,("hatafsegol17", '\x05B1')- ,("hatafsegol24", '\x05B1')- ,("hatafsegol30", '\x05B1')- ,("hatafsegolhebrew", '\x05B1')- ,("hatafsegolnarrowhebrew", '\x05B1')- ,("hatafsegolquarterhebrew", '\x05B1')- ,("hatafsegolwidehebrew", '\x05B1')- ,("hbar", '\x0127')- ,("hbopomofo", '\x310F')- ,("hbrevebelow", '\x1E2B')- ,("hcedilla", '\x1E29')- ,("hcircle", '\x24D7')- ,("hcircumflex", '\x0125')- ,("hdieresis", '\x1E27')- ,("hdotaccent", '\x1E23')- ,("hdotbelow", '\x1E25')- ,("he", '\x05D4')- ,("heart", '\x2665')- ,("heartsuitblack", '\x2665')- ,("heartsuitwhite", '\x2661')- ,("hedagesh", '\xFB34')- ,("hedageshhebrew", '\xFB34')- ,("hehaltonearabic", '\x06C1')- ,("heharabic", '\x0647')- ,("hehebrew", '\x05D4')- ,("hehfinalaltonearabic", '\xFBA7')- ,("hehfinalalttwoarabic", '\xFEEA')- ,("hehfinalarabic", '\xFEEA')- ,("hehhamzaabovefinalarabic", '\xFBA5')- ,("hehhamzaaboveisolatedarabic", '\xFBA4')- ,("hehinitialaltonearabic", '\xFBA8')- ,("hehinitialarabic", '\xFEEB')- ,("hehiragana", '\x3078')- ,("hehmedialaltonearabic", '\xFBA9')- ,("hehmedialarabic", '\xFEEC')- ,("heiseierasquare", '\x337B')- ,("hekatakana", '\x30D8')- ,("hekatakanahalfwidth", '\xFF8D')- ,("hekutaarusquare", '\x3336')- ,("henghook", '\x0267')- ,("herutusquare", '\x3339')- ,("het", '\x05D7')- ,("hethebrew", '\x05D7')- ,("hhook", '\x0266')- ,("hhooksuperior", '\x02B1')- ,("hieuhacirclekorean", '\x327B')- ,("hieuhaparenkorean", '\x321B')- ,("hieuhcirclekorean", '\x326D')- ,("hieuhkorean", '\x314E')- ,("hieuhparenkorean", '\x320D')- ,("hihiragana", '\x3072')- ,("hikatakana", '\x30D2')- ,("hikatakanahalfwidth", '\xFF8B')- ,("hiriq", '\x05B4')- ,("hiriq14", '\x05B4')- ,("hiriq21", '\x05B4')- ,("hiriq2d", '\x05B4')- ,("hiriqhebrew", '\x05B4')- ,("hiriqnarrowhebrew", '\x05B4')- ,("hiriqquarterhebrew", '\x05B4')- ,("hiriqwidehebrew", '\x05B4')- ,("hlinebelow", '\x1E96')- ,("hmonospace", '\xFF48')- ,("hoarmenian", '\x0570')- ,("hohipthai", '\x0E2B')- ,("hohiragana", '\x307B')- ,("hokatakana", '\x30DB')- ,("hokatakanahalfwidth", '\xFF8E')- ,("holam", '\x05B9')- ,("holam19", '\x05B9')- ,("holam26", '\x05B9')- ,("holam32", '\x05B9')- ,("holamhebrew", '\x05B9')- ,("holamnarrowhebrew", '\x05B9')- ,("holamquarterhebrew", '\x05B9')- ,("holamwidehebrew", '\x05B9')- ,("honokhukthai", '\x0E2E')- ,("hookabovecomb", '\x0309')- ,("hookcmb", '\x0309')- ,("hookpalatalizedbelowcmb", '\x0321')- ,("hookretroflexbelowcmb", '\x0322')- ,("hoonsquare", '\x3342')- ,("horicoptic", '\x03E9')- ,("horizontalbar", '\x2015')- ,("horncmb", '\x031B')- ,("hotsprings", '\x2668')- ,("house", '\x2302')- ,("hparen", '\x24A3')- ,("hsuperior", '\x02B0')- ,("hturned", '\x0265')- ,("huhiragana", '\x3075')- ,("huiitosquare", '\x3333')- ,("hukatakana", '\x30D5')- ,("hukatakanahalfwidth", '\xFF8C')- ,("hungarumlaut", '\x02DD')- ,("hungarumlautcmb", '\x030B')- ,("hv", '\x0195')- ,("hyphen", '\x002D')- ,("hypheninferior", '\xF6E5')- ,("hyphenmonospace", '\xFF0D')- ,("hyphensmall", '\xFE63')- ,("hyphensuperior", '\xF6E6')- ,("hyphentwo", '\x2010')- ,("i", '\x0069')- ,("iacute", '\x00ED')- ,("iacyrillic", '\x044F')- ,("ibengali", '\x0987')- ,("ibopomofo", '\x3127')- ,("ibreve", '\x012D')- ,("icaron", '\x01D0')- ,("icircle", '\x24D8')- ,("icircumflex", '\x00EE')- ,("icyrillic", '\x0456')- ,("idblgrave", '\x0209')- ,("ideographearthcircle", '\x328F')- ,("ideographfirecircle", '\x328B')- ,("ideographicallianceparen", '\x323F')- ,("ideographiccallparen", '\x323A')- ,("ideographiccentrecircle", '\x32A5')- ,("ideographicclose", '\x3006')- ,("ideographiccomma", '\x3001')- ,("ideographiccommaleft", '\xFF64')- ,("ideographiccongratulationparen", '\x3237')- ,("ideographiccorrectcircle", '\x32A3')- ,("ideographicearthparen", '\x322F')- ,("ideographicenterpriseparen", '\x323D')- ,("ideographicexcellentcircle", '\x329D')- ,("ideographicfestivalparen", '\x3240')- ,("ideographicfinancialcircle", '\x3296')- ,("ideographicfinancialparen", '\x3236')- ,("ideographicfireparen", '\x322B')- ,("ideographichaveparen", '\x3232')- ,("ideographichighcircle", '\x32A4')- ,("ideographiciterationmark", '\x3005')- ,("ideographiclaborcircle", '\x3298')- ,("ideographiclaborparen", '\x3238')- ,("ideographicleftcircle", '\x32A7')- ,("ideographiclowcircle", '\x32A6')- ,("ideographicmedicinecircle", '\x32A9')- ,("ideographicmetalparen", '\x322E')- ,("ideographicmoonparen", '\x322A')- ,("ideographicnameparen", '\x3234')- ,("ideographicperiod", '\x3002')- ,("ideographicprintcircle", '\x329E')- ,("ideographicreachparen", '\x3243')- ,("ideographicrepresentparen", '\x3239')- ,("ideographicresourceparen", '\x323E')- ,("ideographicrightcircle", '\x32A8')- ,("ideographicsecretcircle", '\x3299')- ,("ideographicselfparen", '\x3242')- ,("ideographicsocietyparen", '\x3233')- ,("ideographicspace", '\x3000')- ,("ideographicspecialparen", '\x3235')- ,("ideographicstockparen", '\x3231')- ,("ideographicstudyparen", '\x323B')- ,("ideographicsunparen", '\x3230')- ,("ideographicsuperviseparen", '\x323C')- ,("ideographicwaterparen", '\x322C')- ,("ideographicwoodparen", '\x322D')- ,("ideographiczero", '\x3007')- ,("ideographmetalcircle", '\x328E')- ,("ideographmooncircle", '\x328A')- ,("ideographnamecircle", '\x3294')- ,("ideographsuncircle", '\x3290')- ,("ideographwatercircle", '\x328C')- ,("ideographwoodcircle", '\x328D')- ,("ideva", '\x0907')- ,("idieresis", '\x00EF')- ,("idieresisacute", '\x1E2F')- ,("idieresiscyrillic", '\x04E5')- ,("idotbelow", '\x1ECB')- ,("iebrevecyrillic", '\x04D7')- ,("iecyrillic", '\x0435')- ,("ieungacirclekorean", '\x3275')- ,("ieungaparenkorean", '\x3215')- ,("ieungcirclekorean", '\x3267')- ,("ieungkorean", '\x3147')- ,("ieungparenkorean", '\x3207')- ,("igrave", '\x00EC')- ,("igujarati", '\x0A87')- ,("igurmukhi", '\x0A07')- ,("ihiragana", '\x3044')- ,("ihookabove", '\x1EC9')- ,("iibengali", '\x0988')- ,("iicyrillic", '\x0438')- ,("iideva", '\x0908')- ,("iigujarati", '\x0A88')- ,("iigurmukhi", '\x0A08')- ,("iimatragurmukhi", '\x0A40')- ,("iinvertedbreve", '\x020B')- ,("iishortcyrillic", '\x0439')- ,("iivowelsignbengali", '\x09C0')- ,("iivowelsigndeva", '\x0940')- ,("iivowelsigngujarati", '\x0AC0')- ,("ij", '\x0133')- ,("ikatakana", '\x30A4')- ,("ikatakanahalfwidth", '\xFF72')- ,("ikorean", '\x3163')- ,("ilde", '\x02DC')- ,("iluyhebrew", '\x05AC')- ,("imacron", '\x012B')- ,("imacroncyrillic", '\x04E3')- ,("imageorapproximatelyequal", '\x2253')- ,("imatragurmukhi", '\x0A3F')- ,("imonospace", '\xFF49')- ,("increment", '\x2206')- ,("infinity", '\x221E')- ,("iniarmenian", '\x056B')- ,("integral", '\x222B')- ,("integralbottom", '\x2321')- ,("integralbt", '\x2321')- ,("integralex", '\xF8F5')- ,("integraltop", '\x2320')- ,("integraltp", '\x2320')- ,("intersection", '\x2229')- ,("intisquare", '\x3305')- ,("invbullet", '\x25D8')- ,("invcircle", '\x25D9')- ,("invsmileface", '\x263B')- ,("iocyrillic", '\x0451')- ,("iogonek", '\x012F')- ,("iota", '\x03B9')- ,("iotadieresis", '\x03CA')- ,("iotadieresistonos", '\x0390')- ,("iotalatin", '\x0269')- ,("iotatonos", '\x03AF')- ,("iparen", '\x24A4')- ,("irigurmukhi", '\x0A72')- ,("ismallhiragana", '\x3043')- ,("ismallkatakana", '\x30A3')- ,("ismallkatakanahalfwidth", '\xFF68')- ,("issharbengali", '\x09FA')- ,("istroke", '\x0268')- ,("isuperior", '\xF6ED')- ,("iterationhiragana", '\x309D')- ,("iterationkatakana", '\x30FD')- ,("itilde", '\x0129')- ,("itildebelow", '\x1E2D')- ,("iubopomofo", '\x3129')- ,("iucyrillic", '\x044E')- ,("ivowelsignbengali", '\x09BF')- ,("ivowelsigndeva", '\x093F')- ,("ivowelsigngujarati", '\x0ABF')- ,("izhitsacyrillic", '\x0475')- ,("izhitsadblgravecyrillic", '\x0477')- ,("j", '\x006A')- ,("jaarmenian", '\x0571')- ,("jabengali", '\x099C')- ,("jadeva", '\x091C')- ,("jagujarati", '\x0A9C')- ,("jagurmukhi", '\x0A1C')- ,("jbopomofo", '\x3110')- ,("jcaron", '\x01F0')- ,("jcircle", '\x24D9')- ,("jcircumflex", '\x0135')- ,("jcrossedtail", '\x029D')- ,("jdotlessstroke", '\x025F')- ,("jecyrillic", '\x0458')- ,("jeemarabic", '\x062C')- ,("jeemfinalarabic", '\xFE9E')- ,("jeeminitialarabic", '\xFE9F')- ,("jeemmedialarabic", '\xFEA0')- ,("jeharabic", '\x0698')- ,("jehfinalarabic", '\xFB8B')- ,("jhabengali", '\x099D')- ,("jhadeva", '\x091D')- ,("jhagujarati", '\x0A9D')- ,("jhagurmukhi", '\x0A1D')- ,("jheharmenian", '\x057B')- ,("jis", '\x3004')- ,("jmonospace", '\xFF4A')- ,("jparen", '\x24A5')- ,("jsuperior", '\x02B2')- ,("k", '\x006B')- ,("kabashkircyrillic", '\x04A1')- ,("kabengali", '\x0995')- ,("kacute", '\x1E31')- ,("kacyrillic", '\x043A')- ,("kadescendercyrillic", '\x049B')- ,("kadeva", '\x0915')- ,("kaf", '\x05DB')- ,("kafarabic", '\x0643')- ,("kafdagesh", '\xFB3B')- ,("kafdageshhebrew", '\xFB3B')- ,("kaffinalarabic", '\xFEDA')- ,("kafhebrew", '\x05DB')- ,("kafinitialarabic", '\xFEDB')- ,("kafmedialarabic", '\xFEDC')- ,("kafrafehebrew", '\xFB4D')- ,("kagujarati", '\x0A95')- ,("kagurmukhi", '\x0A15')- ,("kahiragana", '\x304B')- ,("kahookcyrillic", '\x04C4')- ,("kakatakana", '\x30AB')- ,("kakatakanahalfwidth", '\xFF76')- ,("kappa", '\x03BA')- ,("kappasymbolgreek", '\x03F0')- ,("kapyeounmieumkorean", '\x3171')- ,("kapyeounphieuphkorean", '\x3184')- ,("kapyeounpieupkorean", '\x3178')- ,("kapyeounssangpieupkorean", '\x3179')- ,("karoriisquare", '\x330D')- ,("kashidaautoarabic", '\x0640')- ,("kashidaautonosidebearingarabic", '\x0640')- ,("kasmallkatakana", '\x30F5')- ,("kasquare", '\x3384')- ,("kasraarabic", '\x0650')- ,("kasratanarabic", '\x064D')- ,("kastrokecyrillic", '\x049F')- ,("katahiraprolongmarkhalfwidth", '\xFF70')- ,("kaverticalstrokecyrillic", '\x049D')- ,("kbopomofo", '\x310E')- ,("kcalsquare", '\x3389')- ,("kcaron", '\x01E9')- ,("kcedilla", '\x0137')- ,("kcircle", '\x24DA')- ,("kcommaaccent", '\x0137')- ,("kdotbelow", '\x1E33')- ,("keharmenian", '\x0584')- ,("kehiragana", '\x3051')- ,("kekatakana", '\x30B1')- ,("kekatakanahalfwidth", '\xFF79')- ,("kenarmenian", '\x056F')- ,("kesmallkatakana", '\x30F6')- ,("kgreenlandic", '\x0138')- ,("khabengali", '\x0996')- ,("khacyrillic", '\x0445')- ,("khadeva", '\x0916')- ,("khagujarati", '\x0A96')- ,("khagurmukhi", '\x0A16')- ,("khaharabic", '\x062E')- ,("khahfinalarabic", '\xFEA6')- ,("khahinitialarabic", '\xFEA7')- ,("khahmedialarabic", '\xFEA8')- ,("kheicoptic", '\x03E7')- ,("khhadeva", '\x0959')- ,("khhagurmukhi", '\x0A59')- ,("khieukhacirclekorean", '\x3278')- ,("khieukhaparenkorean", '\x3218')- ,("khieukhcirclekorean", '\x326A')- ,("khieukhkorean", '\x314B')- ,("khieukhparenkorean", '\x320A')- ,("khokhaithai", '\x0E02')- ,("khokhonthai", '\x0E05')- ,("khokhuatthai", '\x0E03')- ,("khokhwaithai", '\x0E04')- ,("khomutthai", '\x0E5B')- ,("khook", '\x0199')- ,("khorakhangthai", '\x0E06')- ,("khzsquare", '\x3391')- ,("kihiragana", '\x304D')- ,("kikatakana", '\x30AD')- ,("kikatakanahalfwidth", '\xFF77')- ,("kiroguramusquare", '\x3315')- ,("kiromeetorusquare", '\x3316')- ,("kirosquare", '\x3314')- ,("kiyeokacirclekorean", '\x326E')- ,("kiyeokaparenkorean", '\x320E')- ,("kiyeokcirclekorean", '\x3260')- ,("kiyeokkorean", '\x3131')- ,("kiyeokparenkorean", '\x3200')- ,("kiyeoksioskorean", '\x3133')- ,("kjecyrillic", '\x045C')- ,("klinebelow", '\x1E35')- ,("klsquare", '\x3398')- ,("kmcubedsquare", '\x33A6')- ,("kmonospace", '\xFF4B')- ,("kmsquaredsquare", '\x33A2')- ,("kohiragana", '\x3053')- ,("kohmsquare", '\x33C0')- ,("kokaithai", '\x0E01')- ,("kokatakana", '\x30B3')- ,("kokatakanahalfwidth", '\xFF7A')- ,("kooposquare", '\x331E')- ,("koppacyrillic", '\x0481')- ,("koreanstandardsymbol", '\x327F')- ,("koroniscmb", '\x0343')- ,("kparen", '\x24A6')- ,("kpasquare", '\x33AA')- ,("ksicyrillic", '\x046F')- ,("ktsquare", '\x33CF')- ,("kturned", '\x029E')- ,("kuhiragana", '\x304F')- ,("kukatakana", '\x30AF')- ,("kukatakanahalfwidth", '\xFF78')- ,("kvsquare", '\x33B8')- ,("kwsquare", '\x33BE')- ,("l", '\x006C')- ,("labengali", '\x09B2')- ,("lacute", '\x013A')- ,("ladeva", '\x0932')- ,("lagujarati", '\x0AB2')- ,("lagurmukhi", '\x0A32')- ,("lakkhangyaothai", '\x0E45')- ,("lamaleffinalarabic", '\xFEFC')- ,("lamalefhamzaabovefinalarabic", '\xFEF8')- ,("lamalefhamzaaboveisolatedarabic", '\xFEF7')- ,("lamalefhamzabelowfinalarabic", '\xFEFA')- ,("lamalefhamzabelowisolatedarabic", '\xFEF9')- ,("lamalefisolatedarabic", '\xFEFB')- ,("lamalefmaddaabovefinalarabic", '\xFEF6')- ,("lamalefmaddaaboveisolatedarabic", '\xFEF5')- ,("lamarabic", '\x0644')- ,("lambda", '\x03BB')- ,("lambdastroke", '\x019B')- ,("lamed", '\x05DC')- ,("lameddagesh", '\xFB3C')- ,("lameddageshhebrew", '\xFB3C')- ,("lamedhebrew", '\x05DC')- ,("lamedholam", '\x05DC')- ,("lamedholamdagesh", '\x05DC')- ,("lamedholamdageshhebrew", '\x05DC')- ,("lamedholamhebrew", '\x05DC')- ,("lamfinalarabic", '\xFEDE')- ,("lamhahinitialarabic", '\xFCCA')- ,("laminitialarabic", '\xFEDF')- ,("lamjeeminitialarabic", '\xFCC9')- ,("lamkhahinitialarabic", '\xFCCB')- ,("lamlamhehisolatedarabic", '\xFDF2')- ,("lammedialarabic", '\xFEE0')- ,("lammeemhahinitialarabic", '\xFD88')- ,("lammeeminitialarabic", '\xFCCC')- ,("lammeemjeeminitialarabic", '\xFEDF')- ,("lammeemkhahinitialarabic", '\xFEDF')- ,("largecircle", '\x25EF')- ,("lbar", '\x019A')- ,("lbelt", '\x026C')- ,("lbopomofo", '\x310C')- ,("lcaron", '\x013E')- ,("lcedilla", '\x013C')- ,("lcircle", '\x24DB')- ,("lcircumflexbelow", '\x1E3D')- ,("lcommaaccent", '\x013C')- ,("ldot", '\x0140')- ,("ldotaccent", '\x0140')- ,("ldotbelow", '\x1E37')- ,("ldotbelowmacron", '\x1E39')- ,("leftangleabovecmb", '\x031A')- ,("lefttackbelowcmb", '\x0318')- ,("less", '\x003C')- ,("lessequal", '\x2264')- ,("lessequalorgreater", '\x22DA')- ,("lessmonospace", '\xFF1C')- ,("lessorequivalent", '\x2272')- ,("lessorgreater", '\x2276')- ,("lessoverequal", '\x2266')- ,("lesssmall", '\xFE64')- ,("lezh", '\x026E')- ,("lfblock", '\x258C')- ,("lhookretroflex", '\x026D')- ,("lira", '\x20A4')- ,("liwnarmenian", '\x056C')- ,("lj", '\x01C9')- ,("ljecyrillic", '\x0459')- ,("ll", '\xF6C0')- ,("lladeva", '\x0933')- ,("llagujarati", '\x0AB3')- ,("llinebelow", '\x1E3B')- ,("llladeva", '\x0934')- ,("llvocalicbengali", '\x09E1')- ,("llvocalicdeva", '\x0961')- ,("llvocalicvowelsignbengali", '\x09E3')- ,("llvocalicvowelsigndeva", '\x0963')- ,("lmiddletilde", '\x026B')- ,("lmonospace", '\xFF4C')- ,("lmsquare", '\x33D0')- ,("lochulathai", '\x0E2C')- ,("logicaland", '\x2227')- ,("logicalnot", '\x00AC')- ,("logicalnotreversed", '\x2310')- ,("logicalor", '\x2228')- ,("lolingthai", '\x0E25')- ,("longs", '\x017F')- ,("lowlinecenterline", '\xFE4E')- ,("lowlinecmb", '\x0332')- ,("lowlinedashed", '\xFE4D')- ,("lozenge", '\x25CA')- ,("lparen", '\x24A7')- ,("lslash", '\x0142')- ,("lsquare", '\x2113')- ,("lsuperior", '\xF6EE')- ,("ltshade", '\x2591')- ,("luthai", '\x0E26')- ,("lvocalicbengali", '\x098C')- ,("lvocalicdeva", '\x090C')- ,("lvocalicvowelsignbengali", '\x09E2')- ,("lvocalicvowelsigndeva", '\x0962')- ,("lxsquare", '\x33D3')- ,("m", '\x006D')- ,("mabengali", '\x09AE')- ,("macron", '\x00AF')- ,("macronbelowcmb", '\x0331')- ,("macroncmb", '\x0304')- ,("macronlowmod", '\x02CD')- ,("macronmonospace", '\xFFE3')- ,("macute", '\x1E3F')- ,("madeva", '\x092E')- ,("magujarati", '\x0AAE')- ,("magurmukhi", '\x0A2E')- ,("mahapakhhebrew", '\x05A4')- ,("mahapakhlefthebrew", '\x05A4')- ,("mahiragana", '\x307E')- ,("maichattawalowleftthai", '\xF895')- ,("maichattawalowrightthai", '\xF894')- ,("maichattawathai", '\x0E4B')- ,("maichattawaupperleftthai", '\xF893')- ,("maieklowleftthai", '\xF88C')- ,("maieklowrightthai", '\xF88B')- ,("maiekthai", '\x0E48')- ,("maiekupperleftthai", '\xF88A')- ,("maihanakatleftthai", '\xF884')- ,("maihanakatthai", '\x0E31')- ,("maitaikhuleftthai", '\xF889')- ,("maitaikhuthai", '\x0E47')- ,("maitholowleftthai", '\xF88F')- ,("maitholowrightthai", '\xF88E')- ,("maithothai", '\x0E49')- ,("maithoupperleftthai", '\xF88D')- ,("maitrilowleftthai", '\xF892')- ,("maitrilowrightthai", '\xF891')- ,("maitrithai", '\x0E4A')- ,("maitriupperleftthai", '\xF890')- ,("maiyamokthai", '\x0E46')- ,("makatakana", '\x30DE')- ,("makatakanahalfwidth", '\xFF8F')- ,("male", '\x2642')- ,("mansyonsquare", '\x3347')- ,("maqafhebrew", '\x05BE')- ,("mars", '\x2642')- ,("masoracirclehebrew", '\x05AF')- ,("masquare", '\x3383')- ,("mbopomofo", '\x3107')- ,("mbsquare", '\x33D4')- ,("mcircle", '\x24DC')- ,("mcubedsquare", '\x33A5')- ,("mdotaccent", '\x1E41')- ,("mdotbelow", '\x1E43')- ,("meemarabic", '\x0645')- ,("meemfinalarabic", '\xFEE2')- ,("meeminitialarabic", '\xFEE3')- ,("meemmedialarabic", '\xFEE4')- ,("meemmeeminitialarabic", '\xFCD1')- ,("meemmeemisolatedarabic", '\xFC48')- ,("meetorusquare", '\x334D')- ,("mehiragana", '\x3081')- ,("meizierasquare", '\x337E')- ,("mekatakana", '\x30E1')- ,("mekatakanahalfwidth", '\xFF92')- ,("mem", '\x05DE')- ,("memdagesh", '\xFB3E')- ,("memdageshhebrew", '\xFB3E')- ,("memhebrew", '\x05DE')- ,("menarmenian", '\x0574')- ,("merkhahebrew", '\x05A5')- ,("merkhakefulahebrew", '\x05A6')- ,("merkhakefulalefthebrew", '\x05A6')- ,("merkhalefthebrew", '\x05A5')- ,("mhook", '\x0271')- ,("mhzsquare", '\x3392')- ,("middledotkatakanahalfwidth", '\xFF65')- ,("middot", '\x00B7')- ,("mieumacirclekorean", '\x3272')- ,("mieumaparenkorean", '\x3212')- ,("mieumcirclekorean", '\x3264')- ,("mieumkorean", '\x3141')- ,("mieumpansioskorean", '\x3170')- ,("mieumparenkorean", '\x3204')- ,("mieumpieupkorean", '\x316E')- ,("mieumsioskorean", '\x316F')- ,("mihiragana", '\x307F')- ,("mikatakana", '\x30DF')- ,("mikatakanahalfwidth", '\xFF90')- ,("minus", '\x2212')- ,("minusbelowcmb", '\x0320')- ,("minuscircle", '\x2296')- ,("minusmod", '\x02D7')- ,("minusplus", '\x2213')- ,("minute", '\x2032')- ,("miribaarusquare", '\x334A')- ,("mirisquare", '\x3349')- ,("mlonglegturned", '\x0270')- ,("mlsquare", '\x3396')- ,("mmcubedsquare", '\x33A3')- ,("mmonospace", '\xFF4D')- ,("mmsquaredsquare", '\x339F')- ,("mohiragana", '\x3082')- ,("mohmsquare", '\x33C1')- ,("mokatakana", '\x30E2')- ,("mokatakanahalfwidth", '\xFF93')- ,("molsquare", '\x33D6')- ,("momathai", '\x0E21')- ,("moverssquare", '\x33A7')- ,("moverssquaredsquare", '\x33A8')- ,("mparen", '\x24A8')- ,("mpasquare", '\x33AB')- ,("mssquare", '\x33B3')- ,("msuperior", '\xF6EF')- ,("mturned", '\x026F')- ,("mu", '\x00B5')- ,("mu1", '\x00B5')- ,("muasquare", '\x3382')- ,("muchgreater", '\x226B')- ,("muchless", '\x226A')- ,("mufsquare", '\x338C')- ,("mugreek", '\x03BC')- ,("mugsquare", '\x338D')- ,("muhiragana", '\x3080')- ,("mukatakana", '\x30E0')- ,("mukatakanahalfwidth", '\xFF91')- ,("mulsquare", '\x3395')- ,("multiply", '\x00D7')- ,("mumsquare", '\x339B')- ,("munahhebrew", '\x05A3')- ,("munahlefthebrew", '\x05A3')- ,("musicalnote", '\x266A')- ,("musicalnotedbl", '\x266B')- ,("musicflatsign", '\x266D')- ,("musicsharpsign", '\x266F')- ,("mussquare", '\x33B2')- ,("muvsquare", '\x33B6')- ,("muwsquare", '\x33BC')- ,("mvmegasquare", '\x33B9')- ,("mvsquare", '\x33B7')- ,("mwmegasquare", '\x33BF')- ,("mwsquare", '\x33BD')- ,("n", '\x006E')- ,("nabengali", '\x09A8')- ,("nabla", '\x2207')- ,("nacute", '\x0144')- ,("nadeva", '\x0928')- ,("nagujarati", '\x0AA8')- ,("nagurmukhi", '\x0A28')- ,("nahiragana", '\x306A')- ,("nakatakana", '\x30CA')- ,("nakatakanahalfwidth", '\xFF85')- ,("napostrophe", '\x0149')- ,("nasquare", '\x3381')- ,("nbopomofo", '\x310B')- ,("nbspace", '\x00A0')- ,("ncaron", '\x0148')- ,("ncedilla", '\x0146')- ,("ncircle", '\x24DD')- ,("ncircumflexbelow", '\x1E4B')- ,("ncommaaccent", '\x0146')- ,("ndotaccent", '\x1E45')- ,("ndotbelow", '\x1E47')- ,("nehiragana", '\x306D')- ,("nekatakana", '\x30CD')- ,("nekatakanahalfwidth", '\xFF88')- ,("newsheqelsign", '\x20AA')- ,("nfsquare", '\x338B')- ,("ngabengali", '\x0999')- ,("ngadeva", '\x0919')- ,("ngagujarati", '\x0A99')- ,("ngagurmukhi", '\x0A19')- ,("ngonguthai", '\x0E07')- ,("nhiragana", '\x3093')- ,("nhookleft", '\x0272')- ,("nhookretroflex", '\x0273')- ,("nieunacirclekorean", '\x326F')- ,("nieunaparenkorean", '\x320F')- ,("nieuncieuckorean", '\x3135')- ,("nieuncirclekorean", '\x3261')- ,("nieunhieuhkorean", '\x3136')- ,("nieunkorean", '\x3134')- ,("nieunpansioskorean", '\x3168')- ,("nieunparenkorean", '\x3201')- ,("nieunsioskorean", '\x3167')- ,("nieuntikeutkorean", '\x3166')- ,("nihiragana", '\x306B')- ,("nikatakana", '\x30CB')- ,("nikatakanahalfwidth", '\xFF86')- ,("nikhahitleftthai", '\xF899')- ,("nikhahitthai", '\x0E4D')- ,("nine", '\x0039')- ,("ninearabic", '\x0669')- ,("ninebengali", '\x09EF')- ,("ninecircle", '\x2468')- ,("ninecircleinversesansserif", '\x2792')- ,("ninedeva", '\x096F')- ,("ninegujarati", '\x0AEF')- ,("ninegurmukhi", '\x0A6F')- ,("ninehackarabic", '\x0669')- ,("ninehangzhou", '\x3029')- ,("nineideographicparen", '\x3228')- ,("nineinferior", '\x2089')- ,("ninemonospace", '\xFF19')- ,("nineoldstyle", '\xF739')- ,("nineparen", '\x247C')- ,("nineperiod", '\x2490')- ,("ninepersian", '\x06F9')- ,("nineroman", '\x2178')- ,("ninesuperior", '\x2079')- ,("nineteencircle", '\x2472')- ,("nineteenparen", '\x2486')- ,("nineteenperiod", '\x249A')- ,("ninethai", '\x0E59')- ,("nj", '\x01CC')- ,("njecyrillic", '\x045A')- ,("nkatakana", '\x30F3')- ,("nkatakanahalfwidth", '\xFF9D')- ,("nlegrightlong", '\x019E')- ,("nlinebelow", '\x1E49')- ,("nmonospace", '\xFF4E')- ,("nmsquare", '\x339A')- ,("nnabengali", '\x09A3')- ,("nnadeva", '\x0923')- ,("nnagujarati", '\x0AA3')- ,("nnagurmukhi", '\x0A23')- ,("nnnadeva", '\x0929')- ,("nohiragana", '\x306E')- ,("nokatakana", '\x30CE')- ,("nokatakanahalfwidth", '\xFF89')- ,("nonbreakingspace", '\x00A0')- ,("nonenthai", '\x0E13')- ,("nonuthai", '\x0E19')- ,("noonarabic", '\x0646')- ,("noonfinalarabic", '\xFEE6')- ,("noonghunnaarabic", '\x06BA')- ,("noonghunnafinalarabic", '\xFB9F')- ,("noonhehinitialarabic", '\xFEE7')- ,("nooninitialarabic", '\xFEE7')- ,("noonjeeminitialarabic", '\xFCD2')- ,("noonjeemisolatedarabic", '\xFC4B')- ,("noonmedialarabic", '\xFEE8')- ,("noonmeeminitialarabic", '\xFCD5')- ,("noonmeemisolatedarabic", '\xFC4E')- ,("noonnoonfinalarabic", '\xFC8D')- ,("notcontains", '\x220C')- ,("notelement", '\x2209')- ,("notelementof", '\x2209')- ,("notequal", '\x2260')- ,("notgreater", '\x226F')- ,("notgreaternorequal", '\x2271')- ,("notgreaternorless", '\x2279')- ,("notidentical", '\x2262')- ,("notless", '\x226E')- ,("notlessnorequal", '\x2270')- ,("notparallel", '\x2226')- ,("notprecedes", '\x2280')- ,("notsubset", '\x2284')- ,("notsucceeds", '\x2281')- ,("notsuperset", '\x2285')- ,("nowarmenian", '\x0576')- ,("nparen", '\x24A9')- ,("nssquare", '\x33B1')- ,("nsuperior", '\x207F')- ,("ntilde", '\x00F1')- ,("nu", '\x03BD')- ,("nuhiragana", '\x306C')- ,("nukatakana", '\x30CC')- ,("nukatakanahalfwidth", '\xFF87')- ,("nuktabengali", '\x09BC')- ,("nuktadeva", '\x093C')- ,("nuktagujarati", '\x0ABC')- ,("nuktagurmukhi", '\x0A3C')- ,("numbersign", '\x0023')- ,("numbersignmonospace", '\xFF03')- ,("numbersignsmall", '\xFE5F')- ,("numeralsigngreek", '\x0374')- ,("numeralsignlowergreek", '\x0375')- ,("numero", '\x2116')- ,("nun", '\x05E0')- ,("nundagesh", '\xFB40')- ,("nundageshhebrew", '\xFB40')- ,("nunhebrew", '\x05E0')- ,("nvsquare", '\x33B5')- ,("nwsquare", '\x33BB')- ,("nyabengali", '\x099E')- ,("nyadeva", '\x091E')- ,("nyagujarati", '\x0A9E')- ,("nyagurmukhi", '\x0A1E')- ,("o", '\x006F')- ,("oacute", '\x00F3')- ,("oangthai", '\x0E2D')- ,("obarred", '\x0275')- ,("obarredcyrillic", '\x04E9')- ,("obarreddieresiscyrillic", '\x04EB')- ,("obengali", '\x0993')- ,("obopomofo", '\x311B')- ,("obreve", '\x014F')- ,("ocandradeva", '\x0911')- ,("ocandragujarati", '\x0A91')- ,("ocandravowelsigndeva", '\x0949')- ,("ocandravowelsigngujarati", '\x0AC9')- ,("ocaron", '\x01D2')- ,("ocircle", '\x24DE')- ,("ocircumflex", '\x00F4')- ,("ocircumflexacute", '\x1ED1')- ,("ocircumflexdotbelow", '\x1ED9')- ,("ocircumflexgrave", '\x1ED3')- ,("ocircumflexhookabove", '\x1ED5')- ,("ocircumflextilde", '\x1ED7')- ,("ocyrillic", '\x043E')- ,("odblacute", '\x0151')- ,("odblgrave", '\x020D')- ,("odeva", '\x0913')- ,("odieresis", '\x00F6')- ,("odieresiscyrillic", '\x04E7')- ,("odotbelow", '\x1ECD')- ,("oe", '\x0153')- ,("oekorean", '\x315A')- ,("ogonek", '\x02DB')- ,("ogonekcmb", '\x0328')- ,("ograve", '\x00F2')- ,("ogujarati", '\x0A93')- ,("oharmenian", '\x0585')- ,("ohiragana", '\x304A')- ,("ohookabove", '\x1ECF')- ,("ohorn", '\x01A1')- ,("ohornacute", '\x1EDB')- ,("ohorndotbelow", '\x1EE3')- ,("ohorngrave", '\x1EDD')- ,("ohornhookabove", '\x1EDF')- ,("ohorntilde", '\x1EE1')- ,("ohungarumlaut", '\x0151')- ,("oi", '\x01A3')- ,("oinvertedbreve", '\x020F')- ,("okatakana", '\x30AA')- ,("okatakanahalfwidth", '\xFF75')- ,("okorean", '\x3157')- ,("olehebrew", '\x05AB')- ,("omacron", '\x014D')- ,("omacronacute", '\x1E53')- ,("omacrongrave", '\x1E51')- ,("omdeva", '\x0950')- ,("omega", '\x03C9')- ,("omega1", '\x03D6')- ,("omegacyrillic", '\x0461')- ,("omegalatinclosed", '\x0277')- ,("omegaroundcyrillic", '\x047B')- ,("omegatitlocyrillic", '\x047D')- ,("omegatonos", '\x03CE')- ,("omgujarati", '\x0AD0')- ,("omicron", '\x03BF')- ,("omicrontonos", '\x03CC')- ,("omonospace", '\xFF4F')- ,("one", '\x0031')- ,("onearabic", '\x0661')- ,("onebengali", '\x09E7')- ,("onecircle", '\x2460')- ,("onecircleinversesansserif", '\x278A')- ,("onedeva", '\x0967')- ,("onedotenleader", '\x2024')- ,("oneeighth", '\x215B')- ,("onefitted", '\xF6DC')- ,("onegujarati", '\x0AE7')- ,("onegurmukhi", '\x0A67')- ,("onehackarabic", '\x0661')- ,("onehalf", '\x00BD')- ,("onehangzhou", '\x3021')- ,("oneideographicparen", '\x3220')- ,("oneinferior", '\x2081')- ,("onemonospace", '\xFF11')- ,("onenumeratorbengali", '\x09F4')- ,("oneoldstyle", '\xF731')- ,("oneparen", '\x2474')- ,("oneperiod", '\x2488')- ,("onepersian", '\x06F1')- ,("onequarter", '\x00BC')- ,("oneroman", '\x2170')- ,("onesuperior", '\x00B9')- ,("onethai", '\x0E51')- ,("onethird", '\x2153')- ,("oogonek", '\x01EB')- ,("oogonekmacron", '\x01ED')- ,("oogurmukhi", '\x0A13')- ,("oomatragurmukhi", '\x0A4B')- ,("oopen", '\x0254')- ,("oparen", '\x24AA')- ,("openbullet", '\x25E6')- ,("option", '\x2325')- ,("ordfeminine", '\x00AA')- ,("ordmasculine", '\x00BA')- ,("orthogonal", '\x221F')- ,("oshortdeva", '\x0912')- ,("oshortvowelsigndeva", '\x094A')- ,("oslash", '\x00F8')- ,("oslashacute", '\x01FF')- ,("osmallhiragana", '\x3049')- ,("osmallkatakana", '\x30A9')- ,("osmallkatakanahalfwidth", '\xFF6B')- ,("ostrokeacute", '\x01FF')- ,("osuperior", '\xF6F0')- ,("otcyrillic", '\x047F')- ,("otilde", '\x00F5')- ,("otildeacute", '\x1E4D')- ,("otildedieresis", '\x1E4F')- ,("oubopomofo", '\x3121')- ,("overline", '\x203E')- ,("overlinecenterline", '\xFE4A')- ,("overlinecmb", '\x0305')- ,("overlinedashed", '\xFE49')- ,("overlinedblwavy", '\xFE4C')- ,("overlinewavy", '\xFE4B')- ,("overscore", '\x00AF')- ,("ovowelsignbengali", '\x09CB')- ,("ovowelsigndeva", '\x094B')- ,("ovowelsigngujarati", '\x0ACB')- ,("p", '\x0070')- ,("paampssquare", '\x3380')- ,("paasentosquare", '\x332B')- ,("pabengali", '\x09AA')- ,("pacute", '\x1E55')- ,("padeva", '\x092A')- ,("pagedown", '\x21DF')- ,("pageup", '\x21DE')- ,("pagujarati", '\x0AAA')- ,("pagurmukhi", '\x0A2A')- ,("pahiragana", '\x3071')- ,("paiyannoithai", '\x0E2F')- ,("pakatakana", '\x30D1')- ,("palatalizationcyrilliccmb", '\x0484')- ,("palochkacyrillic", '\x04C0')- ,("pansioskorean", '\x317F')- ,("paragraph", '\x00B6')- ,("parallel", '\x2225')- ,("parenleft", '\x0028')- ,("parenleftaltonearabic", '\xFD3E')- ,("parenleftbt", '\xF8ED')- ,("parenleftex", '\xF8EC')- ,("parenleftinferior", '\x208D')- ,("parenleftmonospace", '\xFF08')- ,("parenleftsmall", '\xFE59')- ,("parenleftsuperior", '\x207D')- ,("parenlefttp", '\xF8EB')- ,("parenleftvertical", '\xFE35')- ,("parenright", '\x0029')- ,("parenrightaltonearabic", '\xFD3F')- ,("parenrightbt", '\xF8F8')- ,("parenrightex", '\xF8F7')- ,("parenrightinferior", '\x208E')- ,("parenrightmonospace", '\xFF09')- ,("parenrightsmall", '\xFE5A')- ,("parenrightsuperior", '\x207E')- ,("parenrighttp", '\xF8F6')- ,("parenrightvertical", '\xFE36')- ,("partialdiff", '\x2202')- ,("paseqhebrew", '\x05C0')- ,("pashtahebrew", '\x0599')- ,("pasquare", '\x33A9')- ,("patah", '\x05B7')- ,("patah11", '\x05B7')- ,("patah1d", '\x05B7')- ,("patah2a", '\x05B7')- ,("patahhebrew", '\x05B7')- ,("patahnarrowhebrew", '\x05B7')- ,("patahquarterhebrew", '\x05B7')- ,("patahwidehebrew", '\x05B7')- ,("pazerhebrew", '\x05A1')- ,("pbopomofo", '\x3106')- ,("pcircle", '\x24DF')- ,("pdotaccent", '\x1E57')- ,("pe", '\x05E4')- ,("pecyrillic", '\x043F')- ,("pedagesh", '\xFB44')- ,("pedageshhebrew", '\xFB44')- ,("peezisquare", '\x333B')- ,("pefinaldageshhebrew", '\xFB43')- ,("peharabic", '\x067E')- ,("peharmenian", '\x057A')- ,("pehebrew", '\x05E4')- ,("pehfinalarabic", '\xFB57')- ,("pehinitialarabic", '\xFB58')- ,("pehiragana", '\x307A')- ,("pehmedialarabic", '\xFB59')- ,("pekatakana", '\x30DA')- ,("pemiddlehookcyrillic", '\x04A7')- ,("perafehebrew", '\xFB4E')- ,("percent", '\x0025')- ,("percentarabic", '\x066A')- ,("percentmonospace", '\xFF05')- ,("percentsmall", '\xFE6A')- ,("period", '\x002E')- ,("periodarmenian", '\x0589')- ,("periodcentered", '\x00B7')- ,("periodhalfwidth", '\xFF61')- ,("periodinferior", '\xF6E7')- ,("periodmonospace", '\xFF0E')- ,("periodsmall", '\xFE52')- ,("periodsuperior", '\xF6E8')- ,("perispomenigreekcmb", '\x0342')- ,("perpendicular", '\x22A5')- ,("perthousand", '\x2030')- ,("peseta", '\x20A7')- ,("pfsquare", '\x338A')- ,("phabengali", '\x09AB')- ,("phadeva", '\x092B')- ,("phagujarati", '\x0AAB')- ,("phagurmukhi", '\x0A2B')- ,("phi", '\x03C6')- ,("phi1", '\x03D5')- ,("phieuphacirclekorean", '\x327A')- ,("phieuphaparenkorean", '\x321A')- ,("phieuphcirclekorean", '\x326C')- ,("phieuphkorean", '\x314D')- ,("phieuphparenkorean", '\x320C')- ,("philatin", '\x0278')- ,("phinthuthai", '\x0E3A')- ,("phisymbolgreek", '\x03D5')- ,("phook", '\x01A5')- ,("phophanthai", '\x0E1E')- ,("phophungthai", '\x0E1C')- ,("phosamphaothai", '\x0E20')- ,("pi", '\x03C0')- ,("pieupacirclekorean", '\x3273')- ,("pieupaparenkorean", '\x3213')- ,("pieupcieuckorean", '\x3176')- ,("pieupcirclekorean", '\x3265')- ,("pieupkiyeokkorean", '\x3172')- ,("pieupkorean", '\x3142')- ,("pieupparenkorean", '\x3205')- ,("pieupsioskiyeokkorean", '\x3174')- ,("pieupsioskorean", '\x3144')- ,("pieupsiostikeutkorean", '\x3175')- ,("pieupthieuthkorean", '\x3177')- ,("pieuptikeutkorean", '\x3173')- ,("pihiragana", '\x3074')- ,("pikatakana", '\x30D4')- ,("pisymbolgreek", '\x03D6')- ,("piwrarmenian", '\x0583')- ,("plus", '\x002B')- ,("plusbelowcmb", '\x031F')- ,("pluscircle", '\x2295')- ,("plusminus", '\x00B1')- ,("plusmod", '\x02D6')- ,("plusmonospace", '\xFF0B')- ,("plussmall", '\xFE62')- ,("plussuperior", '\x207A')- ,("pmonospace", '\xFF50')- ,("pmsquare", '\x33D8')- ,("pohiragana", '\x307D')- ,("pointingindexdownwhite", '\x261F')- ,("pointingindexleftwhite", '\x261C')- ,("pointingindexrightwhite", '\x261E')- ,("pointingindexupwhite", '\x261D')- ,("pokatakana", '\x30DD')- ,("poplathai", '\x0E1B')- ,("postalmark", '\x3012')- ,("postalmarkface", '\x3020')- ,("pparen", '\x24AB')- ,("precedes", '\x227A')- ,("prescription", '\x211E')- ,("primemod", '\x02B9')- ,("primereversed", '\x2035')- ,("product", '\x220F')- ,("projective", '\x2305')- ,("prolongedkana", '\x30FC')- ,("propellor", '\x2318')- ,("propersubset", '\x2282')- ,("propersuperset", '\x2283')- ,("proportion", '\x2237')- ,("proportional", '\x221D')- ,("psi", '\x03C8')- ,("psicyrillic", '\x0471')- ,("psilipneumatacyrilliccmb", '\x0486')- ,("pssquare", '\x33B0')- ,("puhiragana", '\x3077')- ,("pukatakana", '\x30D7')- ,("pvsquare", '\x33B4')- ,("pwsquare", '\x33BA')- ,("q", '\x0071')- ,("qadeva", '\x0958')- ,("qadmahebrew", '\x05A8')- ,("qafarabic", '\x0642')- ,("qaffinalarabic", '\xFED6')- ,("qafinitialarabic", '\xFED7')- ,("qafmedialarabic", '\xFED8')- ,("qamats", '\x05B8')- ,("qamats10", '\x05B8')- ,("qamats1a", '\x05B8')- ,("qamats1c", '\x05B8')- ,("qamats27", '\x05B8')- ,("qamats29", '\x05B8')- ,("qamats33", '\x05B8')- ,("qamatsde", '\x05B8')- ,("qamatshebrew", '\x05B8')- ,("qamatsnarrowhebrew", '\x05B8')- ,("qamatsqatanhebrew", '\x05B8')- ,("qamatsqatannarrowhebrew", '\x05B8')- ,("qamatsqatanquarterhebrew", '\x05B8')- ,("qamatsqatanwidehebrew", '\x05B8')- ,("qamatsquarterhebrew", '\x05B8')- ,("qamatswidehebrew", '\x05B8')- ,("qarneyparahebrew", '\x059F')- ,("qbopomofo", '\x3111')- ,("qcircle", '\x24E0')- ,("qhook", '\x02A0')- ,("qmonospace", '\xFF51')- ,("qof", '\x05E7')- ,("qofdagesh", '\xFB47')- ,("qofdageshhebrew", '\xFB47')- ,("qofhatafpatah", '\x05E7')- ,("qofhatafpatahhebrew", '\x05E7')- ,("qofhatafsegol", '\x05E7')- ,("qofhatafsegolhebrew", '\x05E7')- ,("qofhebrew", '\x05E7')- ,("qofhiriq", '\x05E7')- ,("qofhiriqhebrew", '\x05E7')- ,("qofholam", '\x05E7')- ,("qofholamhebrew", '\x05E7')- ,("qofpatah", '\x05E7')- ,("qofpatahhebrew", '\x05E7')- ,("qofqamats", '\x05E7')- ,("qofqamatshebrew", '\x05E7')- ,("qofqubuts", '\x05E7')- ,("qofqubutshebrew", '\x05E7')- ,("qofsegol", '\x05E7')- ,("qofsegolhebrew", '\x05E7')- ,("qofsheva", '\x05E7')- ,("qofshevahebrew", '\x05E7')- ,("qoftsere", '\x05E7')- ,("qoftserehebrew", '\x05E7')- ,("qparen", '\x24AC')- ,("quarternote", '\x2669')- ,("qubuts", '\x05BB')- ,("qubuts18", '\x05BB')- ,("qubuts25", '\x05BB')- ,("qubuts31", '\x05BB')- ,("qubutshebrew", '\x05BB')- ,("qubutsnarrowhebrew", '\x05BB')- ,("qubutsquarterhebrew", '\x05BB')- ,("qubutswidehebrew", '\x05BB')- ,("question", '\x003F')- ,("questionarabic", '\x061F')- ,("questionarmenian", '\x055E')- ,("questiondown", '\x00BF')- ,("questiondownsmall", '\xF7BF')- ,("questiongreek", '\x037E')- ,("questionmonospace", '\xFF1F')- ,("questionsmall", '\xF73F')- ,("quotedbl", '\x0022')- ,("quotedblbase", '\x201E')- ,("quotedblleft", '\x201C')- ,("quotedblmonospace", '\xFF02')- ,("quotedblprime", '\x301E')- ,("quotedblprimereversed", '\x301D')- ,("quotedblright", '\x201D')- ,("quoteleft", '\x2018')- ,("quoteleftreversed", '\x201B')- ,("quotereversed", '\x201B')- ,("quoteright", '\x2019')- ,("quoterightn", '\x0149')- ,("quotesinglbase", '\x201A')- ,("quotesingle", '\x0027')- ,("quotesinglemonospace", '\xFF07')- ,("r", '\x0072')- ,("raarmenian", '\x057C')- ,("rabengali", '\x09B0')- ,("racute", '\x0155')- ,("radeva", '\x0930')- ,("radical", '\x221A')- ,("radicalex", '\xF8E5')- ,("radoverssquare", '\x33AE')- ,("radoverssquaredsquare", '\x33AF')- ,("radsquare", '\x33AD')- ,("rafe", '\x05BF')- ,("rafehebrew", '\x05BF')- ,("ragujarati", '\x0AB0')- ,("ragurmukhi", '\x0A30')- ,("rahiragana", '\x3089')- ,("rakatakana", '\x30E9')- ,("rakatakanahalfwidth", '\xFF97')- ,("ralowerdiagonalbengali", '\x09F1')- ,("ramiddlediagonalbengali", '\x09F0')- ,("ramshorn", '\x0264')- ,("ratio", '\x2236')- ,("rbopomofo", '\x3116')- ,("rcaron", '\x0159')- ,("rcedilla", '\x0157')- ,("rcircle", '\x24E1')- ,("rcommaaccent", '\x0157')- ,("rdblgrave", '\x0211')- ,("rdotaccent", '\x1E59')- ,("rdotbelow", '\x1E5B')- ,("rdotbelowmacron", '\x1E5D')- ,("referencemark", '\x203B')- ,("reflexsubset", '\x2286')- ,("reflexsuperset", '\x2287')- ,("registered", '\x00AE')- ,("registersans", '\xF8E8')- ,("registerserif", '\xF6DA')- ,("reharabic", '\x0631')- ,("reharmenian", '\x0580')- ,("rehfinalarabic", '\xFEAE')- ,("rehiragana", '\x308C')- ,("rehyehaleflamarabic", '\x0631')- ,("rekatakana", '\x30EC')- ,("rekatakanahalfwidth", '\xFF9A')- ,("resh", '\x05E8')- ,("reshdageshhebrew", '\xFB48')- ,("reshhatafpatah", '\x05E8')- ,("reshhatafpatahhebrew", '\x05E8')- ,("reshhatafsegol", '\x05E8')- ,("reshhatafsegolhebrew", '\x05E8')- ,("reshhebrew", '\x05E8')- ,("reshhiriq", '\x05E8')- ,("reshhiriqhebrew", '\x05E8')- ,("reshholam", '\x05E8')- ,("reshholamhebrew", '\x05E8')- ,("reshpatah", '\x05E8')- ,("reshpatahhebrew", '\x05E8')- ,("reshqamats", '\x05E8')- ,("reshqamatshebrew", '\x05E8')- ,("reshqubuts", '\x05E8')- ,("reshqubutshebrew", '\x05E8')- ,("reshsegol", '\x05E8')- ,("reshsegolhebrew", '\x05E8')- ,("reshsheva", '\x05E8')- ,("reshshevahebrew", '\x05E8')- ,("reshtsere", '\x05E8')- ,("reshtserehebrew", '\x05E8')- ,("reversedtilde", '\x223D')- ,("reviahebrew", '\x0597')- ,("reviamugrashhebrew", '\x0597')- ,("revlogicalnot", '\x2310')- ,("rfishhook", '\x027E')- ,("rfishhookreversed", '\x027F')- ,("rhabengali", '\x09DD')- ,("rhadeva", '\x095D')- ,("rho", '\x03C1')- ,("rhook", '\x027D')- ,("rhookturned", '\x027B')- ,("rhookturnedsuperior", '\x02B5')- ,("rhosymbolgreek", '\x03F1')- ,("rhotichookmod", '\x02DE')- ,("rieulacirclekorean", '\x3271')- ,("rieulaparenkorean", '\x3211')- ,("rieulcirclekorean", '\x3263')- ,("rieulhieuhkorean", '\x3140')- ,("rieulkiyeokkorean", '\x313A')- ,("rieulkiyeoksioskorean", '\x3169')- ,("rieulkorean", '\x3139')- ,("rieulmieumkorean", '\x313B')- ,("rieulpansioskorean", '\x316C')- ,("rieulparenkorean", '\x3203')- ,("rieulphieuphkorean", '\x313F')- ,("rieulpieupkorean", '\x313C')- ,("rieulpieupsioskorean", '\x316B')- ,("rieulsioskorean", '\x313D')- ,("rieulthieuthkorean", '\x313E')- ,("rieultikeutkorean", '\x316A')- ,("rieulyeorinhieuhkorean", '\x316D')- ,("rightangle", '\x221F')- ,("righttackbelowcmb", '\x0319')- ,("righttriangle", '\x22BF')- ,("rihiragana", '\x308A')- ,("rikatakana", '\x30EA')- ,("rikatakanahalfwidth", '\xFF98')- ,("ring", '\x02DA')- ,("ringbelowcmb", '\x0325')- ,("ringcmb", '\x030A')- ,("ringhalfleft", '\x02BF')- ,("ringhalfleftarmenian", '\x0559')- ,("ringhalfleftbelowcmb", '\x031C')- ,("ringhalfleftcentered", '\x02D3')- ,("ringhalfright", '\x02BE')- ,("ringhalfrightbelowcmb", '\x0339')- ,("ringhalfrightcentered", '\x02D2')- ,("rinvertedbreve", '\x0213')- ,("rittorusquare", '\x3351')- ,("rlinebelow", '\x1E5F')- ,("rlongleg", '\x027C')- ,("rlonglegturned", '\x027A')- ,("rmonospace", '\xFF52')- ,("rohiragana", '\x308D')- ,("rokatakana", '\x30ED')- ,("rokatakanahalfwidth", '\xFF9B')- ,("roruathai", '\x0E23')- ,("rparen", '\x24AD')- ,("rrabengali", '\x09DC')- ,("rradeva", '\x0931')- ,("rragurmukhi", '\x0A5C')- ,("rreharabic", '\x0691')- ,("rrehfinalarabic", '\xFB8D')- ,("rrvocalicbengali", '\x09E0')- ,("rrvocalicdeva", '\x0960')- ,("rrvocalicgujarati", '\x0AE0')- ,("rrvocalicvowelsignbengali", '\x09C4')- ,("rrvocalicvowelsigndeva", '\x0944')- ,("rrvocalicvowelsigngujarati", '\x0AC4')- ,("rsuperior", '\xF6F1')- ,("rtblock", '\x2590')- ,("rturned", '\x0279')- ,("rturnedsuperior", '\x02B4')- ,("ruhiragana", '\x308B')- ,("rukatakana", '\x30EB')- ,("rukatakanahalfwidth", '\xFF99')- ,("rupeemarkbengali", '\x09F2')- ,("rupeesignbengali", '\x09F3')- ,("rupiah", '\xF6DD')- ,("ruthai", '\x0E24')- ,("rvocalicbengali", '\x098B')- ,("rvocalicdeva", '\x090B')- ,("rvocalicgujarati", '\x0A8B')- ,("rvocalicvowelsignbengali", '\x09C3')- ,("rvocalicvowelsigndeva", '\x0943')- ,("rvocalicvowelsigngujarati", '\x0AC3')- ,("s", '\x0073')- ,("sabengali", '\x09B8')- ,("sacute", '\x015B')- ,("sacutedotaccent", '\x1E65')- ,("sadarabic", '\x0635')- ,("sadeva", '\x0938')- ,("sadfinalarabic", '\xFEBA')- ,("sadinitialarabic", '\xFEBB')- ,("sadmedialarabic", '\xFEBC')- ,("sagujarati", '\x0AB8')- ,("sagurmukhi", '\x0A38')- ,("sahiragana", '\x3055')- ,("sakatakana", '\x30B5')- ,("sakatakanahalfwidth", '\xFF7B')- ,("sallallahoualayhewasallamarabic", '\xFDFA')- ,("samekh", '\x05E1')- ,("samekhdagesh", '\xFB41')- ,("samekhdageshhebrew", '\xFB41')- ,("samekhhebrew", '\x05E1')- ,("saraaathai", '\x0E32')- ,("saraaethai", '\x0E41')- ,("saraaimaimalaithai", '\x0E44')- ,("saraaimaimuanthai", '\x0E43')- ,("saraamthai", '\x0E33')- ,("saraathai", '\x0E30')- ,("saraethai", '\x0E40')- ,("saraiileftthai", '\xF886')- ,("saraiithai", '\x0E35')- ,("saraileftthai", '\xF885')- ,("saraithai", '\x0E34')- ,("saraothai", '\x0E42')- ,("saraueeleftthai", '\xF888')- ,("saraueethai", '\x0E37')- ,("saraueleftthai", '\xF887')- ,("sarauethai", '\x0E36')- ,("sarauthai", '\x0E38')- ,("sarauuthai", '\x0E39')- ,("sbopomofo", '\x3119')- ,("scaron", '\x0161')- ,("scarondotaccent", '\x1E67')- ,("scedilla", '\x015F')- ,("schwa", '\x0259')- ,("schwacyrillic", '\x04D9')- ,("schwadieresiscyrillic", '\x04DB')- ,("schwahook", '\x025A')- ,("scircle", '\x24E2')- ,("scircumflex", '\x015D')- ,("scommaaccent", '\x0219')- ,("sdotaccent", '\x1E61')- ,("sdotbelow", '\x1E63')- ,("sdotbelowdotaccent", '\x1E69')- ,("seagullbelowcmb", '\x033C')- ,("second", '\x2033')- ,("secondtonechinese", '\x02CA')- ,("section", '\x00A7')- ,("seenarabic", '\x0633')- ,("seenfinalarabic", '\xFEB2')- ,("seeninitialarabic", '\xFEB3')- ,("seenmedialarabic", '\xFEB4')- ,("segol", '\x05B6')- ,("segol13", '\x05B6')- ,("segol1f", '\x05B6')- ,("segol2c", '\x05B6')- ,("segolhebrew", '\x05B6')- ,("segolnarrowhebrew", '\x05B6')- ,("segolquarterhebrew", '\x05B6')- ,("segoltahebrew", '\x0592')- ,("segolwidehebrew", '\x05B6')- ,("seharmenian", '\x057D')- ,("sehiragana", '\x305B')- ,("sekatakana", '\x30BB')- ,("sekatakanahalfwidth", '\xFF7E')- ,("semicolon", '\x003B')- ,("semicolonarabic", '\x061B')- ,("semicolonmonospace", '\xFF1B')- ,("semicolonsmall", '\xFE54')- ,("semivoicedmarkkana", '\x309C')- ,("semivoicedmarkkanahalfwidth", '\xFF9F')- ,("sentisquare", '\x3322')- ,("sentosquare", '\x3323')- ,("seven", '\x0037')- ,("sevenarabic", '\x0667')- ,("sevenbengali", '\x09ED')- ,("sevencircle", '\x2466')- ,("sevencircleinversesansserif", '\x2790')- ,("sevendeva", '\x096D')- ,("seveneighths", '\x215E')- ,("sevengujarati", '\x0AED')- ,("sevengurmukhi", '\x0A6D')- ,("sevenhackarabic", '\x0667')- ,("sevenhangzhou", '\x3027')- ,("sevenideographicparen", '\x3226')- ,("seveninferior", '\x2087')- ,("sevenmonospace", '\xFF17')- ,("sevenoldstyle", '\xF737')- ,("sevenparen", '\x247A')- ,("sevenperiod", '\x248E')- ,("sevenpersian", '\x06F7')- ,("sevenroman", '\x2176')- ,("sevensuperior", '\x2077')- ,("seventeencircle", '\x2470')- ,("seventeenparen", '\x2484')- ,("seventeenperiod", '\x2498')- ,("seventhai", '\x0E57')- ,("sfthyphen", '\x00AD')- ,("shaarmenian", '\x0577')- ,("shabengali", '\x09B6')- ,("shacyrillic", '\x0448')- ,("shaddaarabic", '\x0651')- ,("shaddadammaarabic", '\xFC61')- ,("shaddadammatanarabic", '\xFC5E')- ,("shaddafathaarabic", '\xFC60')- ,("shaddafathatanarabic", '\x0651')- ,("shaddakasraarabic", '\xFC62')- ,("shaddakasratanarabic", '\xFC5F')- ,("shade", '\x2592')- ,("shadedark", '\x2593')- ,("shadelight", '\x2591')- ,("shademedium", '\x2592')- ,("shadeva", '\x0936')- ,("shagujarati", '\x0AB6')- ,("shagurmukhi", '\x0A36')- ,("shalshelethebrew", '\x0593')- ,("shbopomofo", '\x3115')- ,("shchacyrillic", '\x0449')- ,("sheenarabic", '\x0634')- ,("sheenfinalarabic", '\xFEB6')- ,("sheeninitialarabic", '\xFEB7')- ,("sheenmedialarabic", '\xFEB8')- ,("sheicoptic", '\x03E3')- ,("sheqel", '\x20AA')- ,("sheqelhebrew", '\x20AA')- ,("sheva", '\x05B0')- ,("sheva115", '\x05B0')- ,("sheva15", '\x05B0')- ,("sheva22", '\x05B0')- ,("sheva2e", '\x05B0')- ,("shevahebrew", '\x05B0')- ,("shevanarrowhebrew", '\x05B0')- ,("shevaquarterhebrew", '\x05B0')- ,("shevawidehebrew", '\x05B0')- ,("shhacyrillic", '\x04BB')- ,("shimacoptic", '\x03ED')- ,("shin", '\x05E9')- ,("shindagesh", '\xFB49')- ,("shindageshhebrew", '\xFB49')- ,("shindageshshindot", '\xFB2C')- ,("shindageshshindothebrew", '\xFB2C')- ,("shindageshsindot", '\xFB2D')- ,("shindageshsindothebrew", '\xFB2D')- ,("shindothebrew", '\x05C1')- ,("shinhebrew", '\x05E9')- ,("shinshindot", '\xFB2A')- ,("shinshindothebrew", '\xFB2A')- ,("shinsindot", '\xFB2B')- ,("shinsindothebrew", '\xFB2B')- ,("shook", '\x0282')- ,("sigma", '\x03C3')- ,("sigma1", '\x03C2')- ,("sigmafinal", '\x03C2')- ,("sigmalunatesymbolgreek", '\x03F2')- ,("sihiragana", '\x3057')- ,("sikatakana", '\x30B7')- ,("sikatakanahalfwidth", '\xFF7C')- ,("siluqhebrew", '\x05BD')- ,("siluqlefthebrew", '\x05BD')- ,("similar", '\x223C')- ,("sindothebrew", '\x05C2')- ,("siosacirclekorean", '\x3274')- ,("siosaparenkorean", '\x3214')- ,("sioscieuckorean", '\x317E')- ,("sioscirclekorean", '\x3266')- ,("sioskiyeokkorean", '\x317A')- ,("sioskorean", '\x3145')- ,("siosnieunkorean", '\x317B')- ,("siosparenkorean", '\x3206')- ,("siospieupkorean", '\x317D')- ,("siostikeutkorean", '\x317C')- ,("six", '\x0036')- ,("sixarabic", '\x0666')- ,("sixbengali", '\x09EC')- ,("sixcircle", '\x2465')- ,("sixcircleinversesansserif", '\x278F')- ,("sixdeva", '\x096C')- ,("sixgujarati", '\x0AEC')- ,("sixgurmukhi", '\x0A6C')- ,("sixhackarabic", '\x0666')- ,("sixhangzhou", '\x3026')- ,("sixideographicparen", '\x3225')- ,("sixinferior", '\x2086')- ,("sixmonospace", '\xFF16')- ,("sixoldstyle", '\xF736')- ,("sixparen", '\x2479')- ,("sixperiod", '\x248D')- ,("sixpersian", '\x06F6')- ,("sixroman", '\x2175')- ,("sixsuperior", '\x2076')- ,("sixteencircle", '\x246F')- ,("sixteencurrencydenominatorbengali", '\x09F9')- ,("sixteenparen", '\x2483')- ,("sixteenperiod", '\x2497')- ,("sixthai", '\x0E56')- ,("slash", '\x002F')- ,("slashmonospace", '\xFF0F')- ,("slong", '\x017F')- ,("slongdotaccent", '\x1E9B')- ,("smileface", '\x263A')- ,("smonospace", '\xFF53')- ,("sofpasuqhebrew", '\x05C3')- ,("softhyphen", '\x00AD')- ,("softsigncyrillic", '\x044C')- ,("sohiragana", '\x305D')- ,("sokatakana", '\x30BD')- ,("sokatakanahalfwidth", '\xFF7F')- ,("soliduslongoverlaycmb", '\x0338')- ,("solidusshortoverlaycmb", '\x0337')- ,("sorusithai", '\x0E29')- ,("sosalathai", '\x0E28')- ,("sosothai", '\x0E0B')- ,("sosuathai", '\x0E2A')- ,("space", '\x0020')- ,("spacehackarabic", '\x0020')- ,("spade", '\x2660')- ,("spadesuitblack", '\x2660')- ,("spadesuitwhite", '\x2664')- ,("sparen", '\x24AE')- ,("squarebelowcmb", '\x033B')- ,("squarecc", '\x33C4')- ,("squarecm", '\x339D')- ,("squarediagonalcrosshatchfill", '\x25A9')- ,("squarehorizontalfill", '\x25A4')- ,("squarekg", '\x338F')- ,("squarekm", '\x339E')- ,("squarekmcapital", '\x33CE')- ,("squareln", '\x33D1')- ,("squarelog", '\x33D2')- ,("squaremg", '\x338E')- ,("squaremil", '\x33D5')- ,("squaremm", '\x339C')- ,("squaremsquared", '\x33A1')- ,("squareorthogonalcrosshatchfill", '\x25A6')- ,("squareupperlefttolowerrightfill", '\x25A7')- ,("squareupperrighttolowerleftfill", '\x25A8')- ,("squareverticalfill", '\x25A5')- ,("squarewhitewithsmallblack", '\x25A3')- ,("srsquare", '\x33DB')- ,("ssabengali", '\x09B7')- ,("ssadeva", '\x0937')- ,("ssagujarati", '\x0AB7')- ,("ssangcieuckorean", '\x3149')- ,("ssanghieuhkorean", '\x3185')- ,("ssangieungkorean", '\x3180')- ,("ssangkiyeokkorean", '\x3132')- ,("ssangnieunkorean", '\x3165')- ,("ssangpieupkorean", '\x3143')- ,("ssangsioskorean", '\x3146')- ,("ssangtikeutkorean", '\x3138')- ,("ssuperior", '\xF6F2')- ,("sterling", '\x00A3')- ,("sterlingmonospace", '\xFFE1')- ,("strokelongoverlaycmb", '\x0336')- ,("strokeshortoverlaycmb", '\x0335')- ,("subset", '\x2282')- ,("subsetnotequal", '\x228A')- ,("subsetorequal", '\x2286')- ,("succeeds", '\x227B')- ,("suchthat", '\x220B')- ,("suhiragana", '\x3059')- ,("sukatakana", '\x30B9')- ,("sukatakanahalfwidth", '\xFF7D')- ,("sukunarabic", '\x0652')- ,("summation", '\x2211')- ,("sun", '\x263C')- ,("superset", '\x2283')- ,("supersetnotequal", '\x228B')- ,("supersetorequal", '\x2287')- ,("svsquare", '\x33DC')- ,("syouwaerasquare", '\x337C')- ,("t", '\x0074')- ,("tabengali", '\x09A4')- ,("tackdown", '\x22A4')- ,("tackleft", '\x22A3')- ,("tadeva", '\x0924')- ,("tagujarati", '\x0AA4')- ,("tagurmukhi", '\x0A24')- ,("taharabic", '\x0637')- ,("tahfinalarabic", '\xFEC2')- ,("tahinitialarabic", '\xFEC3')- ,("tahiragana", '\x305F')- ,("tahmedialarabic", '\xFEC4')- ,("taisyouerasquare", '\x337D')- ,("takatakana", '\x30BF')- ,("takatakanahalfwidth", '\xFF80')- ,("tatweelarabic", '\x0640')- ,("tau", '\x03C4')- ,("tav", '\x05EA')- ,("tavdages", '\xFB4A')- ,("tavdagesh", '\xFB4A')- ,("tavdageshhebrew", '\xFB4A')- ,("tavhebrew", '\x05EA')- ,("tbar", '\x0167')- ,("tbopomofo", '\x310A')- ,("tcaron", '\x0165')- ,("tccurl", '\x02A8')- ,("tcedilla", '\x0163')- ,("tcheharabic", '\x0686')- ,("tchehfinalarabic", '\xFB7B')- ,("tchehinitialarabic", '\xFB7C')- ,("tchehmedialarabic", '\xFB7D')- ,("tchehmeeminitialarabic", '\xFB7C')- ,("tcircle", '\x24E3')- ,("tcircumflexbelow", '\x1E71')- ,("tcommaaccent", '\x0163')- ,("tdieresis", '\x1E97')- ,("tdotaccent", '\x1E6B')- ,("tdotbelow", '\x1E6D')- ,("tecyrillic", '\x0442')- ,("tedescendercyrillic", '\x04AD')- ,("teharabic", '\x062A')- ,("tehfinalarabic", '\xFE96')- ,("tehhahinitialarabic", '\xFCA2')- ,("tehhahisolatedarabic", '\xFC0C')- ,("tehinitialarabic", '\xFE97')- ,("tehiragana", '\x3066')- ,("tehjeeminitialarabic", '\xFCA1')- ,("tehjeemisolatedarabic", '\xFC0B')- ,("tehmarbutaarabic", '\x0629')- ,("tehmarbutafinalarabic", '\xFE94')- ,("tehmedialarabic", '\xFE98')- ,("tehmeeminitialarabic", '\xFCA4')- ,("tehmeemisolatedarabic", '\xFC0E')- ,("tehnoonfinalarabic", '\xFC73')- ,("tekatakana", '\x30C6')- ,("tekatakanahalfwidth", '\xFF83')- ,("telephone", '\x2121')- ,("telephoneblack", '\x260E')- ,("telishagedolahebrew", '\x05A0')- ,("telishaqetanahebrew", '\x05A9')- ,("tencircle", '\x2469')- ,("tenideographicparen", '\x3229')- ,("tenparen", '\x247D')- ,("tenperiod", '\x2491')- ,("tenroman", '\x2179')- ,("tesh", '\x02A7')- ,("tet", '\x05D8')- ,("tetdagesh", '\xFB38')- ,("tetdageshhebrew", '\xFB38')- ,("tethebrew", '\x05D8')- ,("tetsecyrillic", '\x04B5')- ,("tevirhebrew", '\x059B')- ,("tevirlefthebrew", '\x059B')- ,("thabengali", '\x09A5')- ,("thadeva", '\x0925')- ,("thagujarati", '\x0AA5')- ,("thagurmukhi", '\x0A25')- ,("thalarabic", '\x0630')- ,("thalfinalarabic", '\xFEAC')- ,("thanthakhatlowleftthai", '\xF898')- ,("thanthakhatlowrightthai", '\xF897')- ,("thanthakhatthai", '\x0E4C')- ,("thanthakhatupperleftthai", '\xF896')- ,("theharabic", '\x062B')- ,("thehfinalarabic", '\xFE9A')- ,("thehinitialarabic", '\xFE9B')- ,("thehmedialarabic", '\xFE9C')- ,("thereexists", '\x2203')- ,("therefore", '\x2234')- ,("theta", '\x03B8')- ,("theta1", '\x03D1')- ,("thetasymbolgreek", '\x03D1')- ,("thieuthacirclekorean", '\x3279')- ,("thieuthaparenkorean", '\x3219')- ,("thieuthcirclekorean", '\x326B')- ,("thieuthkorean", '\x314C')- ,("thieuthparenkorean", '\x320B')- ,("thirteencircle", '\x246C')- ,("thirteenparen", '\x2480')- ,("thirteenperiod", '\x2494')- ,("thonangmonthothai", '\x0E11')- ,("thook", '\x01AD')- ,("thophuthaothai", '\x0E12')- ,("thorn", '\x00FE')- ,("thothahanthai", '\x0E17')- ,("thothanthai", '\x0E10')- ,("thothongthai", '\x0E18')- ,("thothungthai", '\x0E16')- ,("thousandcyrillic", '\x0482')- ,("thousandsseparatorarabic", '\x066C')- ,("thousandsseparatorpersian", '\x066C')- ,("three", '\x0033')- ,("threearabic", '\x0663')- ,("threebengali", '\x09E9')- ,("threecircle", '\x2462')- ,("threecircleinversesansserif", '\x278C')- ,("threedeva", '\x0969')- ,("threeeighths", '\x215C')- ,("threegujarati", '\x0AE9')- ,("threegurmukhi", '\x0A69')- ,("threehackarabic", '\x0663')- ,("threehangzhou", '\x3023')- ,("threeideographicparen", '\x3222')- ,("threeinferior", '\x2083')- ,("threemonospace", '\xFF13')- ,("threenumeratorbengali", '\x09F6')- ,("threeoldstyle", '\xF733')- ,("threeparen", '\x2476')- ,("threeperiod", '\x248A')- ,("threepersian", '\x06F3')- ,("threequarters", '\x00BE')- ,("threequartersemdash", '\xF6DE')- ,("threeroman", '\x2172')- ,("threesuperior", '\x00B3')- ,("threethai", '\x0E53')- ,("thzsquare", '\x3394')- ,("tihiragana", '\x3061')- ,("tikatakana", '\x30C1')- ,("tikatakanahalfwidth", '\xFF81')- ,("tikeutacirclekorean", '\x3270')- ,("tikeutaparenkorean", '\x3210')- ,("tikeutcirclekorean", '\x3262')- ,("tikeutkorean", '\x3137')- ,("tikeutparenkorean", '\x3202')- ,("tilde", '\x02DC')- ,("tildebelowcmb", '\x0330')- ,("tildecmb", '\x0303')- ,("tildecomb", '\x0303')- ,("tildedoublecmb", '\x0360')- ,("tildeoperator", '\x223C')- ,("tildeoverlaycmb", '\x0334')- ,("tildeverticalcmb", '\x033E')- ,("timescircle", '\x2297')- ,("tipehahebrew", '\x0596')- ,("tipehalefthebrew", '\x0596')- ,("tippigurmukhi", '\x0A70')- ,("titlocyrilliccmb", '\x0483')- ,("tiwnarmenian", '\x057F')- ,("tlinebelow", '\x1E6F')- ,("tmonospace", '\xFF54')- ,("toarmenian", '\x0569')- ,("tohiragana", '\x3068')- ,("tokatakana", '\x30C8')- ,("tokatakanahalfwidth", '\xFF84')- ,("tonebarextrahighmod", '\x02E5')- ,("tonebarextralowmod", '\x02E9')- ,("tonebarhighmod", '\x02E6')- ,("tonebarlowmod", '\x02E8')- ,("tonebarmidmod", '\x02E7')- ,("tonefive", '\x01BD')- ,("tonesix", '\x0185')- ,("tonetwo", '\x01A8')- ,("tonos", '\x0384')- ,("tonsquare", '\x3327')- ,("topatakthai", '\x0E0F')- ,("tortoiseshellbracketleft", '\x3014')- ,("tortoiseshellbracketleftsmall", '\xFE5D')- ,("tortoiseshellbracketleftvertical", '\xFE39')- ,("tortoiseshellbracketright", '\x3015')- ,("tortoiseshellbracketrightsmall", '\xFE5E')- ,("tortoiseshellbracketrightvertical", '\xFE3A')- ,("totaothai", '\x0E15')- ,("tpalatalhook", '\x01AB')- ,("tparen", '\x24AF')- ,("trademark", '\x2122')- ,("trademarksans", '\xF8EA')- ,("trademarkserif", '\xF6DB')- ,("tretroflexhook", '\x0288')- ,("triagdn", '\x25BC')- ,("triaglf", '\x25C4')- ,("triagrt", '\x25BA')- ,("triagup", '\x25B2')- ,("ts", '\x02A6')- ,("tsadi", '\x05E6')- ,("tsadidagesh", '\xFB46')- ,("tsadidageshhebrew", '\xFB46')- ,("tsadihebrew", '\x05E6')- ,("tsecyrillic", '\x0446')- ,("tsere", '\x05B5')- ,("tsere12", '\x05B5')- ,("tsere1e", '\x05B5')- ,("tsere2b", '\x05B5')- ,("tserehebrew", '\x05B5')- ,("tserenarrowhebrew", '\x05B5')- ,("tserequarterhebrew", '\x05B5')- ,("tserewidehebrew", '\x05B5')- ,("tshecyrillic", '\x045B')- ,("tsuperior", '\xF6F3')- ,("ttabengali", '\x099F')- ,("ttadeva", '\x091F')- ,("ttagujarati", '\x0A9F')- ,("ttagurmukhi", '\x0A1F')- ,("tteharabic", '\x0679')- ,("ttehfinalarabic", '\xFB67')- ,("ttehinitialarabic", '\xFB68')- ,("ttehmedialarabic", '\xFB69')- ,("tthabengali", '\x09A0')- ,("tthadeva", '\x0920')- ,("tthagujarati", '\x0AA0')- ,("tthagurmukhi", '\x0A20')- ,("tturned", '\x0287')- ,("tuhiragana", '\x3064')- ,("tukatakana", '\x30C4')- ,("tukatakanahalfwidth", '\xFF82')- ,("tusmallhiragana", '\x3063')- ,("tusmallkatakana", '\x30C3')- ,("tusmallkatakanahalfwidth", '\xFF6F')- ,("twelvecircle", '\x246B')- ,("twelveparen", '\x247F')- ,("twelveperiod", '\x2493')- ,("twelveroman", '\x217B')- ,("twentycircle", '\x2473')- ,("twentyhangzhou", '\x5344')- ,("twentyparen", '\x2487')- ,("twentyperiod", '\x249B')- ,("two", '\x0032')- ,("twoarabic", '\x0662')- ,("twobengali", '\x09E8')- ,("twocircle", '\x2461')- ,("twocircleinversesansserif", '\x278B')- ,("twodeva", '\x0968')- ,("twodotenleader", '\x2025')- ,("twodotleader", '\x2025')- ,("twodotleadervertical", '\xFE30')- ,("twogujarati", '\x0AE8')- ,("twogurmukhi", '\x0A68')- ,("twohackarabic", '\x0662')- ,("twohangzhou", '\x3022')- ,("twoideographicparen", '\x3221')- ,("twoinferior", '\x2082')- ,("twomonospace", '\xFF12')- ,("twonumeratorbengali", '\x09F5')- ,("twooldstyle", '\xF732')- ,("twoparen", '\x2475')- ,("twoperiod", '\x2489')- ,("twopersian", '\x06F2')- ,("tworoman", '\x2171')- ,("twostroke", '\x01BB')- ,("twosuperior", '\x00B2')- ,("twothai", '\x0E52')- ,("twothirds", '\x2154')- ,("u", '\x0075')- ,("uacute", '\x00FA')- ,("ubar", '\x0289')- ,("ubengali", '\x0989')- ,("ubopomofo", '\x3128')- ,("ubreve", '\x016D')- ,("ucaron", '\x01D4')- ,("ucircle", '\x24E4')- ,("ucircumflex", '\x00FB')- ,("ucircumflexbelow", '\x1E77')- ,("ucyrillic", '\x0443')- ,("udattadeva", '\x0951')- ,("udblacute", '\x0171')- ,("udblgrave", '\x0215')- ,("udeva", '\x0909')- ,("udieresis", '\x00FC')- ,("udieresisacute", '\x01D8')- ,("udieresisbelow", '\x1E73')- ,("udieresiscaron", '\x01DA')- ,("udieresiscyrillic", '\x04F1')- ,("udieresisgrave", '\x01DC')- ,("udieresismacron", '\x01D6')- ,("udotbelow", '\x1EE5')- ,("ugrave", '\x00F9')- ,("ugujarati", '\x0A89')- ,("ugurmukhi", '\x0A09')- ,("uhiragana", '\x3046')- ,("uhookabove", '\x1EE7')- ,("uhorn", '\x01B0')- ,("uhornacute", '\x1EE9')- ,("uhorndotbelow", '\x1EF1')- ,("uhorngrave", '\x1EEB')- ,("uhornhookabove", '\x1EED')- ,("uhorntilde", '\x1EEF')- ,("uhungarumlaut", '\x0171')- ,("uhungarumlautcyrillic", '\x04F3')- ,("uinvertedbreve", '\x0217')- ,("ukatakana", '\x30A6')- ,("ukatakanahalfwidth", '\xFF73')- ,("ukcyrillic", '\x0479')- ,("ukorean", '\x315C')- ,("umacron", '\x016B')- ,("umacroncyrillic", '\x04EF')- ,("umacrondieresis", '\x1E7B')- ,("umatragurmukhi", '\x0A41')- ,("umonospace", '\xFF55')- ,("underscore", '\x005F')- ,("underscoredbl", '\x2017')- ,("underscoremonospace", '\xFF3F')- ,("underscorevertical", '\xFE33')- ,("underscorewavy", '\xFE4F')- ,("union", '\x222A')- ,("universal", '\x2200')- ,("uogonek", '\x0173')- ,("uparen", '\x24B0')- ,("upblock", '\x2580')- ,("upperdothebrew", '\x05C4')- ,("upsilon", '\x03C5')- ,("upsilondieresis", '\x03CB')- ,("upsilondieresistonos", '\x03B0')- ,("upsilonlatin", '\x028A')- ,("upsilontonos", '\x03CD')- ,("uptackbelowcmb", '\x031D')- ,("uptackmod", '\x02D4')- ,("uragurmukhi", '\x0A73')- ,("uring", '\x016F')- ,("ushortcyrillic", '\x045E')- ,("usmallhiragana", '\x3045')- ,("usmallkatakana", '\x30A5')- ,("usmallkatakanahalfwidth", '\xFF69')- ,("ustraightcyrillic", '\x04AF')- ,("ustraightstrokecyrillic", '\x04B1')- ,("utilde", '\x0169')- ,("utildeacute", '\x1E79')- ,("utildebelow", '\x1E75')- ,("uubengali", '\x098A')- ,("uudeva", '\x090A')- ,("uugujarati", '\x0A8A')- ,("uugurmukhi", '\x0A0A')- ,("uumatragurmukhi", '\x0A42')- ,("uuvowelsignbengali", '\x09C2')- ,("uuvowelsigndeva", '\x0942')- ,("uuvowelsigngujarati", '\x0AC2')- ,("uvowelsignbengali", '\x09C1')- ,("uvowelsigndeva", '\x0941')- ,("uvowelsigngujarati", '\x0AC1')- ,("v", '\x0076')- ,("vadeva", '\x0935')- ,("vagujarati", '\x0AB5')- ,("vagurmukhi", '\x0A35')- ,("vakatakana", '\x30F7')- ,("vav", '\x05D5')- ,("vavdagesh", '\xFB35')- ,("vavdagesh65", '\xFB35')- ,("vavdageshhebrew", '\xFB35')- ,("vavhebrew", '\x05D5')- ,("vavholam", '\xFB4B')- ,("vavholamhebrew", '\xFB4B')- ,("vavvavhebrew", '\x05F0')- ,("vavyodhebrew", '\x05F1')- ,("vcircle", '\x24E5')- ,("vdotbelow", '\x1E7F')- ,("vecyrillic", '\x0432')- ,("veharabic", '\x06A4')- ,("vehfinalarabic", '\xFB6B')- ,("vehinitialarabic", '\xFB6C')- ,("vehmedialarabic", '\xFB6D')- ,("vekatakana", '\x30F9')- ,("venus", '\x2640')- ,("verticalbar", '\x007C')- ,("verticallineabovecmb", '\x030D')- ,("verticallinebelowcmb", '\x0329')- ,("verticallinelowmod", '\x02CC')- ,("verticallinemod", '\x02C8')- ,("vewarmenian", '\x057E')- ,("vhook", '\x028B')- ,("vikatakana", '\x30F8')- ,("viramabengali", '\x09CD')- ,("viramadeva", '\x094D')- ,("viramagujarati", '\x0ACD')- ,("visargabengali", '\x0983')- ,("visargadeva", '\x0903')- ,("visargagujarati", '\x0A83')- ,("vmonospace", '\xFF56')- ,("voarmenian", '\x0578')- ,("voicediterationhiragana", '\x309E')- ,("voicediterationkatakana", '\x30FE')- ,("voicedmarkkana", '\x309B')- ,("voicedmarkkanahalfwidth", '\xFF9E')- ,("vokatakana", '\x30FA')- ,("vparen", '\x24B1')- ,("vtilde", '\x1E7D')- ,("vturned", '\x028C')- ,("vuhiragana", '\x3094')- ,("vukatakana", '\x30F4')- ,("w", '\x0077')- ,("wacute", '\x1E83')- ,("waekorean", '\x3159')- ,("wahiragana", '\x308F')- ,("wakatakana", '\x30EF')- ,("wakatakanahalfwidth", '\xFF9C')- ,("wakorean", '\x3158')- ,("wasmallhiragana", '\x308E')- ,("wasmallkatakana", '\x30EE')- ,("wattosquare", '\x3357')- ,("wavedash", '\x301C')- ,("wavyunderscorevertical", '\xFE34')- ,("wawarabic", '\x0648')- ,("wawfinalarabic", '\xFEEE')- ,("wawhamzaabovearabic", '\x0624')- ,("wawhamzaabovefinalarabic", '\xFE86')- ,("wbsquare", '\x33DD')- ,("wcircle", '\x24E6')- ,("wcircumflex", '\x0175')- ,("wdieresis", '\x1E85')- ,("wdotaccent", '\x1E87')- ,("wdotbelow", '\x1E89')- ,("wehiragana", '\x3091')- ,("weierstrass", '\x2118')- ,("wekatakana", '\x30F1')- ,("wekorean", '\x315E')- ,("weokorean", '\x315D')- ,("wgrave", '\x1E81')- ,("whitebullet", '\x25E6')- ,("whitecircle", '\x25CB')- ,("whitecircleinverse", '\x25D9')- ,("whitecornerbracketleft", '\x300E')- ,("whitecornerbracketleftvertical", '\xFE43')- ,("whitecornerbracketright", '\x300F')- ,("whitecornerbracketrightvertical", '\xFE44')- ,("whitediamond", '\x25C7')- ,("whitediamondcontainingblacksmalldiamond", '\x25C8')- ,("whitedownpointingsmalltriangle", '\x25BF')- ,("whitedownpointingtriangle", '\x25BD')- ,("whiteleftpointingsmalltriangle", '\x25C3')- ,("whiteleftpointingtriangle", '\x25C1')- ,("whitelenticularbracketleft", '\x3016')- ,("whitelenticularbracketright", '\x3017')- ,("whiterightpointingsmalltriangle", '\x25B9')- ,("whiterightpointingtriangle", '\x25B7')- ,("whitesmallsquare", '\x25AB')- ,("whitesmilingface", '\x263A')- ,("whitesquare", '\x25A1')- ,("whitestar", '\x2606')- ,("whitetelephone", '\x260F')- ,("whitetortoiseshellbracketleft", '\x3018')- ,("whitetortoiseshellbracketright", '\x3019')- ,("whiteuppointingsmalltriangle", '\x25B5')- ,("whiteuppointingtriangle", '\x25B3')- ,("wihiragana", '\x3090')- ,("wikatakana", '\x30F0')- ,("wikorean", '\x315F')- ,("wmonospace", '\xFF57')- ,("wohiragana", '\x3092')- ,("wokatakana", '\x30F2')- ,("wokatakanahalfwidth", '\xFF66')- ,("won", '\x20A9')- ,("wonmonospace", '\xFFE6')- ,("wowaenthai", '\x0E27')- ,("wparen", '\x24B2')- ,("wring", '\x1E98')- ,("wsuperior", '\x02B7')- ,("wturned", '\x028D')- ,("wynn", '\x01BF')- ,("x", '\x0078')- ,("xabovecmb", '\x033D')- ,("xbopomofo", '\x3112')- ,("xcircle", '\x24E7')- ,("xdieresis", '\x1E8D')- ,("xdotaccent", '\x1E8B')- ,("xeharmenian", '\x056D')- ,("xi", '\x03BE')- ,("xmonospace", '\xFF58')- ,("xparen", '\x24B3')- ,("xsuperior", '\x02E3')- ,("y", '\x0079')- ,("yaadosquare", '\x334E')- ,("yabengali", '\x09AF')- ,("yacute", '\x00FD')- ,("yadeva", '\x092F')- ,("yaekorean", '\x3152')- ,("yagujarati", '\x0AAF')- ,("yagurmukhi", '\x0A2F')- ,("yahiragana", '\x3084')- ,("yakatakana", '\x30E4')- ,("yakatakanahalfwidth", '\xFF94')- ,("yakorean", '\x3151')- ,("yamakkanthai", '\x0E4E')- ,("yasmallhiragana", '\x3083')- ,("yasmallkatakana", '\x30E3')- ,("yasmallkatakanahalfwidth", '\xFF6C')- ,("yatcyrillic", '\x0463')- ,("ycircle", '\x24E8')- ,("ycircumflex", '\x0177')- ,("ydieresis", '\x00FF')- ,("ydotaccent", '\x1E8F')- ,("ydotbelow", '\x1EF5')- ,("yeharabic", '\x064A')- ,("yehbarreearabic", '\x06D2')- ,("yehbarreefinalarabic", '\xFBAF')- ,("yehfinalarabic", '\xFEF2')- ,("yehhamzaabovearabic", '\x0626')- ,("yehhamzaabovefinalarabic", '\xFE8A')- ,("yehhamzaaboveinitialarabic", '\xFE8B')- ,("yehhamzaabovemedialarabic", '\xFE8C')- ,("yehinitialarabic", '\xFEF3')- ,("yehmedialarabic", '\xFEF4')- ,("yehmeeminitialarabic", '\xFCDD')- ,("yehmeemisolatedarabic", '\xFC58')- ,("yehnoonfinalarabic", '\xFC94')- ,("yehthreedotsbelowarabic", '\x06D1')- ,("yekorean", '\x3156')- ,("yen", '\x00A5')- ,("yenmonospace", '\xFFE5')- ,("yeokorean", '\x3155')- ,("yeorinhieuhkorean", '\x3186')- ,("yerahbenyomohebrew", '\x05AA')- ,("yerahbenyomolefthebrew", '\x05AA')- ,("yericyrillic", '\x044B')- ,("yerudieresiscyrillic", '\x04F9')- ,("yesieungkorean", '\x3181')- ,("yesieungpansioskorean", '\x3183')- ,("yesieungsioskorean", '\x3182')- ,("yetivhebrew", '\x059A')- ,("ygrave", '\x1EF3')- ,("yhook", '\x01B4')- ,("yhookabove", '\x1EF7')- ,("yiarmenian", '\x0575')- ,("yicyrillic", '\x0457')- ,("yikorean", '\x3162')- ,("yinyang", '\x262F')- ,("yiwnarmenian", '\x0582')- ,("ymonospace", '\xFF59')- ,("yod", '\x05D9')- ,("yoddagesh", '\xFB39')- ,("yoddageshhebrew", '\xFB39')- ,("yodhebrew", '\x05D9')- ,("yodyodhebrew", '\x05F2')- ,("yodyodpatahhebrew", '\xFB1F')- ,("yohiragana", '\x3088')- ,("yoikorean", '\x3189')- ,("yokatakana", '\x30E8')- ,("yokatakanahalfwidth", '\xFF96')- ,("yokorean", '\x315B')- ,("yosmallhiragana", '\x3087')- ,("yosmallkatakana", '\x30E7')- ,("yosmallkatakanahalfwidth", '\xFF6E')- ,("yotgreek", '\x03F3')- ,("yoyaekorean", '\x3188')- ,("yoyakorean", '\x3187')- ,("yoyakthai", '\x0E22')- ,("yoyingthai", '\x0E0D')- ,("yparen", '\x24B4')- ,("ypogegrammeni", '\x037A')- ,("ypogegrammenigreekcmb", '\x0345')- ,("yr", '\x01A6')- ,("yring", '\x1E99')- ,("ysuperior", '\x02B8')- ,("ytilde", '\x1EF9')- ,("yturned", '\x028E')- ,("yuhiragana", '\x3086')- ,("yuikorean", '\x318C')- ,("yukatakana", '\x30E6')- ,("yukatakanahalfwidth", '\xFF95')- ,("yukorean", '\x3160')- ,("yusbigcyrillic", '\x046B')- ,("yusbigiotifiedcyrillic", '\x046D')- ,("yuslittlecyrillic", '\x0467')- ,("yuslittleiotifiedcyrillic", '\x0469')- ,("yusmallhiragana", '\x3085')- ,("yusmallkatakana", '\x30E5')- ,("yusmallkatakanahalfwidth", '\xFF6D')- ,("yuyekorean", '\x318B')- ,("yuyeokorean", '\x318A')- ,("yyabengali", '\x09DF')- ,("yyadeva", '\x095F')- ,("z", '\x007A')- ,("zaarmenian", '\x0566')- ,("zacute", '\x017A')- ,("zadeva", '\x095B')- ,("zagurmukhi", '\x0A5B')- ,("zaharabic", '\x0638')- ,("zahfinalarabic", '\xFEC6')- ,("zahinitialarabic", '\xFEC7')- ,("zahiragana", '\x3056')- ,("zahmedialarabic", '\xFEC8')- ,("zainarabic", '\x0632')- ,("zainfinalarabic", '\xFEB0')- ,("zakatakana", '\x30B6')- ,("zaqefgadolhebrew", '\x0595')- ,("zaqefqatanhebrew", '\x0594')- ,("zarqahebrew", '\x0598')- ,("zayin", '\x05D6')- ,("zayindagesh", '\xFB36')- ,("zayindageshhebrew", '\xFB36')- ,("zayinhebrew", '\x05D6')- ,("zbopomofo", '\x3117')- ,("zcaron", '\x017E')- ,("zcircle", '\x24E9')- ,("zcircumflex", '\x1E91')- ,("zcurl", '\x0291')- ,("zdot", '\x017C')- ,("zdotaccent", '\x017C')- ,("zdotbelow", '\x1E93')- ,("zecyrillic", '\x0437')- ,("zedescendercyrillic", '\x0499')- ,("zedieresiscyrillic", '\x04DF')- ,("zehiragana", '\x305C')- ,("zekatakana", '\x30BC')- ,("zero", '\x0030')- ,("zeroarabic", '\x0660')- ,("zerobengali", '\x09E6')- ,("zerodeva", '\x0966')- ,("zerogujarati", '\x0AE6')- ,("zerogurmukhi", '\x0A66')- ,("zerohackarabic", '\x0660')- ,("zeroinferior", '\x2080')- ,("zeromonospace", '\xFF10')- ,("zerooldstyle", '\xF730')- ,("zeropersian", '\x06F0')- ,("zerosuperior", '\x2070')- ,("zerothai", '\x0E50')- ,("zerowidthjoiner", '\xFEFF')- ,("zerowidthnonjoiner", '\x200C')- ,("zerowidthspace", '\x200B')- ,("zeta", '\x03B6')- ,("zhbopomofo", '\x3113')- ,("zhearmenian", '\x056A')- ,("zhebrevecyrillic", '\x04C2')- ,("zhecyrillic", '\x0436')- ,("zhedescendercyrillic", '\x0497')- ,("zhedieresiscyrillic", '\x04DD')- ,("zihiragana", '\x3058')- ,("zikatakana", '\x30B8')- ,("zinorhebrew", '\x05AE')- ,("zlinebelow", '\x1E95')- ,("zmonospace", '\xFF5A')- ,("zohiragana", '\x305E')- ,("zokatakana", '\x30BE')- ,("zparen", '\x24B5')- ,("zretroflexhook", '\x0290')- ,("zstroke", '\x01B6')- ,("zuhiragana", '\x305A')- ,("zukatakana", '\x30BA')- ]
− lib/Pdf/Toolbox/Content/Ops.hs
@@ -1,196 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- | Content stream operators--module Pdf.Toolbox.Content.Ops-(- Op(..),- Expr(..),- Operator,- toOp-)-where--import Data.ByteString (ByteString)--import Pdf.Toolbox.Core---- | Operator with arguments-type Operator = (Op, [Object ()])---- | Content stream operators-data Op- -- | Graphics State Operators- = Op_q- | Op_Q- | Op_cm- | Op_w- | Op_J- | Op_j- | Op_M- | Op_d- | Op_ri- | Op_i- | Op_gs- -- | Path Construction Operators- | Op_m- | Op_l- | Op_c- | Op_v- | Op_y- | Op_h- | Op_re- -- | Path Painting Operators- | Op_S- | Op_s- | Op_f- | Op_F- | Op_f_star- | Op_B- | Op_B_star- | Op_b- | Op_b_star- | Op_n- -- | Clipping Path Operators- | Op_W- | Op_W_star- -- | Text Object Operators- | Op_BT- | Op_ET- -- | Text State Operators- | Op_Tc- | Op_Tw- | Op_Tz- | Op_TL- | Op_Tf- | Op_Tr- | Op_Ts- -- | Text Positioning Operators- | Op_Td- | Op_TD- | Op_Tm- | Op_T_star- -- | Text Showing Operators- | Op_Tj- | Op_apostrophe- | Op_quote- | Op_TJ- -- | Type 3 Font Operators- | Op_d0- | Op_d1- -- | Color Operators- | Op_CS- | Op_cs- | Op_SC- | Op_SCN- | Op_sc- | Op_scn- | Op_G- | Op_g- | Op_RG- | Op_rg- | Op_K- | Op_k- -- | Shading Operator- | Op_sh- -- | Inline Image Operators- | Op_BI- | Op_ID- | Op_EI- -- | XObject Operator- | Op_Do- -- | Marked Content Operators- | Op_MP- | Op_DP- | Op_BMC- | Op_BDC- | Op_EMC- -- | Compatibility Operators- | Op_BX- | Op_EX- -- | Unknown- | UnknownOp ByteString- deriving (Show, Eq)---- | Expression is a regular objects or an operators-data Expr- = Obj (Object ())- | Op Op- deriving (Show, Eq)---- | Conversion to operator-toOp :: ByteString -> Op-toOp "q" = Op_q-toOp "Q" = Op_Q-toOp "cm" = Op_cm-toOp "w" = Op_w-toOp "J" = Op_J-toOp "j" = Op_j-toOp "M" = Op_M-toOp "d" = Op_d-toOp "ri" = Op_ri-toOp "i" = Op_i-toOp "gs" = Op_gs-toOp "m" = Op_m-toOp "l" = Op_l-toOp "c" = Op_c-toOp "v" = Op_v-toOp "y" = Op_y-toOp "h" = Op_h-toOp "re" = Op_re-toOp "S" = Op_S-toOp "s" = Op_s-toOp "f" = Op_f-toOp "F" = Op_F-toOp "f*" = Op_f_star-toOp "B" = Op_B-toOp "B*" = Op_B_star-toOp "b" = Op_b-toOp "b*" = Op_b_star-toOp "n" = Op_n-toOp "W" = Op_W-toOp "W*" = Op_W_star-toOp "BT" = Op_BT-toOp "ET" = Op_ET-toOp "Tc" = Op_Tc-toOp "Tw" = Op_Tw-toOp "Tz" = Op_Tz-toOp "TL" = Op_TL-toOp "Tf" = Op_Tf-toOp "Tr" = Op_Tr-toOp "Ts" = Op_Ts-toOp "Td" = Op_Td-toOp "TD" = Op_TD-toOp "Tm" = Op_Tm-toOp "T*" = Op_T_star-toOp "Tj" = Op_Tj-toOp "'" = Op_apostrophe-toOp "\"" = Op_quote-toOp "TJ" = Op_TJ-toOp "d0" = Op_d0-toOp "d1" = Op_d1-toOp "CS" = Op_CS-toOp "cs" = Op_cs-toOp "SC" = Op_SC-toOp "SCN" = Op_SCN-toOp "sc" = Op_sc-toOp "scn" = Op_scn-toOp "G" = Op_G-toOp "g" = Op_g-toOp "RG" = Op_RG-toOp "rg" = Op_rg-toOp "K" = Op_K-toOp "k" = Op_k-toOp "sh" = Op_sh-toOp "BI" = Op_BI-toOp "ID" = Op_ID-toOp "EI" = Op_EI-toOp "Do" = Op_Do-toOp "MP" = Op_MP-toOp "DP" = Op_DP-toOp "BMC" = Op_BMC-toOp "BDC" = Op_BDC-toOp "EMC" = Op_EMC-toOp "BX" = Op_BX-toOp "EX" = Op_EX-toOp str = UnknownOp str
− lib/Pdf/Toolbox/Content/Parser.hs
@@ -1,119 +0,0 @@---- | Parse content stream--module Pdf.Toolbox.Content.Parser-(- parseContentStream,- readNextOperator,- parseContent-)-where--import Data.Int-import qualified Data.ByteString.Char8 as ByteString8-import Data.Attoparsec.ByteString.Char8 (Parser)-import qualified Data.Attoparsec.ByteString.Char8 as Parser-import Data.IORef-import Control.Applicative-import Control.Exception-import System.IO.Streams (InputStream)-import qualified System.IO.Streams as Streams-import qualified System.IO.Streams.Attoparsec as Streams--import Pdf.Toolbox.Core-import Pdf.Toolbox.Core.Parsers.Object--import Pdf.Toolbox.Content.Ops---- | Parse content streams for a page------ Note: we need content stream ref to be able to decrypt stream content.--- We need stream length because it can be an indirect object in--- stream dictionary-parseContentStream :: MonadIO m- => RIS -- ^ random input stream to read data from- -> [StreamFilter] -- ^ how to unpack data- -> (Ref -> IS -> IO IS) -- ^ how to decrypt data- -> [(Stream Int64, Ref, Int)] -- ^ content streams (with offset), their refs and length- -> PdfE m (InputStream Expr)-parseContentStream ris filters decryptor streams = do- is <- combineStreams ris filters decryptor streams- liftIO $ Streams.parserToInputStream parseContent is---- | Read the next operator if any-readNextOperator :: MonadIO m => InputStream Expr -> PdfE m (Maybe Operator)-readNextOperator is = annotateError "reading the next operator from content stream" $ go []- where- go args = do- expr <- do- e <- tryPdfIO $ (Right <$> Streams.read is)- `catch` (\e -> return $ Left $ UnexpectedError $ show (e :: Streams.ParseException))- case e of- Right expr -> return expr- Left er -> throwE er- case expr of- Nothing -> case args of- [] -> return Nothing- _ -> throwE $ UnexpectedError $ "Args without op: " ++ show args- Just (Obj o) -> go (o : args)- Just (Op o) -> return $ Just (o, reverse args)--combineStreams :: MonadIO m => RIS -> [StreamFilter] -> (Ref -> IS -> IO IS) -> [(Stream Int64, Ref, Int)] -> PdfE m IS-combineStreams _ _ _ [] = liftIO Streams.nullInput-combineStreams ris filters decryptor (x:xs) = do- reader <- mkReader x xs- ref <- liftIO $ newIORef reader- liftIO $ Streams.makeInputStream (doRead ref)- where- mkReader (s, ref, len) ss = do- Stream _ is <- decodedStreamContent ris filters (decryptor ref) len s- return (is, ss)- doRead ref = do- (is, ss) <- liftIO $ readIORef ref- chunk <- liftIO $ Streams.read is- case chunk of- Nothing ->- case ss of- [] -> return Nothing- (h:t) -> do- reader <- runExceptT $ mkReader h t- case reader of- Left e -> liftIO $ ioError $ userError $ show e- Right r -> do- liftIO $ writeIORef ref r- doRead ref- Just c -> return (Just c)--parseContent :: Parser (Maybe Expr)-parseContent- = (skipSpace >> Parser.endOfInput >> return Nothing)- <|> do- skipSpace- fmap Just $ fmap Obj parseObject- <|> fmap (Op . toOp) (Parser.takeWhile1 isRegularChar)- -- See Note Inline image- <|> fmap (Op . UnknownOp . ByteString8.pack . return) Parser.anyChar--{- Note Inline image--There is at least one case that doesn't fit the way we represent content-stream operators: inline images, see Pdf1.7:8.9.7--Inline image looks like "BI" operator, a number of key/value pairs, "ID"-operator, image data and "EI" operator. I have no idea how to handle that case.-There is no data length, so the "EI" string is the only indicator for end-of image data. What if the data contains "EI"?--For now lets skip all unknown bytes as unknown operator. That seems to work,-but it is not reliable.--}---- Treat comments as spaces-skipSpace :: Parser ()-skipSpace = do- Parser.skipSpace- _ <- many $ do- _ <- Parser.char '%'- Parser.skipWhile $ \c -> c /= '\n' && c /= '\r'- Parser.skipSpace- return ()
− lib/Pdf/Toolbox/Content/Processor.hs
@@ -1,298 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- | Process content stream operators maintaining graphics state------ It is pretty experimental--module Pdf.Toolbox.Content.Processor-(- Processor(..),- GraphicsState(..),- GlyphDecoder,- Glyph(..),- initialGraphicsState,- mkProcessor,- processOp-)-where--import Data.Text (Text)-import Control.Monad--import Pdf.Toolbox.Core--import Pdf.Toolbox.Content.Ops-import Pdf.Toolbox.Content.Transform---- | Given font name and string, it should return list of glyphs--- and their widths.------ Note: it should not try to position or scale glyphs to user space,--- bounding boxes should be defined in glyph space.------ Note: glyph width is a distance between the glyph's origin and--- the next glyph's origin, so it generally can't be calculated--- from bounding box------ Note: the 'Processor' actually doesn't cares about glyph's--- bounding box, so you can return anything you want-type GlyphDecoder = Name -> Str -> [(Glyph, Double)]---- | Glyph-data Glyph = Glyph {- -- | The code as read from content stream- glyphCode :: Int,- -- | Top-left corner of glyph's bounding box- glyphTopLeft :: Vector Double,- -- | Bottom-right corner of glyph's bounding box- glyphBottomRight :: Vector Double,- -- | Text ectracted from the glyph- glyphText :: Maybe Text- }- deriving Show---- | Graphics state-data GraphicsState = GraphicsState {- gsInText :: Bool, -- ^ Indicates that we are inside text object- gsCurrentTransformMatrix :: Transform Double,- gsFont :: Maybe Name,- gsFontSize :: Maybe Double,- gsTextMatrix :: Transform Double, -- ^ Defined only inside text object- gsTextLineMatrix :: Transform Double, -- ^ Defined only inside text object- gsTextLeading :: Double,- gsTextCharSpacing :: Double,- gsTextWordSpacing :: Double- }- deriving Show---- | Empty graphics state-initialGraphicsState :: GraphicsState-initialGraphicsState = GraphicsState {- gsInText = False,- gsCurrentTransformMatrix = identity,- gsFont = Nothing,- gsFontSize = Nothing,- gsTextMatrix = identity,- gsTextLineMatrix = identity,- gsTextLeading = 0,- gsTextCharSpacing = 0,- gsTextWordSpacing = 0- }---- | Processor maintains graphics state-data Processor = Processor {- prState :: GraphicsState,- prStateStack :: [GraphicsState],- prGlyphDecoder :: GlyphDecoder,- prGlyphs :: [[Glyph]] -- ^ Each element is a list of glyphs, drawn in one shot- }---- | Create processor in initial state-mkProcessor :: Processor-mkProcessor = Processor {- prState = initialGraphicsState,- prStateStack = [],- prGlyphDecoder = \_ _ -> [],- prGlyphs = mempty- }---- | Process one operation-processOp :: Monad m => Operator -> Processor -> PdfE m Processor--processOp (Op_q, []) p = return p {prStateStack = prState p : prStateStack p}-processOp (Op_q, args) _ = throwE $ UnexpectedError $ "Op_q: wrong number of arguments: " ++ show args--processOp (Op_Q, []) p =- case prStateStack p of- [] -> throwE $ UnexpectedError "Op_Q: state is empty"- (x:xs) -> return p {prState = x, prStateStack = xs}-processOp (Op_Q, args) _ = throwE $ UnexpectedError $ "Op_Q: wrong number of arguments: " ++ show args--processOp (Op_BT, []) p = do- ensureInTextObject False p- let gstate = prState p- return p {prState = gstate {- gsInText = True,- gsTextMatrix = identity,- gsTextLineMatrix = identity- }}-processOp (Op_BT, args) _ = throwE $ UnexpectedError $ "Op_BT: wrong number of arguments: " ++ show args--processOp (Op_ET, []) p = do- ensureInTextObject True p- let gstate = prState p- return p {prState = gstate {- gsInText = False- }}-processOp (Op_ET, args) _ = throwE $ UnexpectedError $ "Op_ET: wrong number of arguments: " ++ show args--processOp (Op_Td, [txo, tyo]) p = do- ensureInTextObject True p- tx <- fromObject txo >>= realValue- ty <- fromObject tyo >>= realValue- let gstate = prState p- tm = translate tx ty $ gsTextLineMatrix gstate- return p {prState = gstate {- gsTextMatrix = tm,- gsTextLineMatrix = tm- }}-processOp (Op_Td, args) _ = throwE $ UnexpectedError $ "Op_Td: wrong number of arguments: " ++ show args--processOp (Op_TD, [txo, tyo]) p = do- l <- fromObject tyo >>= realValue- p' <- processOp (Op_TL, [ONumber $ NumReal $ negate l]) p- processOp (Op_Td, [txo, tyo]) p'-processOp (Op_TD, args) _ = throwE $ UnexpectedError $ "Op_TD: wrong number of arguments: " ++ show args--processOp (Op_Tm, [a', b', c', d', e', f']) p = do- ensureInTextObject True p- a <- fromObject a' >>= realValue- b <- fromObject b' >>= realValue- c <- fromObject c' >>= realValue- d <- fromObject d' >>= realValue- e <- fromObject e' >>= realValue- f <- fromObject f' >>= realValue- let gstate = prState p- tm = Transform a b c d e f- return p {prState = gstate {- gsTextMatrix = tm,- gsTextLineMatrix = tm- }}-processOp (Op_Tm, args) _ = throwE $ UnexpectedError $ "Op_Tm: wrong number of arguments: " ++ show args--processOp (Op_T_star, []) p = do- ensureInTextObject True p- let gstate = prState p- l = gsTextLeading gstate- processOp (Op_TD, map (ONumber . NumReal) [0, negate l]) p-processOp (Op_T_star, args) _ = throwE $ UnexpectedError $ "Op_T_star: wrong number of arguments: " ++ show args--processOp (Op_TL, [lo]) p = do- l <- fromObject lo >>= realValue- let gstate = prState p- return p {prState = gstate {- gsTextLeading = l- }}-processOp (Op_TL, args) _ = throwE $ UnexpectedError $ "Op_TL: wrong number of arguments: " ++ show args--processOp (Op_cm, [a', b', c', d', e', f']) p = do- a <- fromObject a' >>= realValue- b <- fromObject b' >>= realValue- c <- fromObject c' >>= realValue- d <- fromObject d' >>= realValue- e <- fromObject e' >>= realValue- f <- fromObject f' >>= realValue- let gstate = prState p- ctm = Transform a b c d e f `multiply` gsCurrentTransformMatrix gstate- return p {prState = gstate {- gsCurrentTransformMatrix = ctm- }}-processOp (Op_cm, args) _ = throwE $ UnexpectedError $ "Op_cm: wrong number of arguments: " ++ show args--processOp (Op_Tf, [fontO, szO]) p = do- font <- fromObject fontO- sz <- fromObject szO >>= realValue- let gstate = prState p- return p {prState = gstate {- gsFont = Just font,- gsFontSize = Just sz- }}-processOp (Op_Tf, args) _ = throwE $ UnexpectedError $ "Op_Tf: wrong number of agruments: " ++ show args--processOp (Op_Tj, [OStr str]) p = do- let gstate = prState p- fontName <-- case gsFont gstate of- Nothing -> throwE $ UnexpectedError "Op_Tj: font not set"- Just fn -> return fn- fontSize <-- case gsFontSize gstate of- Nothing -> throwE $ UnexpectedError "Op_Tj: font size not set"- Just fs -> return fs- let (tm, glyphs) = positionGlyghs fontSize (gsCurrentTransformMatrix gstate)- (gsTextMatrix gstate) (gsTextCharSpacing gstate) (gsTextWordSpacing gstate) $- prGlyphDecoder p fontName str- return p {- prGlyphs = prGlyphs p ++ [glyphs],- prState = gstate {- gsTextMatrix = tm- }- }-processOp (Op_Tj, args) _ = throwE $ UnexpectedError $ "Op_Tj: wrong number of agruments:" ++ show args--processOp (Op_TJ, [OArray (Array array)]) p = do- let gstate = prState p- fontName <-- case gsFont gstate of- Nothing -> throwE $ UnexpectedError "Op_Tj: font not set"- Just fn -> return fn- fontSize <-- case gsFontSize gstate of- Nothing -> throwE $ UnexpectedError "Op_Tj: font size not set"- Just fs -> return fs- let (textMatrix, glyphs) = loop (gsTextMatrix gstate) [] array- where- loop tm res [] = (tm, reverse res)- loop tm res (OStr str : rest) = let (tm', gs) = positionGlyghs fontSize (gsCurrentTransformMatrix gstate)- tm (gsTextCharSpacing gstate) (gsTextWordSpacing gstate)- (prGlyphDecoder p fontName str)- in loop tm' (gs : res) rest- loop tm res (ONumber (NumInt i): rest) = loop (translate (fromIntegral (-i) * fontSize / 1000) 0 tm) res rest- loop tm res (ONumber (NumReal d): rest) = loop (translate (-d * fontSize / 1000) 0 tm) res rest- loop tm res (_:rest) = loop tm res rest- return p {- prGlyphs = prGlyphs p ++ glyphs,- prState = gstate {- gsTextMatrix = textMatrix- }- }-processOp (Op_TJ, args) _ = throwE $ UnexpectedError $ "Op_TJ: wrong number of agruments:" ++ show args--processOp (Op_Tc, [o]) p = do- spacing <- fromObject o >>= realValue- let gstate = prState p- return p {- prState = gstate {- gsTextCharSpacing = spacing- }- }-processOp (Op_Tc, args) _ = throwE $ UnexpectedError $ "Op_Tc: wrong number of agruments:" ++ show args--processOp (Op_Tw, [o]) p = do- spacing <- fromObject o >>= realValue- let gstate = prState p- return p {- prState = gstate {- gsTextWordSpacing = spacing- }- }-processOp (Op_Tw, args) _ = throwE $ UnexpectedError $ "Op_Tw: wrong number of agruments:" ++ show args--processOp (Op_apostrophe, [o]) p = do- p' <- processOp (Op_T_star, []) p- processOp (Op_Tj, [o]) p'-processOp (Op_apostrophe, args) _ = throwE $ UnexpectedError $ "Op_apostrophe: wrong number of agruments:" ++ show args--processOp _ p = return p--ensureInTextObject :: Monad m => Bool -> Processor -> PdfE m ()-ensureInTextObject inText p =- unless (inText == gsInText (prState p)) $ throwE $- UnexpectedError $ "ensureInTextObject: expected: " ++ show inText ++ ", found: " ++ show (gsInText $ prState p)--positionGlyghs :: Double -> Transform Double -> Transform Double -> Double -> Double -> [(Glyph, Double)] -> (Transform Double, [Glyph])-positionGlyghs fontSize ctm textMatrix charSpacing wordSpacing = go textMatrix []- where- go tm res [] = (tm, reverse res)- go tm res ((g, width):gs) =- let g' = g {- glyphTopLeft = transform (multiply tm ctm) topLeft,- glyphBottomRight = transform (multiply tm ctm) bottomRight- }- topLeft = transform (scale fontSize fontSize) $ glyphTopLeft g- bottomRight = transform (scale fontSize fontSize) $ glyphBottomRight g- spacing = charSpacing + case glyphText g of- Just " " -> wordSpacing- _ -> 0- tm' = translate (width * fontSize + spacing) 0 tm- in go tm' (g':res) gs
− lib/Pdf/Toolbox/Content/TexGlyphList.hs
@@ -1,304 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- | Mapping from glyph names to unicode characters--- for TeX fonts--module Pdf.Toolbox.Content.TexGlyphList-(- texGlyphList-)-where--import Data.ByteString (ByteString)-import Data.Map (Map)-import qualified Data.Map as Map---- | Glyph list-texGlyphList :: Map ByteString Char-texGlyphList = Map.fromList- [("Delta", '\x2206')- ,("Ifractur", '\x2111')- ,("FFsmall", '\xF766')- ,("FFIsmall", '\xF766')- ,("FFLsmall", '\xF766')- ,("FIsmall", '\xF766')- ,("FLsmall", '\xF766')- ,("Germandbls", '\x0053')- ,("Germandblssmall", '\xF773')- ,("Ng", '\x014A')- ,("Omega", '\x2126')- ,("Rfractur", '\x211C')- ,("SS", '\x0053')- ,("SSsmall", '\xF773')- ,("altselector", '\xD802')- ,("angbracketleft", '\x27E8')- ,("angbracketright", '\x27E9')- ,("arrowbothv", '\x2195')- ,("arrowdblbothv", '\x21D5')- ,("arrowleftbothalf", '\x21BD')- ,("arrowlefttophalf", '\x21BC')- ,("arrownortheast", '\x2197')- ,("arrownorthwest", '\x2196')- ,("arrowrightbothalf", '\x21C1')- ,("arrowrighttophalf", '\x21C0')- ,("arrowsoutheast", '\x2198')- ,("arrowsouthwest", '\x2199')- ,("ascendercompwordmark", '\xD80A')- ,("asteriskcentered", '\x2217')- ,("bardbl", '\x2225')- ,("capitalcompwordmark", '\xD809')- ,("ceilingleft", '\x2308')- ,("ceilingright", '\x2309')- ,("circlecopyrt", '\x20DD')- ,("circledivide", '\x2298')- ,("circledot", '\x2299')- ,("circleminus", '\x2296')- ,("coproduct", '\x2A3F')- ,("ct", '\x0063')- ,("cwm", '\x200C')- ,("dblbracketleft", '\x27E6')- ,("dblbracketright", '\x27E7')- ,("diamond", '\x2662')- ,("diamondmath", '\x22C4')- ,("dotlessj", '\x0237')- ,("emptyset", '\x2205')- ,("emptyslot", '\xD801')- ,("epsilon1", '\x03F5')- ,("epsiloninv", '\x03F6')- ,("equivasymptotic", '\x224D')- ,("flat", '\x266D')- ,("floorleft", '\x230A')- ,("floorright", '\x230B')- ,("follows", '\x227B')- ,("followsequal", '\x2AB0')- ,("followsorcurly", '\x227D')- ,("greatermuch", '\x226B')- ,("heart", '\x2661')- ,("interrobang", '\x203D')- ,("interrobangdown", '\x2E18')- ,("intersectionsq", '\x2293')- ,("latticetop", '\x22A4')- ,("lessmuch", '\x226A')- ,("longdbls", '\x017F')- ,("longsh", '\x017F')- ,("longsi", '\x017F')- ,("longsl", '\x017F')- ,("longst", '\xFB05')- ,("lscript", '\x2113')- ,("natural", '\x266E')- ,("negationslash", '\x0338')- ,("ng", '\x014B')- ,("owner", '\x220B')- ,("pertenthousand", '\x2031')- ,("phi", '\x03D5')- ,("phi1", '\x03C6')- ,("pi1", '\x03D6')- ,("precedesequal", '\x2AAF')- ,("precedesorcurly", '\x227C')- ,("prime", '\x2032')- ,("rho1", '\x03F1')- ,("ringfitted", '\xD80D')- ,("sharp", '\x266F')- ,("similarequal", '\x2243')- ,("slurabove", '\x2322')- ,("slurbelow", '\x2323')- ,("st", '\xFB06')- ,("star", '\x22C6')- ,("subsetsqequal", '\x2291')- ,("supersetsqequal", '\x2292')- ,("triangle", '\x25B3')- ,("triangleinv", '\x25BD')- ,("triangleleft", '\x25C1')- ,("triangleright", '\x25B7')- ,("turnstileleft", '\x22A2')- ,("turnstileright", '\x22A3')- ,("twelveudash", '\xD80C')- ,("unionmulti", '\x228E')- ,("unionsq", '\x2294')- ,("vector", '\x20D7')- ,("visualspace", '\x2423')- ,("wreathproduct", '\x2240')- ,("Dbar", '\x0110')- ,("compwordmark", '\x200C')- ,("dbar", '\x0111')- ,("rangedash", '\x2013')- ,("hyphenchar", '\x002D')- ,("punctdash", '\x2014')- ,("visiblespace", '\x2423')- ,("Yen", '\x00A5')- ,("anticlockwise", '\x27F2')- ,("arrowparrleftright", '\x21C6')- ,("arrowparrrightleft", '\x21C4')- ,("arrowtailleft", '\x21A2')- ,("arrowtailright", '\x21A3')- ,("arrowtripleleft", '\x21DA')- ,("arrowtripleright", '\x21DB')- ,("between", '\x226C')- ,("check", '\x2713')- ,("circleR", '\x00AE')- ,("circleS", '\x24C8')- ,("circleasterisk", '\x229B')- ,("circleequal", '\x229C')- ,("circlering", '\x229A')- ,("clockwise", '\x27F3')- ,("complement", '\x2201')- ,("curlyleft", '\x21AB')- ,("curlyright", '\x21AC')- ,("dblarrowdwn", '\x21CA')- ,("dblarrowheadleft", '\x219E')- ,("dblarrowheadright", '\x21A0')- ,("dblarrowup", '\x21C8')- ,("defines", '\x225C')- ,("diamondsolid", '\x2666')- ,("difference", '\x224F')- ,("dotplus", '\x2214')- ,("downfall", '\x22CE')- ,("equaldotleftright", '\x2252')- ,("equaldotrightleft", '\x2253')- ,("equalorfollows", '\x22DF')- ,("equalorgreater", '\x2A96')- ,("equalorless", '\x2A95')- ,("equalorprecedes", '\x22DE')- ,("equalsdots", '\x2251')- ,("followsorequal", '\x227F')- ,("forces", '\x22A9')- ,("forcesbar", '\x22AA')- ,("fork", '\x22D4')- ,("frown", '\x2322')- ,("geomequivalent", '\x224E')- ,("greaterdbleqlless", '\x2A8C')- ,("greaterdblequal", '\x2267')- ,("greaterlessequal", '\x22DB')- ,("greaterorapproxeql", '\x2A86')- ,("greaterorequalslant", '\x2A7E')- ,("greaterorsimilar", '\x2273')- ,("harpoondownleft", '\x21C3')- ,("harpoondownright", '\x21C2')- ,("harpoonleftright", '\x21CC')- ,("harpoonrightleft", '\x21CB')- ,("harpoonupleft", '\x21BF')- ,("harpoonupright", '\x21BE')- ,("intercal", '\x22BA')- ,("intersectiondbl", '\x22D2')- ,("lessdbleqlgreater", '\x2A8B')- ,("lessdblequal", '\x2266')- ,("lessequalgreater", '\x22DA')- ,("lessorapproxeql", '\x2A85')- ,("lessorequalslant", '\x2A7D')- ,("lessorsimilar", '\x2272')- ,("maltesecross", '\x2720')- ,("measuredangle", '\x2221')- ,("multimap", '\x22B8')- ,("multiopenleft", '\x22CB')- ,("multiopenright", '\x22CC')- ,("nand", '\x22BC')- ,("orunderscore", '\x22BB')- ,("perpcorrespond", '\x2A5E')- ,("precedesorequal", '\x227E')- ,("primereverse", '\x2035')- ,("revasymptequal", '\x22CD')- ,("revsimilar", '\x223D')- ,("rightanglene", '\x231D')- ,("rightanglenw", '\x231C')- ,("rightanglese", '\x231F')- ,("rightanglesw", '\x231E')- ,("ringinequal", '\x2256')- ,("satisfies", '\x22A8')- ,("shiftleft", '\x21B0')- ,("shiftright", '\x21B1')- ,("smile", '\x2323')- ,("sphericalangle", '\x2222')- ,("square", '\x25A1')- ,("squaredot", '\x22A1')- ,("squareimage", '\x228F')- ,("squareminus", '\x229F')- ,("squaremultiply", '\x22A0')- ,("squareoriginal", '\x2290')- ,("squareplus", '\x229E')- ,("squaresolid", '\x25A0')- ,("squiggleleftright", '\x21AD')- ,("squiggleright", '\x21DD')- ,("subsetdbl", '\x22D0')- ,("subsetdblequal", '\x2AC5')- ,("supersetdbl", '\x22D1')- ,("supersetdblequal", '\x2AC6')- ,("triangledownsld", '\x25BC')- ,("triangleleftequal", '\x22B4')- ,("triangleleftsld", '\x25C0')- ,("trianglerightequal", '\x22B5')- ,("trianglerightsld", '\x25B6')- ,("trianglesolid", '\x25B2')- ,("uniondbl", '\x22D3')- ,("uprise", '\x22CF')- ,("Digamma", '\x1D7CB')- ,("Finv", '\x2132')- ,("Gmir", '\x2141')- ,("Omegainv", '\x2127')- ,("approxorequal", '\x224A')- ,("archleftdown", '\x21B6')- ,("archrightdown", '\x21B7')- ,("beth", '\x2136')- ,("daleth", '\x2138')- ,("dividemultiply", '\x22C7')- ,("downslope", '\x29F9')- ,("equalorsimilar", '\x2242')- ,("follownotdbleqv", '\x2ABA')- ,("follownotslnteql", '\x2AB6')- ,("followornoteqvlnt", '\x22E9')- ,("greaterdot", '\x22D7')- ,("greaternotdblequal", '\x2A8A')- ,("greaternotequal", '\x2A88')- ,("greaterornotdbleql", '\x2269')- ,("greaterornotequal", '\x2269')- ,("integerdivide", '\x2216')- ,("lessdot", '\x22D6')- ,("lessnotdblequal", '\x2A89')- ,("lessnotequal", '\x2A87')- ,("lessornotdbleql", '\x2268')- ,("lessornotequal", '\x2268')- ,("multicloseleft", '\x22C9')- ,("multicloseright", '\x22CA')- ,("notapproxequal", '\x2247')- ,("notarrowboth", '\x21AE')- ,("notarrowleft", '\x219A')- ,("notarrowright", '\x219B')- ,("notbar", '\x2224')- ,("notdblarrowboth", '\x21CE')- ,("notdblarrowleft", '\x21CD')- ,("notdblarrowright", '\x21CF')- ,("notexistential", '\x2204')- ,("notfollows", '\x2281')- ,("notfollowsoreql", '\x2AB0')- ,("notforces", '\x22AE')- ,("notforcesextra", '\x22AF')- ,("notgreaterdblequal", '\x2267')- ,("notgreaterequal", '\x2271')- ,("notgreaterorslnteql", '\x2A7E')- ,("notlessdblequal", '\x2266')- ,("notlessequal", '\x2270')- ,("notlessorslnteql", '\x2A7D')- ,("notprecedesoreql", '\x2AAF')- ,("notsatisfies", '\x22AD')- ,("notsimilar", '\x2241')- ,("notsubseteql", '\x2288')- ,("notsubsetordbleql", '\x2AC5')- ,("notsubsetoreql", '\x228A')- ,("notsuperseteql", '\x2289')- ,("notsupersetordbleql", '\x2AC6')- ,("notsupersetoreql", '\x228B')- ,("nottriangeqlleft", '\x22EC')- ,("nottriangeqlright", '\x22ED')- ,("nottriangleleft", '\x22EA')- ,("nottriangleright", '\x22EB')- ,("notturnstile", '\x22AC')- ,("planckover2pi", '\x210F')- ,("planckover2pi1", '\x210F')- ,("precedenotdbleqv", '\x2AB9')- ,("precedenotslnteql", '\x2AB5')- ,("precedeornoteqvlnt", '\x22E8')- ,("subsetnoteql", '\x228A')- ,("subsetornotdbleql", '\x2ACB')- ,("supersetnoteql", '\x228B')- ,("supersetornotdbleql", '\x2ACC')- ,("upslope", '\x29F8')- ]
− lib/Pdf/Toolbox/Content/Transform.hs
@@ -1,54 +0,0 @@---- | 2d affine transform--module Pdf.Toolbox.Content.Transform-(- Transform(..),- Vector(..),- identity,- translation,- scale,- transform,- translate,- multiply-)-where---- | Affine transform-data Transform a = Transform a a a a a a- deriving Show---- | 2d vector/point-data Vector a = Vector a a- deriving Show---- | Identity transform-identity :: Num a => Transform a-identity = Transform 1 0 0 1 0 0---- | Translation-translation :: Num a => a -> a -> Transform a-translation tx ty = Transform 1 0 0 1 tx ty---- | Scale-scale :: Num a => a -> a -> Transform a-scale sx sy = Transform sx 0 0 sy 0 0---- | Apply transformation to vector-transform :: Num a => Transform a -> Vector a -> Vector a-transform (Transform a b c d e f) (Vector x y) = Vector (a * x + c * y + e) (b * x + d * y + f)---- | Translate-translate :: Num a => a -> a -> Transform a -> Transform a-translate tx ty t = translation tx ty `multiply` t---- | Combine two transformations-multiply :: Num a => Transform a -> Transform a -> Transform a-multiply (Transform a1 b1 c1 d1 e1 f1) (Transform a2 b2 c2 d2 e2 f2) = Transform a b c d e f- where- a = a1 * a2 + b1 * c2- b = a1 * b2 + b1 * d2- c = c1 * a2 + d1 * c2- d = c1 * b2 + d1 * d2- e = e1 * a2 + f1 * c2 + e2- f = e1 * b2 + f1 * d2 + f2
− lib/Pdf/Toolbox/Content/UnicodeCMap.hs
@@ -1,203 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- | Unicode CMap defines mapping from glyphs to text--module Pdf.Toolbox.Content.UnicodeCMap-(- UnicodeCMap(..),- parseUnicodeCMap,- unicodeCMapNextGlyph,- unicodeCMapDecodeGlyph-)-where--import Data.Monoid-import Data.Char-import qualified Data.List as List-import Data.Map (Map)-import qualified Data.Map as Map-import Data.ByteString (ByteString)-import qualified Data.ByteString as BS-import qualified Data.ByteString.Base16 as Base16-import Data.Text (Text)-import qualified Data.Text as Text-import qualified Data.Text.Encoding as Text-import Data.Attoparsec.ByteString.Char8 (Parser, parseOnly)-import qualified Data.Attoparsec.ByteString.Char8 as P-import Control.Monad---- | Unicode character map------ Font dictionary can contain \"ToUnicode\" key -- reference--- to a stream with unicode CMap-data UnicodeCMap = UnicodeCMap {- unicodeCMapCodeRanges :: [(ByteString, ByteString)],- unicodeCMapChars :: Map Int Text,- unicodeCMapRanges :: [(Int, Int, Char)]- }- deriving (Show)---- | Parse content of unicode CMap-parseUnicodeCMap :: ByteString -> Either String UnicodeCMap-parseUnicodeCMap cmap =- case (codeRanges, chars, ranges) of- (Right cr, Right cs, Right (rs, crs)) -> Right $ UnicodeCMap {- unicodeCMapCodeRanges = cr,- unicodeCMapChars = cs <> crs,- unicodeCMapRanges = rs- }- (Left err, _, _) -> Left $ "CMap code ranges: " ++ err- (_, Left err, _) -> Left $ "CMap chars: " ++ err- (_, _, Left err) -> Left $ "CMap ranges: " ++ err- where- codeRanges = parseOnly codeRangesParser cmap- chars = parseOnly charsParser cmap- ranges = parseOnly rangesParser cmap---- | Take the next glyph code from string, also returns the rest of the string-unicodeCMapNextGlyph :: UnicodeCMap -> ByteString -> Maybe (Int, ByteString)-unicodeCMapNextGlyph cmap = go 1- where- go 5 _ = Nothing- go n str =- let glyph = BS.take n str in- if BS.length glyph /= n- then Nothing- else if any (inRange glyph) (unicodeCMapCodeRanges cmap)- then Just (toCode glyph, BS.drop n str)- else go (n + 1) str- inRange glyph (start, end) = glyph >= start && glyph <= end--toCode :: ByteString -> Int-toCode bs = fst $ BS.foldr (\b (sm, i) ->- (sm + fromIntegral b * i, i * 255)) (0, 1) bs---- | Convert glyph to text------ Note: one glyph can represent more then one char, e.g. for ligatures-unicodeCMapDecodeGlyph :: UnicodeCMap -> Int -> Maybe Text-unicodeCMapDecodeGlyph cmap glyph =- case Map.lookup glyph (unicodeCMapChars cmap) of- Just txt -> Just txt- Nothing ->- case filter inRange (unicodeCMapRanges cmap) of- [(start, _, char)] -> Just (Text.singleton $ toEnum- $ (fromEnum char) + (glyph - start))- _ -> Nothing- where- inRange (start, end, _) = glyph >= start && glyph <= end--charsParser :: Parser (Map Int Text)-charsParser = do- combineChars <$> P.many' charsParser'- where- combineChars = List.foldl' Map.union Map.empty--charsParser' :: Parser (Map Int Text)-charsParser' = do- n <- skipTillParser $ do- n <- P.decimal- P.skipSpace- _ <- P.string "beginbfchar"- return n-- chars <- replicateM n $ do- P.skipSpace- i <- parseHex- P.skipSpace- j <- parseHex- return (toCode i, Text.decodeUtf16BE j)-- return $ Map.fromList chars---- | It returns regular ranges and char map------ Array ranges are converted to char map-rangesParser :: Parser ([(Int, Int, Char)], Map Int Text)-rangesParser =- combineRanges <$> P.many' rangesParser'- where- combineRanges = List.foldl' combineRange ([], Map.empty)- combineRange (ranges, rmap) (ranges', rmap') =- (ranges ++ ranges', Map.union rmap rmap')--rangesParser' :: Parser ([(Int, Int, Char)], Map Int Text)-rangesParser' = do- n <- skipTillParser $ do- n <- P.decimal- P.skipSpace- void $ P.string "beginbfrange"- return (n :: Int)-- let go 0 rs cs = return (rs, cs)- go count rs cs = do- P.skipSpace- i <- toCode <$> parseHex- P.skipSpace- j <- toCode <$> parseHex- P.skipSpace- k <- P.eitherP parseHex parseHexArray- case k of- Left h -> do- c <- case Text.uncons $ Text.decodeUtf16BE h of- Nothing -> fail "Can't decode range"- Just (v, _) -> return v- go (pred count) ((i, j, c) : rs) cs- Right hs -> do- let cs' = zip [i..j] . map Text.decodeUtf16BE $ hs- go (pred count) rs (cs <> Map.fromList cs')-- go n mempty mempty--codeRangesParser :: Parser [(ByteString, ByteString)]-codeRangesParser = do- n <- skipTillParser $ do- n <- P.decimal- P.skipSpace- void $ P.string "begincodespacerange"- return n-- replicateM n $ do- P.skipSpace- i <- parseHex- P.skipSpace- j <- parseHex- return (i, j)--parseHex :: Parser ByteString-parseHex = do- void $ P.char '<'- -- hex can contain spaces, lets filter them out- res <- P.takeTill (== '>') >>= fromHex . BS.filter (/= 32)- void $ P.char '>'- return res--parseHexArray :: Parser [ByteString]-parseHexArray = do- void $ P.char '['- res <- P.many' $ do- P.skipSpace- parseHex- P.skipSpace- void $ P.char ']'- return res---- XXX: wtf?!-fromHex :: Monad m => ByteString -> m ByteString-fromHex hex = do- let (str, rest) = Base16.decode $ bsToLower hex- unless (BS.null rest) $- fail $ "Can't decode hex" ++ show rest- return str- where- bsToLower = BS.map $ fromIntegral- . fromEnum- . toLower- . toEnum- . fromIntegral--skipTillParser :: Parser a -> Parser a-skipTillParser p = P.choice [- p,- P.anyChar >> skipTillParser p- ]
pdf-toolbox-content.cabal view
@@ -1,5 +1,5 @@ name: pdf-toolbox-content-version: 0.0.5.1+version: 0.1.1 synopsis: A collection of tools for processing PDF files license: BSD3 license-file: LICENSE@@ -8,7 +8,7 @@ copyright: Copyright (c) Yuras Shumovich 2013-2016 category: PDF build-type: Simple-cabal-version: >=1.8+cabal-version: >=1.10 homepage: https://github.com/Yuras/pdf-toolbox extra-source-files: changelog.md description:@@ -22,23 +22,51 @@ hs-source-dirs: lib compat exposed-modules:- Pdf.Toolbox.Content- Pdf.Toolbox.Content.Parser- Pdf.Toolbox.Content.Ops- Pdf.Toolbox.Content.Processor- Pdf.Toolbox.Content.Transform- Pdf.Toolbox.Content.UnicodeCMap- Pdf.Toolbox.Content.FontInfo- Pdf.Toolbox.Content.GlyphList- Pdf.Toolbox.Content.TexGlyphList- Pdf.Toolbox.Content.Encoding.WinAnsi- Pdf.Toolbox.Content.Encoding.MacRoman+ Pdf.Content+ Pdf.Content.Parser+ Pdf.Content.Ops+ Pdf.Content.Processor+ Pdf.Content.Transform+ Pdf.Content.UnicodeCMap+ Pdf.Content.FontDescriptor+ Pdf.Content.FontInfo+ Pdf.Content.GlyphList+ Pdf.Content.TexGlyphList+ Pdf.Content.Encoding.WinAnsi+ Pdf.Content.Encoding.MacRoman+ Pdf.Content.Encoding.PdfDoc other-modules: Prelude build-depends: base >= 4.5 && < 5, containers, attoparsec >= 0.10, bytestring,- base16-bytestring,+ base16-bytestring >= 1, text,+ scientific,+ vector, io-streams,- pdf-toolbox-core ==0.0.4.*+ pdf-toolbox-core ==0.1.*+ if impl(ghc >= 8.10)+ ghc-options: -Wunused-packages+ default-language: Haskell2010++test-suite test+ type: exitcode-stdio-1.0+ hs-source-dirs: test+ compat+ main-is: test.hs+ other-modules: Test.UnicodeCMap+ Test.Parser+ Test.FontDescriptor+ Prelude+ build-depends: base,+ containers,+ bytestring,+ attoparsec,+ io-streams,+ pdf-toolbox-content,+ pdf-toolbox-core,+ hspec+ if impl(ghc >= 8.10)+ ghc-options: -Wunused-packages+ default-language: Haskell2010
+ test/Test/FontDescriptor.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE OverloadedStrings #-}++module Test.FontDescriptor+(+ spec,+)+where++import Pdf.Content.FontDescriptor++import Data.Int+import Test.Hspec++spec :: Spec+spec = describe "FontDescriptor" $ do+ testFlagSet++defFD :: FontDescriptor+defFD = FontDescriptor+ { fdFontName = "test"+ , fdFontFamily = Nothing+ , fdFontStretch = Nothing+ , fdFontWeight = Nothing+ , fdFlags = 5+ , fdFontBBox = Nothing+ , fdItalicAngle = -12.5+ , fdDescent = Nothing+ , fdAscent = Nothing+ , fdLeading = Nothing+ , fdCapHeight = Nothing+ , fdXHeight = Nothing+ , fdStemV = Nothing+ , fdStemH = Nothing+ , fdAvgWidth = Nothing+ , fdMaxWidth = Nothing+ , fdMissingWidth = Nothing+ , fdCharSet = Nothing+ }++testFlagSet :: Spec+testFlagSet = describe "flagSet" $ do+ it "should return True when testing FixedPitch on 5" $ do+ let res = flagSet defFD FixedPitch+ res `shouldSatisfy` (==True)++ it "should return False when testing Serif on 5" $ do+ let res = flagSet defFD Serif+ res `shouldSatisfy` (==False)++ it "should return True when testing Symbolic on 5" $ do+ let res = flagSet defFD Symbolic+ res `shouldSatisfy` (==True)++ it "should return False when testing Script on 5" $ do+ let res = flagSet defFD Script+ res `shouldSatisfy` (==False)++ it "should return False when testing ForceBold on 5" $ do+ let res = flagSet defFD ForceBold+ res `shouldSatisfy` (==False)++ it "should return True when testing ForceBold on (2^32)-1" $ do+ let res = flagSet (defFD {fdFlags = (power64 2 32)-1}) ForceBold+ res `shouldSatisfy` (==True)++ it "should return False when testing ForceBold on 0" $ do+ let res = flagSet (defFD {fdFlags = 0}) ForceBold+ res `shouldSatisfy` (==False)++ where+ power64 :: Int64 -> Int64 -> Int64+ power64 _ 0 = 1+ power64 b e = b * power64 b (e-1)
+ test/Test/Parser.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE OverloadedStrings #-}++module Test.Parser+(+ spec,+)+where++import Pdf.Core+import Pdf.Core.Exception+import Pdf.Content.Parser+import Pdf.Content.Ops++import qualified Data.Attoparsec.ByteString as Parser+import qualified System.IO.Streams as Streams+import Test.Hspec++spec :: Spec+spec = describe "Parser" $ do+ parseContentSpec+ readNextOperatorSpec++parseContentSpec :: Spec+parseContentSpec = describe "parseContent" $ do+ it "should parse an object" $ do+ let input = "(hello)"+ res = Parser.parseOnly parseContent input+ res `shouldBe` Right (Just $ Obj $ String "hello")++ it "should parse an operator" $ do+ let input = "T*"+ res = Parser.parseOnly parseContent input+ res `shouldBe` Right (Just $ Op Op_T_star)++ it "should return Nothing when input is empty" $ do+ let input = ""+ res = Parser.parseOnly parseContent input+ res `shouldBe` Right Nothing++ it "should ignore comments at the beginning" $ do+ let input = "% comments\nTj"+ res = Parser.parseOnly parseContent input+ res `shouldBe` Right (Just $ Op Op_Tj)++ it "should ignore multiple lines of comments at the beginning" $ do+ let input = "% comments\nTj"+ res = Parser.parseOnly parseContent input+ res `shouldBe` Right (Just $ Op Op_Tj)++readNextOperatorSpec :: Spec+readNextOperatorSpec = describe "readNextOperator" $ do+ it "should return Nothing when there is no input" $ do+ let input = []+ is <- Streams.fromList input+ next <- readNextOperator is+ next `shouldBe` Nothing++ it "should collect all objects until an operator" $ do+ let input = [Obj o1, Obj o2, Op op]+ o1 = String "o1"+ o2 = String "o2"+ op = Op_Tj+ is <- Streams.fromList input+ next <- readNextOperator is+ next `shouldBe` Just (op, [o1, o2])++ it "should throw when there is no operator after arguments" $ do+ let input = [Obj o1, Obj o2]+ o1 = String "o1"+ o2 = String "o2"+ is <- Streams.fromList input+ readNextOperator is+ `shouldThrow` \Corrupted{} -> True
+ test/Test/UnicodeCMap.hs view
@@ -0,0 +1,164 @@+{-# LANGUAGE OverloadedStrings #-}++module Test.UnicodeCMap+(+ spec,+)+where++import Pdf.Content.UnicodeCMap++import Data.Either+import qualified Data.List as List+import qualified Data.Map as Map+import qualified Data.ByteString as ByteString+import Test.Hspec++spec :: Spec+spec = describe "UnicodeCMap" $ do+ parseUnicodeCMapSpec+ unicodeCMapDecodeGlyphSpec+ unicodeCMapNextGlyphSpec++parseUnicodeCMapSpec :: Spec+parseUnicodeCMapSpec = describe "parseUnicodeCMap" $ do+ it "should parse trivial cmap" $ do+ let input = ByteString.concat+ [ "0 begincodespacerange\n"+ , "0 beginbfchar\n"+ , "0 beginbfrange\n"+ ]+ res = parseUnicodeCMap input+ res `shouldSatisfy` isRight++ it "should parse codespace ranges" $ do+ let input = ByteString.concat+ [ "1 begincodespacerange\n"+ , "<0000> <FFFF>\n"+ , "0 beginbfchar\n"+ , "0 beginbfrange\n"+ ]+ res = parseUnicodeCMap input+ fmap unicodeCMapCodeRanges res `shouldBe`+ Right [ (ByteString.pack [0, 0], ByteString.pack [255, 255])]++ it "should parse chars" $ do+ let input = ByteString.concat+ [ "0 begincodespacerange\n"+ , "1 beginbfchar\n"+ , "<3A51> <D840DC3E>\n"+ , "0 beginbfrange\n"+ ]+ res = parseUnicodeCMap input+ fmap unicodeCMapChars res `shouldBe`+ Right (Map.fromList [(14929,"\131134")])++ it "should parse multiple chars" $ do+ let input = ByteString.concat+ [ "0 begincodespacerange\n"+ , "1 beginbfchar\n"+ , "<25> <00660066>\n"+ , "endbfchar\n"+ , "1 beginbfchar\n"+ , "<26> <0066006c>\n"+ , "endbfchar\n"+ , "0 beginbfrange\n"+ ]+ res = parseUnicodeCMap input+ fmap unicodeCMapChars res `shouldBe`+ Right (Map.fromList [(37,"ff"), (38, "fl")])++ it "should parse ranges" $ do+ let input = ByteString.concat+ [ "0 begincodespacerange\n"+ , "0 beginbfchar\n"+ , "1 beginbfrange\n"+ , "<0000> <005E> <0020>\n"+ ]+ res = parseUnicodeCMap input+ fmap unicodeCMapRanges res `shouldBe`+ Right [(0,94,' ')]++ it "should parse multiple ranges" $ do+ let input = ByteString.concat+ [ "0 begincodespacerange\n"+ , "0 beginbfchar\n"+ , "1 beginbfrange\n"+ , "<21> <21> <0045>\n"+ , "endbfrange\n"+ , "1 beginbfrange\n"+ , "<22> <22> <0073>\n"+ , "endbfrange\n"+ ]+ res = parseUnicodeCMap input+ fmap (List.sort . unicodeCMapRanges) res `shouldBe`+ Right (List.sort [(33,33,'E'), (34, 34, 's')])++ it "should parse array ranges into char map" $ do+ let input = ByteString.concat+ [ "0 begincodespacerange\n"+ , "0 beginbfchar\n"+ , "1 beginbfrange\n"+ , "<005F> <0061> [<00660066> <00660069> <00660066006C>]\n"+ ]+ res = parseUnicodeCMap input+ fmap unicodeCMapChars res `shouldBe`+ Right (Map.fromList [(95,"ff"),(96,"fi"),(97,"ffl")])++ it "should allow spaces in hex numbers" $ do+ let input = ByteString.concat+ [ "1 begincodespacerange\n"+ , "<0000> <FF FF>\n"+ , "0 beginbfchar\n"+ , "0 beginbfrange\n"+ ]+ res = parseUnicodeCMap input+ fmap unicodeCMapCodeRanges res `shouldBe`+ Right [ (ByteString.pack [0, 0], ByteString.pack [255, 255])]++unicodeCMapDecodeGlyphSpec :: Spec+unicodeCMapDecodeGlyphSpec = describe "unicodeCMapDecodeGlyph" $ do+ it "should take glyph from char map if possible" $ do+ let cmap = UnicodeCMap [] charMap []+ charMap = Map.fromList [(42, "hello")]++ let res = unicodeCMapDecodeGlyph cmap 42+ res `shouldBe` Just "hello"++ it "should be able to decode the first glyph from a range" $ do+ let cmap = UnicodeCMap [] mempty [(10, 15, '1')]++ let res = unicodeCMapDecodeGlyph cmap 10+ res `shouldBe` Just "1"++ it "should be able to decode the last glyph from a range" $ do+ let cmap = UnicodeCMap [] mempty [(10, 15, '1')]++ let res = unicodeCMapDecodeGlyph cmap 15+ res `shouldBe` Just "6"++ it "should be able to decode a glyph from a middle of a range" $ do+ let cmap = UnicodeCMap [] mempty [(10, 15, '1')]++ let res = unicodeCMapDecodeGlyph cmap 11+ res `shouldBe` Just "2"++ it "should not decode a glyph before a range" $ do+ let cmap = UnicodeCMap [] mempty [(10, 15, '1')]++ let res = unicodeCMapDecodeGlyph cmap 9+ res `shouldBe` Nothing++ it "should not decode a glyph after a range" $ do+ let cmap = UnicodeCMap [] mempty [(10, 15, '1')]++ let res = unicodeCMapDecodeGlyph cmap 16+ res `shouldBe` Nothing++unicodeCMapNextGlyphSpec :: Spec+unicodeCMapNextGlyphSpec = describe "unicodeCMapNextGlyph" $ do+ it "correctly handles multibyte ranges" $ do+ let cmap = UnicodeCMap [("\0\0", "\1\1")] mempty []+ let Just (code, rest) = unicodeCMapNextGlyph cmap "\1\0rest"+ rest `shouldBe` rest+ code `shouldBe` 256
+ test/test.hs view
@@ -0,0 +1,18 @@++module Main+(+ main+)+where++import qualified Test.UnicodeCMap+import qualified Test.Parser+import qualified Test.FontDescriptor++import Test.Hspec++main :: IO ()+main = hspec $ do+ Test.UnicodeCMap.spec+ Test.Parser.spec+ Test.FontDescriptor.spec