packages feed

wumpus-core 0.37.0 → 0.40.0

raw patch · 44 files changed

+10208/−1641 lines, 44 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Wumpus.Core.FontSize: courier48_ascender_height :: PtSize
- Wumpus.Core.FontSize: courier48_descender_depth :: PtSize
- Wumpus.Core.FontSize: courier48_height :: PtSize
- Wumpus.Core.FontSize: courier48_numeral_height :: PtSize
- Wumpus.Core.FontSize: courier48_spacer_width :: PtSize
- Wumpus.Core.FontSize: courier48_width :: PtSize
- Wumpus.Core.FontSize: courier48_xheight :: PtSize
- Wumpus.Core.FontSize: numeralHeight :: FontSize -> PtSize
- Wumpus.Core.FontSize: spacerWidth :: FontSize -> PtSize
- Wumpus.Core.FontSize: textBoundsEnc :: (Num u, Ord u, FromPtSize u) => FontSize -> Point2 u -> EncodedText -> BoundingBox u
- Wumpus.Core.FontSize: textHeight :: FontSize -> PtSize
- Wumpus.Core.FontSize: widthAt48pt :: CharCount -> PtSize
- Wumpus.Core.GraphicProps: font_enc_name :: FontFace -> FontEncoderName
- Wumpus.Core.GraphicProps: font_name :: FontFace -> String
- Wumpus.Core.OutputPostScript: writeEPS_latin1 :: (Real u, Floating u, PSUnit u) => FilePath -> Picture u -> IO ()
- Wumpus.Core.OutputPostScript: writePS_latin1 :: (Real u, Floating u, PSUnit u) => FilePath -> [Picture u] -> IO ()
- Wumpus.Core.OutputSVG: writeSVG_latin1 :: (Real u, Floating u, PSUnit u) => FilePath -> Picture u -> IO ()
- Wumpus.Core.Picture: path :: Point2 u -> [PrimPathSegment u] -> PrimPath u
- Wumpus.Core.Text.DefaultEncoder: defaultEncoder :: TextEncoder
- Wumpus.Core.Text.Encoder: FontEncoder :: PostScriptLookup -> SVGLookup -> GlyphName -> CharCode -> FontEncoder
- Wumpus.Core.Text.Encoder: FontEncoderName :: Word16 -> FontEncoderName
- Wumpus.Core.Text.Encoder: TextEncoder :: String -> Map FontEncoderName FontEncoder -> TextEncoder
- Wumpus.Core.Text.Encoder: data FontEncoder
- Wumpus.Core.Text.Encoder: data TextEncoder
- Wumpus.Core.Text.Encoder: font_encoder_map :: TextEncoder -> Map FontEncoderName FontEncoder
- Wumpus.Core.Text.Encoder: getFontEncoderName :: FontEncoderName -> Word16
- Wumpus.Core.Text.Encoder: instance Eq FontEncoderName
- Wumpus.Core.Text.Encoder: instance Ord FontEncoderName
- Wumpus.Core.Text.Encoder: instance Show FontEncoderName
- Wumpus.Core.Text.Encoder: newtype FontEncoderName
- Wumpus.Core.Text.Encoder: ps_fallback :: FontEncoder -> GlyphName
- Wumpus.Core.Text.Encoder: ps_lookup :: FontEncoder -> PostScriptLookup
- Wumpus.Core.Text.Encoder: svg_encoding_name :: TextEncoder -> String
- Wumpus.Core.Text.Encoder: svg_fallback :: FontEncoder -> CharCode
- Wumpus.Core.Text.Encoder: svg_lookup :: FontEncoder -> SVGLookup
- Wumpus.Core.Text.Encoder: type CharCode = Int
- Wumpus.Core.Text.Encoder: type GlyphName = String
- Wumpus.Core.Text.Encoder: type PostScriptLookup = CharCode -> Maybe GlyphName
- Wumpus.Core.Text.Encoder: type SVGLookup = GlyphName -> Maybe CharCode
- Wumpus.Core.Text.Latin1: latin1FontAll :: [(GlyphName, CharCode)]
- Wumpus.Core.Text.Latin1: latin1FontEncoder :: FontEncoder
- Wumpus.Core.Text.Latin1: latin1_font_encoder :: FontEncoderName
- Wumpus.Core.Text.SymbolFont: symbolFontAll :: [(GlyphName, CharCode)]
- Wumpus.Core.Text.SymbolFont: symbolFontEncoder :: FontEncoder
- Wumpus.Core.Text.SymbolFont: symbol_font_encoder :: FontEncoderName
+ Wumpus.Core.BoundingBox: boundaryCornerList :: BoundingBox u -> [Point2 u]
+ Wumpus.Core.FontSize: ascenderHeight :: FontSize -> PtSize
+ Wumpus.Core.FontSize: capHeight :: FontSize -> PtSize
+ Wumpus.Core.FontSize: data PtScale
+ Wumpus.Core.FontSize: instance Eq PtScale
+ Wumpus.Core.FontSize: instance Floating PtScale
+ Wumpus.Core.FontSize: instance Fractional PtScale
+ Wumpus.Core.FontSize: instance Num PtScale
+ Wumpus.Core.FontSize: instance Ord PtScale
+ Wumpus.Core.FontSize: instance Real PtScale
+ Wumpus.Core.FontSize: instance RealFloat PtScale
+ Wumpus.Core.FontSize: instance RealFrac PtScale
+ Wumpus.Core.FontSize: instance Show PtScale
+ Wumpus.Core.FontSize: mono_ascender :: PtScale
+ Wumpus.Core.FontSize: mono_cap_height :: PtScale
+ Wumpus.Core.FontSize: mono_descender :: PtScale
+ Wumpus.Core.FontSize: mono_left_margin :: PtScale
+ Wumpus.Core.FontSize: mono_right_margin :: PtScale
+ Wumpus.Core.FontSize: mono_width :: PtScale
+ Wumpus.Core.FontSize: mono_x_height :: PtScale
+ Wumpus.Core.FontSize: ptSizeScale :: PtScale -> PtSize -> PtSize
+ Wumpus.Core.FontSize: textBoundsEsc :: (Num u, Ord u, FromPtSize u) => FontSize -> Point2 u -> EscapedText -> BoundingBox u
+ Wumpus.Core.FontSize: totalCharHeight :: FontSize -> PtSize
+ Wumpus.Core.Geometry: vreverse :: Num u => Vec2 u -> Vec2 u
+ Wumpus.Core.GraphicProps: font_enc_vector :: FontFace -> EncodingVector
+ Wumpus.Core.GraphicProps: ps_font_name :: FontFace -> String
+ Wumpus.Core.OutputSVG: writeSVG_defs :: (Real u, Floating u, PSUnit u) => FilePath -> String -> Picture u -> IO ()
+ Wumpus.Core.Picture: annotateGroup :: [SvgAttr] -> Primitive u -> Primitive u
+ Wumpus.Core.Picture: annotateXLink :: XLink -> [SvgAttr] -> Primitive u -> Primitive u
+ Wumpus.Core.Picture: escapedlabel :: Num u => RGBi -> FontAttr -> EscapedText -> Point2 u -> Primitive u
+ Wumpus.Core.Picture: primPath :: Num u => Point2 u -> [AbsPathSegment u] -> PrimPath u
+ Wumpus.Core.Picture: rescapedlabel :: Num u => RGBi -> FontAttr -> EscapedText -> Point2 u -> Radian -> Primitive u
+ Wumpus.Core.Picture: svgattr :: String -> String -> SvgAttr
+ Wumpus.Core.Picture: zescapedlabel :: Num u => EscapedText -> Point2 u -> Primitive u
+ Wumpus.Core.Text.Base: CharEscInt :: Int -> EscapedChar
+ Wumpus.Core.Text.Base: CharEscName :: String -> EscapedChar
+ Wumpus.Core.Text.Base: CharLiteral :: Char -> EscapedChar
+ Wumpus.Core.Text.Base: EscapedText :: [EscapedChar] -> EscapedText
+ Wumpus.Core.Text.Base: data EscapedChar
+ Wumpus.Core.Text.Base: escapeString :: String -> EscapedText
+ Wumpus.Core.Text.Base: getEscapedText :: EscapedText -> [EscapedChar]
+ Wumpus.Core.Text.Base: instance Eq EscapedChar
+ Wumpus.Core.Text.Base: instance Eq EscapedText
+ Wumpus.Core.Text.Base: instance Format EscapedChar
+ Wumpus.Core.Text.Base: instance Format EscapedText
+ Wumpus.Core.Text.Base: instance Show EscapedChar
+ Wumpus.Core.Text.Base: instance Show EscapedText
+ Wumpus.Core.Text.Base: newtype EscapedText
+ Wumpus.Core.Text.Base: textLength :: EscapedText -> Int
+ Wumpus.Core.Text.Base: type EncodingVector = IntMap String
+ Wumpus.Core.Text.GlyphIndices: ps_glyph_indices :: Map String Int
+ Wumpus.Core.Text.GlyphNames: ps_glyph_names :: IntMap String
+ Wumpus.Core.Text.Latin1Encoding: latin1_encoding :: EncodingVector
+ Wumpus.Core.Text.StandardEncoding: standard_encoding :: EncodingVector
+ Wumpus.Core.Text.Symbol: symbol_encoding :: EncodingVector
- Wumpus.Core.GraphicProps: FontFace :: String -> String -> SVGFontStyle -> FontEncoderName -> FontFace
+ Wumpus.Core.GraphicProps: FontFace :: String -> String -> SVGFontStyle -> EncodingVector -> FontFace
- Wumpus.Core.OutputPostScript: writeEPS :: (Real u, Floating u, PSUnit u) => FilePath -> TextEncoder -> Picture u -> IO ()
+ Wumpus.Core.OutputPostScript: writeEPS :: (Real u, Floating u, PSUnit u) => FilePath -> Picture u -> IO ()
- Wumpus.Core.OutputPostScript: writePS :: (Real u, Floating u, PSUnit u) => FilePath -> TextEncoder -> [Picture u] -> IO ()
+ Wumpus.Core.OutputPostScript: writePS :: (Real u, Floating u, PSUnit u) => FilePath -> [Picture u] -> IO ()
- Wumpus.Core.OutputSVG: writeSVG :: (Real u, Floating u, PSUnit u) => FilePath -> TextEncoder -> Picture u -> IO ()
+ Wumpus.Core.OutputSVG: writeSVG :: (Real u, Floating u, PSUnit u) => FilePath -> Picture u -> IO ()
- Wumpus.Core.Picture: curveTo :: Point2 u -> Point2 u -> Point2 u -> PrimPathSegment u
+ Wumpus.Core.Picture: curveTo :: Point2 u -> Point2 u -> Point2 u -> AbsPathSegment u
- Wumpus.Core.Picture: curvedPath :: [Point2 u] -> PrimPath u
+ Wumpus.Core.Picture: curvedPath :: Num u => [Point2 u] -> PrimPath u
- Wumpus.Core.Picture: lineTo :: Point2 u -> PrimPathSegment u
+ Wumpus.Core.Picture: lineTo :: Point2 u -> AbsPathSegment u
- Wumpus.Core.Picture: vertexPath :: [Point2 u] -> PrimPath u
+ Wumpus.Core.Picture: vertexPath :: Num u => [Point2 u] -> PrimPath u
- Wumpus.Core.WumpusTypes: type KerningChar u = (u, EncodedChar)
+ Wumpus.Core.WumpusTypes: type KerningChar u = (u, EscapedChar)

Files

demo/AffineTestBase.hs view
@@ -47,8 +47,8 @@ runATA :: AffineTrafoAlg -> IO ()
 runATA ata = do 
     { putStrLn $ ata_console_msg ata
-    ; writeEPS_latin1 (ata_eps_file ata) pic
-    ; writeSVG_latin1 (ata_svg_file ata) pic 
+    ; writeEPS (ata_eps_file ata) pic
+    ; writeSVG (ata_svg_file ata) pic 
     }
   where
     pic = buildPictureATA (ata_prim_constructor ata) 
@@ -92,8 +92,8 @@ runCPA :: ControlPointAlg -> IO ()
 runCPA cpa = do 
     { putStrLn $ cpa_console_msg cpa
-    ; writeEPS_latin1 (cpa_eps_file cpa) pic
-    ; writeSVG_latin1 (cpa_svg_file cpa) pic
+    ; writeEPS (cpa_eps_file cpa) pic
+    ; writeSVG (cpa_svg_file cpa) pic
     }
   where
     pic = cpPicture (cpa_prim_constructor cpa) (cpa_prim_transformer cpa)
@@ -125,13 +125,13 @@ 
 
 dog_kennel :: DPrimPath
-dog_kennel = path zeroPt [ lineTo  (P2 0 60) 
-                         , lineTo  (P2 40 100)
-                         , lineTo  (P2 80 60)
-                         , lineTo  (P2 80 0)
-                         , lineTo  (P2 60 0)  
-                         , lineTo  (P2 60 30)
-                         , curveTo (P2 60 50) (P2 50 60) (P2 40 60)
-                         , curveTo (P2 30 60) (P2 20 50) (P2 20 30)
-                         , lineTo  (P2 20 0)
-                         ]+dog_kennel = primPath zeroPt [ lineTo  (P2 0 60) 
+                             , lineTo  (P2 40 100)
+                             , lineTo  (P2 80 60)
+                             , lineTo  (P2 80 0)
+                             , lineTo  (P2 60 0)  
+                             , lineTo  (P2 60 30)
+                             , curveTo (P2 60 50) (P2 50 60) (P2 40 60)
+                             , curveTo (P2 30 60) (P2 20 50) (P2 20 30)
+                             , lineTo  (P2 20 0)
+                             ]
demo/DeltaPic.hs view
@@ -7,7 +7,7 @@ module DeltaPic where  import Wumpus.Core-+import Wumpus.Core.Text.StandardEncoding import System.Directory  @@ -23,8 +23,8 @@ main :: IO () main = do      createDirectoryIfMissing True "./out/"-    writeEPS_latin1 "./out/delta_pic01.eps" pic1-    writeSVG_latin1 "./out/delta_pic01.svg" pic1+    writeEPS "./out/delta_pic01.eps" pic1+    writeSVG "./out/delta_pic01.svg" pic1   pic1 :: DPicture@@ -38,7 +38,7 @@    frame1 a   = frame [a]   common_ff :: FontFace-common_ff = FontFace "Helvetica" "Helvetica" SVG_REGULAR latin1_font_encoder+common_ff = FontFace "Helvetica" "Helvetica" SVG_REGULAR standard_encoding   -- Note - each label is fully attributed with the font style.
demo/FontMetrics.hs view
@@ -3,6 +3,8 @@ module FontMetrics where  import Wumpus.Core+import Wumpus.Core.FontSize+import Wumpus.Core.Text.StandardEncoding  import Data.AffineSpace                 -- package: vector-space @@ -13,8 +15,8 @@ main :: IO () main = do      createDirectoryIfMissing True "./out/"-    writeEPS_latin1 "./out/font_metrics.eps" metrics_pic-    writeSVG_latin1 "./out/font_metrics.svg" metrics_pic+    writeEPS "./out/font_metrics.eps" metrics_pic+    writeSVG "./out/font_metrics.svg" metrics_pic   peru :: RGBi@@ -28,45 +30,33 @@  courier_attr :: FontAttr courier_attr = FontAttr 48 (FontFace "Courier" "Courier New" -                                     SVG_REGULAR latin1_font_encoder)+                                     SVG_REGULAR standard_encoding)  metrics_pic :: DPicture metrics_pic = char_pic `picOver` lines_pic  lines_pic   :: DPicture lines_pic   = frame $ -    [ ascender_line, numeral_line, xheight_line, baseline, descender_line ]+    [ ascender_line, cap_line, xheight_line, baseline, descender_line ]   where-    descender_pos   = 0 - courier48_descender_depth-  -    ascender_line   = haxis peru (descender_pos + courier48_height)-    numeral_line    = haxis peru courier48_numeral_height-    xheight_line    = haxis peru courier48_xheight+    ascender_line   = haxis peru (ascenderHeight 48)+    cap_line        = haxis peru (capHeight 48)+    xheight_line    = haxis peru (xcharHeight 48)     baseline        = haxis peru 0-    descender_line  = haxis peru descender_pos+    descender_line  = haxis peru (descenderDepth 48)    char_pic :: Picture Double char_pic = frame $ zipWith ($) chars (iterate (.+^ hvec 32) zeroPt)   where-    chars = (map letter "ABXabdgjxy12") ++ [agraveU]+    chars = map letter "ABXabdgjxy12" -type PrimF = DPoint2 -> DPrimitive -bodyHeight  :: PrimF-bodyHeight  = vertLine peru $ fromPtSize courier48_numeral_height -agraveU     :: PrimF-agraveU     = textlabel black courier_attr "&#Agrave"- letter :: Char -> DPoint2 -> DPrimitive letter ch pt = textlabel black courier_attr [ch] pt --vertLine :: RGBi -> Double -> DPoint2 -> DPrimitive-vertLine rgb height pt = -    ostroke rgb default_stroke_attr $ vertexPath [pt, pt .+^ vvec height]  haxis :: RGBi -> PtSize -> DPrimitive haxis rgb ypos = 
+ demo/Hyperlink.hs view
@@ -0,0 +1,21 @@+{-# OPTIONS -Wall #-}++module Hyperlink where++import Wumpus.Core++import System.Directory++++main :: IO ()+main = do +    createDirectoryIfMissing True "./out/"+    writeEPS "./out/svg_link01.eps"  link_pic+    writeSVG "./out/svg_link01.svg"  link_pic+++link_pic :: DPicture+link_pic = frame [ xlink xref $ ztextlabel "www.haskell.org" zeroPt ]+  where    +     xref = xlinkhref "http://www.haskell.org"
demo/KernPic.hs view
@@ -4,7 +4,8 @@  import Wumpus.Core import Wumpus.Core.Colour-+import Wumpus.Core.Text.StandardEncoding+import Wumpus.Core.Text.Symbol import System.Directory  @@ -12,38 +13,50 @@ main :: IO () main = do      createDirectoryIfMissing True "./out/"-    writeEPS_latin1 "./out/kern_pic01.eps" kern_pic-    writeSVG_latin1 "./out/kern_pic01.svg" kern_pic-+    putStrLn $ unlines warn_msg+    writeEPS "./out/kern_pic01.eps" kern_pic+    writeSVG "./out/kern_pic01.svg" kern_pic+  where+    warn_msg = [ "Note - this demo uses the symbol font which is not"+               , "recommended for SVG."+               ]  kern_pic :: DPicture kern_pic = pic1 `picOver` pic2 `picOver` pic3   pic1 :: DPicture-pic1 = frame [ helveticaLabelH mystere   (P2 0 50)-             , helveticaLabelH mystere   (P2 0 25)+pic1 = frame [ helveticaLabelH universal   (P2 0 50)+             , helveticaLabelH universal   (P2 0 25)              ]  pic2 :: DPicture pic2 = illustrateBoundsPrim blue_violet $ -          helveticaLabelV mystere   (P2 100 140)+          helveticaLabelV universal (P2 200 180)  pic3 :: DPicture pic3 = frame [ symbolLabelH uUpsilon (P2 0 0) ] -mystere ::[DKerningChar]-mystere = [ kernchar 0  'm'-          , kernchar 15 'y'-          , kernchar 10 's'-          , kernchar 10 't'-          , kernEscInt 6 232-          , kernchar 10 'r'-          , kernchar 6 'e'-          ]+-- Some attention is paid to kerning - note that the kern between +-- @i@ and @v@ is smaller than the norm.+--+universal ::[DKerningChar]+universal = [ kernchar     0  'u'+            , kernchar    15  'n'+            , kernchar    15  'i'+            , kernchar    10  'v'+            , kernchar    15  'e'+            , kernchar    15  'r'+            , kernchar    13  's'+            , kernchar    15  'a'+            , kernchar    15  'l'+            , kernEscName 10  "currency"+            ] --- Note - to assert that this is working check both the --- PostScript and the SVG.+-- Note - this may not work in SVG, some renderers are intolerant +-- towards the Symbol font. --+-- 0o241 is upper-case upsilon in the Symbol encoding vector.+--  uUpsilon :: [ DKerningChar ] uUpsilon = [ kernEscInt 6 0o241, kernchar 12 'a', kernchar 12 'b' ]  @@ -61,14 +74,14 @@ helvetica18 = FontAttr 18 (FontFace "Helvetica"                                      "Helvetica"                                      SVG_REGULAR -                                    latin1_font_encoder)+                                    standard_encoding)   symbol18 :: FontAttr symbol18 = FontAttr 18 (FontFace "Symbol"                                   "Symbol"                                   SVG_REGULAR-                                 symbol_font_encoder)+                                 symbol_encoding)  blue_violet             :: RGBi blue_violet             = RGBi 0x8a 0x2b 0xe2
demo/LabelPic.hs view
@@ -4,6 +4,7 @@ module LabelPic where  import Wumpus.Core+import Wumpus.Core.Text.StandardEncoding  import System.Directory @@ -18,13 +19,13 @@  demo01 :: IO () demo01 = do -    writeEPS_latin1 "./out/label01.eps" lbl1-    writeSVG_latin1 "./out/label01.svg" lbl1+    writeEPS "./out/label01.eps" lbl1+    writeSVG "./out/label01.svg" lbl1  demo02 :: IO () demo02 = do -    writeEPS_latin1 "./out/label02.eps" p1-    writeSVG_latin1 "./out/label02.svg" p1+    writeEPS "./out/label02.eps" p1+    writeSVG "./out/label02.svg" p1   where     p1 = lbl1 `picBeside` lbl1                `picBeside` (rotateAbout (pi/4) (center lbl1) lbl1) @@ -32,8 +33,8 @@  demo03 :: IO () demo03 = do -    writeEPS_latin1 "./out/label03.eps" p1-    writeSVG_latin1 "./out/label03.svg" p1+    writeEPS "./out/label03.eps" p1+    writeSVG "./out/label03.svg" p1   where     p1 = (drawBounds lbl1) `picBeside`           (drawBounds lbl1) `picBeside` @@ -44,8 +45,8 @@  demo04 :: IO () demo04 = do-    writeEPS_latin1 "./out/label04.eps" p1-    writeSVG_latin1 "./out/label04.svg" p1+    writeEPS "./out/label04.eps" p1+    writeSVG "./out/label04.svg" p1   where     p1 =           (drawBounds lbl1)           `picOver` (drawBounds $ scale 2 2 lbl1)@@ -63,14 +64,14 @@ bigLetter rgb ch = uniformScale 5 $ frame [textlabel rgb attrs [ch] zeroPt]   where     attrs = FontAttr 12 (FontFace "Helvetica" "Helvetica" -                                  SVG_REGULAR latin1_font_encoder)+                                  SVG_REGULAR standard_encoding)   -- | A should be above B, above T demo05 :: IO () demo05 = do -    writeEPS_latin1 "./out/label05.eps" p1-    writeSVG_latin1 "./out/label05.svg" p1+    writeEPS "./out/label05.eps" p1+    writeSVG "./out/label05.svg" p1   where     p1 = uniformScale 10 $ bigA `picOver` bigB `picOver` bigT @@ -78,8 +79,8 @@  demo06 :: IO () demo06 = do -    writeEPS_latin1 "./out/label06.eps" p1-    writeSVG_latin1 "./out/label06.svg" p1+    writeEPS "./out/label06.eps" p1+    writeSVG "./out/label06.svg" p1   where     p1 = pA `picBeside` pB `picBeside` pC `picBeside` pA     @@ -90,8 +91,8 @@  demo07 :: IO () demo07 = do -    writeEPS_latin1 "./out/label07.eps" p1-    writeSVG_latin1 "./out/label07.svg" p1+    writeEPS "./out/label07.eps" p1+    writeSVG "./out/label07.svg" p1   where     p1 = pA `picBeside` pB `picBeside` pC     @@ -139,5 +140,5 @@   line1 = frame [textlabel peru attrs "Hello" zeroPt]   line2 = frame [textlabel peru attrs "World" zeroPt]   attrs = FontAttr 12 (FontFace "Helvetica" "Helvetica" -                                SVG_REGULAR latin1_font_encoder)+                                SVG_REGULAR standard_encoding) 
demo/Latin1Pic.hs view
@@ -4,6 +4,7 @@  import Wumpus.Core import Wumpus.Core.Colour+import Wumpus.Core.Text.StandardEncoding  import System.Directory @@ -12,16 +13,39 @@ main :: IO () main = do      createDirectoryIfMissing True "./out/"-    writeEPS_latin1 "./out/latin1_pic01.eps" pic1-    writeSVG_latin1 "./out/latin1_pic01.svg" pic1+    putStr ps_msg+    writeEPS "./out/latin1_pic01.eps" pic1+    writeSVG "./out/latin1_pic01.svg" pic1+  where+    ps_msg = unlines $ +        [ "Expected output:"+        , "  SVG - egrave in all four lines."+        , "  GhostScript - Lslash / egrave / Lslash / Lslash." +        , ""+        , "Explanation:"+        , "The data for this demo uses char code 232 (0xE8) corresponding"+        , "to (egrave) in the common Latin1 character set."+        , "This is printed as expected for SVG."+        , ""+        , "However, in the PostScript _Standard Encoding_ 232 corresponds"+        , "to Lslash and the core GhostScript and Adobe fonts generally use" +        , "Standard Encoding, so Wumpus matches the font Helvetica with this"+        , "encoding."+        , ""+        , "To get the expected character in both PostScript and SVG use the"+        , "glyph name as the escape token."+        , ""+        ]   -- | Provided the respective lookups can be found, Wumpus  -- supports escapes as either numbers or names... --+-- Note - 0xE8 corresponds to Lslash in the standard encoding. +--  pic1 :: DPicture pic1 = frame [ helveticaLabel "mystère"      (P2 0 60)-             , helveticaLabel "myst&#egrave;re"   (P2 0 40)+             , helveticaLabel "mystère"    (P2 0 40) -- no HASH!              , helveticaLabel "myst&#0o350;re"    (P2 0 20)              , helveticaLabel "myst&#0XE8;re"     (P2 0 00)              ]@@ -34,4 +58,4 @@  helvetica18 :: FontAttr helvetica18 = FontAttr 18 (FontFace "Helvetica" "Helvetica" -                                    SVG_REGULAR latin1_font_encoder)+                                    SVG_REGULAR standard_encoding)
demo/MultiPic.hs view
@@ -12,8 +12,8 @@ main :: IO () main = do      createDirectoryIfMissing True "./out/"-    writeEPS_latin1 "./out/multi_pic.eps"  pic1-    writeSVG_latin1 "./out/multi_pic.svg"  pic1+    writeEPS "./out/multi_pic.eps"  pic1+    writeSVG "./out/multi_pic.svg"  pic1   
+ demo/TextBBox.hs view
@@ -0,0 +1,57 @@+{-# OPTIONS -Wall #-}++module TextBBox where++import Wumpus.Core+import Wumpus.Core.Text.StandardEncoding+++import System.Directory++++main :: IO ()+main = do +    createDirectoryIfMissing True "./out/"+    writeEPS "./out/text_bbox.eps" words_pic+    writeSVG "./out/text_bbox.svg" words_pic+++peru :: RGBi+peru = RGBi 205  133  63++plum :: RGBi+plum = RGBi 221  160  221++black :: RGBi+black = RGBi 0 0 0 ++courier :: FontAttr+courier = FontAttr 48 (FontFace "Courier" "Courier New" +                                     SVG_REGULAR standard_encoding)+++words_pic   :: DPicture+words_pic   = frame $ +    [ line1, line2, line3, char1, char2 ]+  where+    line1   = boundedCourier "This text is drawn"  (P2  0 180)+    line2   = boundedCourier "within its bounding" (P2  0 120)+    line3   = boundedCourier "box."                (P2  0  60)+    char1   = boundedCourier "1"                   (P2  0   0)+    char2   = boundedCourier "2"                   (P2 29   0)+++boundedCourier :: String -> DPoint2 -> DPrimitive+boundedCourier = boundedText courier++boundedText :: (Num u, Ord u, FromPtSize u) +            => FontAttr -> String -> Point2 u -> Primitive u+boundedText fa@(FontAttr sz _) ss pt = primCat bbox text+  where+    esc_text  = escapeString ss  +    bbox_path = vertexPath $ boundaryCornerList $ textBoundsEsc sz pt esc_text+    bbox      = cstroke peru default_stroke_attr bbox_path+    text      = escapedlabel black fa esc_text pt++
demo/TransformEllipse.hs view
@@ -14,16 +14,16 @@ main :: IO () main = do      createDirectoryIfMissing True "./out/"-    writeEPS_latin1 "./out/transform_ellipse01.eps" pic1-    writeSVG_latin1 "./out/transform_ellipse01.svg" pic1-    writeEPS_latin1 "./out/transform_ellipse02.eps" pic2-    writeSVG_latin1 "./out/transform_ellipse02.svg" pic2-    writeEPS_latin1 "./out/transform_ellipse03.eps" pic3-    writeSVG_latin1 "./out/transform_ellipse03.svg" pic3-    writeEPS_latin1 "./out/transform_ellipse04.eps" pic4-    writeSVG_latin1 "./out/transform_ellipse04.svg" pic4-    writeEPS_latin1 "./out/transform_ellipse05.eps" pic5-    writeSVG_latin1 "./out/transform_ellipse05.svg" pic5+    writeEPS "./out/transform_ellipse01.eps" pic1+    writeSVG "./out/transform_ellipse01.svg" pic1+    writeEPS "./out/transform_ellipse02.eps" pic2+    writeSVG "./out/transform_ellipse02.svg" pic2+    writeEPS "./out/transform_ellipse03.eps" pic3+    writeSVG "./out/transform_ellipse03.svg" pic3+    writeEPS "./out/transform_ellipse04.eps" pic4+    writeSVG "./out/transform_ellipse04.svg" pic4+    writeEPS "./out/transform_ellipse05.eps" pic5+    writeSVG "./out/transform_ellipse05.svg" pic5   @@ -75,7 +75,8 @@  crossbar :: (Real u, Floating u, FromPtSize u)           => u -> u -> Point2 u -> Picture u-crossbar rx ry ctr = frame [ostroke black default_stroke_attr $ path west ps]+crossbar rx ry ctr = +    frame [ostroke black default_stroke_attr $ primPath west ps]   where     ps    = [ lineTo east, lineTo ctr, lineTo north, lineTo south ]     north = ctr .+^ vvec ry@@ -92,4 +93,4 @@           ]    where-    mkline p1 p2 = ostroke black default_stroke_attr $ path p1 [lineTo p2]+    mkline p1 p2 = ostroke black default_stroke_attr $ primPath p1 [lineTo p2]
demo/TransformPath.hs view
@@ -13,16 +13,16 @@ main :: IO () main = do      createDirectoryIfMissing True "./out/"-    writeEPS_latin1 "./out/transform_path01.eps" pic1-    writeSVG_latin1 "./out/transform_path01.svg" pic1-    writeEPS_latin1 "./out/transform_path02.eps" pic2-    writeSVG_latin1 "./out/transform_path02.svg" pic2-    writeEPS_latin1 "./out/transform_path03.eps" pic3-    writeSVG_latin1 "./out/transform_path03.svg" pic3-    writeEPS_latin1 "./out/transform_path04.eps" pic4-    writeSVG_latin1 "./out/transform_path04.svg" pic4-    writeEPS_latin1 "./out/transform_path05.eps" pic5-    writeSVG_latin1 "./out/transform_path05.svg" pic5+    writeEPS "./out/transform_path01.eps" pic1+    writeSVG "./out/transform_path01.svg" pic1+    writeEPS "./out/transform_path02.eps" pic2+    writeSVG "./out/transform_path02.svg" pic2+    writeEPS "./out/transform_path03.eps" pic3+    writeSVG "./out/transform_path03.svg" pic3+    writeEPS "./out/transform_path04.eps" pic4+    writeSVG "./out/transform_path04.svg" pic4+    writeEPS "./out/transform_path05.eps" pic5+    writeSVG "./out/transform_path05.svg" pic5   @@ -71,7 +71,7 @@              => (Primitive u -> Primitive u)               -> Point2 u -> Picture u mkBlackPath trafo bl = -    frame [ trafo $ ostroke black custom_stroke_attr $ path bl ps]+    frame [ trafo $ ostroke black custom_stroke_attr $ primPath bl ps]   where     ps = [lineTo p1, lineTo p2, lineTo p3]     p1 = bl .+^ vec 25 12@@ -88,7 +88,8 @@  crosshair :: (Real u, Floating u, FromPtSize u)            => u -> u -> Point2 u -> Picture u-crosshair w h bl = frame [ostroke burlywood default_stroke_attr $ path bl ps]+crosshair w h bl = +    frame [ostroke burlywood default_stroke_attr $ primPath bl ps]   where     ps    = [ lineTo tr, lineTo br, lineTo tl, lineTo bl ]     tl    = bl .+^ vvec h@@ -106,4 +107,4 @@           ]    where-    mkline p1 p2 = ostroke black default_stroke_attr $ path p1 [lineTo p2]+    mkline p1 p2 = ostroke black default_stroke_attr $ primPath p1 [lineTo p2]
demo/TransformTextlabel.hs view
@@ -13,16 +13,16 @@ main :: IO () main = do      createDirectoryIfMissing True "./out/"-    writeEPS_latin1 "./out/transform_textlabel01.eps" pic1-    writeSVG_latin1 "./out/transform_textlabel01.svg" pic1-    writeEPS_latin1 "./out/transform_textlabel02.eps" pic2-    writeSVG_latin1 "./out/transform_textlabel02.svg" pic2-    writeEPS_latin1 "./out/transform_textlabel03.eps" pic3-    writeSVG_latin1 "./out/transform_textlabel03.svg" pic3-    writeEPS_latin1 "./out/transform_textlabel04.eps" pic4-    writeSVG_latin1 "./out/transform_textlabel04.svg" pic4-    writeEPS_latin1 "./out/transform_textlabel05.eps" pic5-    writeSVG_latin1 "./out/transform_textlabel05.svg" pic5+    writeEPS "./out/transform_textlabel01.eps" pic1+    writeSVG "./out/transform_textlabel01.svg" pic1+    writeEPS "./out/transform_textlabel02.eps" pic2+    writeSVG "./out/transform_textlabel02.svg" pic2+    writeEPS "./out/transform_textlabel03.eps" pic3+    writeSVG "./out/transform_textlabel03.svg" pic3+    writeEPS "./out/transform_textlabel04.eps" pic4+    writeSVG "./out/transform_textlabel04.svg" pic4+    writeEPS "./out/transform_textlabel05.eps" pic5+    writeSVG "./out/transform_textlabel05.svg" pic5   @@ -78,7 +78,8 @@  crosshair :: (Real u, Floating u, FromPtSize u)            => u -> u -> Point2 u -> Picture u-crosshair w h bl = frame [ostroke burlywood default_stroke_attr $ path bl ps]+crosshair w h bl = +    frame [ostroke burlywood default_stroke_attr $ primPath bl ps]   where     ps    = [ lineTo tr, lineTo br, lineTo tl, lineTo bl ]     tl    = bl .+^ vvec h@@ -96,4 +97,4 @@           ]    where-    mkline p1 p2 = ostroke black default_stroke_attr $ path p1 [lineTo p2]+    mkline p1 p2 = ostroke black default_stroke_attr $ primPath p1 [lineTo p2]
demo/ZOrderPic.hs view
@@ -13,8 +13,8 @@ main = do      createDirectoryIfMissing True "./out/"     putStrLn zorder_msg-    writeEPS_latin1 "./out/zorder01.eps" combined_pic-    writeSVG_latin1 "./out/zorder01.svg" combined_pic+    writeEPS "./out/zorder01.eps" combined_pic+    writeSVG "./out/zorder01.svg" combined_pic  zorder_msg :: String zorder_msg = unlines $ 
doc-src/Guide.lhs view
@@ -23,7 +23,7 @@ \section{About \wumpuscore}
 %-----------------------------------------------------------------
 
-This guide was last updated for \wumpuscore version 0.37.0.
+This guide was last updated for \wumpuscore version 0.40.0.
 
 \wumpuscore is a Haskell library for generating 2D vector 
 pictures. It was written with portability as a priority, so it has 
@@ -65,7 +65,7 @@ 
 \item[\texttt{Wumpus.Core.BoundingBox.}]
 Data type representing bounding boxes and operations on them. 
-Bounding boxes are important for Pictures and they support the 
+Bounding boxes are important for Pictures as they support the 
 definition of \emph{picture composition} operators.
 
 \item[\texttt{Wumpus.Core.Colour.}]
@@ -123,29 +123,54 @@ (i.e. 1/72 of an inch). The \texttt{PtSize} module is a numeric 
 type to represent them.
 
-\item[\texttt{Wumpus.Core.TextEncoder.}]
-Types for handling extended character codes within fonts e.g. 
-for accented characters or the Symbol font. Special characters 
-generally have to be escaped in the PostScript and SVG output, 
-this module provides data types for lookup tables between the 
-escaped character code and its PostScript or SVG representation. 
-Text encoders are associated with fonts - glyphs within a font 
-are located by their character name / code. Currently 
-\wumpuscore has encoders for the Standard Latin Encoding table 
-and the Symbol font character set. 
+\item[\texttt{Wumpus.Core.Text.Base.}]
+Types for handling escaped \emph{special} charcters within input 
+text. Wumpus mostly follows SVG conventions for escaping strings, 
+although glyph names should \emph{always} correspond to PostScript 
+names and never XML / SVG ones, e.g. for \texttt{\&} use 
+\texttt{\#ampersand;} not \texttt{\#amp;}. 
 
-\item[\texttt{Wumpus.Core.TextLatin1.}]
-A instance of the TextEncoder type for mapping Latin 1 characters
-to the PostScript and SVG escape characters. Typically this 
-encoder is associated with the fonts - Helvetica, Courier and 
-Times-Roman.
+Also note, unless you are generating only SVG output, glyph 
+names should be used rather than char codes. For PostScript the 
+resolution of char codes is dependent on the encoding of the font 
+used to render it. As core fonts do not use the common Latin1 
+encoding, using using numeric char codes in the input text may 
+produce unexpected results.
 
-\item[\texttt{Wumpus.Core.TextSymbol.}]
-A instance of the TextEncoder type for the Symbol font. Note, 
-unfortunately escape codes for the Symbol font seem to cause
-problems for some SVG renderers. Chrome appears fine, but Safari 
-and Firefox currently have problems.
+Unfortunately fonts are often missing characters you might want, 
+and a PostScript renderer cannot do anything about it (SVG appears 
+to support glyph subsitution from other fonts). \wumpuscore is 
+oblivious to the contents of fonts so it cannot issue a warning 
+if a glyph is not present when it generates a document.
 
+
+\item[\texttt{Wumpus.Core.Text.GlyphIndices.}]
+An map of PostScript glyph names to Unicode code points. 
+
+\item[\texttt{Wumpus.Core.Text.GlyphNames.}]
+An map of Unicode code points to PostScript glyph names. 
+Unfortunately this table is \emph{lossy} - some code points have 
+more than one name, and as this file is auto-generated the 
+resolution of which glyph name matches a code point is arbtirary. 
+\wumpuscore uses this table only as a fallback if PostScript glyph 
+name resolution cannot be solved through an encoding vector.
+
+\item[\texttt{Wumpus.Core.Text.Latin1Encoding.}]
+An encoding vector for the Latin 1 character set. 
+
+\item[\texttt{Wumpus.Core.Text.StandardEncoding.}]
+An encoding vector for the PostScript StandardEncoding set. This 
+encoder is associated with the core text fonts - Helvetica, 
+Courier and Times-Roman. Typically core fonts will include further 
+glyphs not indexed by the Standard Encoding, for PostScript these 
+glyphs are addressable only by name and not by index.
+
+\item[\texttt{Wumpus.Core.Text.Symbol.}]
+An encoding vector for the Symbol font which uses distinct glyph 
+names. Unfortunately whilst the Symbol font is useful for 
+PostScript, its use in SVG is actively discouraged by the W3C and
+some browsers.
+
 \item[\texttt{Wumpus.Core.VersionNumber.}]
 Current version number of \wumpuscore.
 
@@ -295,30 +320,31 @@ Font handling is quite primitive in \wumpuscore. The bounding box 
 of text label is only estimated - based on the length of the 
 label's string rather than the metrics of the individual letters 
-encoded in the font. Accessing the glyph metrics in a font would 
-require a font loader to read TrueType font files. This would be 
-a significant development effort, probably larger than the effort 
-put into \wumpuscore itself; for \wumpuscore's intended use - 
-producing diagrams and pictures rather than high quality text - 
-the primitive font handling is not such a draw back.
-
+encoded in the font. Accessing the glyph metrics in a font 
+requires a font loader - work has been done on this for 
+\texttt{wumpus-basic} but this is considered a special requirement
+and adds a lot of code. As \wumpuscore is considered to be a 
+fairly minimal system for generating pictures it can live without
+font metrics.
 
-In both PostScript and SVG mis-named fonts can cause somewhat
-inscrutable printing anomalies - usually falling back to a default 
-font but not always. At worst, PostScript may do no subsequent 
-drawing after a font load error. \wumpuscore uses @scalefont@ in 
-the generated PostScript, this semingly works for any integer size 
-and not just the regular font sizes (10, 12, 18, 24, 36). 
+In PostScript, mis-named fonts can cause somewhat inscrutable 
+printing anomalies depending on the implementation. At worst, 
+GhostScript may do no subsequent drawing after a failing to load a 
+font. SVG renderers fallback to some common font if a font cannot 
+be found. 
 
+A PostScript interpreter should have built-in support for the 
+\emph{Core 14} fonts. For the \emph{writing} fonts, SVG renderers 
+appear to support literal analogues quite well rather than needing 
+general descriptors (e.g. \texttt{sans-serif} or 
+\texttt{monospace}). The symbolic fonts Symbol and ZapfDingbats 
+should be avoided for SVG - the W3C does not condone their use in 
+SVG or HTML. Likewise, certain browsers reject them out of course.
 
-The following table lists PostScript fonts and their SVG 
-equivalents, the package \texttt{wumpus-basic} includes a module 
+The following table lists the Core 14 PostScript fonts and their 
+SVG analogues, \texttt{wumpus-basic} includes a module 
 \texttt{Wumpus.Basic.SafeFonts} encoding the fonts in this list 
-and matching them to their appropriate \texttt{TextEncoder}.
-
-Note that the Symbol font, whilst incredibly useful, is a taboo
-with the W3C and they do not condone its use in SVG or HTML.
-Likewise, certain browsers reject it out of course.
+and matching them to their appropriate encoding vectors.
 
 \begin{tabular}{ l l }
 PostScript name   & SVG name      \\
@@ -335,7 +361,8 @@ Courier-Oblique   & Courier New - style="italic" \\
 Courier-Bold      & Courier New - font-weight="bold" \\
 Courier-Bold-Oblique & Courier New - style="italic", font-weight="bold" \\
-Symbol & (Symbol - see text) \\
+Symbol            & (see text) \\
+ZapfDingbats      & (see text) \\
 \hline
 \end{tabular}
 
doc-src/WorldFrame.hs view
@@ -4,10 +4,10 @@  import Wumpus.Core import Wumpus.Core.Colour ( black )-+import Wumpus.Core.Text.StandardEncoding  main :: IO ()-main = writeEPS_latin1 "WorldFrame.eps" world_frame+main = writeEPS "WorldFrame.eps" world_frame  world_frame :: DPicture world_frame = uniformScale 0.75 $ @@ -30,9 +30,9 @@ makeLabelPrim = textlabel black attrs    where     attrs     = FontAttr 10 (FontFace "Helvetica" "Helvetica" -                                      SVG_REGULAR latin1_font_encoder)+                                      SVG_REGULAR standard_encoding)  makeLinePrim :: Double -> DPoint2 -> DPoint2 -> DPrimitive-makeLinePrim lw a b = ostroke black attrs $ path a [lineTo b]+makeLinePrim lw a b = ostroke black attrs $ primPath a [lineTo b]   where     attrs = default_stroke_attr {line_width=lw}
doc/Guide.pdf view

binary file changed (60184 → 62287 bytes)

src/Wumpus/Core.hs view
@@ -22,6 +22,14 @@ -- colours are needed, "Wumpus.Core.Colour" can be imported  -- directly. -- +-- Courier metrics (charWidth, textHeight, etc.) are hidden from +-- the module "Wumpus.Core.FontSize". As these metrics are +-- somewhat approximate, it is expected that if higher-level +-- software needs these functionality it should define its own+-- implementations. However the functions may be convenient and if +-- they are needed, "Wumpus.Core.FontSize" can be imported +-- directly.+-- --------------------------------------------------------------------------------  @@ -37,9 +45,7 @@   , module Wumpus.Core.OutputSVG   , module Wumpus.Core.Picture   , module Wumpus.Core.PtSize-  , module Wumpus.Core.Text.Encoder-  , module Wumpus.Core.Text.Latin1-  , module Wumpus.Core.Text.SymbolFont+  , module Wumpus.Core.Text.Base   , module Wumpus.Core.VersionNumber   , module Wumpus.Core.WumpusTypes @@ -48,18 +54,20 @@  import Wumpus.Core.AffineTrans import Wumpus.Core.BoundingBox-import Wumpus.Core.Colour hiding ( black, white, red, green, blue, yellow, -                                   cyan, magenta )-import Wumpus.Core.FontSize hiding ( textBoundsEnc )+import Wumpus.Core.Colour hiding +    ( black, white, red, green, blue, yellow, cyan, magenta )++import Wumpus.Core.FontSize hiding +    ( charWidth, textWidth, capHeight, xcharHeight, totalCharHeight+    , ascenderHeight, descenderDepth ) + import Wumpus.Core.Geometry import Wumpus.Core.GraphicProps import Wumpus.Core.OutputPostScript import Wumpus.Core.OutputSVG import Wumpus.Core.Picture import Wumpus.Core.PtSize-import Wumpus.Core.Text.Encoder-import Wumpus.Core.Text.Latin1-import Wumpus.Core.Text.SymbolFont+import Wumpus.Core.Text.Base import Wumpus.Core.VersionNumber import Wumpus.Core.WumpusTypes 
src/Wumpus/Core/BoundingBox.hs view
@@ -42,6 +42,7 @@   , retraceBoundary    , boundaryCorners+  , boundaryCornerList   , withinBoundary   , boundaryWidth   , boundaryHeight@@ -196,16 +197,36 @@     fromCorners (bl,br,tr,tl) = [bl,br,tr,tl]  --- | 'boundaryCorners' : @bbox -> (bottom_left, bottm_right,+-- | 'boundaryCorners' : @bbox -> (bottom_left, bottom_right, --      top_right, top_left)@ --  -- Generate all the corners of a bounding box, counter-clock  -- wise from the bottom left, i.e. @(bl, br, tr, tl)@. -- boundaryCorners :: BoundingBox u -> (Point2 u, Point2 u, Point2 u, Point2 u)-boundaryCorners (BBox bl@(P2 x0 y0) tr@(P2 x1 y1)) = (bl, br, tr, tl) where+boundaryCorners (BBox bl@(P2 x0 y0) tr@(P2 x1 y1)) = (bl, br, tr, tl) +  where     br = P2 x1 y0     tl = P2 x0 y1+++-- | 'boundaryCornerList' : @bbox -> [bottom_left, bottom_right,+--      top_right, top_left]@+-- +-- Generate all the corners of a bounding box, counter-clock +-- wise from the bottom left, i.e. @[bl, br, tr, tl]@. +--+-- This is a list version of 'boundaryCorners' which is sometimes +-- more convenient. For instance, to create a vertex path it is +-- more direct to use this list rather than build one from the +-- 4-tuple returned by 'boundaryCorners'.+--+boundaryCornerList :: BoundingBox u -> [Point2 u]+boundaryCornerList (BBox bl@(P2 x0 y0) tr@(P2 x1 y1)) = [bl, br, tr, tl]+  where+    br = P2 x1 y0+    tl = P2 x0 y1+  -- | Within test - is the supplied point within the bounding box? --
src/Wumpus/Core/FontSize.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# OPTIONS -Wall #-}  --------------------------------------------------------------------------------@@ -10,13 +11,15 @@ -- Stability   :  unstable -- Portability :  GHC ----- Font size calculation for Label\'s and their bounding boxes.+-- Approximate glyph size calculations for Label\'s and their +-- bounding boxes. -- --- Calculations are based on metrics derived from Courier at --- 48pt. As Courier is a monospaced font, applying these metrics+-- Calculations are based on metrics derived from the Courier +-- font. As Courier is a monospaced font, applying these metrics -- to other font families will usually produce over-estimates -- (bounding boxes will be longer than the true visual length--- of the text).+-- of the text). Furthermore, even italic or bold Courier will +-- have different metrics. --  -- This is a deficiency of Wumpus, and limits its text handling -- capabilities - for example, text cannot be reliably centered @@ -33,28 +36,30 @@   -- * Type synonyms     FontSize   , CharCount--  -- * Courier metrics at 48 point-  , courier48_width-  , courier48_height-  , courier48_numeral_height-  , courier48_xheight-  , courier48_descender_depth-  , courier48_ascender_height-  , courier48_spacer_width+  , PtScale+  , ptSizeScale +  -- * Scaling values derived from Courier+  , mono_width+  , mono_cap_height+  , mono_x_height+  , mono_descender+  , mono_ascender+  , mono_left_margin+  , mono_right_margin -  -- * Metrics calculation-  , widthAt48pt+  -- * Courier metrics   , charWidth-  , spacerWidth   , textWidth-  , textHeight-  , numeralHeight+  , capHeight   , xcharHeight+  , totalCharHeight+  , ascenderHeight   , descenderDepth++  -- * Size calculation   , textBounds-  , textBoundsEnc       -- hidden by toplevel Wumpus.Core+  , textBoundsEsc   , charCount    ) where@@ -62,157 +67,170 @@ import Wumpus.Core.BoundingBox import Wumpus.Core.Geometry import Wumpus.Core.PtSize-import Wumpus.Core.Text.TextInternal--import Data.AffineSpace                 -- package: vector-space+import Wumpus.Core.Text.Base    type CharCount = Int type FontSize = Int --- NOTE - I\'ve largely tried to follow the terminoly from ++-- | Wrapped Double representing 1\/1000 of the scale factor+-- (Point size) of a font. AFM files encode all measurements +-- as these units. +-- +newtype PtScale = PtScale { getPtScale :: Double } +  deriving (Eq,Ord,Num,Floating,Fractional,Real,RealFrac,RealFloat)+++instance Show PtScale where+  showsPrec p d = showsPrec p (getPtScale d)++ptSizeScale :: PtScale -> PtSize -> PtSize +ptSizeScale sc sz = sz * realToFrac sc+++-- NOTE - I\'ve largely tried to follow the terminoloy from  -- Edward Tufte\'s /Visual Explantions/, page 99. --  --- | The width of a letter in Courier at 48 pt.------ The value is not entirely accurate but it is satisfactory.+-- | The ratio of width to point size of a letter in Courier. ----- > width = 26.0 +-- > mono_width = 0.6  ---courier48_width :: PtSize-courier48_width = 26.0+mono_width :: PtScale+mono_width = 0.600 --- | The point size of a character in Courier at 48 pt.------ \*\* Naturally the height is 48.0 \*\*.+-- | The ratio of cap height to point size of a letter in Courier. ---courier48_height :: PtSize -courier48_height = 48.0+-- > mono_cap_height = 0.562+-- +mono_cap_height :: PtScale +mono_cap_height = 0.562   --- | The height of a numeral without accents, ascenders or --- descenders in Courier at 48 pt.------ Note - the height of a numeral in Courier is slightly --- larger than a upper-case letter.------ > numeral_height = 30.0 ----courier48_numeral_height :: PtSize -courier48_numeral_height = 30.0 --- | The height of the body of a lower-case letter ---  (typically the letter  \'x\') in Courier at 48 pt. +-- | The ratio of x height to point size of a letter in Courier.  -- -- This is also known as the \"body height\". ----- > xheight = 20.0 +-- > mono_x_height = 0.426 -- -courier48_xheight :: PtSize-courier48_xheight = 20.0+mono_x_height :: PtScale+mono_x_height = 0.426  --- | The depth of a descender in Courier at 48 pt.+-- | The ratio of descender depth to point size of a letter in +-- Courier. -- --- > descender_depth = 9.0+-- > mono_descender = -0.157 -- -courier48_descender_depth :: PtSize-courier48_descender_depth = 9.0+mono_descender :: PtScale+mono_descender = (-0.157) --- | The depth of an ascender in Courier at 48 pt.++-- | The ratio of ascender to point size of a letter in Courier. -- --- > ascender_height = 10.0+-- > mono_ascender = 0.629 -- --- Note - for Courier point size is not the sum of--- descender, ascender and xheight and lower-case letters with--- ascenders are slightly taller than upper-case letters:------ > descender_depth + xheight + ascender_height /= point_size------ > xheight + ascender_height /= cap_height------ > xheight + ascender_height == numeral_height----courier48_ascender_height :: PtSize -courier48_ascender_height = 10.0+mono_ascender :: PtScale+mono_ascender = 0.629  --- | The spacing between letters printed directly with --- PostScript\'s show command for Courier at 48 pt.------ The value is not entirely accurate but it is satisfactory--- for bounding box calculations.------ > spacer_width = 3.0----courier48_spacer_width :: PtSize-courier48_spacer_width = 3.0+-- | The distance from baseline to max height as a ratio to point +-- size for Courier.+-- +-- > mono_max_height = 0.805+-- +mono_max_height :: PtScale +mono_max_height = 0.805  --- | Width of the supplied string when printed at 48pt (i.e. n --- chars + (n-1) spacers).------ Use 'charCount' to calculate the @CharCount@.----widthAt48pt :: CharCount -> PtSize-widthAt48pt n = (courier48_width * len) + (courier48_spacer_width * len_sub)-  where-    len      = fromIntegral n-    len_sub  = len - 1.0+-- | The distance from baseline to max depth as a ratio to point +-- size for Courier.+-- +-- > max_depth = -0.250+-- +mono_max_depth :: PtScale +mono_max_depth = (-0.250) ++-- | The left margin for the bounding box of printed text as a +-- ratio to point size for Courier.+-- +-- > mono_left_margin = -0.046+-- +mono_left_margin :: PtScale +mono_left_margin = (-0.046)+++-- | The right margin for the bounding box of printed text as a +-- ratio to point size for Courier.+-- +-- > mono_right_margin = 0.050+-- +mono_right_margin :: PtScale +mono_right_margin = 0.050++ -- | Approximate the width of a monospace character using  -- metrics derived from the Courier font. -- charWidth :: FontSize -> PtSize-charWidth sz = (fromIntegral sz)/48 * courier48_width----- | Approximate the width of a spacer between monospace --- characters using metrics derived from the Courier font.----spacerWidth :: FontSize -> PtSize-spacerWidth sz = (fromIntegral sz)/48 * courier48_spacer_width+charWidth = ptSizeScale mono_width . fromIntegral    -- | Text width at @sz@ point size of the string @s@. All--- characters are counted literally - special chars may cause--- problems (this a current deficiency of Wumpus).+-- characters are counted literally - it is expected that +-- @CharCount@ has been calculated with the @charCount@ function. --+-- Note - this does not account for left and right margins around+-- the printed text.+-- textWidth :: FontSize -> CharCount -> PtSize textWidth _  n | n <= 0 = 0-textWidth sz n          = (fromIntegral sz)/48 * widthAt48pt n+textWidth sz n          = fromIntegral n * charWidth sz  --- | Text height is just identity/double-coercion of the Point size.--- i.e. @18 == 18.0@. The /size/ of a font is the maximum height:+-- | Height of capitals e.g. \'A\' using metrics derived +-- the Courier monospaced font. ---textHeight :: FontSize -> PtSize-textHeight = fromIntegral+capHeight :: FontSize -> PtSize+capHeight = fromIntegral --- | Approximate the height of a numeral using metrics derived --- from the Courier monospaced font.----numeralHeight :: FontSize -> PtSize-numeralHeight sz = textHeight sz * (courier48_numeral_height / courier48_height) --- | Approximate the height of the lower-case char \'x\' using --- metrics derived from the Courier monospaced font.+-- | Height of the lower-case char \'x\' using metrics derived +-- the Courier monospaced font. -- xcharHeight :: FontSize -> PtSize-xcharHeight sz = textHeight sz * (courier48_xheight / courier48_height)+xcharHeight = ptSizeScale mono_x_height . fromIntegral +-- | The total height span of the glyph bounding box for the +-- Courier monospaced font.+--+totalCharHeight :: FontSize -> PtSize+totalCharHeight sz = let sz' = fromIntegral sz in +    ptSizeScale mono_max_height sz' + negate (ptSizeScale mono_max_depth sz')+   --- | Approximate the descender depth for font size @sz@ using--- metrics derived from the Courier monospaced font.+-- | Ascender height for font size @sz@ using metrics from the +-- Courier monospaced font. -- +ascenderHeight :: FontSize -> PtSize+ascenderHeight = ptSizeScale mono_ascender . fromIntegral ++++-- | Descender depth for font size @sz@ using metrics from the +-- Courier monospaced font.+--  descenderDepth :: FontSize -> PtSize-descenderDepth sz = (fromIntegral sz) / 48 * courier48_descender_depth+descenderDepth = ptSizeScale mono_descender . fromIntegral  + -- | 'textBounds' : @ font_size * baseline_left * text -> BBox@ -- -- Find the bounding box for the character count at the @@ -220,12 +238,10 @@ --  -- The supplied point represents the baseline left corner of the  -- a regular upper-case letter (that is without descenders).--- The bounding box will always be /dropped/ to accommodate --- ascenders - no interpretation of the string takes place to --- see if it actually contains ascenders or descenders.+-- The bounding box adds a margin around all sides of the text. --   -- The metrics used are derived from Courier - a monospaced font.--- For variable width fonts the calculated bounding box will +-- For proportional fonts the calculated bounding box will  -- usually be too long. -- textBounds :: (Num u, Ord u, FromPtSize u) @@ -233,27 +249,27 @@ textBounds sz pt ss = textBoundsBody sz pt (charCount ss)   --- | 'textBoundsEnc' : @ font_size * baseline_left * encoded_text -> BBox@--- ---  Version of textBounds for EncodedText.+-- | 'textBoundsEnc' : @ font_size * baseline_left * escaped_text -> BBox@ -- --- Note this function is hidded by the top-level module --- @Wumpus.Core@.+--  Version of textBounds for EscapedText. ---textBoundsEnc :: (Num u, Ord u, FromPtSize u) -           => FontSize -> Point2 u -> EncodedText -> BoundingBox u-textBoundsEnc sz pt enc = textBoundsBody sz pt (textLength enc) +textBoundsEsc :: (Num u, Ord u, FromPtSize u) +           => FontSize -> Point2 u -> EscapedText -> BoundingBox u+textBoundsEsc sz pt esc = textBoundsBody sz pt (textLength esc)    textBoundsBody :: (Num u, Ord u, FromPtSize u)                 => FontSize -> Point2 u -> Int -> BoundingBox u-textBoundsBody sz baseline_left len = boundingBox bl tr +textBoundsBody sz (P2 x y) len = boundingBox ll ur   where-    h           = fromPtSize $ textHeight sz+    pt_sz       = fromIntegral sz     w           = fromPtSize $ textWidth  sz len-    dd          = fromPtSize $ descenderDepth sz-    bl          = baseline_left .-^ V2 0 dd -    tr          = bl .+^ V2 w h+    left_m      = fromPtSize $ ptSizeScale mono_left_margin  pt_sz+    right_m     = fromPtSize $ ptSizeScale mono_right_margin pt_sz+    max_depth   = fromPtSize $ ptSizeScale mono_max_depth  pt_sz+    max_height  = fromPtSize $ ptSizeScale mono_max_height pt_sz+    ll          = P2 (x + left_m)      (y + max_depth)+    ur          = P2 (x + w + right_m) (y + max_height)   
src/Wumpus/Core/Geometry.hs view
@@ -47,6 +47,7 @@   , vvec   , avec   , pvec+  , vreverse   , direction   , vlength   , vangle@@ -390,6 +391,12 @@ -- pvec :: Num u => Point2 u -> Point2 u -> Vec2 u pvec = flip (.-.)+++-- | Reverse a vector.+--+vreverse :: Num u => Vec2 u -> Vec2 u+vreverse (V2 x y) = V2 (-x) (-y)  -- | Direction of a vector - i.e. the counter-clockwise angle  -- from the x-axis.
src/Wumpus/Core/GraphicProps.hs view
@@ -51,8 +51,8 @@   ) where  import Wumpus.Core.Colour-import Wumpus.Core.Text.Encoder-import Wumpus.Core.Text.Latin1+import Wumpus.Core.Text.Base+import Wumpus.Core.Text.StandardEncoding import Wumpus.Core.Utils.FormatCombinators  @@ -111,10 +111,10 @@ -- | 'FontFace' : @ postscript_name * svg_font_family * svg_font_style @ -- data FontFace = FontFace-      { font_name       :: String        -- for PostScript-      , svg_font_family :: String        -- for SVG-      , svg_font_style  :: SVGFontStyle-      , font_enc_name   :: FontEncoderName+      { ps_font_name            :: String+      , svg_font_family         :: String+      , svg_font_style          :: SVGFontStyle+      , font_enc_vector         :: EncodingVector       }   deriving (Eq,Ord,Show) @@ -181,7 +181,7 @@  instance Format LabelProps where   format (LabelProps rgb attr) = format rgb -                             <+> text (font_name $ font_face attr)+                             <+> text (ps_font_name $ font_face attr)  instance Format EllipseProps where   format (EFill rgb)          = format rgb <+> text "Fill"@@ -208,13 +208,22 @@ -- | Constructor for the default font, which is @Courier@ (aliased  -- to @Courier New@ for SVG) at the supplied size. --+-- Note - the font uses the Standard encoding - this is common to +-- fonts but uses different indices to the more common Latin1.+--+-- For instance 232 is Lslash not egrave. +--+-- Both GhostScript and the standard AFM /Core 14/ metrics +-- supplied by Adobe use Standard Encoding but include further +-- characters (e.g. egrave) in the non-indexed /higher-region/.+--  defaultFont :: Int -> FontAttr defaultFont sz = FontAttr sz face    where-    face = FontFace { font_name         = "Courier"+    face = FontFace { ps_font_name      = "Courier"                     , svg_font_family   = "Courier New"                     , svg_font_style    = SVG_REGULAR-                    , font_enc_name     = latin1_font_encoder+                    , font_enc_vector   = standard_encoding                     }  
src/Wumpus/Core/OutputPostScript.hs view
@@ -13,6 +13,9 @@ -- -- Output PostScript - either PostScript (PS) files or  -- EPS (Encapusulated PostScript) files can be generated. +-- +-- The generated PostScript uses only features from Language +-- Level 1. -- -------------------------------------------------------------------------------- @@ -21,10 +24,7 @@   -- * Output PostScript     writePS   , writeEPS-  -  , writePS_latin1-  , writeEPS_latin1-+    ) where  import Wumpus.Core.BoundingBox@@ -33,19 +33,22 @@ import Wumpus.Core.GraphicProps import Wumpus.Core.PictureInternal import Wumpus.Core.PostScriptDoc-import Wumpus.Core.Text.DefaultEncoder-import Wumpus.Core.Text.Encoder-import Wumpus.Core.Text.TextInternal+import Wumpus.Core.Text.Base+import Wumpus.Core.Text.GlyphNames import Wumpus.Core.TrafoInternal import Wumpus.Core.Utils.Common-import Wumpus.Core.Utils.JoinList+import Wumpus.Core.Utils.JoinList hiding ( cons ) import Wumpus.Core.Utils.FormatCombinators +import Data.AffineSpace                         -- package: vector-space  import Control.Applicative hiding ( empty, some ) import Control.Monad +import Data.Char import qualified Data.Foldable          as F+import qualified Data.IntMap            as IntMap+import Data.List ( mapAccumL ) import Data.Maybe  import Data.Time @@ -61,47 +64,45 @@ -- the diff is with the last drawn object. -- - newtype PsMonad a = PsMonad { -            getPsMonad :: TextEncoder -> GraphicsState -> (a,GraphicsState) }+            getPsMonad :: GraphicsState -> (a,GraphicsState) }   instance Functor PsMonad where-  fmap f mf = PsMonad $ \r s -> let (a,s1) = getPsMonad mf r s in (f a,s1)+  fmap f mf = PsMonad $ \s -> let (a,s1) = getPsMonad mf s in (f a,s1)  instance Applicative PsMonad where-  pure a    = PsMonad $ \_ s -> (a,s)-  mf <*> ma = PsMonad $ \r s -> let (f,s1) = getPsMonad mf r s-                                    (a,s2) = getPsMonad ma r s1-                                  in (f a,s2)+  pure a    = PsMonad $ \s -> (a,s)+  mf <*> ma = PsMonad $ \s -> let (f,s1) = getPsMonad mf s+                                  (a,s2) = getPsMonad ma s1+                                in (f a,s2)  instance Monad PsMonad where-  return a  = PsMonad $ \_ s  -> (a,s)-  m >>= k   = PsMonad $ \r s -> let (a,s1) = getPsMonad m r s-                                in (getPsMonad . k) a r s1+  return a  = PsMonad $ \s -> (a,s)+  m >>= k   = PsMonad $ \s -> let (a,s1) = getPsMonad m s+                              in (getPsMonad . k) a s1                                -runPsMonad :: TextEncoder -> PsMonad a -> a-runPsMonad enc mf = fst $ getPsMonad mf enc zeroGS+runPsMonad :: PsMonad a -> a+runPsMonad mf = fst $ getPsMonad mf zeroGS -askCharCode :: FontEncoderName -> Int -> PsMonad (Either GlyphName GlyphName)-askCharCode fen i = PsMonad $ \r s -> -    case lookupByCharCode fen i r of-      Just n  -> (Right n, s)-      Nothing -> (Left $ getPsFallback fen r, s) ++ -- runLocalGS :: GSUpdate -> PsMonad a -> PsMonad a -- runLocalGS upd mf = ---     PsMonad $ \r s -> let (a,_) = getPsMonad mf r (getGSU upd s) in (a,s)+--     PsMonad $ \s -> let (a,_) = getPsMonad mf (getGSU upd s) in (a,s) ++ getsGS :: (GraphicsState -> a) -> PsMonad a-getsGS fn = PsMonad $ \_ s -> (fn s,s)+getsGS fn = PsMonad $ \s -> (fn s,s)  setsGS :: (GraphicsState -> GraphicsState) -> PsMonad ()-setsGS fn = PsMonad $ \_ s -> ((),fn s)+setsGS fn = PsMonad $ \s -> ((),fn s)  resetGS :: PsMonad ()-resetGS = PsMonad $ \ _ _ -> ((),zeroGS)+resetGS = PsMonad $ \_ -> ((),zeroGS)   setsSA :: (StrokeAttr -> StrokeAttr) -> PsMonad ()@@ -163,48 +164,25 @@ -- | Output a series of pictures to a Postscript file. Each  -- picture will be printed on a separate page.  ----- Generally an encoder should always support the principal--- encoders for the fonts used (e.g. Latin1) /and/ the encoder --- for the Symbol font, as characters from the Symbol font may --- be used as decorations for plot marks, etc.--- writePS :: (Real u, Floating u, PSUnit u) -        => FilePath -> TextEncoder -> [Picture u] -> IO ()-writePS filepath enc pic = -    getZonedTime >>= \ztim -> writeFile filepath (show $ psDraw ztim enc pic)+        => FilePath -> [Picture u] -> IO ()+writePS filepath pics = +    getZonedTime >>= \ztim -> writeFile filepath (show $ psDraw ztim pics)  -- | Output a picture to an EPS (Encapsulated PostScript) file.  -- The .eps file can then be imported or embedded in another  -- document. ----- Generally an encoder should always support the principal--- encoders for the fonts used (e.g. Latin1) /and/ the encoder for--- the Symbol font, as characters from the Symbol font may be used --- as decorations for plot marks, etc.--- writeEPS :: (Real u, Floating u, PSUnit u)  -         => FilePath -> TextEncoder -> Picture u -> IO ()-writeEPS filepath enc pic =-    getZonedTime >>= \ztim -> writeFile filepath (show $ epsDraw ztim enc pic)+         => FilePath -> Picture u -> IO ()+writeEPS filepath pic =+    getZonedTime >>= \ztim -> writeFile filepath (show $ epsDraw ztim pic)  --- | Version of 'writePS' - using the /default encoder/ which --- supports Latin1 and the Symbol font.--- --- Generally an encoder should always support the principal--- encoder (e.g. Latin1) /and/ the Symbol font, as characters from--- the Symbol font may be used as decorations for plot marks, etc.--- -writePS_latin1 :: (Real u, Floating u, PSUnit u) -               => FilePath -> [Picture u] -> IO ()-writePS_latin1 filepath = writePS filepath defaultEncoder --- | Version of 'writeEPS' - using Latin1 encoding. ----writeEPS_latin1 :: (Real u, Floating u, PSUnit u)  -                => FilePath -> Picture u -> IO ()-writeEPS_latin1 filepath = writeEPS filepath defaultEncoder ++ -------------------------------------------------------------------------------- -- Internals @@ -216,10 +194,10 @@ --  psDraw :: (Real u, Floating u, PSUnit u) -       => ZonedTime -> TextEncoder -> [Picture u] -> Doc-psDraw timestamp enc pics = -    let body = vcat $ runPsMonad enc $ zipWithM psDrawPage pages pics-    in vcat [ psHeader 1 timestamp+       => ZonedTime -> [Picture u] -> Doc+psDraw timestamp pics = +    let body = vcat $ runPsMonad $ zipWithM psDrawPage pages pics+    in vcat [ psHeader (length pics) timestamp             , body             , psFooter              ]@@ -247,10 +225,10 @@ -- will need translating. -- epsDraw :: (Real u, Floating u, PSUnit u)-        => ZonedTime -> TextEncoder -> Picture u -> Doc-epsDraw timestamp enc pic =+        => ZonedTime -> Picture u -> Doc+epsDraw timestamp pic =     let (bb,cmdtrans) = imageTranslation pic -        body          = runPsMonad enc (picture pic) +        body          = runPsMonad (picture pic)      in vcat [ epsHeader bb timestamp             , ps_gsave             , cmdtrans@@ -265,7 +243,47 @@   (bb, Nothing) -> (bb, empty)   (bb, Just v)  -> (bb, ps_translate v) +--------------------------------------------------------------------------------+--  +++findGlyphName :: Int -> EncodingVector -> Either String String+findGlyphName i ev = +    case IntMap.lookup i ev of+      Just n  -> Right n+      Nothing -> Left $ fromMaybe "space" $ IntMap.lookup i ps_glyph_names+++psText :: EncodingVector -> EscapedText -> Doc+psText ev enc_text = cons $ foldr fn ([],empty) $ getEscapedText enc_text+  where+    cons ([],doc)               = doc+    cons (cs,doc)               = ps_show cs `vconcat` doc++    fn (CharLiteral c) (cs,doc) | ord c < 0x80  = (c:cs,doc)+    fn (CharLiteral c) acc      = ([], psSpecial ev (ord c) `vconcat` cons acc) +    fn (CharEscInt i)  acc      = ([], psSpecial ev i `vconcat` cons acc)+    fn (CharEscName s) acc      = ([], ps_glyphshow s `vconcat` cons acc)  ++psChar :: EncodingVector -> EscapedChar -> Doc+psChar _  (CharLiteral c) | ord c < 0x80  = ps_show [c]+psChar ev (CharLiteral c)                 = psSpecial ev (ord c) +psChar ev (CharEscInt i)                  = psSpecial ev i+psChar _  (CharEscName s)                 = ps_glyphshow s  +++psSpecial :: EncodingVector -> Int -> Doc+psSpecial ev i = case findGlyphName i ev of+    Left fallback  -> missingComment i `vconcat` ps_glyphshow fallback+    Right ss       -> ps_glyphshow ss     +++missingComment :: Int -> Doc+missingComment i = +    ps_comment $ "lookup in encoding vector failed for " ++ show i++ --------------------------------------------------------------------------------  -- Note - PostScript ignotes any FontCtx changes via the @Group@@@ -304,23 +322,23 @@ primitive (PLabel props lbl)   = primLabel props lbl primitive (PEllipse props ell) = primEllipse props ell primitive (PContext _ chi)     = primitive chi-primitive (PLink _ chi)        = primitive chi+primitive (PSVG _ chi)         = primitive chi primitive (PGroup ones)        = oneConcat primitive ones   primPath :: PSUnit u          => PathProps -> PrimPath u -> PsMonad Doc primPath (CFill rgb)     p = -    (\rgbd -> vcat [rgbd, makeStartPath p, ps_closepath, ps_fill]) +    (\rgbd -> vcat [rgbd, pathBody p, ps_closepath, ps_fill])        <$> deltaDrawColour rgb    primPath (CStroke attrs rgb) p = -    (\rgbd attrd -> vcat [ rgbd, attrd, makeStartPath p+    (\rgbd attrd -> vcat [ rgbd, attrd, pathBody p                          , ps_closepath, ps_stroke ])       <$> deltaDrawColour rgb <*> deltaStrokeAttrs attrs   primPath (OStroke attrs rgb) p = -    (\rgbd attrd -> vcat [rgbd, attrd, makeStartPath p, ps_stroke]) +    (\rgbd attrd -> vcat [rgbd, attrd, pathBody p, ps_stroke])        <$> deltaDrawColour rgb <*> deltaStrokeAttrs attrs  primPath (CFillStroke fc attrs sc) p = @@ -329,20 +347,22 @@   clipPath :: PSUnit u => PrimPath u -> PsMonad Doc-clipPath p = pure $ vcat [makeStartPath p , ps_closepath, ps_clip]+clipPath p = pure $ vcat [pathBody p , ps_closepath, ps_clip]  -makeStartPath :: PSUnit u => PrimPath u -> Doc-makeStartPath (PrimPath start xs) = -    vcat $ ps_newpath : ps_moveto start : map makePathSegment xs+pathBody :: PSUnit u => PrimPath u -> Doc+pathBody (PrimPath start xs) = +    vcat $ ps_newpath : ps_moveto start : (snd $ mapAccumL step start xs)+  where+    step pt (RelLineTo v)         = let p1 = pt .+^ v in (p1, ps_lineto p1)+    step pt (RelCurveTo v1 v2 v3) = let p1 = pt .+^ v1 +                                        p2 = p1 .+^ v2+                                        p3 = p2 .+^ v3+                                    in (p3, ps_curveto p1 p2 p3)   -makePathSegment :: PSUnit u => PrimPathSegment u -> Doc-makePathSegment (PLineTo p1)        = ps_lineto p1 -makePathSegment (PCurveTo p1 p2 p3) = ps_curveto p1 p2 p3  - -- | Drawing stroked ellipse has an unfortunate - but (probably)  -- unavoidable deficiency. --@@ -355,8 +375,8 @@ -- primEllipse :: (Real u, Floating u, PSUnit u)              => EllipseProps -> PrimEllipse u -> PsMonad Doc-primEllipse props (PrimEllipse center hw hh ctm) =-    bracketPrimCTM center (scaleCTM 1 (hh/hw) ctm) (drawF props)+primEllipse props (PrimEllipse hw hh ctm) =+    bracketPrimCTM (scaleCTM 1 (hh/hw) ctm) (drawF props)   where     drawF (EFill rgb)            pt = fillArcPath rgb hw pt     drawF (EStroke sa rgb)       pt = strokeArcPath rgb sa hw pt@@ -393,61 +413,57 @@ -- primLabel :: (Real u, Floating u, PSUnit u)            => LabelProps -> PrimLabel u -> PsMonad Doc-primLabel (LabelProps rgb attrs) (PrimLabel basept body ctm) = -    bracketPrimCTM basept ctm mf+primLabel (LabelProps rgb attrs) (PrimLabel body ctm) = bracketPrimCTM ctm mf   where-    mf pt = (\rgbd fontd showd -> vcat [ rgbd, fontd, showd ]) -              <$> deltaDrawColour rgb <*> deltaFontAttrs attrs-                                      <*> labelBody fen pt body-    -    fen = font_enc_name $ font_face attrs    +    ev    = font_enc_vector $ font_face attrs    +    mf pt = (\rgbd fontd -> vcat [ rgbd, fontd, labelBody ev pt body ]) +              <$> deltaDrawColour rgb <*> deltaFontAttrs attrs   +-- Note - it would be nice to use @xshow@ and @yshow@ (PostScript+-- Language Level 2) to generate more efficient code as per using +-- horizontal or vertical coordinate lists in the SVG output.+-- +-- Unfortunately, because Wumpus has to use @ps_glyphshow@ for +-- any special charaters the code cannot use necessarily use +-- @xshow@ to generate a single string. If the string is +-- broken by a special char calculating the restart position is +-- complicated because PostScript implicitly moves the current +-- point as a string is drawn (using the advance vector for each +-- glyph in the font). +-- +-- I tried to use @xshow@ and @yshow@ in an experiment, but the +-- Haskell code was very complicated and the generated PostScript +-- was not much better in the presence of special chars. As +-- Wumpus makes no claims for suitability regarding type-setting +-- the current code seems good enough.+--+      labelBody :: PSUnit u -          => FontEncoderName -> Point2 u -> LabelBody u -> PsMonad Doc-labelBody nm pt (StdLayout txt) = (\d1 -> ps_moveto pt `vconcat` d1) -                                 <$> encodedText nm txt-labelBody nm pt (KernTextH xs)  = kernTextH nm pt xs-labelBody nm pt (KernTextV xs)  = kernTextV nm pt xs---encodedText :: FontEncoderName -> EncodedText -> PsMonad Doc -encodedText nm etext = vcat <$> (mapM (textChunk nm) $ getEncodedText etext)---textChunk :: FontEncoderName -> TextChunk -> PsMonad Doc-textChunk _  (TextSpan s)    = pure (ps_show $ escapeSpecial s)-textChunk _  (TextEscName s) = pure (ps_glyphshow s)-textChunk nm (TextEscInt i)  = (either failk ps_glyphshow) <$> askCharCode nm i-  where-    failk gly_name = missingCharCode i gly_name+          => EncodingVector -> Point2 u -> LabelBody u -> Doc+labelBody ev pt (StdLayout txt) = ps_moveto pt `vconcat` psText ev txt+labelBody ev pt (KernTextH xs)  = kernTextH ev pt xs+labelBody ev pt (KernTextV xs)  = kernTextV ev pt xs +--  kernTextH :: PSUnit u -          => FontEncoderName -> Point2 u -> [KerningChar u] -> PsMonad Doc-kernTextH nm pt0 xs = snd <$> F.foldlM fn (pt0,empty) xs+                => EncodingVector -> Point2 u -> [KerningChar u] -> Doc+kernTextH ev pt0 xs = snd $ F.foldl' fn (pt0,empty) xs   where-    fn (P2 x y,acc) (dx,ch) = (\doc1 -> let pt = P2 (x+dx) y in-                                        (pt, vcat [acc, ps_moveto pt, doc1]))-                                <$> encodedChar nm ch+    fn (P2 x y,acc) (dx,ch) = let doc1 = psChar ev ch+                                  pt   = P2 (x+dx) y +                              in (pt, vcat [acc, ps_moveto pt, doc1])  -- Note - vertical labels grow downwards... -- kernTextV :: PSUnit u -          => FontEncoderName -> Point2 u -> [KerningChar u] -> PsMonad Doc-kernTextV nm pt0 xs = snd <$> F.foldlM fn (pt0,empty) xs-  where-    fn (P2 x y,acc) (dy,ch) = (\doc1 -> let pt = P2 x (y-dy) in-                                        (pt, vcat [acc, ps_moveto pt, doc1]))-                                <$> encodedChar nm ch---encodedChar :: FontEncoderName -> EncodedChar -> PsMonad Doc-encodedChar _  (CharLiteral c) = pure (ps_show $ escapeSpecialChar c)-encodedChar _  (CharEscName s) = pure (ps_glyphshow s)-encodedChar nm (CharEscInt i)  = (either failk ps_glyphshow) <$> askCharCode nm i +                => EncodingVector -> Point2 u -> [KerningChar u] -> Doc+kernTextV ev pt0 xs = snd $ F.foldl' fn (pt0,empty) xs   where-    failk gly_name = missingCharCode i gly_name+    fn (P2 x y,acc) (dy,ch) = let doc1 = psChar ev ch+                                  pt   = P2 x (y-dy) +                              in (pt, vcat [acc, ps_moveto pt, doc1])   --------------------------------------------------------------------------------@@ -520,7 +536,7 @@  makeFontAttrs :: FontAttr -> Doc makeFontAttrs (FontAttr sz face) = -    vcat [ ps_findfont (font_name face), ps_scalefont sz, ps_setfont ]+    vcat [ ps_findfont (ps_font_name face), ps_scalefont sz, ps_setfont ]   --------------------------------------------------------------------------------@@ -541,16 +557,15 @@   bracketPrimCTM :: forall u. (Real u, Floating u, PSUnit u)-               => Point2 u -> PrimCTM u +               => PrimCTM u                 -> (Point2 u -> PsMonad Doc) -> PsMonad Doc-bracketPrimCTM pt@(P2 x y) ctm mf -    | ctm == identityCTM  = mf pt-    | otherwise           = (\doc -> vcat [inn, doc, out]) <$> mf zeroPt'-  where-    zeroPt' :: Point2 u-    zeroPt' = zeroPt+bracketPrimCTM ctm0 mf= step $ unCTM ctm0 +  where +    step (pt,ctm) +      | ctm == identityCTM  = mf pt+      | otherwise           = let mtrx = matrixRepCTM ctm0  -- originalCTM+                                  inn   = ps_concat $ mtrx+                                  out   = ps_concat $ invert mtrx+                              in (\doc -> vcat [inn, doc, out]) <$> mf zeroPt -    mtrx  = translMatrixRepCTM x y ctm-    inn   = ps_concat $ mtrx-    out   = ps_concat $ invert mtrx 
src/Wumpus/Core/OutputSVG.hs view
@@ -32,8 +32,9 @@   -- * Output SVG     writeSVG -  , writeSVG_latin1+  , writeSVG_defs +   ) where  import Wumpus.Core.BoundingBox@@ -43,55 +44,55 @@ import Wumpus.Core.PageTranslation import Wumpus.Core.PictureInternal import Wumpus.Core.SVGDoc-import Wumpus.Core.Text.DefaultEncoder-import Wumpus.Core.Text.Encoder-import Wumpus.Core.Text.TextInternal import Wumpus.Core.TrafoInternal+import Wumpus.Core.Text.Base+import Wumpus.Core.Text.GlyphIndices import Wumpus.Core.Utils.Common import Wumpus.Core.Utils.FormatCombinators import Wumpus.Core.Utils.JoinList +import Data.AffineSpace                         -- package: vector-space+ import Control.Applicative hiding ( empty, some )+import Data.Char+import Data.List ( mapAccumL )+import qualified Data.Map as Map import Data.Maybe  -- SvgMonad is two Readers plus Int state for clip paths... -- +type ClipCount = Int  newtype SvgMonad a = SvgMonad { -          getSvgMonad :: TextEncoder -> GraphicsState -> Int -> (a,Int) }+          getSvgMonad :: GraphicsState -> ClipCount -> (a,ClipCount) }    instance Functor SvgMonad where-  fmap f mf = SvgMonad $ \r1 r2 s -> let (a,s1) = getSvgMonad mf r1 r2 s-                                     in (f a,s1)+  fmap f mf = SvgMonad $ \r s -> let (a,s1) = getSvgMonad mf r s+                                 in (f a,s1)  instance Applicative SvgMonad where-  pure a    = SvgMonad $ \_  _  s -> (a,s)-  mf <*> ma = SvgMonad $ \r1 r2 s -> let (f,s1) = getSvgMonad mf r1 r2 s-                                         (a,s2) = getSvgMonad ma r1 r2 s1-                                   in (f a, s2)+  pure a    = SvgMonad $ \_ s -> (a,s)+  mf <*> ma = SvgMonad $ \r s -> let (f,s1) = getSvgMonad mf r s+                                     (a,s2) = getSvgMonad ma r s1+                                 in (f a, s2)  instance Monad SvgMonad where-  return a  = SvgMonad $ \_  _  s -> (a,s)-  m >>= k   = SvgMonad $ \r1 r2 s -> let (a,s1) = getSvgMonad m r1 r2 s-                                     in (getSvgMonad . k) a r1 r2 s1+  return a  = SvgMonad $ \_ s -> (a,s)+  m >>= k   = SvgMonad $ \r s -> let (a,s1) = getSvgMonad m r s+                                 in (getSvgMonad . k) a r s1                               -runSvgMonad :: TextEncoder -> SvgMonad a -> a-runSvgMonad enc mf = fst $ getSvgMonad mf enc zeroGS 0+runSvgMonad :: SvgMonad a -> a+runSvgMonad mf = fst $ getSvgMonad mf zeroGS 0  newClipLabel :: SvgMonad String-newClipLabel = SvgMonad $ \_ _ s -> ('c':'l':'i':'p':show s, s+1)+newClipLabel = SvgMonad $ \_ s -> ('c':'l':'i':'p':show s, s+1)  -getGlyphName :: FontEncoderName -> String -> SvgMonad (Either GlyphName GlyphName)-getGlyphName fen glyname = SvgMonad $ \r1 _ s -> -    case lookupByGlyphName fen glyname r1 of-      Just a  -> (Right $ escapeSpecial a, s)-      Nothing -> (Left  $ escapeSpecial $ getSvgFallback fen r1, s)  -- This is different to the PsMonad version, as SVG is nested  -- (and /graphics state/ is via a Reader), so it is the same as @@ -99,11 +100,11 @@ -- runLocalGS :: (GraphicsState -> GraphicsState) -> SvgMonad a -> SvgMonad a runLocalGS upd mf = -    SvgMonad $ \r1 r2 s -> getSvgMonad mf r1 (upd r2) s+    SvgMonad $ \r s -> getSvgMonad mf (upd r) s   askGraphicsState :: SvgMonad GraphicsState-askGraphicsState = SvgMonad $ \_ r2 s -> (r2,s)+askGraphicsState = SvgMonad $ \r s -> (r,s)  asksGraphicsState :: (GraphicsState -> a) -> SvgMonad a asksGraphicsState fn = fmap fn askGraphicsState@@ -128,39 +129,44 @@ askDashPattern  = asksGraphicsState (dash_pattern . gs_stroke_attr)  +-------------------------------------------------------------------------------- ++svgChar :: EscapedChar -> Doc+svgChar (CharLiteral c) | ord c < 0x80  = char c+svgChar (CharLiteral c)                 = escapeSpecial $ ord c+svgChar (CharEscInt i)                  = escapeSpecial i+svgChar (CharEscName s)                 = +   escapeSpecial $ fromMaybe 0x0020 $ Map.lookup s ps_glyph_indices + --------------------------------------------------------------------------------  -- | Output a picture to a SVG file.  ----- Generally an encoder should always support the principal--- encoders for the fonts used (e.g. Latin1) /and/ the encoder for--- the Symbol font, as characters from the Symbol font may be used --- as decorations for plot marks, etc.--- writeSVG :: (Real u, Floating u, PSUnit u) -         => FilePath -> TextEncoder -> Picture u -> IO ()-writeSVG filepath enc pic = -    writeFile filepath $ show $ svgDraw enc pic +         => FilePath -> Picture u -> IO ()+writeSVG filepath pic = +    writeFile filepath $ show $ svgDraw Nothing pic  --- | Version of 'writeSVG' - using Latin1 and Symbol font encoders. +-- | 'writeSVG_defs' : @ file_name -> defs -> picture -> IO () @ ----- Generally an encoder should always support the principal--- encoders for the fonts used (e.g. Latin1) /and/ the encoder for --- the Symbol font, as characters from the Symbol font may be used --- as decorations for plot marks, etc.+-- Output a picture to a SVG file the supplied /defs/ are+-- written into the defs section of SVG file verbatim.  ---writeSVG_latin1 :: (Real u, Floating u, PSUnit u) -                => FilePath -> Picture u -> IO ()-writeSVG_latin1 filepath = writeSVG filepath defaultEncoder+writeSVG_defs :: (Real u, Floating u, PSUnit u) +              => FilePath -> String -> Picture u -> IO ()+writeSVG_defs filepath ss pic = +    writeFile filepath $ show $ svgDraw (Just ss) pic  + svgDraw :: (Real u, Floating u, PSUnit u) -        => TextEncoder -> Picture u -> Doc-svgDraw enc original_pic = +        => Maybe String -> Picture u -> Doc+svgDraw mb_defs original_pic =      let pic          = trivialTranslation original_pic         (_,imgTrafo) = imageTranslation pic-        body         = runSvgMonad enc $ picture pic-    in vcat [ xml_version, doctype, elem_svg $ imgTrafo body ]+        body         = runSvgMonad $ picture pic+        mkSvg        = maybe elem_svg elem_svg_defs mb_defs+    in vcat [ xml_version, doctype, mkSvg $ imgTrafo body ]   @@ -173,13 +179,7 @@  -------------------------------------------------------------------------------- --- Note - it will be wise to make coordinate remapping and output--- separate passes (unlike in Wumpus-Core). Then I\'ll at least --- be able to debug the remapped Picture.--- -- picture :: (Real u, Floating u, PSUnit u) => Picture u -> SvgMonad Doc picture (Leaf    (_,xs) ones)   = bracketTrafos xs $ oneConcat primitive ones picture (Picture (_,xs) ones)   = bracketTrafos xs $ oneConcat picture ones@@ -208,13 +208,28 @@ primitive (PLabel props lbl)    = primLabel props lbl primitive (PEllipse props ell)  = primEllipse props ell primitive (PContext fa chi)     = bracketGS fa (primitive chi)-primitive (PLink hypl chi)      = drawXLink hypl <$> primitive chi+primitive (PSVG anno chi)       = svgAnnoPrim anno <$> primitive chi primitive (PGroup ones)         = oneConcat primitive ones   +svgAnnoPrim :: SvgAnno -> Doc -> Doc+svgAnnoPrim (ALink hypl)    d = drawXLink hypl d+svgAnnoPrim (GAnno xs)      d = drawGProps xs d+svgAnnoPrim (SvgAG hypl xs) d = drawXLink hypl $ drawGProps xs d ++ drawXLink :: XLink -> Doc -> Doc drawXLink (XLink href) doc = elem_a_xlink href doc +drawGProps :: [SvgAttr] -> Doc -> Doc+drawGProps [] d = d +drawGProps xs d = elem_g attrs_doc d+  where+    attrs_doc = hsep $ map svgAttribute xs++svgAttribute :: SvgAttr -> Doc+svgAttribute (SvgAttr n v) = svgAttr n $ text v+  clipPath :: PSUnit u => String -> PrimPath u -> SvgMonad Doc clipPath clip_id pp =      (\doc -> elem_clipPath (attr_id clip_id) (elem_path_no_attrs doc)) @@ -225,14 +240,29 @@ primPath props pp = (\(a,f) d -> elem_path a (f d))                        <$> pathProps props <*> path pp +--+-- Paths are printed as absolute paths. Internally they are +-- relative paths, but client code specifies them as absolute +-- paths. So, here at least, the output matches the input.+-- +-- Also, the SVG syntax for distinguishing between absolute and +-- relative paths is is horrible (upper case char versus its +-- corresponding lower case char). As Wumpus used absolute paths +-- internally up to version 0.40.0, the horrible syntax was not+-- an encouragement to change when it moved to relative ones. +--   path :: PSUnit u => PrimPath u -> SvgMonad Doc path (PrimPath start xs) = -    pure $ path_m start <+> hsep (map seg xs)+    pure $ path_m start <+> hsep (snd $ mapAccumL step start xs)   where-    seg (PLineTo pt)        = path_l pt-    seg (PCurveTo p1 p2 p3) = path_c p1 p2 p3+    step pt (RelLineTo v)         = let p1 = pt .+^ v in (p1, path_l p1)+    step pt (RelCurveTo v1 v2 v3) = let p1 = pt .+^ v1 +                                        p2 = p1 .+^ v2+                                        p3 = p2 .+^ v3+                                    in (p3, path_c p1 p2 p3) + -- Return - drawing props, plus a function to close the path (or not).  -- pathProps :: PathProps -> SvgMonad (Doc, Doc -> Doc)@@ -262,11 +292,11 @@ -- primEllipse :: (Real u, Floating u, PSUnit u)             => EllipseProps -> PrimEllipse u -> SvgMonad Doc-primEllipse props (PrimEllipse pt hw hh ctm) +primEllipse props (PrimEllipse hw hh ctm)      | hw == hh  = (\a b -> elem_circle (a <+> circle_radius <+> b))-                    <$> bracketPrimCTM pt ctm mkCXCY <*> ellipseProps props+                    <$> bracketPrimCTM ctm mkCXCY <*> ellipseProps props     | otherwise = (\a b -> elem_ellipse (a <+> ellipse_radius <+> b))-                    <$> bracketPrimCTM pt ctm mkCXCY <*> ellipseProps props+                    <$> bracketPrimCTM ctm mkCXCY <*> ellipseProps props   where    mkCXCY (P2 x y) = pure $ attr_cx x <+> attr_cy y    @@ -296,39 +326,33 @@  primLabel :: (Real u, Floating u, PSUnit u)        => LabelProps -> PrimLabel u -> SvgMonad Doc-primLabel (LabelProps rgb attrs) (PrimLabel pt body ctm) = -    (\fa ca dtxt -> elem_text (fa <+> ca) (makeTspan rgb dtxt))-      <$> deltaFontAttrs attrs <*> bracketPrimCTM pt ctm (labelBodyCoords body)-                               <*> labelBodyText fen body+primLabel (LabelProps rgb attrs) (PrimLabel body ctm) = +    (\fa ca -> elem_text (fa <+> ca) (makeTspan rgb dtext))+      <$> deltaFontAttrs attrs <*> bracketPrimCTM ctm coordf+                                  where-    fen = font_enc_name $ font_face attrs    +    coordf = \p0 -> pure $ labelBodyCoords body p0+    dtext  = labelBodyText body +labelBodyCoords :: PSUnit u => LabelBody u -> Point2 u -> Doc+labelBodyCoords (StdLayout _)  pt = makeXY pt+labelBodyCoords (KernTextH xs) pt = makeXsY pt xs        +labelBodyCoords (KernTextV xs) pt = makeXYs pt xs -labelBodyCoords :: PSUnit u => LabelBody u -> Point2 u -> SvgMonad Doc-labelBodyCoords (StdLayout _)  pt = pure $ makeXY pt-labelBodyCoords (KernTextH xs) pt = pure $ makeXsY pt xs        -labelBodyCoords (KernTextV xs) pt = pure $ makeXYs pt xs+labelBodyText :: LabelBody u -> Doc+labelBodyText (StdLayout enctext) = encodedText enctext+labelBodyText (KernTextH xs)      = kerningText xs+labelBodyText (KernTextV xs)      = kerningText xs -labelBodyText :: FontEncoderName -> LabelBody u -> SvgMonad Doc-labelBodyText nm (StdLayout enctext) = encodedText nm enctext-labelBodyText nm (KernTextH xs)      = hcat <$> mapM (kerningChar nm) xs-labelBodyText nm (KernTextV xs)      = hcat <$> mapM (kerningChar nm) xs +encodedText :: EscapedText -> Doc+encodedText enctext = hcat $ map svgChar $ getEscapedText enctext -encodedText :: FontEncoderName -> EncodedText -> SvgMonad Doc-encodedText nm enctext = hcat <$> mapM (textChunk nm) (getEncodedText enctext)+kerningText :: [KerningChar u] -> Doc+kerningText xs = hcat $ map (\(_,c) -> svgChar c) xs -textChunk :: FontEncoderName -> TextChunk -> SvgMonad Doc-textChunk _  (TextSpan s)    = pure $ text s-textChunk _  (TextEscInt i)  = pure $ text $ escapeSpecial i-textChunk nm (TextEscName s) = either text text <$> getGlyphName nm s  -kerningChar :: FontEncoderName -> KerningChar u -> SvgMonad Doc-kerningChar _  (_, CharLiteral c) = pure $ char c-kerningChar _  (_, CharEscInt i)  = pure $ text $ escapeSpecial i-kerningChar nm (_, CharEscName s) = either text text <$> getGlyphName nm s  - makeTspan :: RGBi -> Doc -> Doc makeTspan rgb body = elem_tspan (attr_fill rgb) body @@ -479,15 +503,15 @@     trafo = attr_transform $ val_matrix mtrx  +-- Note - the otherwise step uses the origina ctm (ctm0).+--  bracketPrimCTM :: forall u. (Real u, Floating u, PSUnit u)-               => Point2 u -> PrimCTM u +               => PrimCTM u                 -> (Point2 u -> SvgMonad Doc) -> SvgMonad Doc-bracketPrimCTM pt@(P2 x y) ctm pf -    | ctm == identityCTM  = pf pt-    | otherwise           = (\xy -> xy <+> attr_transform mtrx) <$> pf zeroPt'+bracketPrimCTM ctm0 pf = step $ unCTM ctm0   where-    zeroPt' :: Point2 u-    zeroPt' = zeroPt--    mtrx  = val_matrix $ translMatrixRepCTM x y ctm-+    step (pt, ctm) +        | ctm == identityCTM  = pf pt+        | otherwise           = let mtrx = attr_transform $ +                                             val_matrix $ matrixRepCTM ctm0+                                in (\xy -> xy <+> mtrx) <$> pf zeroPt
src/Wumpus/Core/PageTranslation.hs view
@@ -53,20 +53,19 @@ trivPrim (PLabel a lbl)   = PLabel a (trivLabel lbl) trivPrim (PEllipse a ell) = PEllipse a (trivEllipse ell) trivPrim (PContext a chi) = PContext a (trivPrim chi)-trivPrim (PLink a chi)    = PLink a (trivPrim chi)+trivPrim (PSVG a chi)     = PSVG a (trivPrim chi) trivPrim (PGroup ones)    = PGroup $ fmap trivPrim ones   trivLabel :: Num u => PrimLabel u -> PrimLabel u-trivLabel (PrimLabel pt txt ctm) = PrimLabel pt txt (trivPrimCTM ctm)+trivLabel (PrimLabel txt ctm) = PrimLabel txt (trivPrimCTM ctm)  trivEllipse :: Num u => PrimEllipse u -> PrimEllipse u-trivEllipse (PrimEllipse ctr hw hh ctm) = -    PrimEllipse ctr hw hh (trivPrimCTM ctm)+trivEllipse (PrimEllipse hw hh ctm) = PrimEllipse hw hh (trivPrimCTM ctm)  -- Is the translation here just negating the angle with scaling -- left untouched? -- trivPrimCTM :: Num u => PrimCTM u -> PrimCTM u-trivPrimCTM (PrimCTM sx sy theta) = PrimCTM sx (-sy) theta+trivPrimCTM (PrimCTM dx dy sx sy theta) = PrimCTM dx dy sx (-sy) theta 
src/Wumpus/Core/Picture.hs view
@@ -14,6 +14,21 @@ -- -- Construction of pictures, paths and text labels. --+-- Note - the text label functions are only appropriate for single +-- printed lines of text. Wumpus-Core does not interpret special +-- white-space characters (i.e. tab or newline) and passes them +-- forward into the output file. Renderers will then deal with +-- white-space as they please, which is usually to ignore it.+--+-- Also, SVG output does not currently use @space=\"preserve\"@. +-- It would be desirable to do so, as the PostScript generated by +-- Wumpus can use doubled up spaces to print wide spaces. +-- Unfortunately, SVG renderers seem to differ as to whether they+-- can inherit @space=\"preserve\"@ from a top level attribute or+-- whether it must be annotated on every @\<text\>@ element. +-- Wumpus considers the latter to be a too-high burden as it will+-- expand the code size (this view may change).+-- --------------------------------------------------------------------------------  @@ -24,13 +39,17 @@     frame   , multi   , fontDeltaContext-  , path+  , primPath   , lineTo   , curveTo   , vertexPath   , curvedPath   , xlinkhref   , xlink+  , svgattr+  , annotateGroup+  , annotateXLink+   , primGroup   , primCat @@ -51,6 +70,10 @@   , rtextlabel   , ztextlabel +  , escapedlabel+  , rescapedlabel+  , zescapedlabel+   , hkernlabel   , vkernlabel   , kernchar@@ -88,15 +111,16 @@ import Wumpus.Core.GraphicProps import Wumpus.Core.PictureInternal import Wumpus.Core.PtSize-import Wumpus.Core.Text.TextInternal+import Wumpus.Core.Text.Base import Wumpus.Core.TrafoInternal import Wumpus.Core.Utils.Common import Wumpus.Core.Utils.FormatCombinators hiding ( fill ) import Wumpus.Core.Utils.JoinList  import Data.AffineSpace                         -- package: vector-space-+import Data.VectorSpace +import Data.List ( mapAccumL )  -------------------------------------------------------------------------------- -- Construction@@ -168,16 +192,24 @@  -- | Create a Path from a start point and a list of PathSegments. ---path :: Point2 u -> [PrimPathSegment u] -> PrimPath u-path = PrimPath +primPath :: Num u => Point2 u -> [AbsPathSegment u] -> PrimPath u+primPath pt xs = PrimPath pt $ step pt xs+  where+    step p (AbsLineTo p1:rest)        = RelLineTo (p1 .-. p) : step p1 rest+    step p (AbsCurveTo p1 p2 p3:rest) = +        RelCurveTo (p1 .-. p) (p2 .-. p1) (p3 .-. p2) : step p3 rest +    step _ []                         = []+++          -- | 'lineTo' : @ end_point -> path_segment @ --  -- Create a straight-line PathSegment, the start point is  -- implicitly the previous point in a path. ---lineTo :: Point2 u -> PrimPathSegment u-lineTo = PLineTo+lineTo :: Point2 u -> AbsPathSegment u+lineTo = AbsLineTo  -- | 'curveTo' : @ control_point1 * control_point2 * end_point ->  --        path_segment @@@ -186,16 +218,18 @@ -- implicitly the previous point in a path. -- ---curveTo :: Point2 u -> Point2 u -> Point2 u -> PrimPathSegment u-curveTo = PCurveTo+curveTo :: Point2 u -> Point2 u -> Point2 u -> AbsPathSegment u+curveTo = AbsCurveTo   -- | Convert the list of vertices to a path of straight line  -- segments. ---vertexPath :: [Point2 u] -> PrimPath u+vertexPath :: Num u => [Point2 u] -> PrimPath u vertexPath []     = error "Picture.vertexPath - empty point list"-vertexPath (x:xs) = PrimPath x (map PLineTo xs)+vertexPath (x:xs) = PrimPath x $ snd $ mapAccumL step x xs+  where+    step a b = let v = b .-. a in (b, RelLineTo v)   @@ -204,13 +238,15 @@ -- segment thereafter takes 3 points. /Spare/ points at the end  -- are discarded.  ---curvedPath :: [Point2 u] -> PrimPath u+curvedPath :: Num u => [Point2 u] -> PrimPath u curvedPath []     = error "Picture.curvedPath - empty point list"-curvedPath (x:xs) = PrimPath x (step xs) +curvedPath (x:xs) = PrimPath x $ step x xs   where-    step (a:b:c:ys) = PCurveTo a b c : step ys -    step _          = []-+    step p (a:b:c:ys) = let v1 = a .-. p +                            v2 = b .-. a+                            v3 = c .-. a+                        in RelCurveTo v1 v2 v3 : step c ys+    step _ _          = []  -- | Create a hyperlink for SVG output. --@@ -221,9 +257,34 @@ -- | Create a hyperlinked Primitive. -- xlink :: XLink -> Primitive u -> Primitive u-xlink hypl p = PLink hypl p  +xlink hypl p = PSVG (ALink hypl) p    +-- | Create an attribute for SVG output.+--+svgattr :: String -> String -> SvgAttr+svgattr = SvgAttr+++-- | Add SVG attribute annotations to a Primitive.+--+-- The primitive will be printed in a @g@ (group) element +-- labelled with the annotations.+--+annotateGroup :: [SvgAttr] -> Primitive u -> Primitive u+annotateGroup xs p = PSVG (GAnno xs) p  +++-- | Add SVG XLink and attribute annotations to a Primitive.+--+-- The primitive will be printed in a @g@ (group) element, itself+-- inside an @a@ link.+--+annotateXLink :: XLink -> [SvgAttr] -> Primitive u -> Primitive u+annotateXLink hypl xs p = PSVG (SvgAG hypl xs) p  +++ -- | Group a list of Primitives. -- -- This function throws a runtime error when supplied with an@@ -369,9 +430,8 @@ -- rtextlabel :: Num u             => RGBi -> FontAttr -> String -> Point2 u -> Radian -> Primitive u-rtextlabel rgb attr txt pt theta = PLabel (LabelProps rgb attr) lbl -  where-    lbl = PrimLabel pt (StdLayout $ lexLabel txt) (thetaCTM theta)+rtextlabel rgb attr txt pt theta = +    rescapedlabel rgb attr (escapeString txt) pt theta   -- | 'ztextlabel' : @ string * baseline_left -> Primitive @@@ -384,6 +444,42 @@   +-- | 'escapedlabel' : @ rgb * font_attr * escaped_text * baseline_left -> Primitive @+--+-- Version of 'textlabel' where the label text has already been +-- parsed for special characters.+--+-- The supplied point is the left baseline.+--+escapedlabel :: Num u +             => RGBi -> FontAttr -> EscapedText -> Point2 u -> Primitive u+escapedlabel rgb attr txt pt = rescapedlabel rgb attr txt pt 0++-- | 'rescapedlabel' : @ rgb * font_attr * escaped_text * baseline_left * +--      rotation -> Primitive @+--+-- Version of 'rtextlabel' where the label text has already been +-- parsed for special characters.+--+-- The supplied point is the left baseline.+--+rescapedlabel :: Num u +              => RGBi -> FontAttr -> EscapedText -> Point2 u -> Radian -> Primitive u+rescapedlabel rgb attr txt (P2 dx dy) theta = PLabel (LabelProps rgb attr) lbl +  where+    lbl = PrimLabel (StdLayout txt) (makeThetaCTM dx dy theta)+++-- | 'zescapedlabel' : @ escaped_text * baseline_left -> Primitive @+--+-- Version of 'ztextlabel' where the label text has already been +-- encoded.+--+zescapedlabel :: Num u => EscapedText -> Point2 u -> Primitive u+zescapedlabel = escapedlabel black wumpus_default_font+++ --------------------------------------------------------------------------------  -- | 'hkernlabel' : @ rgb * font_attr * kerning_chars * @@ -406,20 +502,22 @@ -- -- The supplied point is the left baseline. ----- \*\* CAUTION \*\* - @hkernlabel@ generates a coordinate list --- for X-positions rather than a single start point. This is --- perfectly valid SVG, but it is not universally supported by --- renderers. Chrome support is fine, but Firefox and Safari --- currently seem lacking. +-- \*\* CAUTION \*\* - for SVG, @hkernlabel@ generates a +-- coordinate list of X-positions rather than a single start +-- point. This is syntactically valid SVG, but it is not +-- universally supported by renderers. Chrome support is fine, +-- but Firefox and Safari currently seem lacking.  ----- Also, currently the generated PostScript is inefficient.+-- Also, note this feature does not have a directly compatible +-- PostScript analogue. While the same picture is generated in +-- both cases, the PostScript code is not particularly inefficient. -- hkernlabel :: Num u              => RGBi -> FontAttr -> [KerningChar u] -> Point2 u              -> Primitive u-hkernlabel rgb attr xs pt = PLabel (LabelProps rgb attr) lbl +hkernlabel rgb attr xs (P2 x y) = PLabel (LabelProps rgb attr) lbl    where-    lbl = PrimLabel pt (KernTextH xs) identityCTM+    lbl = PrimLabel (KernTextH xs) (makeTranslCTM x y)   @@ -446,20 +544,22 @@ -- -- The supplied point is the left baseline of the top character. ----- \*\* CAUTION \*\* - @vkernlabel@ generates a coordinate list --- for Y-positions rather than a single start point. This is --- perfectly valid SVG, but it is not universally supported by --- renderers. Chrome support is fine, but Firefox and Safari --- currently seem lacking. +-- \*\* CAUTION \*\* - for SVG, @hkernlabel@ generates a +-- coordinate list of Y-positions rather than a single start +-- point. This is syntactically valid SVG, but it is not +-- universally supported by renderers. Chrome support is fine, +-- but Firefox and Safari currently seem lacking.  ----- Also, currently the generated PostScript is inefficient.+-- Also, note this feature does not have a directly compatible +-- PostScript analogue. While the same picture is generated in +-- both cases, the PostScript code is not particularly inefficient. -- vkernlabel :: Num u              => RGBi -> FontAttr -> [KerningChar u] -> Point2 u              -> Primitive u-vkernlabel rgb attr xs pt = PLabel (LabelProps rgb attr) lbl +vkernlabel rgb attr xs (P2 x y) = PLabel (LabelProps rgb attr) lbl    where-    lbl = PrimLabel pt (KernTextV xs) identityCTM+    lbl = PrimLabel (KernTextV xs) (makeTranslCTM x y)   @@ -583,7 +683,8 @@   mkPrimEllipse :: Num u => u -> u -> Radian -> Point2 u -> PrimEllipse u-mkPrimEllipse rx ry theta pt = PrimEllipse pt rx ry (thetaCTM theta)+mkPrimEllipse rx ry theta (P2 dx dy) = +    PrimEllipse rx ry (makeThetaCTM dx dy theta)  -------------------------------------------------------------------------------- -- Operations@@ -706,7 +807,7 @@ -- illustrateControlPoints :: (Real u, Floating u, FromPtSize u)                         => RGBi -> Primitive u -> Picture u-illustrateControlPoints rgb elt = frame $ step elt+illustrateControlPoints rgb elt = frame $ elt : step elt   where     step (PEllipse _ e) = ellipseCtrlLines rgb e     step (PPath    _ p) = pathCtrlLines rgb p@@ -723,15 +824,18 @@ pathCtrlLines :: (Num u, Ord u) => RGBi -> PrimPath u -> [Primitive u] pathCtrlLines rgb (PrimPath start ss) = step start ss   where -    -- trail the current end point through the recursion...-    step _ []                    = []-    step _ (PLineTo e:xs)        = step e xs-    step s (PCurveTo c1 c2 e:xs) = mkLine s c1 : mkLine c2 e : step e xs +    step s (RelLineTo v:xs)         = step (s .+^ v) xs -    mkLine s e                   = let pp = (PrimPath s [lineTo e]) in -                                   ostroke rgb default_stroke_attr pp +    step s (RelCurveTo v1 v2 v3:xs) = let e   = s .+^ (v1 ^+^ v2 ^+^ v3)+                                          v3r = vreverse v3+                                      in mkLine s v1 : mkLine e v3r : step e xs +    step _ []                       = [] +    mkLine s v                      = let pp = (PrimPath s [RelLineTo v]) +                                      in ostroke rgb default_stroke_attr pp ++ -- Generate lines illustrating the control points of an  -- ellipse: -- @@ -753,7 +857,8 @@     rest s (c1:c2:e:xs)  = mkLine s c1 : mkLine c2 e : rest e xs     rest _ _             = [] -    mkLine s e  = ostroke rgb default_stroke_attr (PrimPath s [lineTo e]) +    mkLine s e  = let path = PrimPath s [RelLineTo (e .-. s)]+                  in ostroke rgb default_stroke_attr path   @@ -765,10 +870,8 @@ -- ellipseControlPoints :: (Floating u, Real u)                      => PrimEllipse u -> [Point2 u]-ellipseControlPoints (PrimEllipse (P2 x y) hw hh ctm) = -    map (disp . (new_mtrx *#)) circ+ellipseControlPoints (PrimEllipse hw hh ctm) = map (new_mtrx *#) circ   where-    disp             = (.+^ V2 x y)     (radius,(dx,dy)) = circleScalingProps hw hh     new_mtrx         = matrixRepCTM $ scaleCTM dx dy ctm     circ             = bezierCircle 1 radius (P2 0 0)
src/Wumpus/Core/PictureInternal.hs view
@@ -26,12 +26,16 @@    , Primitive(..)   , DPrimitive+  , SvgAnno(..)   , XLink(..)+  , SvgAttr(..)    , PrimPath(..)   , DPrimPath   , PrimPathSegment(..)   , DPrimPathSegment+  , AbsPathSegment(..)+  , DAbsPathSegment   , PrimLabel(..)   , DPrimLabel   , LabelBody(..)@@ -61,8 +65,7 @@ import Wumpus.Core.Geometry import Wumpus.Core.GraphicProps import Wumpus.Core.PtSize-import Wumpus.Core.Text.Latin1-import Wumpus.Core.Text.TextInternal+import Wumpus.Core.Text.Base import Wumpus.Core.TrafoInternal import Wumpus.Core.Utils.Common import Wumpus.Core.Utils.FormatCombinators@@ -72,7 +75,7 @@ import Data.AffineSpace                         -- package: vector-space  import qualified Data.Foldable                  as F-+import qualified Data.IntMap                    as IntMap   -- | Picture is a leaf attributed tree - where attributes are @@ -164,19 +167,19 @@ -- constraint is also obliged. -- -- To represent XLink hyperlinks, Primitives can be annotated --- with some a hyperlink (similarly a a font change for better--- SVG code generation) and grouped - a hyperlinked arrow would--- want the tip and the arrow body both to be incorporated in the--- link even though they are two drawings. +-- with some a hyperlink (likewise a /passive/ font change for +-- better SVG code generation) and grouped - a hyperlinked arrow +-- would want the tip and the arrow body both to be incorporated +-- in thelink even though they are two drawing primitives.  -- -- This means that Primitives aren\'t strictly /primitive/ as  -- the actual implementation is a tree. -- -data Primitive u = PPath    PathProps     (PrimPath u)-                 | PLabel   LabelProps    (PrimLabel u)-                 | PEllipse EllipseProps  (PrimEllipse u)-                 | PContext FontCtx       (Primitive u)-                 | PLink    XLink         (Primitive u)+data Primitive u = PPath    PathProps         (PrimPath u)+                 | PLabel   LabelProps        (PrimLabel u)+                 | PEllipse EllipseProps      (PrimEllipse u)+                 | PContext FontCtx           (Primitive u)+                 | PSVG     SvgAnno           (Primitive u)                  | PGroup   (JoinList (Primitive u))   deriving (Eq,Show) @@ -193,12 +196,43 @@ newtype FontCtx = FontCtx { getFontCtx :: FontAttr }   deriving (Eq,Show) ++-- | SVG annotations - annotations can be: +-- +-- A hyperlink inside @<a ...> ... </a>@ .+--+-- A group - @<g ...> ... </g>@+--+-- A group inside a hyperlink.+--+data SvgAnno = ALink XLink+             | GAnno [SvgAttr]+             | SvgAG XLink [SvgAttr]+   deriving (Eq,Show)+ -- | Primitives can be grouped with hyperlinks in SVG output. --+-- Note - this is always printed as @xlink:href="..."@. Other+-- types of xlink can be modelled with the unrestrained +-- SvgAnno type.+-- newtype XLink = XLink { getXLink :: String }   deriving (Eq,Show)  +-- | Primitives can be labelled with arbitrary SVG properties +-- (e.g @onmouseover@) within a group element.+--+-- Note - annotations should be used only for non-graphical +-- properties. Graphical properties (fill_colour, font_size, etc.)+-- should be set through the appropriate Wumpus functions.+--+data SvgAttr = SvgAttr +      { svg_attr_name   :: String+      , svg_attr_value  :: String +      }+  deriving (Eq,Show)+ -- | PrimPath - start point and a list of path segments. -- data PrimPath u = PrimPath (Point2 u) [PrimPathSegment u]@@ -206,21 +240,40 @@  type DPrimPath = PrimPath Double --- | PrimPathSegment - either a cubic Bezier curve or a line.+-- | PrimPathSegment - either a relative cubic Bezier /curve-to/ +-- or a relative /line-to/. ---data PrimPathSegment u = PCurveTo  (Point2 u) (Point2 u) (Point2 u)-                       | PLineTo   (Point2 u)+data PrimPathSegment u = RelCurveTo  (Vec2 u) (Vec2 u) (Vec2 u)+                       | RelLineTo   (Vec2 u)   deriving (Eq,Show)  type DPrimPathSegment = PrimPathSegment Double +-- Design note - if paths were represented as:+--   start-point plus [relative-path-segment]+-- They would be cheaper to move...+--  --- | Label - represented by /baseline/ left point and text.+-- | AbsPathSegment - either a cubic Bezier curve or a line.+-- +-- Note this data type is transitory - it is only used as a +-- convenience to build relative paths.  --+data AbsPathSegment u = AbsCurveTo  (Point2 u) (Point2 u) (Point2 u)+                      | AbsLineTo   (Point2 u)+  deriving (Eq,Show)++type DAbsPathSegment = AbsPathSegment Double++++-- | Label - represented by baseline-left point and text.+--+-- Baseline-left is the dx * dy of the PrimCTM.+-- data PrimLabel u = PrimLabel -      { label_baseline_left :: Point2 u-      , label_body          :: LabelBody u+      { label_body          :: LabelBody u       , label_ctm           :: PrimCTM u       }   deriving (Eq,Show)@@ -240,7 +293,7 @@ -- Kerned vertical layout - each character is encoded with the -- upwards distance from the last charcaters left base-line. -- -data LabelBody u = StdLayout EncodedText+data LabelBody u = StdLayout EscapedText                  | KernTextH [KerningChar u]                  | KernTextV [KerningChar u]   deriving (Eq,Show)@@ -251,15 +304,16 @@ -- | A Char (possibly escaped) paired with is displacement from  -- the previous KerningChar. ---type KerningChar u = (u,EncodedChar) +type KerningChar u = (u,EscapedChar)   type DKerningChar = KerningChar Double --- Ellipse represented by center and half_width * half_height+-- | Ellipse represented by center and half_width * half_height. --+-- Center is the dx * dy of the PrimCTM.+-- data PrimEllipse u = PrimEllipse -      { ellipse_center        :: Point2 u-      , ellipse_half_width    :: u+      { ellipse_half_width    :: u       , ellipse_half_height   :: u        , ellipse_ctm           :: PrimCTM u       } @@ -337,8 +391,8 @@   format (PContext _ a)     =        vcat [ text "-- svg ctx change " , format a ] -  format (PLink _ a)     = -      vcat [ text "-- svg link " , format a ]+  format (PSVG _ a)       = +      vcat [ text "-- svg:", format  a ]    format (PGroup ones)      =        vcat [ text "-- group ", fmtPrimlist ones  ]@@ -356,16 +410,15 @@         start = text "start_point " <> format pt  instance PSUnit u => Format (PrimPathSegment u) where-  format (PCurveTo p1 p2 p3)  =-    text "curve_to    " <> format p1 <+> format p2 <+> format p3+  format (RelCurveTo p1 p2 p3)  =+    text "rel_curve_to " <> format p1 <+> format p2 <+> format p3 -  format (PLineTo pt)         = text "line_to     " <> format pt+  format (RelLineTo pt)         = text "rel_line_to  " <> format pt  instance PSUnit u => Format (PrimLabel u) where-  format (PrimLabel pt s ctm) = +  format (PrimLabel s ctm) =       vcat [ dquotes (format s)-          ,     text "baseline_left=" <> format pt-            <+> text "ctm="           <> format ctm+          , text "ctm="           <> format ctm           ]  instance PSUnit u => Format (LabelBody u) where@@ -375,14 +428,13 @@   instance PSUnit u => Format (PrimEllipse u) where-  format (PrimEllipse ctr hw hh ctm) = text "center="   <> format ctr-                                   <+> text "hw="       <> dtruncFmt hw-                                   <+> text "hh="       <> dtruncFmt hh-                                   <+> text "ctm="      <> format ctm+  format (PrimEllipse hw hh ctm) =  text "hw="       <> dtruncFmt hw+                                <+> text "hh="       <> dtruncFmt hh+                                <+> text "ctm="      <> format ctm     instance Format XLink where-  format (XLink ss) = text "xlink" <+> text ss+  format (XLink ss) = text "xlink:href" <+> text ss   --------------------------------------------------------------------------------@@ -398,7 +450,7 @@   boundary (PLabel a l)     = labelBoundary (label_font a) l   boundary (PEllipse _ e)   = ellipseBoundary e   boundary (PContext _ a)   = boundary a-  boundary (PLink _ a)      = boundary a+  boundary (PSVG _ a)       = boundary a   boundary (PGroup ones)    = outer $ viewl ones      where       outer (OneL a)     = boundary a@@ -410,15 +462,23 @@   -pathBoundary :: Ord u => PrimPath u -> BoundingBox u-pathBoundary (PrimPath st xs) = step (st,st) xs+pathBoundary :: (Num u, Ord u) => PrimPath u -> BoundingBox u+pathBoundary (PrimPath st xs) = step st (st,st) xs   where-    step (lo,hi) []                       = BBox lo hi -    step (lo,hi) (PLineTo p1:rest)        = step (lo2 lo p1, hi2 hi p1) rest-    step (lo,hi) (PCurveTo p1 p2 p3:rest) = let lo' = lo4 lo p1 p2 p3 -                                                hi' = hi4 hi p1 p2 p3-                                            in step (lo',hi') rest +    step _  (lo,hi) []                         = BBox lo hi  +    step pt (lo,hi) (RelLineTo v1:rest)        = +        let p1 = pt .+^ v1+        in step p1 (lo2 lo p1, hi2 hi p1) rest++    step pt (lo,hi) (RelCurveTo v1 v2 v3:rest) = +        let p1  = pt .+^ v1+            p2  = p1 .+^ v2+            p3  = p2 .+^ v3+            lo' = lo4 lo p1 p2 p3 +            hi' = hi4 hi p1 p2 p3+        in step p3 (lo',hi') rest +     lo2 (P2 x1 y1) (P2 x2 y2) = P2 (min x1 x2) (min y1 y2)      hi2 (P2 x1 y1) (P2 x2 y2) = P2 (max x1 x2) (max y1 y2)@@ -433,10 +493,9 @@  labelBoundary :: (Floating u, Real u, FromPtSize u)                => FontAttr -> PrimLabel u -> BoundingBox u-labelBoundary attr (PrimLabel (P2 x y) body ctm) = -    retraceBoundary  (disp . (m33 *#)) untraf_bbox+labelBoundary attr (PrimLabel body ctm) = +    retraceBoundary (m33 *#) untraf_bbox   where-    disp        = (.+^ V2 x y)     m33         = matrixRepCTM ctm     untraf_bbox = labelBodyBoundary (font_size attr) body @@ -448,8 +507,8 @@   stdLayoutBB :: (Num u, Ord u, FromPtSize u) -            => FontSize -> EncodedText -> BoundingBox u-stdLayoutBB sz etxt = textBoundsEnc sz zeroPt etxt+            => FontSize -> EscapedText -> BoundingBox u+stdLayoutBB sz etxt = textBoundsEsc sz zeroPt etxt   -- Note - this assumes positive deltas (and a nonempty list)...@@ -461,7 +520,7 @@ -- displacements. --  hKerningBB :: (Num u, Ord u, FromPtSize u) -           => FontSize -> [(u,EncodedChar)] -> BoundingBox u+           => FontSize -> [(u,EscapedChar)] -> BoundingBox u hKerningBB sz xs = rightGrow (sumDiffs xs) $ textBounds sz zeroPt "A"   where     sumDiffs                          = foldr (\(u,_) i -> i+u)  0@@ -478,7 +537,7 @@ -- Also note, that the Label /grows/ downwards... -- vKerningBB :: (Num u, Ord u, FromPtSize u) -           => FontSize -> [(u,EncodedChar)] -> BoundingBox u+           => FontSize -> [(u,EscapedChar)] -> BoundingBox u vKerningBB sz xs = downGrow (sumDiffs xs) $ textBounds sz zeroPt "A"   where     sumDiffs                                = foldr (\(u,_) i -> i+u)  0@@ -489,17 +548,14 @@ -- then retraced. -- ellipseBoundary :: (Real u, Floating u) => PrimEllipse u -> BoundingBox u-ellipseBoundary (PrimEllipse pt hw0 hh0 (PrimCTM sx sy theta)) = -    traceBoundary $ applyIf (theta /= 0) (map (rotm *#)) [ll,lr,ur,ul]+ellipseBoundary (PrimEllipse hw hh ctm) = +    traceBoundary $ map (m33 *#) [sw,se,ne,nw]   where-    hw   = hw0 * sx-    hh   = hh0 * sy-    ll   = pt .+^ V2 (-hw) (-hh) -    lr   = pt .+^ V2   hw  (-hh) -    ur   = pt .+^ V2   hw    hh -    ul   = pt .+^ V2 (-hw)   hh -    rotm = rotationMatrix theta-+    sw   = P2 (-hw) (-hh) +    se   = P2   hw  (-hh) +    ne   = P2   hw    hh +    nw   = P2 (-hw)   hh +    m33  = matrixRepCTM ctm   --------------------------------------------------------------------------------@@ -553,7 +609,7 @@   rotate r (PLabel a lbl)   = PLabel a   $ rotateLabel r lbl   rotate r (PEllipse a ell) = PEllipse a $ rotateEllipse r ell   rotate r (PContext a chi) = PContext a $ rotate r chi -  rotate r (PLink a chi)    = PLink a    $ rotate r chi +  rotate r (PSVG a chi)     = PSVG a     $ rotate r chi    rotate r (PGroup xs)      = PGroup     $ fmap (rotate r) xs   @@ -562,7 +618,7 @@   rotateAbout r pt (PLabel a lbl)   = PLabel a   $ rotateAboutLabel r pt lbl   rotateAbout r pt (PEllipse a ell) = PEllipse a $ rotateAboutEllipse r pt ell   rotateAbout r pt (PContext a chi) = PContext a $ rotateAbout r pt chi-  rotateAbout r pt (PLink a chi)    = PLink a    $ rotateAbout r pt chi+  rotateAbout r pt (PSVG a chi)     = PSVG a     $ rotateAbout r pt chi   rotateAbout r pt (PGroup xs)      = PGroup     $ fmap (rotateAbout r pt) xs  @@ -571,7 +627,7 @@   scale sx sy (PLabel a lbl)    = PLabel a   $ scaleLabel sx sy lbl   scale sx sy (PEllipse a ell)  = PEllipse a $ scaleEllipse sx sy ell   scale sx sy (PContext a chi)  = PContext a $ scale sx sy chi-  scale sx sy (PLink a chi)     = PLink a    $ scale sx sy chi+  scale sx sy (PSVG a chi)      = PSVG a     $ scale sx sy chi   scale sx sy (PGroup xs)       = PGroup     $ fmap (scale sx sy) xs  @@ -580,7 +636,7 @@   translate dx dy (PLabel a lbl)   = PLabel a   $ translateLabel dx dy lbl   translate dx dy (PEllipse a ell) = PEllipse a $ translateEllipse dx dy ell   translate dx dy (PContext a chi) = PContext a $ translate dx dy chi-  translate dx dy (PLink a chi)    = PLink a    $ translate dx dy chi+  translate dx dy (PSVG a chi)     = PSVG a     $ translate dx dy chi   translate dx dy (PGroup xs)      = PGroup     $ fmap (translate dx dy) xs  @@ -589,28 +645,31 @@   rotatePath :: (Real u, Floating u) => Radian -> PrimPath u -> PrimPath u-rotatePath ang = mapPath (rotate ang)+rotatePath ang = mapPath (rotate ang) (rotate ang)   rotateAboutPath :: (Real u, Floating u)                  => Radian -> Point2 u -> PrimPath u -> PrimPath u-rotateAboutPath ang pt = mapPath (rotateAbout ang pt) +rotateAboutPath ang pt = mapPath (rotateAbout ang pt) (rotateAbout ang pt)    scalePath :: Num u => u -> u -> PrimPath u -> PrimPath u-scalePath sx sy = mapPath (scale sx sy)-+scalePath sx sy = mapPath (scale sx sy) (scale sx sy) +-- Note - translate only needs change the start point /because/ +-- the path represented as a relative path.+--  translatePath :: Num u => u -> u -> PrimPath u -> PrimPath u-translatePath x y = mapPath (translate x y)+translatePath x y (PrimPath st xs) = PrimPath (translate x y st) xs  -mapPath :: (Point2 u -> Point2 u) -> PrimPath u -> PrimPath u-mapPath fn (PrimPath st xs) = PrimPath (fn st) (map (mapSeg fn) xs)+mapPath :: (Point2 u -> Point2 u) -> (Vec2 u -> Vec2 u) +        -> PrimPath u -> PrimPath u+mapPath f g (PrimPath st xs) = PrimPath (f st) (map (mapSeg g) xs) -mapSeg :: (Point2 u -> Point2 u) -> PrimPathSegment u -> PrimPathSegment u-mapSeg fn (PLineTo p)         = PLineTo (fn p)-mapSeg fn (PCurveTo p1 p2 p3) = PCurveTo (fn p1) (fn p2) (fn p3)+mapSeg :: (Vec2 u -> Vec2 u) -> PrimPathSegment u -> PrimPathSegment u+mapSeg fn (RelLineTo p)         = RelLineTo (fn p)+mapSeg fn (RelCurveTo p1 p2 p3) = RelCurveTo (fn p1) (fn p2) (fn p3)  -------------------------------------------------------------------------------- -- Labels@@ -622,28 +681,26 @@ -- rotateLabel :: (Real u, Floating u)              => Radian -> PrimLabel u -> PrimLabel u-rotateLabel ang (PrimLabel pt txt ctm) = -    PrimLabel (rotate ang pt) txt (rotateCTM ang ctm)+rotateLabel ang (PrimLabel txt ctm) = PrimLabel txt (rotateCTM ang ctm)   -- /rotateAbout/ the start-point, /rotate/ the the CTM. -- rotateAboutLabel :: (Real u, Floating u)                   => Radian -> Point2 u -> PrimLabel u -> PrimLabel u-rotateAboutLabel ang pt0 (PrimLabel pt txt ctm) = -    PrimLabel (rotateAbout ang pt0 pt) txt (rotateCTM ang ctm)+rotateAboutLabel ang pt (PrimLabel txt ctm) = +    PrimLabel txt (rotateAboutCTM ang pt ctm)   scaleLabel :: Num u => u -> u -> PrimLabel u -> PrimLabel u-scaleLabel sx sy (PrimLabel pt txt ctm) = -    PrimLabel (scale sx sy pt) txt (scaleCTM sx sy ctm)+scaleLabel sx sy (PrimLabel txt ctm) = PrimLabel txt (scaleCTM sx sy ctm)   -- Change the bottom-left corner. -- translateLabel :: Num u => u -> u -> PrimLabel u -> PrimLabel u-translateLabel dx dy (PrimLabel pt txt ctm) = -    PrimLabel (translate dx dy pt) txt ctm+translateLabel dx dy (PrimLabel txt ctm) = +    PrimLabel txt (translateCTM dx dy ctm)  -------------------------------------------------------------------------------- -- Ellipse@@ -651,27 +708,27 @@  rotateEllipse :: (Real u, Floating u)                => Radian -> PrimEllipse u -> PrimEllipse u-rotateEllipse ang (PrimEllipse pt hw hh ctm) = -    PrimEllipse (rotate ang pt) hw hh (rotateCTM ang ctm)+rotateEllipse ang (PrimEllipse hw hh ctm) = +    PrimEllipse hw hh (rotateCTM ang ctm)       rotateAboutEllipse :: (Real u, Floating u)                => Radian -> Point2 u -> PrimEllipse u -> PrimEllipse u-rotateAboutEllipse ang pt0 (PrimEllipse pt hw hh ctm) = -    PrimEllipse (rotateAbout ang pt0 pt) hw hh (rotateCTM ang ctm)+rotateAboutEllipse ang pt (PrimEllipse hw hh ctm) = +    PrimEllipse hw hh (rotateAboutCTM ang pt ctm)   scaleEllipse :: Num u => u -> u -> PrimEllipse u -> PrimEllipse u-scaleEllipse sx sy (PrimEllipse pt hw hh ctm) = -    PrimEllipse (scale sx sy pt) hw hh (scaleCTM sx sy ctm)+scaleEllipse sx sy (PrimEllipse hw hh ctm) = +    PrimEllipse hw hh (scaleCTM sx sy ctm)        -- Change the point -- translateEllipse :: Num u => u -> u -> PrimEllipse u -> PrimEllipse u-translateEllipse dx dy (PrimEllipse pt hw hh ctm) = -    PrimEllipse (translate dx dy pt) hw hh ctm+translateEllipse dx dy (PrimEllipse hw hh ctm) = +    PrimEllipse hw hh (translateCTM dx dy ctm)   @@ -733,6 +790,8 @@                        }   where     unmatchable_face = FontFace "DONT_MATCH"     "" -                                SVG_BOLD_OBLIQUE latin1_font_encoder+                                SVG_BOLD_OBLIQUE no_encoding++    no_encoding      = IntMap.empty   
src/Wumpus/Core/PostScriptDoc.hs view
@@ -45,6 +45,7 @@    , ps_newpath   , ps_moveto+  , ps_rmoveto   , ps_lineto   , ps_arc   , ps_curveto@@ -68,7 +69,6 @@ import Wumpus.Core.Geometry import Wumpus.Core.GraphicProps import Wumpus.Core.PictureInternal-import Wumpus.Core.Text.Encoder import Wumpus.Core.Utils.Common import Wumpus.Core.Utils.FormatCombinators @@ -100,12 +100,12 @@   -psHeader  :: Int -> ZonedTime -> Doc+psHeader :: Int -> ZonedTime -> Doc psHeader page_count tod = vcat $      [ text "%!PS-Adobe-3.0"     , text "%%Pages:"         <+> int page_count     , text "%%CreationDate:"  <+> parens (showsDoc $ psTimeStamp tod)                -    , text "%%EndComments"                  +    , text "%%EndComments"     ]  @@ -114,8 +114,8 @@     [ text "%!PS-Adobe-3.0 EPSF-3.0"     , text "%%BoundingBox:"   <+> upint llx <+> upint lly                               <+> upint urx <+> upint ury-    , text "%%CreationDate:"  <+> parens (showsDoc $ psTimeStamp tod)                -    , text "%%EndComments"                  +    , text "%%CreationDate:"  <+> parens (showsDoc $ psTimeStamp tod)+    , text "%%EndComments"     ]   where     upint             = text . roundup . toDouble@@ -137,7 +137,7 @@ dsc_Page label ordinal = text "%%Page:" <+> text label <+> int ordinal  -missingCharCode :: CharCode -> GlyphName -> Doc+missingCharCode :: Int -> String -> Doc missingCharCode i fallback = vcat $     [ ps_comment $ "missing lookup for &#" ++ show i ++ ";"      , ps_glyphshow fallback@@ -256,6 +256,12 @@ ps_moveto (P2 x y) = command "moveto" [dtruncFmt x, dtruncFmt y]  +-- | @ ... ... rmoveto @+--+ps_rmoveto :: PSUnit u => Point2 u -> Doc+ps_rmoveto (P2 x y) = command "rmoveto" [dtruncFmt x, dtruncFmt y]++ -- | @ ... ... lineto @ -- ps_lineto :: PSUnit u => Point2 u -> Doc@@ -348,6 +354,7 @@ -- ps_show :: String -> Doc ps_show ss = command "show" [parens $ text ss]+  -- | @ (/...) show  @ --
src/Wumpus/Core/SVGDoc.hs view
@@ -17,10 +17,11 @@ module Wumpus.Core.SVGDoc   (     escapeSpecial-+  , svgAttr   , xml_version   , doctype   , elem_svg+  , elem_svg_defs   , elem_g   , elem_g_no_attrs @@ -79,13 +80,12 @@ import Wumpus.Core.Geometry import Wumpus.Core.GraphicProps import Wumpus.Core.PictureInternal-import Wumpus.Core.Text.Encoder import Wumpus.Core.Utils.Common import Wumpus.Core.Utils.FormatCombinators  -escapeSpecial :: CharCode -> String-escapeSpecial i = "&#" ++ show i ++ ";"+escapeSpecial :: Int -> Doc+escapeSpecial i = text "&#" <> int i <> char ';'   -- Note - it is easier put particular attrs at the end (esp. d @@ -135,7 +135,15 @@   elem_svg :: Doc -> Doc -elem_svg body = svgElemB "svg" (svgns <+> svgvn <+> xlink) body+elem_svg body = svgElemB "svg" svg_top_attrs body++elem_svg_defs :: String -> Doc -> Doc +elem_svg_defs ss body = +    svgElemB "svg" svg_top_attrs (elem_defs ss `vconcat` body)+++svg_top_attrs :: Doc+svg_top_attrs = svgns <+> svgvn <+> xlink   where      svgns = svgAttr "xmlns"       (text "http://www.w3.org/2000/svg")     svgvn = svgAttr "version"     (text "1.1")@@ -150,6 +158,10 @@ -- elem_g_no_attrs :: Doc -> Doc elem_g_no_attrs body = svgElemB_no_attrs "g" body++elem_defs :: String -> Doc+elem_defs ss = svgElemB_no_attrs "defs" $ vcat $ map text $ lines ss+  -- | @ \<clipPath ...\> ... \</clipPath\> @  --
+ src/Wumpus/Core/Text/Base.hs view
@@ -0,0 +1,229 @@+{-# OPTIONS -Wall #-}++--------------------------------------------------------------------------------+-- |+-- Module      :  Wumpus.Core.Text.Base+-- Copyright   :  (c) Stephen Tetley 2010+-- License     :  BSD3+--+-- Maintainer  :  stephen.tetley@gmail.com+-- Stability   :  unstable+-- Portability :  GHC+--+-- Extended character code handling.+-- +-- Wumpus uses an escaping style derived from SVG to embed +-- character codes and PostScript glyph names in regular strings. +--+-- > "regular ascii text &#38; more ascii text"+--  +-- i.e. character codes are delimited by @&\#@ on the +-- left and @;@ on the right.+--+-- Glyph names are delimited by @&@ on the left and @;@ on the +-- right.+--+-- > "regular ascii text &ampersand; more ascii text"+--+-- Note that glyph names \*\* /should always/ \*\* correspond to+-- PostScript glyph names not SVG / HTML glyph names.+--+-- In Wumpus both glyph names and character codes can+-- be embedded in strings - (e.g. @&\egrave;@ or @&\#232;@) +-- although glyph names are preferred for PostScript (see below).+--+-- Character codes can be also be expressed as octal or +-- hexadecimal numbers:+--+-- > myst&#0o350;re+--+-- > myst&#0xE8;re+--+-- In the generated PostScript, Wumpus uses the character name, +-- e.g.:  +--+-- > (myst) show /egrave glyphshow (re) show+-- +-- The generated SVG uses the numeric code, e.g.: +--+-- > myst&#232;re+--+-- Unless you are generating only SVG, you should favour glyph +-- names rather than code points as they are unambiguously +-- interpreted by Wumpus. Character codes are context-dependent+-- on the encoding of the font used to render the text. +-- /Standard/ fonts (e.g. Helvetica, Times, Courier) use the +-- Standard Encoding is which has some differences to the +-- common Latin1 character set. +--+-- Unfortunately if a glyph is not present in a font it cannot +-- be rendered in PostScript. Wumpus-Core is oblivious to the +-- contents of fonts, it does not warn about missing glyphs or +-- attempt to substitute them.+-- +--------------------------------------------------------------------------------+++module Wumpus.Core.Text.Base+  ( ++    EscapedText(..)    +  , EscapedChar(..)+  , EncodingVector++  , escapeString+  , textLength  ++  ) where++import Wumpus.Core.Utils.FormatCombinators++import Data.Char+import qualified Data.IntMap as IntMap+++-- | Internal string representation for Wumpus-Core.+-- +-- 'EscapedText' is a list of characters, where each character +-- may be either a regular character, an integer representing a +-- Unicode code-point or a PostScript glyph name.+-- +newtype EscapedText = EscapedText { getEscapedText :: [EscapedChar] }+  deriving (Eq,Show)+++-- | Internal character representation for Wumpus-Core.+-- +-- An 'EscapedChar' may be either a regular character, an integer+-- representing a Unicode code-point or a PostScript glyph+-- name.+-- +data EscapedChar = CharLiteral Char+                 | CharEscInt  Int+                 | CharEscName String+  deriving (Eq,Show)+++-- | 'EncodingVecor' - a map from code point to PostScript glyph+-- name.+-- +type EncodingVector = IntMap.IntMap String+++--------------------------------------------------------------------------------++instance Format EscapedText where+  format = hcat . map format . getEscapedText+++instance Format EscapedChar where+  format (CharLiteral c) = char c+  format (CharEscInt i)  = text "&#" <> int i <> semicolon+  format (CharEscName s) = text "&" <> text s <> semicolon+++--------------------------------------------------------------------------------+++++-- | 'escapeString' input is regular text and escaped glyph names +-- or decimal character codes. Escaping in the input string should +-- follow the SVG convention - the escape sequence starts with +-- @&@ (ampresand) for glyph names or @&#@ (ampersand hash) for+-- char codes and ends with @;@ (semicolon).+--+-- Escaped characters are output to PostScript as their respective+-- glyph names:+--+-- > /egrave glyphshow+--+-- Escaped chararacters are output to SVG as an escaped decimal, +-- e.g.:+--+-- > &#232;+--+-- Note - for SVG output, Wumpus automatically escapes characters +-- where the char code is above 128. This is the convention used +-- by the @Text.XHtml@ library.+--+escapeString :: String -> EscapedText+escapeString = EscapedText . lexer+++-- | Get the character count of an 'EscapedText' string.+--+textLength :: EscapedText -> Int+textLength = length . getEscapedText ++--+-- Design note.+--+-- There is a fair argument that the lexer function should be +-- supplied with an encoding table and the actual encoding is +-- perfomed here rather than just escaping...+--++ +lexer :: String -> [EscapedChar]+lexer []            = []+lexer ('&':'#':cs)  = escNumStart cs+lexer ('&':cs)      = escName cs+lexer (c:cs)        = CharLiteral c : lexer cs++-- Input is malformed if this reaches the @rest@ case.+-- +escNumStart :: String -> [EscapedChar]+escNumStart ('0':'o':cs)           = escOct cs+escNumStart ('0':'O':cs)           = escOct cs+escNumStart ('0':'x':cs)           = escHex cs+escNumStart ('0':'X':cs)           = escHex cs+escNumStart (c:cs) | isDigit c     = escDec (digitToInt c) cs+escNumStart rest                   = chompToSemi rest      ++escName :: String -> [EscapedChar]+escName (c:cs)                     = let (ss,rest) = span isAlphaNum cs +                                     in specialEscape (c:ss) : chompToSemi rest+escName []                         = [] +++-- | One digit consumed already...+--+escDec :: Int -> String -> [EscapedChar]+escDec n (c:cs) | isDigit c = escDec (n*10 + digitToInt c) cs+escDec n cs     | n > 0     = CharEscInt n : chompToSemi cs+                | otherwise = chompToSemi cs++escHex :: String -> [EscapedChar]+escHex = step 0+  where+    step n (c:cs) | isHexDigit c = step (n*16 + digitToInt c) cs+    step n cs     | n > 0        = CharEscInt n : chompToSemi cs+                  | otherwise    = chompToSemi cs +++escOct :: String -> [EscapedChar]+escOct = step 0+  where+    step n (c:cs) | isHexDigit c = step (n*8 + digitToInt c) cs+    step n cs     | n > 0        = CharEscInt n : chompToSemi cs+                  | otherwise    = chompToSemi cs ++++-- The last two conditions both indicate ill-formed input, but it+-- is /best/ if the lexer does not throw errors.+-- +chompToSemi :: String -> [EscapedChar]+chompToSemi (';':cs) = lexer cs+chompToSemi (_:cs)   = chompToSemi cs           +chompToSemi []       = []+++-- | Special processing for @amp@ because it is so common.+--+-- Are there other cases to add to this function?+--+specialEscape :: String -> EscapedChar+specialEscape ['a','m','p'] = CharEscName "ampersand"+specialEscape cs            = CharEscName cs
− src/Wumpus/Core/Text/DefaultEncoder.hs
@@ -1,44 +0,0 @@-{-# OPTIONS -Wall #-}------------------------------------------------------------------------------------- |--- Module      :  Wumpus.Core.Text.DefaultEncoder--- Copyright   :  (c) Stephen Tetley 2010--- License     :  BSD3------ Maintainer  :  stephen.tetley@gmail.com--- Stability   :  unstable--- Portability :  GHC------ This is the default @TextEncoder@ with lookups for both Latin1--- character codes / names and Symbol font.--------------------------------------------------------------------------------------module Wumpus.Core.Text.DefaultEncoder-  ( -    defaultEncoder--  ) where--import Wumpus.Core.Text.Encoder-import Wumpus.Core.Text.Latin1-import Wumpus.Core.Text.SymbolFont--import Data.Map----- | This is the default encoder supporting names and codes for --- both Latin1 and the Symbol font.----defaultEncoder :: TextEncoder-defaultEncoder = TextEncoder-      { svg_encoding_name       = "ISO-8859-1"-      , font_encoder_map        = fem-      }-  where-    fem = insert symbol_font_encoder symbolFontEncoder -        $ insert latin1_font_encoder latin1FontEncoder-        $ empty --
− src/Wumpus/Core/Text/Encoder.hs
@@ -1,143 +0,0 @@-{-# OPTIONS -Wall #-}------------------------------------------------------------------------------------- |--- Module      :  Wumpus.Core.Text.Encoder--- Copyright   :  (c) Stephen Tetley 2009-2010--- License     :  BSD3------ Maintainer  :  stephen.tetley@gmail.com--- Stability   :  unstable--- Portability :  GHC------ Extended character code handling.--- --- Wumpus uses SVG style escaping to embed character codes or --- names in regular strings:------ > "regular ascii text &#egrave; more ascii text"---  --- i.e. character names and codes are delimited by @&\#@ on the --- left and @;@ on the right.------ In Wumpus both character names and character codes can--- be embedded in strings - (e.g. @ &\#egrave; or &\#232; @).------ Character codes can be also be expressed as octal or --- hexadecimal:------ > myst&#0o350;re------ > myst&#0xE8;re------ In the generated PostScript, Wumpus uses the character name, --- e.g.:  ------ > (myst) show /egrave glyphshow (re) show--- --- The generated SVG uses the numeric code, e.g.: ------ > myst&#232;re------ To accommodate both, Wumpus defines a TextEncoder record which--- provides a two-way mapping between character codes and glyph --- names for a character set.--------------------------------------------------------------------------------------module Wumpus.Core.Text.Encoder-  ( -    GlyphName-  , CharCode-  , PostScriptLookup-  , SVGLookup--  , FontEncoderName(..)-  , TextEncoder(..)-  , FontEncoder(..)--  ) where--import Data.Map-import Data.Word--type GlyphName        = String-type CharCode         = Int --type PostScriptLookup = CharCode -> Maybe GlyphName-type SVGLookup        = GlyphName -> Maybe CharCode------ | Font encoder name - a newtype wrapped /number/.--- --- Ideally this would be an enumerated type, but it has to be --- open - new encoders need to be added, so an enum is out of the--- question.------ A String would be good, but would have slow lookup when used --- as a key. Dealing with multiple encoders was added late to --- Wumpus-Core - it is necessary, but taking a performace hit --- because of it is chagrin. So instead /uniquely/ asssigned--- numbers are used.------ Numbers below 10000 are reserved for Wumpus, though it is --- unlikely to need more than a handful. Numbers above are free --- to use (clearly clashes are possible, but probably unlikely).--- --- Wumpus-Core assigns the following, other Wumpus libraries may --- assign more:------ > 0 - Latin1 (for Helvetica, Times Roman, Courier...)------ > 1 - Symbol Font--- -newtype FontEncoderName = FontEncoderName { getFontEncoderName :: Word16 }-  deriving (Eq,Ord)--instance Show FontEncoderName where-  show = step . getFontEncoderName-    where-      step 0 = "Latin1"-      step 1 = "Symbol-Font"-      step n = show n---- | 'TextEncoder'------ An /instance/ needs: ------ * A map of FontEncoderNames to FontEncoders.------ * The name of the encoding - this is printed in the xml --- prologue of the SVG file as the @encoding@ attribute. Latin --- 1\'s official name is seemingly \"ISO-8859-1\". --- --- * The name of the default encoder - this should naturally be --- in the Font Encoder map.--- --- -data TextEncoder = TextEncoder-      { svg_encoding_name       :: String-      , font_encoder_map        :: Map FontEncoderName FontEncoder-      }---- | 'FontEncoder'.------ * The functions for looking up codes by glyph-name and --- glyph-name by code. --- --- * Fallback glyph-names and char codes in case lookup fails.--- --- "Wumpus.Core.TextLatin1" defines an implementation for Latin 1.----data FontEncoder = FontEncoder  -      { ps_lookup           :: PostScriptLookup-      , svg_lookup          :: SVGLookup-      , ps_fallback         :: GlyphName-      , svg_fallback        :: CharCode-      }-                     ---- no show instance as a TextEncoder contains functions.--
+ src/Wumpus/Core/Text/GlyphIndices.lhs view
@@ -0,0 +1,4314 @@+{-# OPTIONS -Wall #-}
+
+> ------------------------------------------------------------------------------
+> -- | 
+> -- Module       :   Wumpus.Core.Text.GlyphIndices
+> -- Copyright    :   (c) Stephen Tetley 2010
+> -- License      :   BSD3
+> -- 
+> -- Maintainer   :   Stephen Tetley <stephen.tetley@gmail.com>
+> -- Stability    :   unstable
+> -- Portability  :   GHC
+> -- 
+> -- Map of PostScript glyph names to Unicode code points.
+> -- 
+> -- \*\* This file is auto-generated. \*\*
+> -- 
+> -- Generated - 2010-11-13 15:30
+> -- 
+> ------------------------------------------------------------------------------
+
+> module Wumpus.Core.Text.GlyphIndices
+>   (
+>      ps_glyph_indices
+>   ) where
+
+> import Data.Map ( Map, fromAscList )
+
+> -- | Lookup table mapping from PostScript glyph name
+> -- to the corresponding Unicode code point.
+
+> ps_glyph_indices :: Map String Int
+> ps_glyph_indices = fromAscList $
+>     [ ( "A", 0x0041 )
+>     , ( "AE", 0x00c6 )
+>     , ( "AEacute", 0x01fc )
+>     , ( "AEmacron", 0x01e2 )
+>     , ( "AEsmall", 0xf7e6 )
+>     , ( "Aacute", 0x00c1 )
+>     , ( "Aacutesmall", 0xf7e1 )
+>     , ( "Abreve", 0x0102 )
+>     , ( "Abreveacute", 0x1eae )
+>     , ( "Abrevecyrillic", 0x04d0 )
+>     , ( "Abrevedotbelow", 0x1eb6 )
+>     , ( "Abrevegrave", 0x1eb0 )
+>     , ( "Abrevehookabove", 0x1eb2 )
+>     , ( "Abrevetilde", 0x1eb4 )
+>     , ( "Acaron", 0x01cd )
+>     , ( "Acircle", 0x24b6 )
+>     , ( "Acircumflex", 0x00c2 )
+>     , ( "Acircumflexacute", 0x1ea4 )
+>     , ( "Acircumflexdotbelow", 0x1eac )
+>     , ( "Acircumflexgrave", 0x1ea6 )
+>     , ( "Acircumflexhookabove", 0x1ea8 )
+>     , ( "Acircumflexsmall", 0xf7e2 )
+>     , ( "Acircumflextilde", 0x1eaa )
+>     , ( "Acute", 0xf6c9 )
+>     , ( "Acutesmall", 0xf7b4 )
+>     , ( "Acyrillic", 0x0410 )
+>     , ( "Adblgrave", 0x0200 )
+>     , ( "Adieresis", 0x00c4 )
+>     , ( "Adieresiscyrillic", 0x04d2 )
+>     , ( "Adieresismacron", 0x01de )
+>     , ( "Adieresissmall", 0xf7e4 )
+>     , ( "Adotbelow", 0x1ea0 )
+>     , ( "Adotmacron", 0x01e0 )
+>     , ( "Agrave", 0x00c0 )
+>     , ( "Agravesmall", 0xf7e0 )
+>     , ( "Ahookabove", 0x1ea2 )
+>     , ( "Aiecyrillic", 0x04d4 )
+>     , ( "Ainvertedbreve", 0x0202 )
+>     , ( "Alpha", 0x0391 )
+>     , ( "Alphatonos", 0x0386 )
+>     , ( "Amacron", 0x0100 )
+>     , ( "Amonospace", 0xff21 )
+>     , ( "Aogonek", 0x0104 )
+>     , ( "Aring", 0x00c5 )
+>     , ( "Aringacute", 0x01fa )
+>     , ( "Aringbelow", 0x1e00 )
+>     , ( "Aringsmall", 0xf7e5 )
+>     , ( "Asmall", 0xf761 )
+>     , ( "Atilde", 0x00c3 )
+>     , ( "Atildesmall", 0xf7e3 )
+>     , ( "Aybarmenian", 0x0531 )
+>     , ( "B", 0x0042 )
+>     , ( "Bcircle", 0x24b7 )
+>     , ( "Bdotaccent", 0x1e02 )
+>     , ( "Bdotbelow", 0x1e04 )
+>     , ( "Becyrillic", 0x0411 )
+>     , ( "Benarmenian", 0x0532 )
+>     , ( "Beta", 0x0392 )
+>     , ( "Bhook", 0x0181 )
+>     , ( "Blinebelow", 0x1e06 )
+>     , ( "Bmonospace", 0xff22 )
+>     , ( "Brevesmall", 0xf6f4 )
+>     , ( "Bsmall", 0xf762 )
+>     , ( "Btopbar", 0x0182 )
+>     , ( "C", 0x0043 )
+>     , ( "Caarmenian", 0x053e )
+>     , ( "Cacute", 0x0106 )
+>     , ( "Caron", 0xf6ca )
+>     , ( "Caronsmall", 0xf6f5 )
+>     , ( "Ccaron", 0x010c )
+>     , ( "Ccedilla", 0x00c7 )
+>     , ( "Ccedillaacute", 0x1e08 )
+>     , ( "Ccedillasmall", 0xf7e7 )
+>     , ( "Ccircle", 0x24b8 )
+>     , ( "Ccircumflex", 0x0108 )
+>     , ( "Cdot", 0x010a )
+>     , ( "Cdotaccent", 0x010a )
+>     , ( "Cedillasmall", 0xf7b8 )
+>     , ( "Chaarmenian", 0x0549 )
+>     , ( "Cheabkhasiancyrillic", 0x04bc )
+>     , ( "Checyrillic", 0x0427 )
+>     , ( "Chedescenderabkhasiancyrillic", 0x04be )
+>     , ( "Chedescendercyrillic", 0x04b6 )
+>     , ( "Chedieresiscyrillic", 0x04f4 )
+>     , ( "Cheharmenian", 0x0543 )
+>     , ( "Chekhakassiancyrillic", 0x04cb )
+>     , ( "Cheverticalstrokecyrillic", 0x04b8 )
+>     , ( "Chi", 0x03a7 )
+>     , ( "Chook", 0x0187 )
+>     , ( "Circumflexsmall", 0xf6f6 )
+>     , ( "Cmonospace", 0xff23 )
+>     , ( "Coarmenian", 0x0551 )
+>     , ( "Csmall", 0xf763 )
+>     , ( "D", 0x0044 )
+>     , ( "DZ", 0x01f1 )
+>     , ( "DZcaron", 0x01c4 )
+>     , ( "Daarmenian", 0x0534 )
+>     , ( "Dafrican", 0x0189 )
+>     , ( "Dcaron", 0x010e )
+>     , ( "Dcedilla", 0x1e10 )
+>     , ( "Dcircle", 0x24b9 )
+>     , ( "Dcircumflexbelow", 0x1e12 )
+>     , ( "Dcroat", 0x0110 )
+>     , ( "Ddotaccent", 0x1e0a )
+>     , ( "Ddotbelow", 0x1e0c )
+>     , ( "Decyrillic", 0x0414 )
+>     , ( "Deicoptic", 0x03ee )
+>     , ( "Delta", 0x2206 )
+>     , ( "Deltagreek", 0x0394 )
+>     , ( "Dhook", 0x018a )
+>     , ( "Dieresis", 0xf6cb )
+>     , ( "DieresisAcute", 0xf6cc )
+>     , ( "DieresisGrave", 0xf6cd )
+>     , ( "Dieresissmall", 0xf7a8 )
+>     , ( "Digammagreek", 0x03dc )
+>     , ( "Djecyrillic", 0x0402 )
+>     , ( "Dlinebelow", 0x1e0e )
+>     , ( "Dmonospace", 0xff24 )
+>     , ( "Dotaccentsmall", 0xf6f7 )
+>     , ( "Dslash", 0x0110 )
+>     , ( "Dsmall", 0xf764 )
+>     , ( "Dtopbar", 0x018b )
+>     , ( "Dz", 0x01f2 )
+>     , ( "Dzcaron", 0x01c5 )
+>     , ( "Dzeabkhasiancyrillic", 0x04e0 )
+>     , ( "Dzecyrillic", 0x0405 )
+>     , ( "Dzhecyrillic", 0x040f )
+>     , ( "E", 0x0045 )
+>     , ( "Eacute", 0x00c9 )
+>     , ( "Eacutesmall", 0xf7e9 )
+>     , ( "Ebreve", 0x0114 )
+>     , ( "Ecaron", 0x011a )
+>     , ( "Ecedillabreve", 0x1e1c )
+>     , ( "Echarmenian", 0x0535 )
+>     , ( "Ecircle", 0x24ba )
+>     , ( "Ecircumflex", 0x00ca )
+>     , ( "Ecircumflexacute", 0x1ebe )
+>     , ( "Ecircumflexbelow", 0x1e18 )
+>     , ( "Ecircumflexdotbelow", 0x1ec6 )
+>     , ( "Ecircumflexgrave", 0x1ec0 )
+>     , ( "Ecircumflexhookabove", 0x1ec2 )
+>     , ( "Ecircumflexsmall", 0xf7ea )
+>     , ( "Ecircumflextilde", 0x1ec4 )
+>     , ( "Ecyrillic", 0x0404 )
+>     , ( "Edblgrave", 0x0204 )
+>     , ( "Edieresis", 0x00cb )
+>     , ( "Edieresissmall", 0xf7eb )
+>     , ( "Edot", 0x0116 )
+>     , ( "Edotaccent", 0x0116 )
+>     , ( "Edotbelow", 0x1eb8 )
+>     , ( "Efcyrillic", 0x0424 )
+>     , ( "Egrave", 0x00c8 )
+>     , ( "Egravesmall", 0xf7e8 )
+>     , ( "Eharmenian", 0x0537 )
+>     , ( "Ehookabove", 0x1eba )
+>     , ( "Eightroman", 0x2167 )
+>     , ( "Einvertedbreve", 0x0206 )
+>     , ( "Eiotifiedcyrillic", 0x0464 )
+>     , ( "Elcyrillic", 0x041b )
+>     , ( "Elevenroman", 0x216a )
+>     , ( "Emacron", 0x0112 )
+>     , ( "Emacronacute", 0x1e16 )
+>     , ( "Emacrongrave", 0x1e14 )
+>     , ( "Emcyrillic", 0x041c )
+>     , ( "Emonospace", 0xff25 )
+>     , ( "Encyrillic", 0x041d )
+>     , ( "Endescendercyrillic", 0x04a2 )
+>     , ( "Eng", 0x014a )
+>     , ( "Enghecyrillic", 0x04a4 )
+>     , ( "Enhookcyrillic", 0x04c7 )
+>     , ( "Eogonek", 0x0118 )
+>     , ( "Eopen", 0x0190 )
+>     , ( "Epsilon", 0x0395 )
+>     , ( "Epsilontonos", 0x0388 )
+>     , ( "Ercyrillic", 0x0420 )
+>     , ( "Ereversed", 0x018e )
+>     , ( "Ereversedcyrillic", 0x042d )
+>     , ( "Escyrillic", 0x0421 )
+>     , ( "Esdescendercyrillic", 0x04aa )
+>     , ( "Esh", 0x01a9 )
+>     , ( "Esmall", 0xf765 )
+>     , ( "Eta", 0x0397 )
+>     , ( "Etarmenian", 0x0538 )
+>     , ( "Etatonos", 0x0389 )
+>     , ( "Eth", 0x00d0 )
+>     , ( "Ethsmall", 0xf7f0 )
+>     , ( "Etilde", 0x1ebc )
+>     , ( "Etildebelow", 0x1e1a )
+>     , ( "Euro", 0x20ac )
+>     , ( "Ezh", 0x01b7 )
+>     , ( "Ezhcaron", 0x01ee )
+>     , ( "Ezhreversed", 0x01b8 )
+>     , ( "F", 0x0046 )
+>     , ( "Fcircle", 0x24bb )
+>     , ( "Fdotaccent", 0x1e1e )
+>     , ( "Feharmenian", 0x0556 )
+>     , ( "Feicoptic", 0x03e4 )
+>     , ( "Fhook", 0x0191 )
+>     , ( "Fitacyrillic", 0x0472 )
+>     , ( "Fiveroman", 0x2164 )
+>     , ( "Fmonospace", 0xff26 )
+>     , ( "Fourroman", 0x2163 )
+>     , ( "Fsmall", 0xf766 )
+>     , ( "G", 0x0047 )
+>     , ( "GBsquare", 0x3387 )
+>     , ( "Gacute", 0x01f4 )
+>     , ( "Gamma", 0x0393 )
+>     , ( "Gammaafrican", 0x0194 )
+>     , ( "Gangiacoptic", 0x03ea )
+>     , ( "Gbreve", 0x011e )
+>     , ( "Gcaron", 0x01e6 )
+>     , ( "Gcedilla", 0x0122 )
+>     , ( "Gcircle", 0x24bc )
+>     , ( "Gcircumflex", 0x011c )
+>     , ( "Gcommaaccent", 0x0122 )
+>     , ( "Gdot", 0x0120 )
+>     , ( "Gdotaccent", 0x0120 )
+>     , ( "Gecyrillic", 0x0413 )
+>     , ( "Ghadarmenian", 0x0542 )
+>     , ( "Ghemiddlehookcyrillic", 0x0494 )
+>     , ( "Ghestrokecyrillic", 0x0492 )
+>     , ( "Gheupturncyrillic", 0x0490 )
+>     , ( "Ghook", 0x0193 )
+>     , ( "Gimarmenian", 0x0533 )
+>     , ( "Gjecyrillic", 0x0403 )
+>     , ( "Gmacron", 0x1e20 )
+>     , ( "Gmonospace", 0xff27 )
+>     , ( "Grave", 0xf6ce )
+>     , ( "Gravesmall", 0xf760 )
+>     , ( "Gsmall", 0xf767 )
+>     , ( "Gsmallhook", 0x029b )
+>     , ( "Gstroke", 0x01e4 )
+>     , ( "H", 0x0048 )
+>     , ( "H18533", 0x25cf )
+>     , ( "H18543", 0x25aa )
+>     , ( "H18551", 0x25ab )
+>     , ( "H22073", 0x25a1 )
+>     , ( "HPsquare", 0x33cb )
+>     , ( "Haabkhasiancyrillic", 0x04a8 )
+>     , ( "Hadescendercyrillic", 0x04b2 )
+>     , ( "Hardsigncyrillic", 0x042a )
+>     , ( "Hbar", 0x0126 )
+>     , ( "Hbrevebelow", 0x1e2a )
+>     , ( "Hcedilla", 0x1e28 )
+>     , ( "Hcircle", 0x24bd )
+>     , ( "Hcircumflex", 0x0124 )
+>     , ( "Hdieresis", 0x1e26 )
+>     , ( "Hdotaccent", 0x1e22 )
+>     , ( "Hdotbelow", 0x1e24 )
+>     , ( "Hmonospace", 0xff28 )
+>     , ( "Hoarmenian", 0x0540 )
+>     , ( "Horicoptic", 0x03e8 )
+>     , ( "Hsmall", 0xf768 )
+>     , ( "Hungarumlaut", 0xf6cf )
+>     , ( "Hungarumlautsmall", 0xf6f8 )
+>     , ( "Hzsquare", 0x3390 )
+>     , ( "I", 0x0049 )
+>     , ( "IAcyrillic", 0x042f )
+>     , ( "IJ", 0x0132 )
+>     , ( "IUcyrillic", 0x042e )
+>     , ( "Iacute", 0x00cd )
+>     , ( "Iacutesmall", 0xf7ed )
+>     , ( "Ibreve", 0x012c )
+>     , ( "Icaron", 0x01cf )
+>     , ( "Icircle", 0x24be )
+>     , ( "Icircumflex", 0x00ce )
+>     , ( "Icircumflexsmall", 0xf7ee )
+>     , ( "Icyrillic", 0x0406 )
+>     , ( "Idblgrave", 0x0208 )
+>     , ( "Idieresis", 0x00cf )
+>     , ( "Idieresisacute", 0x1e2e )
+>     , ( "Idieresiscyrillic", 0x04e4 )
+>     , ( "Idieresissmall", 0xf7ef )
+>     , ( "Idot", 0x0130 )
+>     , ( "Idotaccent", 0x0130 )
+>     , ( "Idotbelow", 0x1eca )
+>     , ( "Iebrevecyrillic", 0x04d6 )
+>     , ( "Iecyrillic", 0x0415 )
+>     , ( "Ifraktur", 0x2111 )
+>     , ( "Igrave", 0x00cc )
+>     , ( "Igravesmall", 0xf7ec )
+>     , ( "Ihookabove", 0x1ec8 )
+>     , ( "Iicyrillic", 0x0418 )
+>     , ( "Iinvertedbreve", 0x020a )
+>     , ( "Iishortcyrillic", 0x0419 )
+>     , ( "Imacron", 0x012a )
+>     , ( "Imacroncyrillic", 0x04e2 )
+>     , ( "Imonospace", 0xff29 )
+>     , ( "Iniarmenian", 0x053b )
+>     , ( "Iocyrillic", 0x0401 )
+>     , ( "Iogonek", 0x012e )
+>     , ( "Iota", 0x0399 )
+>     , ( "Iotaafrican", 0x0196 )
+>     , ( "Iotadieresis", 0x03aa )
+>     , ( "Iotatonos", 0x038a )
+>     , ( "Ismall", 0xf769 )
+>     , ( "Istroke", 0x0197 )
+>     , ( "Itilde", 0x0128 )
+>     , ( "Itildebelow", 0x1e2c )
+>     , ( "Izhitsacyrillic", 0x0474 )
+>     , ( "Izhitsadblgravecyrillic", 0x0476 )
+>     , ( "J", 0x004a )
+>     , ( "Jaarmenian", 0x0541 )
+>     , ( "Jcircle", 0x24bf )
+>     , ( "Jcircumflex", 0x0134 )
+>     , ( "Jecyrillic", 0x0408 )
+>     , ( "Jheharmenian", 0x054b )
+>     , ( "Jmonospace", 0xff2a )
+>     , ( "Jsmall", 0xf76a )
+>     , ( "K", 0x004b )
+>     , ( "KBsquare", 0x3385 )
+>     , ( "KKsquare", 0x33cd )
+>     , ( "Kabashkircyrillic", 0x04a0 )
+>     , ( "Kacute", 0x1e30 )
+>     , ( "Kacyrillic", 0x041a )
+>     , ( "Kadescendercyrillic", 0x049a )
+>     , ( "Kahookcyrillic", 0x04c3 )
+>     , ( "Kappa", 0x039a )
+>     , ( "Kastrokecyrillic", 0x049e )
+>     , ( "Kaverticalstrokecyrillic", 0x049c )
+>     , ( "Kcaron", 0x01e8 )
+>     , ( "Kcedilla", 0x0136 )
+>     , ( "Kcircle", 0x24c0 )
+>     , ( "Kcommaaccent", 0x0136 )
+>     , ( "Kdotbelow", 0x1e32 )
+>     , ( "Keharmenian", 0x0554 )
+>     , ( "Kenarmenian", 0x053f )
+>     , ( "Khacyrillic", 0x0425 )
+>     , ( "Kheicoptic", 0x03e6 )
+>     , ( "Khook", 0x0198 )
+>     , ( "Kjecyrillic", 0x040c )
+>     , ( "Klinebelow", 0x1e34 )
+>     , ( "Kmonospace", 0xff2b )
+>     , ( "Koppacyrillic", 0x0480 )
+>     , ( "Koppagreek", 0x03de )
+>     , ( "Ksicyrillic", 0x046e )
+>     , ( "Ksmall", 0xf76b )
+>     , ( "L", 0x004c )
+>     , ( "LJ", 0x01c7 )
+>     , ( "LL", 0xf6bf )
+>     , ( "Lacute", 0x0139 )
+>     , ( "Lambda", 0x039b )
+>     , ( "Lcaron", 0x013d )
+>     , ( "Lcedilla", 0x013b )
+>     , ( "Lcircle", 0x24c1 )
+>     , ( "Lcircumflexbelow", 0x1e3c )
+>     , ( "Lcommaaccent", 0x013b )
+>     , ( "Ldot", 0x013f )
+>     , ( "Ldotaccent", 0x013f )
+>     , ( "Ldotbelow", 0x1e36 )
+>     , ( "Ldotbelowmacron", 0x1e38 )
+>     , ( "Liwnarmenian", 0x053c )
+>     , ( "Lj", 0x01c8 )
+>     , ( "Ljecyrillic", 0x0409 )
+>     , ( "Llinebelow", 0x1e3a )
+>     , ( "Lmonospace", 0xff2c )
+>     , ( "Lslash", 0x0141 )
+>     , ( "Lslashsmall", 0xf6f9 )
+>     , ( "Lsmall", 0xf76c )
+>     , ( "M", 0x004d )
+>     , ( "MBsquare", 0x3386 )
+>     , ( "Macron", 0xf6d0 )
+>     , ( "Macronsmall", 0xf7af )
+>     , ( "Macute", 0x1e3e )
+>     , ( "Mcircle", 0x24c2 )
+>     , ( "Mdotaccent", 0x1e40 )
+>     , ( "Mdotbelow", 0x1e42 )
+>     , ( "Menarmenian", 0x0544 )
+>     , ( "Mmonospace", 0xff2d )
+>     , ( "Msmall", 0xf76d )
+>     , ( "Mturned", 0x019c )
+>     , ( "Mu", 0x039c )
+>     , ( "N", 0x004e )
+>     , ( "NJ", 0x01ca )
+>     , ( "Nacute", 0x0143 )
+>     , ( "Ncaron", 0x0147 )
+>     , ( "Ncedilla", 0x0145 )
+>     , ( "Ncircle", 0x24c3 )
+>     , ( "Ncircumflexbelow", 0x1e4a )
+>     , ( "Ncommaaccent", 0x0145 )
+>     , ( "Ndotaccent", 0x1e44 )
+>     , ( "Ndotbelow", 0x1e46 )
+>     , ( "Nhookleft", 0x019d )
+>     , ( "Nineroman", 0x2168 )
+>     , ( "Nj", 0x01cb )
+>     , ( "Njecyrillic", 0x040a )
+>     , ( "Nlinebelow", 0x1e48 )
+>     , ( "Nmonospace", 0xff2e )
+>     , ( "Nowarmenian", 0x0546 )
+>     , ( "Nsmall", 0xf76e )
+>     , ( "Ntilde", 0x00d1 )
+>     , ( "Ntildesmall", 0xf7f1 )
+>     , ( "Nu", 0x039d )
+>     , ( "O", 0x004f )
+>     , ( "OE", 0x0152 )
+>     , ( "OEsmall", 0xf6fa )
+>     , ( "Oacute", 0x00d3 )
+>     , ( "Oacutesmall", 0xf7f3 )
+>     , ( "Obarredcyrillic", 0x04e8 )
+>     , ( "Obarreddieresiscyrillic", 0x04ea )
+>     , ( "Obreve", 0x014e )
+>     , ( "Ocaron", 0x01d1 )
+>     , ( "Ocenteredtilde", 0x019f )
+>     , ( "Ocircle", 0x24c4 )
+>     , ( "Ocircumflex", 0x00d4 )
+>     , ( "Ocircumflexacute", 0x1ed0 )
+>     , ( "Ocircumflexdotbelow", 0x1ed8 )
+>     , ( "Ocircumflexgrave", 0x1ed2 )
+>     , ( "Ocircumflexhookabove", 0x1ed4 )
+>     , ( "Ocircumflexsmall", 0xf7f4 )
+>     , ( "Ocircumflextilde", 0x1ed6 )
+>     , ( "Ocyrillic", 0x041e )
+>     , ( "Odblacute", 0x0150 )
+>     , ( "Odblgrave", 0x020c )
+>     , ( "Odieresis", 0x00d6 )
+>     , ( "Odieresiscyrillic", 0x04e6 )
+>     , ( "Odieresissmall", 0xf7f6 )
+>     , ( "Odotbelow", 0x1ecc )
+>     , ( "Ogoneksmall", 0xf6fb )
+>     , ( "Ograve", 0x00d2 )
+>     , ( "Ogravesmall", 0xf7f2 )
+>     , ( "Oharmenian", 0x0555 )
+>     , ( "Ohm", 0x2126 )
+>     , ( "Ohookabove", 0x1ece )
+>     , ( "Ohorn", 0x01a0 )
+>     , ( "Ohornacute", 0x1eda )
+>     , ( "Ohorndotbelow", 0x1ee2 )
+>     , ( "Ohorngrave", 0x1edc )
+>     , ( "Ohornhookabove", 0x1ede )
+>     , ( "Ohorntilde", 0x1ee0 )
+>     , ( "Ohungarumlaut", 0x0150 )
+>     , ( "Oi", 0x01a2 )
+>     , ( "Oinvertedbreve", 0x020e )
+>     , ( "Omacron", 0x014c )
+>     , ( "Omacronacute", 0x1e52 )
+>     , ( "Omacrongrave", 0x1e50 )
+>     , ( "Omega", 0x2126 )
+>     , ( "Omegacyrillic", 0x0460 )
+>     , ( "Omegagreek", 0x03a9 )
+>     , ( "Omegaroundcyrillic", 0x047a )
+>     , ( "Omegatitlocyrillic", 0x047c )
+>     , ( "Omegatonos", 0x038f )
+>     , ( "Omicron", 0x039f )
+>     , ( "Omicrontonos", 0x038c )
+>     , ( "Omonospace", 0xff2f )
+>     , ( "Oneroman", 0x2160 )
+>     , ( "Oogonek", 0x01ea )
+>     , ( "Oogonekmacron", 0x01ec )
+>     , ( "Oopen", 0x0186 )
+>     , ( "Oslash", 0x00d8 )
+>     , ( "Oslashacute", 0x01fe )
+>     , ( "Oslashsmall", 0xf7f8 )
+>     , ( "Osmall", 0xf76f )
+>     , ( "Ostrokeacute", 0x01fe )
+>     , ( "Otcyrillic", 0x047e )
+>     , ( "Otilde", 0x00d5 )
+>     , ( "Otildeacute", 0x1e4c )
+>     , ( "Otildedieresis", 0x1e4e )
+>     , ( "Otildesmall", 0xf7f5 )
+>     , ( "P", 0x0050 )
+>     , ( "Pacute", 0x1e54 )
+>     , ( "Pcircle", 0x24c5 )
+>     , ( "Pdotaccent", 0x1e56 )
+>     , ( "Pecyrillic", 0x041f )
+>     , ( "Peharmenian", 0x054a )
+>     , ( "Pemiddlehookcyrillic", 0x04a6 )
+>     , ( "Phi", 0x03a6 )
+>     , ( "Phook", 0x01a4 )
+>     , ( "Pi", 0x03a0 )
+>     , ( "Piwrarmenian", 0x0553 )
+>     , ( "Pmonospace", 0xff30 )
+>     , ( "Psi", 0x03a8 )
+>     , ( "Psicyrillic", 0x0470 )
+>     , ( "Psmall", 0xf770 )
+>     , ( "Q", 0x0051 )
+>     , ( "Qcircle", 0x24c6 )
+>     , ( "Qmonospace", 0xff31 )
+>     , ( "Qsmall", 0xf771 )
+>     , ( "R", 0x0052 )
+>     , ( "Raarmenian", 0x054c )
+>     , ( "Racute", 0x0154 )
+>     , ( "Rcaron", 0x0158 )
+>     , ( "Rcedilla", 0x0156 )
+>     , ( "Rcircle", 0x24c7 )
+>     , ( "Rcommaaccent", 0x0156 )
+>     , ( "Rdblgrave", 0x0210 )
+>     , ( "Rdotaccent", 0x1e58 )
+>     , ( "Rdotbelow", 0x1e5a )
+>     , ( "Rdotbelowmacron", 0x1e5c )
+>     , ( "Reharmenian", 0x0550 )
+>     , ( "Rfraktur", 0x211c )
+>     , ( "Rho", 0x03a1 )
+>     , ( "Ringsmall", 0xf6fc )
+>     , ( "Rinvertedbreve", 0x0212 )
+>     , ( "Rlinebelow", 0x1e5e )
+>     , ( "Rmonospace", 0xff32 )
+>     , ( "Rsmall", 0xf772 )
+>     , ( "Rsmallinverted", 0x0281 )
+>     , ( "Rsmallinvertedsuperior", 0x02b6 )
+>     , ( "S", 0x0053 )
+>     , ( "SF010000", 0x250c )
+>     , ( "SF020000", 0x2514 )
+>     , ( "SF030000", 0x2510 )
+>     , ( "SF040000", 0x2518 )
+>     , ( "SF050000", 0x253c )
+>     , ( "SF060000", 0x252c )
+>     , ( "SF070000", 0x2534 )
+>     , ( "SF080000", 0x251c )
+>     , ( "SF090000", 0x2524 )
+>     , ( "SF100000", 0x2500 )
+>     , ( "SF110000", 0x2502 )
+>     , ( "SF190000", 0x2561 )
+>     , ( "SF200000", 0x2562 )
+>     , ( "SF210000", 0x2556 )
+>     , ( "SF220000", 0x2555 )
+>     , ( "SF230000", 0x2563 )
+>     , ( "SF240000", 0x2551 )
+>     , ( "SF250000", 0x2557 )
+>     , ( "SF260000", 0x255d )
+>     , ( "SF270000", 0x255c )
+>     , ( "SF280000", 0x255b )
+>     , ( "SF360000", 0x255e )
+>     , ( "SF370000", 0x255f )
+>     , ( "SF380000", 0x255a )
+>     , ( "SF390000", 0x2554 )
+>     , ( "SF400000", 0x2569 )
+>     , ( "SF410000", 0x2566 )
+>     , ( "SF420000", 0x2560 )
+>     , ( "SF430000", 0x2550 )
+>     , ( "SF440000", 0x256c )
+>     , ( "SF450000", 0x2567 )
+>     , ( "SF460000", 0x2568 )
+>     , ( "SF470000", 0x2564 )
+>     , ( "SF480000", 0x2565 )
+>     , ( "SF490000", 0x2559 )
+>     , ( "SF500000", 0x2558 )
+>     , ( "SF510000", 0x2552 )
+>     , ( "SF520000", 0x2553 )
+>     , ( "SF530000", 0x256b )
+>     , ( "SF540000", 0x256a )
+>     , ( "Sacute", 0x015a )
+>     , ( "Sacutedotaccent", 0x1e64 )
+>     , ( "Sampigreek", 0x03e0 )
+>     , ( "Scaron", 0x0160 )
+>     , ( "Scarondotaccent", 0x1e66 )
+>     , ( "Scaronsmall", 0xf6fd )
+>     , ( "Scedilla", 0x015e )
+>     , ( "Schwa", 0x018f )
+>     , ( "Schwacyrillic", 0x04d8 )
+>     , ( "Schwadieresiscyrillic", 0x04da )
+>     , ( "Scircle", 0x24c8 )
+>     , ( "Scircumflex", 0x015c )
+>     , ( "Scommaaccent", 0x0218 )
+>     , ( "Sdotaccent", 0x1e60 )
+>     , ( "Sdotbelow", 0x1e62 )
+>     , ( "Sdotbelowdotaccent", 0x1e68 )
+>     , ( "Seharmenian", 0x054d )
+>     , ( "Sevenroman", 0x2166 )
+>     , ( "Shaarmenian", 0x0547 )
+>     , ( "Shacyrillic", 0x0428 )
+>     , ( "Shchacyrillic", 0x0429 )
+>     , ( "Sheicoptic", 0x03e2 )
+>     , ( "Shhacyrillic", 0x04ba )
+>     , ( "Shimacoptic", 0x03ec )
+>     , ( "Sigma", 0x03a3 )
+>     , ( "Sixroman", 0x2165 )
+>     , ( "Smonospace", 0xff33 )
+>     , ( "Softsigncyrillic", 0x042c )
+>     , ( "Ssmall", 0xf773 )
+>     , ( "Stigmagreek", 0x03da )
+>     , ( "T", 0x0054 )
+>     , ( "Tau", 0x03a4 )
+>     , ( "Tbar", 0x0166 )
+>     , ( "Tcaron", 0x0164 )
+>     , ( "Tcedilla", 0x0162 )
+>     , ( "Tcircle", 0x24c9 )
+>     , ( "Tcircumflexbelow", 0x1e70 )
+>     , ( "Tcommaaccent", 0x0162 )
+>     , ( "Tdotaccent", 0x1e6a )
+>     , ( "Tdotbelow", 0x1e6c )
+>     , ( "Tecyrillic", 0x0422 )
+>     , ( "Tedescendercyrillic", 0x04ac )
+>     , ( "Tenroman", 0x2169 )
+>     , ( "Tetsecyrillic", 0x04b4 )
+>     , ( "Theta", 0x0398 )
+>     , ( "Thook", 0x01ac )
+>     , ( "Thorn", 0x00de )
+>     , ( "Thornsmall", 0xf7fe )
+>     , ( "Threeroman", 0x2162 )
+>     , ( "Tildesmall", 0xf6fe )
+>     , ( "Tiwnarmenian", 0x054f )
+>     , ( "Tlinebelow", 0x1e6e )
+>     , ( "Tmonospace", 0xff34 )
+>     , ( "Toarmenian", 0x0539 )
+>     , ( "Tonefive", 0x01bc )
+>     , ( "Tonesix", 0x0184 )
+>     , ( "Tonetwo", 0x01a7 )
+>     , ( "Tretroflexhook", 0x01ae )
+>     , ( "Tsecyrillic", 0x0426 )
+>     , ( "Tshecyrillic", 0x040b )
+>     , ( "Tsmall", 0xf774 )
+>     , ( "Twelveroman", 0x216b )
+>     , ( "Tworoman", 0x2161 )
+>     , ( "U", 0x0055 )
+>     , ( "Uacute", 0x00da )
+>     , ( "Uacutesmall", 0xf7fa )
+>     , ( "Ubreve", 0x016c )
+>     , ( "Ucaron", 0x01d3 )
+>     , ( "Ucircle", 0x24ca )
+>     , ( "Ucircumflex", 0x00db )
+>     , ( "Ucircumflexbelow", 0x1e76 )
+>     , ( "Ucircumflexsmall", 0xf7fb )
+>     , ( "Ucyrillic", 0x0423 )
+>     , ( "Udblacute", 0x0170 )
+>     , ( "Udblgrave", 0x0214 )
+>     , ( "Udieresis", 0x00dc )
+>     , ( "Udieresisacute", 0x01d7 )
+>     , ( "Udieresisbelow", 0x1e72 )
+>     , ( "Udieresiscaron", 0x01d9 )
+>     , ( "Udieresiscyrillic", 0x04f0 )
+>     , ( "Udieresisgrave", 0x01db )
+>     , ( "Udieresismacron", 0x01d5 )
+>     , ( "Udieresissmall", 0xf7fc )
+>     , ( "Udotbelow", 0x1ee4 )
+>     , ( "Ugrave", 0x00d9 )
+>     , ( "Ugravesmall", 0xf7f9 )
+>     , ( "Uhookabove", 0x1ee6 )
+>     , ( "Uhorn", 0x01af )
+>     , ( "Uhornacute", 0x1ee8 )
+>     , ( "Uhorndotbelow", 0x1ef0 )
+>     , ( "Uhorngrave", 0x1eea )
+>     , ( "Uhornhookabove", 0x1eec )
+>     , ( "Uhorntilde", 0x1eee )
+>     , ( "Uhungarumlaut", 0x0170 )
+>     , ( "Uhungarumlautcyrillic", 0x04f2 )
+>     , ( "Uinvertedbreve", 0x0216 )
+>     , ( "Ukcyrillic", 0x0478 )
+>     , ( "Umacron", 0x016a )
+>     , ( "Umacroncyrillic", 0x04ee )
+>     , ( "Umacrondieresis", 0x1e7a )
+>     , ( "Umonospace", 0xff35 )
+>     , ( "Uogonek", 0x0172 )
+>     , ( "Upsilon", 0x03a5 )
+>     , ( "Upsilon1", 0x03d2 )
+>     , ( "Upsilonacutehooksymbolgreek", 0x03d3 )
+>     , ( "Upsilonafrican", 0x01b1 )
+>     , ( "Upsilondieresis", 0x03ab )
+>     , ( "Upsilondieresishooksymbolgreek", 0x03d4 )
+>     , ( "Upsilonhooksymbol", 0x03d2 )
+>     , ( "Upsilontonos", 0x038e )
+>     , ( "Uring", 0x016e )
+>     , ( "Ushortcyrillic", 0x040e )
+>     , ( "Usmall", 0xf775 )
+>     , ( "Ustraightcyrillic", 0x04ae )
+>     , ( "Ustraightstrokecyrillic", 0x04b0 )
+>     , ( "Utilde", 0x0168 )
+>     , ( "Utildeacute", 0x1e78 )
+>     , ( "Utildebelow", 0x1e74 )
+>     , ( "V", 0x0056 )
+>     , ( "Vcircle", 0x24cb )
+>     , ( "Vdotbelow", 0x1e7e )
+>     , ( "Vecyrillic", 0x0412 )
+>     , ( "Vewarmenian", 0x054e )
+>     , ( "Vhook", 0x01b2 )
+>     , ( "Vmonospace", 0xff36 )
+>     , ( "Voarmenian", 0x0548 )
+>     , ( "Vsmall", 0xf776 )
+>     , ( "Vtilde", 0x1e7c )
+>     , ( "W", 0x0057 )
+>     , ( "Wacute", 0x1e82 )
+>     , ( "Wcircle", 0x24cc )
+>     , ( "Wcircumflex", 0x0174 )
+>     , ( "Wdieresis", 0x1e84 )
+>     , ( "Wdotaccent", 0x1e86 )
+>     , ( "Wdotbelow", 0x1e88 )
+>     , ( "Wgrave", 0x1e80 )
+>     , ( "Wmonospace", 0xff37 )
+>     , ( "Wsmall", 0xf777 )
+>     , ( "X", 0x0058 )
+>     , ( "Xcircle", 0x24cd )
+>     , ( "Xdieresis", 0x1e8c )
+>     , ( "Xdotaccent", 0x1e8a )
+>     , ( "Xeharmenian", 0x053d )
+>     , ( "Xi", 0x039e )
+>     , ( "Xmonospace", 0xff38 )
+>     , ( "Xsmall", 0xf778 )
+>     , ( "Y", 0x0059 )
+>     , ( "Yacute", 0x00dd )
+>     , ( "Yacutesmall", 0xf7fd )
+>     , ( "Yatcyrillic", 0x0462 )
+>     , ( "Ycircle", 0x24ce )
+>     , ( "Ycircumflex", 0x0176 )
+>     , ( "Ydieresis", 0x0178 )
+>     , ( "Ydieresissmall", 0xf7ff )
+>     , ( "Ydotaccent", 0x1e8e )
+>     , ( "Ydotbelow", 0x1ef4 )
+>     , ( "Yericyrillic", 0x042b )
+>     , ( "Yerudieresiscyrillic", 0x04f8 )
+>     , ( "Ygrave", 0x1ef2 )
+>     , ( "Yhook", 0x01b3 )
+>     , ( "Yhookabove", 0x1ef6 )
+>     , ( "Yiarmenian", 0x0545 )
+>     , ( "Yicyrillic", 0x0407 )
+>     , ( "Yiwnarmenian", 0x0552 )
+>     , ( "Ymonospace", 0xff39 )
+>     , ( "Ysmall", 0xf779 )
+>     , ( "Ytilde", 0x1ef8 )
+>     , ( "Yusbigcyrillic", 0x046a )
+>     , ( "Yusbigiotifiedcyrillic", 0x046c )
+>     , ( "Yuslittlecyrillic", 0x0466 )
+>     , ( "Yuslittleiotifiedcyrillic", 0x0468 )
+>     , ( "Z", 0x005a )
+>     , ( "Zaarmenian", 0x0536 )
+>     , ( "Zacute", 0x0179 )
+>     , ( "Zcaron", 0x017d )
+>     , ( "Zcaronsmall", 0xf6ff )
+>     , ( "Zcircle", 0x24cf )
+>     , ( "Zcircumflex", 0x1e90 )
+>     , ( "Zdot", 0x017b )
+>     , ( "Zdotaccent", 0x017b )
+>     , ( "Zdotbelow", 0x1e92 )
+>     , ( "Zecyrillic", 0x0417 )
+>     , ( "Zedescendercyrillic", 0x0498 )
+>     , ( "Zedieresiscyrillic", 0x04de )
+>     , ( "Zeta", 0x0396 )
+>     , ( "Zhearmenian", 0x053a )
+>     , ( "Zhebrevecyrillic", 0x04c1 )
+>     , ( "Zhecyrillic", 0x0416 )
+>     , ( "Zhedescendercyrillic", 0x0496 )
+>     , ( "Zhedieresiscyrillic", 0x04dc )
+>     , ( "Zlinebelow", 0x1e94 )
+>     , ( "Zmonospace", 0xff3a )
+>     , ( "Zsmall", 0xf77a )
+>     , ( "Zstroke", 0x01b5 )
+>     , ( "a", 0x0061 )
+>     , ( "aabengali", 0x0986 )
+>     , ( "aacute", 0x00e1 )
+>     , ( "aadeva", 0x0906 )
+>     , ( "aagujarati", 0x0a86 )
+>     , ( "aagurmukhi", 0x0a06 )
+>     , ( "aamatragurmukhi", 0x0a3e )
+>     , ( "aarusquare", 0x3303 )
+>     , ( "aavowelsignbengali", 0x09be )
+>     , ( "aavowelsigndeva", 0x093e )
+>     , ( "aavowelsigngujarati", 0x0abe )
+>     , ( "abbreviationmarkarmenian", 0x055f )
+>     , ( "abbreviationsigndeva", 0x0970 )
+>     , ( "abengali", 0x0985 )
+>     , ( "abopomofo", 0x311a )
+>     , ( "abreve", 0x0103 )
+>     , ( "abreveacute", 0x1eaf )
+>     , ( "abrevecyrillic", 0x04d1 )
+>     , ( "abrevedotbelow", 0x1eb7 )
+>     , ( "abrevegrave", 0x1eb1 )
+>     , ( "abrevehookabove", 0x1eb3 )
+>     , ( "abrevetilde", 0x1eb5 )
+>     , ( "acaron", 0x01ce )
+>     , ( "acircle", 0x24d0 )
+>     , ( "acircumflex", 0x00e2 )
+>     , ( "acircumflexacute", 0x1ea5 )
+>     , ( "acircumflexdotbelow", 0x1ead )
+>     , ( "acircumflexgrave", 0x1ea7 )
+>     , ( "acircumflexhookabove", 0x1ea9 )
+>     , ( "acircumflextilde", 0x1eab )
+>     , ( "acute", 0x00b4 )
+>     , ( "acutebelowcmb", 0x0317 )
+>     , ( "acutecmb", 0x0301 )
+>     , ( "acutecomb", 0x0301 )
+>     , ( "acutedeva", 0x0954 )
+>     , ( "acutelowmod", 0x02cf )
+>     , ( "acutetonecmb", 0x0341 )
+>     , ( "acyrillic", 0x0430 )
+>     , ( "adblgrave", 0x0201 )
+>     , ( "addakgurmukhi", 0x0a71 )
+>     , ( "adeva", 0x0905 )
+>     , ( "adieresis", 0x00e4 )
+>     , ( "adieresiscyrillic", 0x04d3 )
+>     , ( "adieresismacron", 0x01df )
+>     , ( "adotbelow", 0x1ea1 )
+>     , ( "adotmacron", 0x01e1 )
+>     , ( "ae", 0x00e6 )
+>     , ( "aeacute", 0x01fd )
+>     , ( "aekorean", 0x3150 )
+>     , ( "aemacron", 0x01e3 )
+>     , ( "afii00208", 0x2015 )
+>     , ( "afii08941", 0x20a4 )
+>     , ( "afii10017", 0x0410 )
+>     , ( "afii10018", 0x0411 )
+>     , ( "afii10019", 0x0412 )
+>     , ( "afii10020", 0x0413 )
+>     , ( "afii10021", 0x0414 )
+>     , ( "afii10022", 0x0415 )
+>     , ( "afii10023", 0x0401 )
+>     , ( "afii10024", 0x0416 )
+>     , ( "afii10025", 0x0417 )
+>     , ( "afii10026", 0x0418 )
+>     , ( "afii10027", 0x0419 )
+>     , ( "afii10028", 0x041a )
+>     , ( "afii10029", 0x041b )
+>     , ( "afii10030", 0x041c )
+>     , ( "afii10031", 0x041d )
+>     , ( "afii10032", 0x041e )
+>     , ( "afii10033", 0x041f )
+>     , ( "afii10034", 0x0420 )
+>     , ( "afii10035", 0x0421 )
+>     , ( "afii10036", 0x0422 )
+>     , ( "afii10037", 0x0423 )
+>     , ( "afii10038", 0x0424 )
+>     , ( "afii10039", 0x0425 )
+>     , ( "afii10040", 0x0426 )
+>     , ( "afii10041", 0x0427 )
+>     , ( "afii10042", 0x0428 )
+>     , ( "afii10043", 0x0429 )
+>     , ( "afii10044", 0x042a )
+>     , ( "afii10045", 0x042b )
+>     , ( "afii10046", 0x042c )
+>     , ( "afii10047", 0x042d )
+>     , ( "afii10048", 0x042e )
+>     , ( "afii10049", 0x042f )
+>     , ( "afii10050", 0x0490 )
+>     , ( "afii10051", 0x0402 )
+>     , ( "afii10052", 0x0403 )
+>     , ( "afii10053", 0x0404 )
+>     , ( "afii10054", 0x0405 )
+>     , ( "afii10055", 0x0406 )
+>     , ( "afii10056", 0x0407 )
+>     , ( "afii10057", 0x0408 )
+>     , ( "afii10058", 0x0409 )
+>     , ( "afii10059", 0x040a )
+>     , ( "afii10060", 0x040b )
+>     , ( "afii10061", 0x040c )
+>     , ( "afii10062", 0x040e )
+>     , ( "afii10063", 0xf6c4 )
+>     , ( "afii10064", 0xf6c5 )
+>     , ( "afii10065", 0x0430 )
+>     , ( "afii10066", 0x0431 )
+>     , ( "afii10067", 0x0432 )
+>     , ( "afii10068", 0x0433 )
+>     , ( "afii10069", 0x0434 )
+>     , ( "afii10070", 0x0435 )
+>     , ( "afii10071", 0x0451 )
+>     , ( "afii10072", 0x0436 )
+>     , ( "afii10073", 0x0437 )
+>     , ( "afii10074", 0x0438 )
+>     , ( "afii10075", 0x0439 )
+>     , ( "afii10076", 0x043a )
+>     , ( "afii10077", 0x043b )
+>     , ( "afii10078", 0x043c )
+>     , ( "afii10079", 0x043d )
+>     , ( "afii10080", 0x043e )
+>     , ( "afii10081", 0x043f )
+>     , ( "afii10082", 0x0440 )
+>     , ( "afii10083", 0x0441 )
+>     , ( "afii10084", 0x0442 )
+>     , ( "afii10085", 0x0443 )
+>     , ( "afii10086", 0x0444 )
+>     , ( "afii10087", 0x0445 )
+>     , ( "afii10088", 0x0446 )
+>     , ( "afii10089", 0x0447 )
+>     , ( "afii10090", 0x0448 )
+>     , ( "afii10091", 0x0449 )
+>     , ( "afii10092", 0x044a )
+>     , ( "afii10093", 0x044b )
+>     , ( "afii10094", 0x044c )
+>     , ( "afii10095", 0x044d )
+>     , ( "afii10096", 0x044e )
+>     , ( "afii10097", 0x044f )
+>     , ( "afii10098", 0x0491 )
+>     , ( "afii10099", 0x0452 )
+>     , ( "afii10100", 0x0453 )
+>     , ( "afii10101", 0x0454 )
+>     , ( "afii10102", 0x0455 )
+>     , ( "afii10103", 0x0456 )
+>     , ( "afii10104", 0x0457 )
+>     , ( "afii10105", 0x0458 )
+>     , ( "afii10106", 0x0459 )
+>     , ( "afii10107", 0x045a )
+>     , ( "afii10108", 0x045b )
+>     , ( "afii10109", 0x045c )
+>     , ( "afii10110", 0x045e )
+>     , ( "afii10145", 0x040f )
+>     , ( "afii10146", 0x0462 )
+>     , ( "afii10147", 0x0472 )
+>     , ( "afii10148", 0x0474 )
+>     , ( "afii10192", 0xf6c6 )
+>     , ( "afii10193", 0x045f )
+>     , ( "afii10194", 0x0463 )
+>     , ( "afii10195", 0x0473 )
+>     , ( "afii10196", 0x0475 )
+>     , ( "afii10831", 0xf6c7 )
+>     , ( "afii10832", 0xf6c8 )
+>     , ( "afii10846", 0x04d9 )
+>     , ( "afii299", 0x200e )
+>     , ( "afii300", 0x200f )
+>     , ( "afii301", 0x200d )
+>     , ( "afii57381", 0x066a )
+>     , ( "afii57388", 0x060c )
+>     , ( "afii57392", 0x0660 )
+>     , ( "afii57393", 0x0661 )
+>     , ( "afii57394", 0x0662 )
+>     , ( "afii57395", 0x0663 )
+>     , ( "afii57396", 0x0664 )
+>     , ( "afii57397", 0x0665 )
+>     , ( "afii57398", 0x0666 )
+>     , ( "afii57399", 0x0667 )
+>     , ( "afii57400", 0x0668 )
+>     , ( "afii57401", 0x0669 )
+>     , ( "afii57403", 0x061b )
+>     , ( "afii57407", 0x061f )
+>     , ( "afii57409", 0x0621 )
+>     , ( "afii57410", 0x0622 )
+>     , ( "afii57411", 0x0623 )
+>     , ( "afii57412", 0x0624 )
+>     , ( "afii57413", 0x0625 )
+>     , ( "afii57414", 0x0626 )
+>     , ( "afii57415", 0x0627 )
+>     , ( "afii57416", 0x0628 )
+>     , ( "afii57417", 0x0629 )
+>     , ( "afii57418", 0x062a )
+>     , ( "afii57419", 0x062b )
+>     , ( "afii57420", 0x062c )
+>     , ( "afii57421", 0x062d )
+>     , ( "afii57422", 0x062e )
+>     , ( "afii57423", 0x062f )
+>     , ( "afii57424", 0x0630 )
+>     , ( "afii57425", 0x0631 )
+>     , ( "afii57426", 0x0632 )
+>     , ( "afii57427", 0x0633 )
+>     , ( "afii57428", 0x0634 )
+>     , ( "afii57429", 0x0635 )
+>     , ( "afii57430", 0x0636 )
+>     , ( "afii57431", 0x0637 )
+>     , ( "afii57432", 0x0638 )
+>     , ( "afii57433", 0x0639 )
+>     , ( "afii57434", 0x063a )
+>     , ( "afii57440", 0x0640 )
+>     , ( "afii57441", 0x0641 )
+>     , ( "afii57442", 0x0642 )
+>     , ( "afii57443", 0x0643 )
+>     , ( "afii57444", 0x0644 )
+>     , ( "afii57445", 0x0645 )
+>     , ( "afii57446", 0x0646 )
+>     , ( "afii57448", 0x0648 )
+>     , ( "afii57449", 0x0649 )
+>     , ( "afii57450", 0x064a )
+>     , ( "afii57451", 0x064b )
+>     , ( "afii57452", 0x064c )
+>     , ( "afii57453", 0x064d )
+>     , ( "afii57454", 0x064e )
+>     , ( "afii57455", 0x064f )
+>     , ( "afii57456", 0x0650 )
+>     , ( "afii57457", 0x0651 )
+>     , ( "afii57458", 0x0652 )
+>     , ( "afii57470", 0x0647 )
+>     , ( "afii57505", 0x06a4 )
+>     , ( "afii57506", 0x067e )
+>     , ( "afii57507", 0x0686 )
+>     , ( "afii57508", 0x0698 )
+>     , ( "afii57509", 0x06af )
+>     , ( "afii57511", 0x0679 )
+>     , ( "afii57512", 0x0688 )
+>     , ( "afii57513", 0x0691 )
+>     , ( "afii57514", 0x06ba )
+>     , ( "afii57519", 0x06d2 )
+>     , ( "afii57534", 0x06d5 )
+>     , ( "afii57636", 0x20aa )
+>     , ( "afii57645", 0x05be )
+>     , ( "afii57658", 0x05c3 )
+>     , ( "afii57664", 0x05d0 )
+>     , ( "afii57665", 0x05d1 )
+>     , ( "afii57666", 0x05d2 )
+>     , ( "afii57667", 0x05d3 )
+>     , ( "afii57668", 0x05d4 )
+>     , ( "afii57669", 0x05d5 )
+>     , ( "afii57670", 0x05d6 )
+>     , ( "afii57671", 0x05d7 )
+>     , ( "afii57672", 0x05d8 )
+>     , ( "afii57673", 0x05d9 )
+>     , ( "afii57674", 0x05da )
+>     , ( "afii57675", 0x05db )
+>     , ( "afii57676", 0x05dc )
+>     , ( "afii57677", 0x05dd )
+>     , ( "afii57678", 0x05de )
+>     , ( "afii57679", 0x05df )
+>     , ( "afii57680", 0x05e0 )
+>     , ( "afii57681", 0x05e1 )
+>     , ( "afii57682", 0x05e2 )
+>     , ( "afii57683", 0x05e3 )
+>     , ( "afii57684", 0x05e4 )
+>     , ( "afii57685", 0x05e5 )
+>     , ( "afii57686", 0x05e6 )
+>     , ( "afii57687", 0x05e7 )
+>     , ( "afii57688", 0x05e8 )
+>     , ( "afii57689", 0x05e9 )
+>     , ( "afii57690", 0x05ea )
+>     , ( "afii57694", 0xfb2a )
+>     , ( "afii57695", 0xfb2b )
+>     , ( "afii57700", 0xfb4b )
+>     , ( "afii57705", 0xfb1f )
+>     , ( "afii57716", 0x05f0 )
+>     , ( "afii57717", 0x05f1 )
+>     , ( "afii57718", 0x05f2 )
+>     , ( "afii57723", 0xfb35 )
+>     , ( "afii57793", 0x05b4 )
+>     , ( "afii57794", 0x05b5 )
+>     , ( "afii57795", 0x05b6 )
+>     , ( "afii57796", 0x05bb )
+>     , ( "afii57797", 0x05b8 )
+>     , ( "afii57798", 0x05b7 )
+>     , ( "afii57799", 0x05b0 )
+>     , ( "afii57800", 0x05b2 )
+>     , ( "afii57801", 0x05b1 )
+>     , ( "afii57802", 0x05b3 )
+>     , ( "afii57803", 0x05c2 )
+>     , ( "afii57804", 0x05c1 )
+>     , ( "afii57806", 0x05b9 )
+>     , ( "afii57807", 0x05bc )
+>     , ( "afii57839", 0x05bd )
+>     , ( "afii57841", 0x05bf )
+>     , ( "afii57842", 0x05c0 )
+>     , ( "afii57929", 0x02bc )
+>     , ( "afii61248", 0x2105 )
+>     , ( "afii61289", 0x2113 )
+>     , ( "afii61352", 0x2116 )
+>     , ( "afii61573", 0x202c )
+>     , ( "afii61574", 0x202d )
+>     , ( "afii61575", 0x202e )
+>     , ( "afii61664", 0x200c )
+>     , ( "afii63167", 0x066d )
+>     , ( "afii64937", 0x02bd )
+>     , ( "agrave", 0x00e0 )
+>     , ( "agujarati", 0x0a85 )
+>     , ( "agurmukhi", 0x0a05 )
+>     , ( "ahiragana", 0x3042 )
+>     , ( "ahookabove", 0x1ea3 )
+>     , ( "aibengali", 0x0990 )
+>     , ( "aibopomofo", 0x311e )
+>     , ( "aideva", 0x0910 )
+>     , ( "aiecyrillic", 0x04d5 )
+>     , ( "aigujarati", 0x0a90 )
+>     , ( "aigurmukhi", 0x0a10 )
+>     , ( "aimatragurmukhi", 0x0a48 )
+>     , ( "ainarabic", 0x0639 )
+>     , ( "ainfinalarabic", 0xfeca )
+>     , ( "aininitialarabic", 0xfecb )
+>     , ( "ainmedialarabic", 0xfecc )
+>     , ( "ainvertedbreve", 0x0203 )
+>     , ( "aivowelsignbengali", 0x09c8 )
+>     , ( "aivowelsigndeva", 0x0948 )
+>     , ( "aivowelsigngujarati", 0x0ac8 )
+>     , ( "akatakana", 0x30a2 )
+>     , ( "akatakanahalfwidth", 0xff71 )
+>     , ( "akorean", 0x314f )
+>     , ( "alef", 0x05d0 )
+>     , ( "alefarabic", 0x0627 )
+>     , ( "alefdageshhebrew", 0xfb30 )
+>     , ( "aleffinalarabic", 0xfe8e )
+>     , ( "alefhamzaabovearabic", 0x0623 )
+>     , ( "alefhamzaabovefinalarabic", 0xfe84 )
+>     , ( "alefhamzabelowarabic", 0x0625 )
+>     , ( "alefhamzabelowfinalarabic", 0xfe88 )
+>     , ( "alefhebrew", 0x05d0 )
+>     , ( "aleflamedhebrew", 0xfb4f )
+>     , ( "alefmaddaabovearabic", 0x0622 )
+>     , ( "alefmaddaabovefinalarabic", 0xfe82 )
+>     , ( "alefmaksuraarabic", 0x0649 )
+>     , ( "alefmaksurafinalarabic", 0xfef0 )
+>     , ( "alefmaksurainitialarabic", 0xfef3 )
+>     , ( "alefmaksuramedialarabic", 0xfef4 )
+>     , ( "alefpatahhebrew", 0xfb2e )
+>     , ( "alefqamatshebrew", 0xfb2f )
+>     , ( "aleph", 0x2135 )
+>     , ( "allequal", 0x224c )
+>     , ( "alpha", 0x03b1 )
+>     , ( "alphatonos", 0x03ac )
+>     , ( "amacron", 0x0101 )
+>     , ( "amonospace", 0xff41 )
+>     , ( "ampersand", 0x0026 )
+>     , ( "ampersandmonospace", 0xff06 )
+>     , ( "ampersandsmall", 0xf726 )
+>     , ( "amsquare", 0x33c2 )
+>     , ( "anbopomofo", 0x3122 )
+>     , ( "angbopomofo", 0x3124 )
+>     , ( "angkhankhuthai", 0x0e5a )
+>     , ( "angle", 0x2220 )
+>     , ( "anglebracketleft", 0x3008 )
+>     , ( "anglebracketleftvertical", 0xfe3f )
+>     , ( "anglebracketright", 0x3009 )
+>     , ( "anglebracketrightvertical", 0xfe40 )
+>     , ( "angleleft", 0x2329 )
+>     , ( "angleright", 0x232a )
+>     , ( "angstrom", 0x212b )
+>     , ( "anoteleia", 0x0387 )
+>     , ( "anudattadeva", 0x0952 )
+>     , ( "anusvarabengali", 0x0982 )
+>     , ( "anusvaradeva", 0x0902 )
+>     , ( "anusvaragujarati", 0x0a82 )
+>     , ( "aogonek", 0x0105 )
+>     , ( "apaatosquare", 0x3300 )
+>     , ( "aparen", 0x249c )
+>     , ( "apostrophearmenian", 0x055a )
+>     , ( "apostrophemod", 0x02bc )
+>     , ( "apple", 0xf8ff )
+>     , ( "approaches", 0x2250 )
+>     , ( "approxequal", 0x2248 )
+>     , ( "approxequalorimage", 0x2252 )
+>     , ( "approximatelyequal", 0x2245 )
+>     , ( "araeaekorean", 0x318e )
+>     , ( "araeakorean", 0x318d )
+>     , ( "arc", 0x2312 )
+>     , ( "arighthalfring", 0x1e9a )
+>     , ( "aring", 0x00e5 )
+>     , ( "aringacute", 0x01fb )
+>     , ( "aringbelow", 0x1e01 )
+>     , ( "arrowboth", 0x2194 )
+>     , ( "arrowdashdown", 0x21e3 )
+>     , ( "arrowdashleft", 0x21e0 )
+>     , ( "arrowdashright", 0x21e2 )
+>     , ( "arrowdashup", 0x21e1 )
+>     , ( "arrowdblboth", 0x21d4 )
+>     , ( "arrowdbldown", 0x21d3 )
+>     , ( "arrowdblleft", 0x21d0 )
+>     , ( "arrowdblright", 0x21d2 )
+>     , ( "arrowdblup", 0x21d1 )
+>     , ( "arrowdown", 0x2193 )
+>     , ( "arrowdownleft", 0x2199 )
+>     , ( "arrowdownright", 0x2198 )
+>     , ( "arrowdownwhite", 0x21e9 )
+>     , ( "arrowheaddownmod", 0x02c5 )
+>     , ( "arrowheadleftmod", 0x02c2 )
+>     , ( "arrowheadrightmod", 0x02c3 )
+>     , ( "arrowheadupmod", 0x02c4 )
+>     , ( "arrowhorizex", 0xf8e7 )
+>     , ( "arrowleft", 0x2190 )
+>     , ( "arrowleftdbl", 0x21d0 )
+>     , ( "arrowleftdblstroke", 0x21cd )
+>     , ( "arrowleftoverright", 0x21c6 )
+>     , ( "arrowleftwhite", 0x21e6 )
+>     , ( "arrowright", 0x2192 )
+>     , ( "arrowrightdblstroke", 0x21cf )
+>     , ( "arrowrightheavy", 0x279e )
+>     , ( "arrowrightoverleft", 0x21c4 )
+>     , ( "arrowrightwhite", 0x21e8 )
+>     , ( "arrowtableft", 0x21e4 )
+>     , ( "arrowtabright", 0x21e5 )
+>     , ( "arrowup", 0x2191 )
+>     , ( "arrowupdn", 0x2195 )
+>     , ( "arrowupdnbse", 0x21a8 )
+>     , ( "arrowupdownbase", 0x21a8 )
+>     , ( "arrowupleft", 0x2196 )
+>     , ( "arrowupleftofdown", 0x21c5 )
+>     , ( "arrowupright", 0x2197 )
+>     , ( "arrowupwhite", 0x21e7 )
+>     , ( "arrowvertex", 0xf8e6 )
+>     , ( "asciicircum", 0x005e )
+>     , ( "asciicircummonospace", 0xff3e )
+>     , ( "asciitilde", 0x007e )
+>     , ( "asciitildemonospace", 0xff5e )
+>     , ( "ascript", 0x0251 )
+>     , ( "ascriptturned", 0x0252 )
+>     , ( "asmallhiragana", 0x3041 )
+>     , ( "asmallkatakana", 0x30a1 )
+>     , ( "asmallkatakanahalfwidth", 0xff67 )
+>     , ( "asterisk", 0x002a )
+>     , ( "asteriskaltonearabic", 0x066d )
+>     , ( "asteriskarabic", 0x066d )
+>     , ( "asteriskmath", 0x2217 )
+>     , ( "asteriskmonospace", 0xff0a )
+>     , ( "asterisksmall", 0xfe61 )
+>     , ( "asterism", 0x2042 )
+>     , ( "asuperior", 0xf6e9 )
+>     , ( "asymptoticallyequal", 0x2243 )
+>     , ( "at", 0x0040 )
+>     , ( "atilde", 0x00e3 )
+>     , ( "atmonospace", 0xff20 )
+>     , ( "atsmall", 0xfe6b )
+>     , ( "aturned", 0x0250 )
+>     , ( "aubengali", 0x0994 )
+>     , ( "aubopomofo", 0x3120 )
+>     , ( "audeva", 0x0914 )
+>     , ( "augujarati", 0x0a94 )
+>     , ( "augurmukhi", 0x0a14 )
+>     , ( "aulengthmarkbengali", 0x09d7 )
+>     , ( "aumatragurmukhi", 0x0a4c )
+>     , ( "auvowelsignbengali", 0x09cc )
+>     , ( "auvowelsigndeva", 0x094c )
+>     , ( "auvowelsigngujarati", 0x0acc )
+>     , ( "avagrahadeva", 0x093d )
+>     , ( "aybarmenian", 0x0561 )
+>     , ( "ayin", 0x05e2 )
+>     , ( "ayinaltonehebrew", 0xfb20 )
+>     , ( "ayinhebrew", 0x05e2 )
+>     , ( "b", 0x0062 )
+>     , ( "babengali", 0x09ac )
+>     , ( "backslash", 0x005c )
+>     , ( "backslashmonospace", 0xff3c )
+>     , ( "badeva", 0x092c )
+>     , ( "bagujarati", 0x0aac )
+>     , ( "bagurmukhi", 0x0a2c )
+>     , ( "bahiragana", 0x3070 )
+>     , ( "bahtthai", 0x0e3f )
+>     , ( "bakatakana", 0x30d0 )
+>     , ( "bar", 0x007c )
+>     , ( "barmonospace", 0xff5c )
+>     , ( "bbopomofo", 0x3105 )
+>     , ( "bcircle", 0x24d1 )
+>     , ( "bdotaccent", 0x1e03 )
+>     , ( "bdotbelow", 0x1e05 )
+>     , ( "beamedsixteenthnotes", 0x266c )
+>     , ( "because", 0x2235 )
+>     , ( "becyrillic", 0x0431 )
+>     , ( "beharabic", 0x0628 )
+>     , ( "behfinalarabic", 0xfe90 )
+>     , ( "behinitialarabic", 0xfe91 )
+>     , ( "behiragana", 0x3079 )
+>     , ( "behmedialarabic", 0xfe92 )
+>     , ( "behmeeminitialarabic", 0xfc9f )
+>     , ( "behmeemisolatedarabic", 0xfc08 )
+>     , ( "behnoonfinalarabic", 0xfc6d )
+>     , ( "bekatakana", 0x30d9 )
+>     , ( "benarmenian", 0x0562 )
+>     , ( "bet", 0x05d1 )
+>     , ( "beta", 0x03b2 )
+>     , ( "betasymbolgreek", 0x03d0 )
+>     , ( "betdagesh", 0xfb31 )
+>     , ( "betdageshhebrew", 0xfb31 )
+>     , ( "bethebrew", 0x05d1 )
+>     , ( "betrafehebrew", 0xfb4c )
+>     , ( "bhabengali", 0x09ad )
+>     , ( "bhadeva", 0x092d )
+>     , ( "bhagujarati", 0x0aad )
+>     , ( "bhagurmukhi", 0x0a2d )
+>     , ( "bhook", 0x0253 )
+>     , ( "bihiragana", 0x3073 )
+>     , ( "bikatakana", 0x30d3 )
+>     , ( "bilabialclick", 0x0298 )
+>     , ( "bindigurmukhi", 0x0a02 )
+>     , ( "birusquare", 0x3331 )
+>     , ( "blackcircle", 0x25cf )
+>     , ( "blackdiamond", 0x25c6 )
+>     , ( "blackdownpointingtriangle", 0x25bc )
+>     , ( "blackleftpointingpointer", 0x25c4 )
+>     , ( "blackleftpointingtriangle", 0x25c0 )
+>     , ( "blacklenticularbracketleft", 0x3010 )
+>     , ( "blacklenticularbracketleftvertical", 0xfe3b )
+>     , ( "blacklenticularbracketright", 0x3011 )
+>     , ( "blacklenticularbracketrightvertical", 0xfe3c )
+>     , ( "blacklowerlefttriangle", 0x25e3 )
+>     , ( "blacklowerrighttriangle", 0x25e2 )
+>     , ( "blackrectangle", 0x25ac )
+>     , ( "blackrightpointingpointer", 0x25ba )
+>     , ( "blackrightpointingtriangle", 0x25b6 )
+>     , ( "blacksmallsquare", 0x25aa )
+>     , ( "blacksmilingface", 0x263b )
+>     , ( "blacksquare", 0x25a0 )
+>     , ( "blackstar", 0x2605 )
+>     , ( "blackupperlefttriangle", 0x25e4 )
+>     , ( "blackupperrighttriangle", 0x25e5 )
+>     , ( "blackuppointingsmalltriangle", 0x25b4 )
+>     , ( "blackuppointingtriangle", 0x25b2 )
+>     , ( "blank", 0x2423 )
+>     , ( "blinebelow", 0x1e07 )
+>     , ( "block", 0x2588 )
+>     , ( "bmonospace", 0xff42 )
+>     , ( "bobaimaithai", 0x0e1a )
+>     , ( "bohiragana", 0x307c )
+>     , ( "bokatakana", 0x30dc )
+>     , ( "bparen", 0x249d )
+>     , ( "bqsquare", 0x33c3 )
+>     , ( "braceex", 0xf8f4 )
+>     , ( "braceleft", 0x007b )
+>     , ( "braceleftbt", 0xf8f3 )
+>     , ( "braceleftmid", 0xf8f2 )
+>     , ( "braceleftmonospace", 0xff5b )
+>     , ( "braceleftsmall", 0xfe5b )
+>     , ( "bracelefttp", 0xf8f1 )
+>     , ( "braceleftvertical", 0xfe37 )
+>     , ( "braceright", 0x007d )
+>     , ( "bracerightbt", 0xf8fe )
+>     , ( "bracerightmid", 0xf8fd )
+>     , ( "bracerightmonospace", 0xff5d )
+>     , ( "bracerightsmall", 0xfe5c )
+>     , ( "bracerighttp", 0xf8fc )
+>     , ( "bracerightvertical", 0xfe38 )
+>     , ( "bracketleft", 0x005b )
+>     , ( "bracketleftbt", 0xf8f0 )
+>     , ( "bracketleftex", 0xf8ef )
+>     , ( "bracketleftmonospace", 0xff3b )
+>     , ( "bracketlefttp", 0xf8ee )
+>     , ( "bracketright", 0x005d )
+>     , ( "bracketrightbt", 0xf8fb )
+>     , ( "bracketrightex", 0xf8fa )
+>     , ( "bracketrightmonospace", 0xff3d )
+>     , ( "bracketrighttp", 0xf8f9 )
+>     , ( "breve", 0x02d8 )
+>     , ( "brevebelowcmb", 0x032e )
+>     , ( "brevecmb", 0x0306 )
+>     , ( "breveinvertedbelowcmb", 0x032f )
+>     , ( "breveinvertedcmb", 0x0311 )
+>     , ( "breveinverteddoublecmb", 0x0361 )
+>     , ( "bridgebelowcmb", 0x032a )
+>     , ( "bridgeinvertedbelowcmb", 0x033a )
+>     , ( "brokenbar", 0x00a6 )
+>     , ( "bstroke", 0x0180 )
+>     , ( "bsuperior", 0xf6ea )
+>     , ( "btopbar", 0x0183 )
+>     , ( "buhiragana", 0x3076 )
+>     , ( "bukatakana", 0x30d6 )
+>     , ( "bullet", 0x2022 )
+>     , ( "bulletinverse", 0x25d8 )
+>     , ( "bulletoperator", 0x2219 )
+>     , ( "bullseye", 0x25ce )
+>     , ( "c", 0x0063 )
+>     , ( "caarmenian", 0x056e )
+>     , ( "cabengali", 0x099a )
+>     , ( "cacute", 0x0107 )
+>     , ( "cadeva", 0x091a )
+>     , ( "cagujarati", 0x0a9a )
+>     , ( "cagurmukhi", 0x0a1a )
+>     , ( "calsquare", 0x3388 )
+>     , ( "candrabindubengali", 0x0981 )
+>     , ( "candrabinducmb", 0x0310 )
+>     , ( "candrabindudeva", 0x0901 )
+>     , ( "candrabindugujarati", 0x0a81 )
+>     , ( "capslock", 0x21ea )
+>     , ( "careof", 0x2105 )
+>     , ( "caron", 0x02c7 )
+>     , ( "caronbelowcmb", 0x032c )
+>     , ( "caroncmb", 0x030c )
+>     , ( "carriagereturn", 0x21b5 )
+>     , ( "cbopomofo", 0x3118 )
+>     , ( "ccaron", 0x010d )
+>     , ( "ccedilla", 0x00e7 )
+>     , ( "ccedillaacute", 0x1e09 )
+>     , ( "ccircle", 0x24d2 )
+>     , ( "ccircumflex", 0x0109 )
+>     , ( "ccurl", 0x0255 )
+>     , ( "cdot", 0x010b )
+>     , ( "cdotaccent", 0x010b )
+>     , ( "cdsquare", 0x33c5 )
+>     , ( "cedilla", 0x00b8 )
+>     , ( "cedillacmb", 0x0327 )
+>     , ( "cent", 0x00a2 )
+>     , ( "centigrade", 0x2103 )
+>     , ( "centinferior", 0xf6df )
+>     , ( "centmonospace", 0xffe0 )
+>     , ( "centoldstyle", 0xf7a2 )
+>     , ( "centsuperior", 0xf6e0 )
+>     , ( "chaarmenian", 0x0579 )
+>     , ( "chabengali", 0x099b )
+>     , ( "chadeva", 0x091b )
+>     , ( "chagujarati", 0x0a9b )
+>     , ( "chagurmukhi", 0x0a1b )
+>     , ( "chbopomofo", 0x3114 )
+>     , ( "cheabkhasiancyrillic", 0x04bd )
+>     , ( "checkmark", 0x2713 )
+>     , ( "checyrillic", 0x0447 )
+>     , ( "chedescenderabkhasiancyrillic", 0x04bf )
+>     , ( "chedescendercyrillic", 0x04b7 )
+>     , ( "chedieresiscyrillic", 0x04f5 )
+>     , ( "cheharmenian", 0x0573 )
+>     , ( "chekhakassiancyrillic", 0x04cc )
+>     , ( "cheverticalstrokecyrillic", 0x04b9 )
+>     , ( "chi", 0x03c7 )
+>     , ( "chieuchacirclekorean", 0x3277 )
+>     , ( "chieuchaparenkorean", 0x3217 )
+>     , ( "chieuchcirclekorean", 0x3269 )
+>     , ( "chieuchkorean", 0x314a )
+>     , ( "chieuchparenkorean", 0x3209 )
+>     , ( "chochangthai", 0x0e0a )
+>     , ( "chochanthai", 0x0e08 )
+>     , ( "chochingthai", 0x0e09 )
+>     , ( "chochoethai", 0x0e0c )
+>     , ( "chook", 0x0188 )
+>     , ( "cieucacirclekorean", 0x3276 )
+>     , ( "cieucaparenkorean", 0x3216 )
+>     , ( "cieuccirclekorean", 0x3268 )
+>     , ( "cieuckorean", 0x3148 )
+>     , ( "cieucparenkorean", 0x3208 )
+>     , ( "cieucuparenkorean", 0x321c )
+>     , ( "circle", 0x25cb )
+>     , ( "circlemultiply", 0x2297 )
+>     , ( "circleot", 0x2299 )
+>     , ( "circleplus", 0x2295 )
+>     , ( "circlepostalmark", 0x3036 )
+>     , ( "circlewithlefthalfblack", 0x25d0 )
+>     , ( "circlewithrighthalfblack", 0x25d1 )
+>     , ( "circumflex", 0x02c6 )
+>     , ( "circumflexbelowcmb", 0x032d )
+>     , ( "circumflexcmb", 0x0302 )
+>     , ( "clear", 0x2327 )
+>     , ( "clickalveolar", 0x01c2 )
+>     , ( "clickdental", 0x01c0 )
+>     , ( "clicklateral", 0x01c1 )
+>     , ( "clickretroflex", 0x01c3 )
+>     , ( "club", 0x2663 )
+>     , ( "clubsuitblack", 0x2663 )
+>     , ( "clubsuitwhite", 0x2667 )
+>     , ( "cmcubedsquare", 0x33a4 )
+>     , ( "cmonospace", 0xff43 )
+>     , ( "cmsquaredsquare", 0x33a0 )
+>     , ( "coarmenian", 0x0581 )
+>     , ( "colon", 0x003a )
+>     , ( "colonmonetary", 0x20a1 )
+>     , ( "colonmonospace", 0xff1a )
+>     , ( "colonsign", 0x20a1 )
+>     , ( "colonsmall", 0xfe55 )
+>     , ( "colontriangularhalfmod", 0x02d1 )
+>     , ( "colontriangularmod", 0x02d0 )
+>     , ( "comma", 0x002c )
+>     , ( "commaabovecmb", 0x0313 )
+>     , ( "commaaboverightcmb", 0x0315 )
+>     , ( "commaaccent", 0xf6c3 )
+>     , ( "commaarabic", 0x060c )
+>     , ( "commaarmenian", 0x055d )
+>     , ( "commainferior", 0xf6e1 )
+>     , ( "commamonospace", 0xff0c )
+>     , ( "commareversedabovecmb", 0x0314 )
+>     , ( "commareversedmod", 0x02bd )
+>     , ( "commasmall", 0xfe50 )
+>     , ( "commasuperior", 0xf6e2 )
+>     , ( "commaturnedabovecmb", 0x0312 )
+>     , ( "commaturnedmod", 0x02bb )
+>     , ( "compass", 0x263c )
+>     , ( "congruent", 0x2245 )
+>     , ( "contourintegral", 0x222e )
+>     , ( "control", 0x2303 )
+>     , ( "controlACK", 0x0006 )
+>     , ( "controlBEL", 0x0007 )
+>     , ( "controlBS", 0x0008 )
+>     , ( "controlCAN", 0x0018 )
+>     , ( "controlCR", 0x000d )
+>     , ( "controlDC1", 0x0011 )
+>     , ( "controlDC2", 0x0012 )
+>     , ( "controlDC3", 0x0013 )
+>     , ( "controlDC4", 0x0014 )
+>     , ( "controlDEL", 0x007f )
+>     , ( "controlDLE", 0x0010 )
+>     , ( "controlEM", 0x0019 )
+>     , ( "controlENQ", 0x0005 )
+>     , ( "controlEOT", 0x0004 )
+>     , ( "controlESC", 0x001b )
+>     , ( "controlETB", 0x0017 )
+>     , ( "controlETX", 0x0003 )
+>     , ( "controlFF", 0x000c )
+>     , ( "controlFS", 0x001c )
+>     , ( "controlGS", 0x001d )
+>     , ( "controlHT", 0x0009 )
+>     , ( "controlLF", 0x000a )
+>     , ( "controlNAK", 0x0015 )
+>     , ( "controlRS", 0x001e )
+>     , ( "controlSI", 0x000f )
+>     , ( "controlSO", 0x000e )
+>     , ( "controlSOT", 0x0002 )
+>     , ( "controlSTX", 0x0001 )
+>     , ( "controlSUB", 0x001a )
+>     , ( "controlSYN", 0x0016 )
+>     , ( "controlUS", 0x001f )
+>     , ( "controlVT", 0x000b )
+>     , ( "copyright", 0x00a9 )
+>     , ( "copyrightsans", 0xf8e9 )
+>     , ( "copyrightserif", 0xf6d9 )
+>     , ( "cornerbracketleft", 0x300c )
+>     , ( "cornerbracketlefthalfwidth", 0xff62 )
+>     , ( "cornerbracketleftvertical", 0xfe41 )
+>     , ( "cornerbracketright", 0x300d )
+>     , ( "cornerbracketrighthalfwidth", 0xff63 )
+>     , ( "cornerbracketrightvertical", 0xfe42 )
+>     , ( "corporationsquare", 0x337f )
+>     , ( "cosquare", 0x33c7 )
+>     , ( "coverkgsquare", 0x33c6 )
+>     , ( "cparen", 0x249e )
+>     , ( "cruzeiro", 0x20a2 )
+>     , ( "cstretched", 0x0297 )
+>     , ( "curlyand", 0x22cf )
+>     , ( "curlyor", 0x22ce )
+>     , ( "currency", 0x00a4 )
+>     , ( "cyrBreve", 0xf6d1 )
+>     , ( "cyrFlex", 0xf6d2 )
+>     , ( "cyrbreve", 0xf6d4 )
+>     , ( "cyrflex", 0xf6d5 )
+>     , ( "d", 0x0064 )
+>     , ( "daarmenian", 0x0564 )
+>     , ( "dabengali", 0x09a6 )
+>     , ( "dadarabic", 0x0636 )
+>     , ( "dadeva", 0x0926 )
+>     , ( "dadfinalarabic", 0xfebe )
+>     , ( "dadinitialarabic", 0xfebf )
+>     , ( "dadmedialarabic", 0xfec0 )
+>     , ( "dagesh", 0x05bc )
+>     , ( "dageshhebrew", 0x05bc )
+>     , ( "dagger", 0x2020 )
+>     , ( "daggerdbl", 0x2021 )
+>     , ( "dagujarati", 0x0aa6 )
+>     , ( "dagurmukhi", 0x0a26 )
+>     , ( "dahiragana", 0x3060 )
+>     , ( "dakatakana", 0x30c0 )
+>     , ( "dalarabic", 0x062f )
+>     , ( "dalet", 0x05d3 )
+>     , ( "daletdagesh", 0xfb33 )
+>     , ( "daletdageshhebrew", 0xfb33 )
+>     , ( "dalethatafpatah", 0x05d3 )
+>     , ( "dalethatafpatahhebrew", 0x05d3 )
+>     , ( "dalethatafsegol", 0x05d3 )
+>     , ( "dalethatafsegolhebrew", 0x05d3 )
+>     , ( "dalethebrew", 0x05d3 )
+>     , ( "dalethiriq", 0x05d3 )
+>     , ( "dalethiriqhebrew", 0x05d3 )
+>     , ( "daletholam", 0x05d3 )
+>     , ( "daletholamhebrew", 0x05d3 )
+>     , ( "daletpatah", 0x05d3 )
+>     , ( "daletpatahhebrew", 0x05d3 )
+>     , ( "daletqamats", 0x05d3 )
+>     , ( "daletqamatshebrew", 0x05d3 )
+>     , ( "daletqubuts", 0x05d3 )
+>     , ( "daletqubutshebrew", 0x05d3 )
+>     , ( "daletsegol", 0x05d3 )
+>     , ( "daletsegolhebrew", 0x05d3 )
+>     , ( "daletsheva", 0x05d3 )
+>     , ( "daletshevahebrew", 0x05d3 )
+>     , ( "dalettsere", 0x05d3 )
+>     , ( "dalettserehebrew", 0x05d3 )
+>     , ( "dalfinalarabic", 0xfeaa )
+>     , ( "dammaarabic", 0x064f )
+>     , ( "dammalowarabic", 0x064f )
+>     , ( "dammatanaltonearabic", 0x064c )
+>     , ( "dammatanarabic", 0x064c )
+>     , ( "danda", 0x0964 )
+>     , ( "dargahebrew", 0x05a7 )
+>     , ( "dargalefthebrew", 0x05a7 )
+>     , ( "dasiapneumatacyrilliccmb", 0x0485 )
+>     , ( "dblGrave", 0xf6d3 )
+>     , ( "dblanglebracketleft", 0x300a )
+>     , ( "dblanglebracketleftvertical", 0xfe3d )
+>     , ( "dblanglebracketright", 0x300b )
+>     , ( "dblanglebracketrightvertical", 0xfe3e )
+>     , ( "dblarchinvertedbelowcmb", 0x032b )
+>     , ( "dblarrowleft", 0x21d4 )
+>     , ( "dblarrowright", 0x21d2 )
+>     , ( "dbldanda", 0x0965 )
+>     , ( "dblgrave", 0xf6d6 )
+>     , ( "dblgravecmb", 0x030f )
+>     , ( "dblintegral", 0x222c )
+>     , ( "dbllowline", 0x2017 )
+>     , ( "dbllowlinecmb", 0x0333 )
+>     , ( "dbloverlinecmb", 0x033f )
+>     , ( "dblprimemod", 0x02ba )
+>     , ( "dblverticalbar", 0x2016 )
+>     , ( "dblverticallineabovecmb", 0x030e )
+>     , ( "dbopomofo", 0x3109 )
+>     , ( "dbsquare", 0x33c8 )
+>     , ( "dcaron", 0x010f )
+>     , ( "dcedilla", 0x1e11 )
+>     , ( "dcircle", 0x24d3 )
+>     , ( "dcircumflexbelow", 0x1e13 )
+>     , ( "dcroat", 0x0111 )
+>     , ( "ddabengali", 0x09a1 )
+>     , ( "ddadeva", 0x0921 )
+>     , ( "ddagujarati", 0x0aa1 )
+>     , ( "ddagurmukhi", 0x0a21 )
+>     , ( "ddalarabic", 0x0688 )
+>     , ( "ddalfinalarabic", 0xfb89 )
+>     , ( "dddhadeva", 0x095c )
+>     , ( "ddhabengali", 0x09a2 )
+>     , ( "ddhadeva", 0x0922 )
+>     , ( "ddhagujarati", 0x0aa2 )
+>     , ( "ddhagurmukhi", 0x0a22 )
+>     , ( "ddotaccent", 0x1e0b )
+>     , ( "ddotbelow", 0x1e0d )
+>     , ( "decimalseparatorarabic", 0x066b )
+>     , ( "decimalseparatorpersian", 0x066b )
+>     , ( "decyrillic", 0x0434 )
+>     , ( "degree", 0x00b0 )
+>     , ( "dehihebrew", 0x05ad )
+>     , ( "dehiragana", 0x3067 )
+>     , ( "deicoptic", 0x03ef )
+>     , ( "dekatakana", 0x30c7 )
+>     , ( "deleteleft", 0x232b )
+>     , ( "deleteright", 0x2326 )
+>     , ( "delta", 0x03b4 )
+>     , ( "deltaturned", 0x018d )
+>     , ( "denominatorminusonenumeratorbengali", 0x09f8 )
+>     , ( "dezh", 0x02a4 )
+>     , ( "dhabengali", 0x09a7 )
+>     , ( "dhadeva", 0x0927 )
+>     , ( "dhagujarati", 0x0aa7 )
+>     , ( "dhagurmukhi", 0x0a27 )
+>     , ( "dhook", 0x0257 )
+>     , ( "dialytikatonos", 0x0385 )
+>     , ( "dialytikatonoscmb", 0x0344 )
+>     , ( "diamond", 0x2666 )
+>     , ( "diamondsuitwhite", 0x2662 )
+>     , ( "dieresis", 0x00a8 )
+>     , ( "dieresisacute", 0xf6d7 )
+>     , ( "dieresisbelowcmb", 0x0324 )
+>     , ( "dieresiscmb", 0x0308 )
+>     , ( "dieresisgrave", 0xf6d8 )
+>     , ( "dieresistonos", 0x0385 )
+>     , ( "dihiragana", 0x3062 )
+>     , ( "dikatakana", 0x30c2 )
+>     , ( "dittomark", 0x3003 )
+>     , ( "divide", 0x00f7 )
+>     , ( "divides", 0x2223 )
+>     , ( "divisionslash", 0x2215 )
+>     , ( "djecyrillic", 0x0452 )
+>     , ( "dkshade", 0x2593 )
+>     , ( "dlinebelow", 0x1e0f )
+>     , ( "dlsquare", 0x3397 )
+>     , ( "dmacron", 0x0111 )
+>     , ( "dmonospace", 0xff44 )
+>     , ( "dnblock", 0x2584 )
+>     , ( "dochadathai", 0x0e0e )
+>     , ( "dodekthai", 0x0e14 )
+>     , ( "dohiragana", 0x3069 )
+>     , ( "dokatakana", 0x30c9 )
+>     , ( "dollar", 0x0024 )
+>     , ( "dollarinferior", 0xf6e3 )
+>     , ( "dollarmonospace", 0xff04 )
+>     , ( "dollaroldstyle", 0xf724 )
+>     , ( "dollarsmall", 0xfe69 )
+>     , ( "dollarsuperior", 0xf6e4 )
+>     , ( "dong", 0x20ab )
+>     , ( "dorusquare", 0x3326 )
+>     , ( "dotaccent", 0x02d9 )
+>     , ( "dotaccentcmb", 0x0307 )
+>     , ( "dotbelowcmb", 0x0323 )
+>     , ( "dotbelowcomb", 0x0323 )
+>     , ( "dotkatakana", 0x30fb )
+>     , ( "dotlessi", 0x0131 )
+>     , ( "dotlessj", 0xf6be )
+>     , ( "dotlessjstrokehook", 0x0284 )
+>     , ( "dotmath", 0x22c5 )
+>     , ( "dottedcircle", 0x25cc )
+>     , ( "doubleyodpatah", 0xfb1f )
+>     , ( "doubleyodpatahhebrew", 0xfb1f )
+>     , ( "downtackbelowcmb", 0x031e )
+>     , ( "downtackmod", 0x02d5 )
+>     , ( "dparen", 0x249f )
+>     , ( "dsuperior", 0xf6eb )
+>     , ( "dtail", 0x0256 )
+>     , ( "dtopbar", 0x018c )
+>     , ( "duhiragana", 0x3065 )
+>     , ( "dukatakana", 0x30c5 )
+>     , ( "dz", 0x01f3 )
+>     , ( "dzaltone", 0x02a3 )
+>     , ( "dzcaron", 0x01c6 )
+>     , ( "dzcurl", 0x02a5 )
+>     , ( "dzeabkhasiancyrillic", 0x04e1 )
+>     , ( "dzecyrillic", 0x0455 )
+>     , ( "dzhecyrillic", 0x045f )
+>     , ( "e", 0x0065 )
+>     , ( "eacute", 0x00e9 )
+>     , ( "earth", 0x2641 )
+>     , ( "ebengali", 0x098f )
+>     , ( "ebopomofo", 0x311c )
+>     , ( "ebreve", 0x0115 )
+>     , ( "ecandradeva", 0x090d )
+>     , ( "ecandragujarati", 0x0a8d )
+>     , ( "ecandravowelsigndeva", 0x0945 )
+>     , ( "ecandravowelsigngujarati", 0x0ac5 )
+>     , ( "ecaron", 0x011b )
+>     , ( "ecedillabreve", 0x1e1d )
+>     , ( "echarmenian", 0x0565 )
+>     , ( "echyiwnarmenian", 0x0587 )
+>     , ( "ecircle", 0x24d4 )
+>     , ( "ecircumflex", 0x00ea )
+>     , ( "ecircumflexacute", 0x1ebf )
+>     , ( "ecircumflexbelow", 0x1e19 )
+>     , ( "ecircumflexdotbelow", 0x1ec7 )
+>     , ( "ecircumflexgrave", 0x1ec1 )
+>     , ( "ecircumflexhookabove", 0x1ec3 )
+>     , ( "ecircumflextilde", 0x1ec5 )
+>     , ( "ecyrillic", 0x0454 )
+>     , ( "edblgrave", 0x0205 )
+>     , ( "edeva", 0x090f )
+>     , ( "edieresis", 0x00eb )
+>     , ( "edot", 0x0117 )
+>     , ( "edotaccent", 0x0117 )
+>     , ( "edotbelow", 0x1eb9 )
+>     , ( "eegurmukhi", 0x0a0f )
+>     , ( "eematragurmukhi", 0x0a47 )
+>     , ( "efcyrillic", 0x0444 )
+>     , ( "egrave", 0x00e8 )
+>     , ( "egujarati", 0x0a8f )
+>     , ( "eharmenian", 0x0567 )
+>     , ( "ehbopomofo", 0x311d )
+>     , ( "ehiragana", 0x3048 )
+>     , ( "ehookabove", 0x1ebb )
+>     , ( "eibopomofo", 0x311f )
+>     , ( "eight", 0x0038 )
+>     , ( "eightarabic", 0x0668 )
+>     , ( "eightbengali", 0x09ee )
+>     , ( "eightcircle", 0x2467 )
+>     , ( "eightcircleinversesansserif", 0x2791 )
+>     , ( "eightdeva", 0x096e )
+>     , ( "eighteencircle", 0x2471 )
+>     , ( "eighteenparen", 0x2485 )
+>     , ( "eighteenperiod", 0x2499 )
+>     , ( "eightgujarati", 0x0aee )
+>     , ( "eightgurmukhi", 0x0a6e )
+>     , ( "eighthackarabic", 0x0668 )
+>     , ( "eighthangzhou", 0x3028 )
+>     , ( "eighthnotebeamed", 0x266b )
+>     , ( "eightideographicparen", 0x3227 )
+>     , ( "eightinferior", 0x2088 )
+>     , ( "eightmonospace", 0xff18 )
+>     , ( "eightoldstyle", 0xf738 )
+>     , ( "eightparen", 0x247b )
+>     , ( "eightperiod", 0x248f )
+>     , ( "eightpersian", 0x06f8 )
+>     , ( "eightroman", 0x2177 )
+>     , ( "eightsuperior", 0x2078 )
+>     , ( "eightthai", 0x0e58 )
+>     , ( "einvertedbreve", 0x0207 )
+>     , ( "eiotifiedcyrillic", 0x0465 )
+>     , ( "ekatakana", 0x30a8 )
+>     , ( "ekatakanahalfwidth", 0xff74 )
+>     , ( "ekonkargurmukhi", 0x0a74 )
+>     , ( "ekorean", 0x3154 )
+>     , ( "elcyrillic", 0x043b )
+>     , ( "element", 0x2208 )
+>     , ( "elevencircle", 0x246a )
+>     , ( "elevenparen", 0x247e )
+>     , ( "elevenperiod", 0x2492 )
+>     , ( "elevenroman", 0x217a )
+>     , ( "ellipsis", 0x2026 )
+>     , ( "ellipsisvertical", 0x22ee )
+>     , ( "emacron", 0x0113 )
+>     , ( "emacronacute", 0x1e17 )
+>     , ( "emacrongrave", 0x1e15 )
+>     , ( "emcyrillic", 0x043c )
+>     , ( "emdash", 0x2014 )
+>     , ( "emdashvertical", 0xfe31 )
+>     , ( "emonospace", 0xff45 )
+>     , ( "emphasismarkarmenian", 0x055b )
+>     , ( "emptyset", 0x2205 )
+>     , ( "enbopomofo", 0x3123 )
+>     , ( "encyrillic", 0x043d )
+>     , ( "endash", 0x2013 )
+>     , ( "endashvertical", 0xfe32 )
+>     , ( "endescendercyrillic", 0x04a3 )
+>     , ( "eng", 0x014b )
+>     , ( "engbopomofo", 0x3125 )
+>     , ( "enghecyrillic", 0x04a5 )
+>     , ( "enhookcyrillic", 0x04c8 )
+>     , ( "enspace", 0x2002 )
+>     , ( "eogonek", 0x0119 )
+>     , ( "eokorean", 0x3153 )
+>     , ( "eopen", 0x025b )
+>     , ( "eopenclosed", 0x029a )
+>     , ( "eopenreversed", 0x025c )
+>     , ( "eopenreversedclosed", 0x025e )
+>     , ( "eopenreversedhook", 0x025d )
+>     , ( "eparen", 0x24a0 )
+>     , ( "epsilon", 0x03b5 )
+>     , ( "epsilontonos", 0x03ad )
+>     , ( "equal", 0x003d )
+>     , ( "equalmonospace", 0xff1d )
+>     , ( "equalsmall", 0xfe66 )
+>     , ( "equalsuperior", 0x207c )
+>     , ( "equivalence", 0x2261 )
+>     , ( "erbopomofo", 0x3126 )
+>     , ( "ercyrillic", 0x0440 )
+>     , ( "ereversed", 0x0258 )
+>     , ( "ereversedcyrillic", 0x044d )
+>     , ( "escyrillic", 0x0441 )
+>     , ( "esdescendercyrillic", 0x04ab )
+>     , ( "esh", 0x0283 )
+>     , ( "eshcurl", 0x0286 )
+>     , ( "eshortdeva", 0x090e )
+>     , ( "eshortvowelsigndeva", 0x0946 )
+>     , ( "eshreversedloop", 0x01aa )
+>     , ( "eshsquatreversed", 0x0285 )
+>     , ( "esmallhiragana", 0x3047 )
+>     , ( "esmallkatakana", 0x30a7 )
+>     , ( "esmallkatakanahalfwidth", 0xff6a )
+>     , ( "estimated", 0x212e )
+>     , ( "esuperior", 0xf6ec )
+>     , ( "eta", 0x03b7 )
+>     , ( "etarmenian", 0x0568 )
+>     , ( "etatonos", 0x03ae )
+>     , ( "eth", 0x00f0 )
+>     , ( "etilde", 0x1ebd )
+>     , ( "etildebelow", 0x1e1b )
+>     , ( "etnahtafoukhhebrew", 0x0591 )
+>     , ( "etnahtafoukhlefthebrew", 0x0591 )
+>     , ( "etnahtahebrew", 0x0591 )
+>     , ( "etnahtalefthebrew", 0x0591 )
+>     , ( "eturned", 0x01dd )
+>     , ( "eukorean", 0x3161 )
+>     , ( "euro", 0x20ac )
+>     , ( "evowelsignbengali", 0x09c7 )
+>     , ( "evowelsigndeva", 0x0947 )
+>     , ( "evowelsigngujarati", 0x0ac7 )
+>     , ( "exclam", 0x0021 )
+>     , ( "exclamarmenian", 0x055c )
+>     , ( "exclamdbl", 0x203c )
+>     , ( "exclamdown", 0x00a1 )
+>     , ( "exclamdownsmall", 0xf7a1 )
+>     , ( "exclammonospace", 0xff01 )
+>     , ( "exclamsmall", 0xf721 )
+>     , ( "existential", 0x2203 )
+>     , ( "ezh", 0x0292 )
+>     , ( "ezhcaron", 0x01ef )
+>     , ( "ezhcurl", 0x0293 )
+>     , ( "ezhreversed", 0x01b9 )
+>     , ( "ezhtail", 0x01ba )
+>     , ( "f", 0x0066 )
+>     , ( "fadeva", 0x095e )
+>     , ( "fagurmukhi", 0x0a5e )
+>     , ( "fahrenheit", 0x2109 )
+>     , ( "fathaarabic", 0x064e )
+>     , ( "fathalowarabic", 0x064e )
+>     , ( "fathatanarabic", 0x064b )
+>     , ( "fbopomofo", 0x3108 )
+>     , ( "fcircle", 0x24d5 )
+>     , ( "fdotaccent", 0x1e1f )
+>     , ( "feharabic", 0x0641 )
+>     , ( "feharmenian", 0x0586 )
+>     , ( "fehfinalarabic", 0xfed2 )
+>     , ( "fehinitialarabic", 0xfed3 )
+>     , ( "fehmedialarabic", 0xfed4 )
+>     , ( "feicoptic", 0x03e5 )
+>     , ( "female", 0x2640 )
+>     , ( "ff", 0xfb00 )
+>     , ( "ffi", 0xfb03 )
+>     , ( "ffl", 0xfb04 )
+>     , ( "fi", 0xfb01 )
+>     , ( "fifteencircle", 0x246e )
+>     , ( "fifteenparen", 0x2482 )
+>     , ( "fifteenperiod", 0x2496 )
+>     , ( "figuredash", 0x2012 )
+>     , ( "filledbox", 0x25a0 )
+>     , ( "filledrect", 0x25ac )
+>     , ( "finalkaf", 0x05da )
+>     , ( "finalkafdagesh", 0xfb3a )
+>     , ( "finalkafdageshhebrew", 0xfb3a )
+>     , ( "finalkafhebrew", 0x05da )
+>     , ( "finalkafqamats", 0x05da )
+>     , ( "finalkafqamatshebrew", 0x05da )
+>     , ( "finalkafsheva", 0x05da )
+>     , ( "finalkafshevahebrew", 0x05da )
+>     , ( "finalmem", 0x05dd )
+>     , ( "finalmemhebrew", 0x05dd )
+>     , ( "finalnun", 0x05df )
+>     , ( "finalnunhebrew", 0x05df )
+>     , ( "finalpe", 0x05e3 )
+>     , ( "finalpehebrew", 0x05e3 )
+>     , ( "finaltsadi", 0x05e5 )
+>     , ( "finaltsadihebrew", 0x05e5 )
+>     , ( "firsttonechinese", 0x02c9 )
+>     , ( "fisheye", 0x25c9 )
+>     , ( "fitacyrillic", 0x0473 )
+>     , ( "five", 0x0035 )
+>     , ( "fivearabic", 0x0665 )
+>     , ( "fivebengali", 0x09eb )
+>     , ( "fivecircle", 0x2464 )
+>     , ( "fivecircleinversesansserif", 0x278e )
+>     , ( "fivedeva", 0x096b )
+>     , ( "fiveeighths", 0x215d )
+>     , ( "fivegujarati", 0x0aeb )
+>     , ( "fivegurmukhi", 0x0a6b )
+>     , ( "fivehackarabic", 0x0665 )
+>     , ( "fivehangzhou", 0x3025 )
+>     , ( "fiveideographicparen", 0x3224 )
+>     , ( "fiveinferior", 0x2085 )
+>     , ( "fivemonospace", 0xff15 )
+>     , ( "fiveoldstyle", 0xf735 )
+>     , ( "fiveparen", 0x2478 )
+>     , ( "fiveperiod", 0x248c )
+>     , ( "fivepersian", 0x06f5 )
+>     , ( "fiveroman", 0x2174 )
+>     , ( "fivesuperior", 0x2075 )
+>     , ( "fivethai", 0x0e55 )
+>     , ( "fl", 0xfb02 )
+>     , ( "florin", 0x0192 )
+>     , ( "fmonospace", 0xff46 )
+>     , ( "fmsquare", 0x3399 )
+>     , ( "fofanthai", 0x0e1f )
+>     , ( "fofathai", 0x0e1d )
+>     , ( "fongmanthai", 0x0e4f )
+>     , ( "forall", 0x2200 )
+>     , ( "four", 0x0034 )
+>     , ( "fourarabic", 0x0664 )
+>     , ( "fourbengali", 0x09ea )
+>     , ( "fourcircle", 0x2463 )
+>     , ( "fourcircleinversesansserif", 0x278d )
+>     , ( "fourdeva", 0x096a )
+>     , ( "fourgujarati", 0x0aea )
+>     , ( "fourgurmukhi", 0x0a6a )
+>     , ( "fourhackarabic", 0x0664 )
+>     , ( "fourhangzhou", 0x3024 )
+>     , ( "fourideographicparen", 0x3223 )
+>     , ( "fourinferior", 0x2084 )
+>     , ( "fourmonospace", 0xff14 )
+>     , ( "fournumeratorbengali", 0x09f7 )
+>     , ( "fouroldstyle", 0xf734 )
+>     , ( "fourparen", 0x2477 )
+>     , ( "fourperiod", 0x248b )
+>     , ( "fourpersian", 0x06f4 )
+>     , ( "fourroman", 0x2173 )
+>     , ( "foursuperior", 0x2074 )
+>     , ( "fourteencircle", 0x246d )
+>     , ( "fourteenparen", 0x2481 )
+>     , ( "fourteenperiod", 0x2495 )
+>     , ( "fourthai", 0x0e54 )
+>     , ( "fourthtonechinese", 0x02cb )
+>     , ( "fparen", 0x24a1 )
+>     , ( "fraction", 0x2044 )
+>     , ( "franc", 0x20a3 )
+>     , ( "g", 0x0067 )
+>     , ( "gabengali", 0x0997 )
+>     , ( "gacute", 0x01f5 )
+>     , ( "gadeva", 0x0917 )
+>     , ( "gafarabic", 0x06af )
+>     , ( "gaffinalarabic", 0xfb93 )
+>     , ( "gafinitialarabic", 0xfb94 )
+>     , ( "gafmedialarabic", 0xfb95 )
+>     , ( "gagujarati", 0x0a97 )
+>     , ( "gagurmukhi", 0x0a17 )
+>     , ( "gahiragana", 0x304c )
+>     , ( "gakatakana", 0x30ac )
+>     , ( "gamma", 0x03b3 )
+>     , ( "gammalatinsmall", 0x0263 )
+>     , ( "gammasuperior", 0x02e0 )
+>     , ( "gangiacoptic", 0x03eb )
+>     , ( "gbopomofo", 0x310d )
+>     , ( "gbreve", 0x011f )
+>     , ( "gcaron", 0x01e7 )
+>     , ( "gcedilla", 0x0123 )
+>     , ( "gcircle", 0x24d6 )
+>     , ( "gcircumflex", 0x011d )
+>     , ( "gcommaaccent", 0x0123 )
+>     , ( "gdot", 0x0121 )
+>     , ( "gdotaccent", 0x0121 )
+>     , ( "gecyrillic", 0x0433 )
+>     , ( "gehiragana", 0x3052 )
+>     , ( "gekatakana", 0x30b2 )
+>     , ( "geometricallyequal", 0x2251 )
+>     , ( "gereshaccenthebrew", 0x059c )
+>     , ( "gereshhebrew", 0x05f3 )
+>     , ( "gereshmuqdamhebrew", 0x059d )
+>     , ( "germandbls", 0x00df )
+>     , ( "gershayimaccenthebrew", 0x059e )
+>     , ( "gershayimhebrew", 0x05f4 )
+>     , ( "getamark", 0x3013 )
+>     , ( "ghabengali", 0x0998 )
+>     , ( "ghadarmenian", 0x0572 )
+>     , ( "ghadeva", 0x0918 )
+>     , ( "ghagujarati", 0x0a98 )
+>     , ( "ghagurmukhi", 0x0a18 )
+>     , ( "ghainarabic", 0x063a )
+>     , ( "ghainfinalarabic", 0xfece )
+>     , ( "ghaininitialarabic", 0xfecf )
+>     , ( "ghainmedialarabic", 0xfed0 )
+>     , ( "ghemiddlehookcyrillic", 0x0495 )
+>     , ( "ghestrokecyrillic", 0x0493 )
+>     , ( "gheupturncyrillic", 0x0491 )
+>     , ( "ghhadeva", 0x095a )
+>     , ( "ghhagurmukhi", 0x0a5a )
+>     , ( "ghook", 0x0260 )
+>     , ( "ghzsquare", 0x3393 )
+>     , ( "gihiragana", 0x304e )
+>     , ( "gikatakana", 0x30ae )
+>     , ( "gimarmenian", 0x0563 )
+>     , ( "gimel", 0x05d2 )
+>     , ( "gimeldagesh", 0xfb32 )
+>     , ( "gimeldageshhebrew", 0xfb32 )
+>     , ( "gimelhebrew", 0x05d2 )
+>     , ( "gjecyrillic", 0x0453 )
+>     , ( "glottalinvertedstroke", 0x01be )
+>     , ( "glottalstop", 0x0294 )
+>     , ( "glottalstopinverted", 0x0296 )
+>     , ( "glottalstopmod", 0x02c0 )
+>     , ( "glottalstopreversed", 0x0295 )
+>     , ( "glottalstopreversedmod", 0x02c1 )
+>     , ( "glottalstopreversedsuperior", 0x02e4 )
+>     , ( "glottalstopstroke", 0x02a1 )
+>     , ( "glottalstopstrokereversed", 0x02a2 )
+>     , ( "gmacron", 0x1e21 )
+>     , ( "gmonospace", 0xff47 )
+>     , ( "gohiragana", 0x3054 )
+>     , ( "gokatakana", 0x30b4 )
+>     , ( "gparen", 0x24a2 )
+>     , ( "gpasquare", 0x33ac )
+>     , ( "gradient", 0x2207 )
+>     , ( "grave", 0x0060 )
+>     , ( "gravebelowcmb", 0x0316 )
+>     , ( "gravecmb", 0x0300 )
+>     , ( "gravecomb", 0x0300 )
+>     , ( "gravedeva", 0x0953 )
+>     , ( "gravelowmod", 0x02ce )
+>     , ( "gravemonospace", 0xff40 )
+>     , ( "gravetonecmb", 0x0340 )
+>     , ( "greater", 0x003e )
+>     , ( "greaterequal", 0x2265 )
+>     , ( "greaterequalorless", 0x22db )
+>     , ( "greatermonospace", 0xff1e )
+>     , ( "greaterorequivalent", 0x2273 )
+>     , ( "greaterorless", 0x2277 )
+>     , ( "greateroverequal", 0x2267 )
+>     , ( "greatersmall", 0xfe65 )
+>     , ( "gscript", 0x0261 )
+>     , ( "gstroke", 0x01e5 )
+>     , ( "guhiragana", 0x3050 )
+>     , ( "guillemotleft", 0x00ab )
+>     , ( "guillemotright", 0x00bb )
+>     , ( "guilsinglleft", 0x2039 )
+>     , ( "guilsinglright", 0x203a )
+>     , ( "gukatakana", 0x30b0 )
+>     , ( "guramusquare", 0x3318 )
+>     , ( "gysquare", 0x33c9 )
+>     , ( "h", 0x0068 )
+>     , ( "haabkhasiancyrillic", 0x04a9 )
+>     , ( "haaltonearabic", 0x06c1 )
+>     , ( "habengali", 0x09b9 )
+>     , ( "hadescendercyrillic", 0x04b3 )
+>     , ( "hadeva", 0x0939 )
+>     , ( "hagujarati", 0x0ab9 )
+>     , ( "hagurmukhi", 0x0a39 )
+>     , ( "haharabic", 0x062d )
+>     , ( "hahfinalarabic", 0xfea2 )
+>     , ( "hahinitialarabic", 0xfea3 )
+>     , ( "hahiragana", 0x306f )
+>     , ( "hahmedialarabic", 0xfea4 )
+>     , ( "haitusquare", 0x332a )
+>     , ( "hakatakana", 0x30cf )
+>     , ( "hakatakanahalfwidth", 0xff8a )
+>     , ( "halantgurmukhi", 0x0a4d )
+>     , ( "hamzaarabic", 0x0621 )
+>     , ( "hamzadammaarabic", 0x0621 )
+>     , ( "hamzadammatanarabic", 0x0621 )
+>     , ( "hamzafathaarabic", 0x0621 )
+>     , ( "hamzafathatanarabic", 0x0621 )
+>     , ( "hamzalowarabic", 0x0621 )
+>     , ( "hamzalowkasraarabic", 0x0621 )
+>     , ( "hamzalowkasratanarabic", 0x0621 )
+>     , ( "hamzasukunarabic", 0x0621 )
+>     , ( "hangulfiller", 0x3164 )
+>     , ( "hardsigncyrillic", 0x044a )
+>     , ( "harpoonleftbarbup", 0x21bc )
+>     , ( "harpoonrightbarbup", 0x21c0 )
+>     , ( "hasquare", 0x33ca )
+>     , ( "hatafpatah", 0x05b2 )
+>     , ( "hatafpatah16", 0x05b2 )
+>     , ( "hatafpatah23", 0x05b2 )
+>     , ( "hatafpatah2f", 0x05b2 )
+>     , ( "hatafpatahhebrew", 0x05b2 )
+>     , ( "hatafpatahnarrowhebrew", 0x05b2 )
+>     , ( "hatafpatahquarterhebrew", 0x05b2 )
+>     , ( "hatafpatahwidehebrew", 0x05b2 )
+>     , ( "hatafqamats", 0x05b3 )
+>     , ( "hatafqamats1b", 0x05b3 )
+>     , ( "hatafqamats28", 0x05b3 )
+>     , ( "hatafqamats34", 0x05b3 )
+>     , ( "hatafqamatshebrew", 0x05b3 )
+>     , ( "hatafqamatsnarrowhebrew", 0x05b3 )
+>     , ( "hatafqamatsquarterhebrew", 0x05b3 )
+>     , ( "hatafqamatswidehebrew", 0x05b3 )
+>     , ( "hatafsegol", 0x05b1 )
+>     , ( "hatafsegol17", 0x05b1 )
+>     , ( "hatafsegol24", 0x05b1 )
+>     , ( "hatafsegol30", 0x05b1 )
+>     , ( "hatafsegolhebrew", 0x05b1 )
+>     , ( "hatafsegolnarrowhebrew", 0x05b1 )
+>     , ( "hatafsegolquarterhebrew", 0x05b1 )
+>     , ( "hatafsegolwidehebrew", 0x05b1 )
+>     , ( "hbar", 0x0127 )
+>     , ( "hbopomofo", 0x310f )
+>     , ( "hbrevebelow", 0x1e2b )
+>     , ( "hcedilla", 0x1e29 )
+>     , ( "hcircle", 0x24d7 )
+>     , ( "hcircumflex", 0x0125 )
+>     , ( "hdieresis", 0x1e27 )
+>     , ( "hdotaccent", 0x1e23 )
+>     , ( "hdotbelow", 0x1e25 )
+>     , ( "he", 0x05d4 )
+>     , ( "heart", 0x2665 )
+>     , ( "heartsuitblack", 0x2665 )
+>     , ( "heartsuitwhite", 0x2661 )
+>     , ( "hedagesh", 0xfb34 )
+>     , ( "hedageshhebrew", 0xfb34 )
+>     , ( "hehaltonearabic", 0x06c1 )
+>     , ( "heharabic", 0x0647 )
+>     , ( "hehebrew", 0x05d4 )
+>     , ( "hehfinalaltonearabic", 0xfba7 )
+>     , ( "hehfinalalttwoarabic", 0xfeea )
+>     , ( "hehfinalarabic", 0xfeea )
+>     , ( "hehhamzaabovefinalarabic", 0xfba5 )
+>     , ( "hehhamzaaboveisolatedarabic", 0xfba4 )
+>     , ( "hehinitialaltonearabic", 0xfba8 )
+>     , ( "hehinitialarabic", 0xfeeb )
+>     , ( "hehiragana", 0x3078 )
+>     , ( "hehmedialaltonearabic", 0xfba9 )
+>     , ( "hehmedialarabic", 0xfeec )
+>     , ( "heiseierasquare", 0x337b )
+>     , ( "hekatakana", 0x30d8 )
+>     , ( "hekatakanahalfwidth", 0xff8d )
+>     , ( "hekutaarusquare", 0x3336 )
+>     , ( "henghook", 0x0267 )
+>     , ( "herutusquare", 0x3339 )
+>     , ( "het", 0x05d7 )
+>     , ( "hethebrew", 0x05d7 )
+>     , ( "hhook", 0x0266 )
+>     , ( "hhooksuperior", 0x02b1 )
+>     , ( "hieuhacirclekorean", 0x327b )
+>     , ( "hieuhaparenkorean", 0x321b )
+>     , ( "hieuhcirclekorean", 0x326d )
+>     , ( "hieuhkorean", 0x314e )
+>     , ( "hieuhparenkorean", 0x320d )
+>     , ( "hihiragana", 0x3072 )
+>     , ( "hikatakana", 0x30d2 )
+>     , ( "hikatakanahalfwidth", 0xff8b )
+>     , ( "hiriq", 0x05b4 )
+>     , ( "hiriq14", 0x05b4 )
+>     , ( "hiriq21", 0x05b4 )
+>     , ( "hiriq2d", 0x05b4 )
+>     , ( "hiriqhebrew", 0x05b4 )
+>     , ( "hiriqnarrowhebrew", 0x05b4 )
+>     , ( "hiriqquarterhebrew", 0x05b4 )
+>     , ( "hiriqwidehebrew", 0x05b4 )
+>     , ( "hlinebelow", 0x1e96 )
+>     , ( "hmonospace", 0xff48 )
+>     , ( "hoarmenian", 0x0570 )
+>     , ( "hohipthai", 0x0e2b )
+>     , ( "hohiragana", 0x307b )
+>     , ( "hokatakana", 0x30db )
+>     , ( "hokatakanahalfwidth", 0xff8e )
+>     , ( "holam", 0x05b9 )
+>     , ( "holam19", 0x05b9 )
+>     , ( "holam26", 0x05b9 )
+>     , ( "holam32", 0x05b9 )
+>     , ( "holamhebrew", 0x05b9 )
+>     , ( "holamnarrowhebrew", 0x05b9 )
+>     , ( "holamquarterhebrew", 0x05b9 )
+>     , ( "holamwidehebrew", 0x05b9 )
+>     , ( "honokhukthai", 0x0e2e )
+>     , ( "hookabovecomb", 0x0309 )
+>     , ( "hookcmb", 0x0309 )
+>     , ( "hookpalatalizedbelowcmb", 0x0321 )
+>     , ( "hookretroflexbelowcmb", 0x0322 )
+>     , ( "hoonsquare", 0x3342 )
+>     , ( "horicoptic", 0x03e9 )
+>     , ( "horizontalbar", 0x2015 )
+>     , ( "horncmb", 0x031b )
+>     , ( "hotsprings", 0x2668 )
+>     , ( "house", 0x2302 )
+>     , ( "hparen", 0x24a3 )
+>     , ( "hsuperior", 0x02b0 )
+>     , ( "hturned", 0x0265 )
+>     , ( "huhiragana", 0x3075 )
+>     , ( "huiitosquare", 0x3333 )
+>     , ( "hukatakana", 0x30d5 )
+>     , ( "hukatakanahalfwidth", 0xff8c )
+>     , ( "hungarumlaut", 0x02dd )
+>     , ( "hungarumlautcmb", 0x030b )
+>     , ( "hv", 0x0195 )
+>     , ( "hyphen", 0x002d )
+>     , ( "hypheninferior", 0xf6e5 )
+>     , ( "hyphenmonospace", 0xff0d )
+>     , ( "hyphensmall", 0xfe63 )
+>     , ( "hyphensuperior", 0xf6e6 )
+>     , ( "hyphentwo", 0x2010 )
+>     , ( "i", 0x0069 )
+>     , ( "iacute", 0x00ed )
+>     , ( "iacyrillic", 0x044f )
+>     , ( "ibengali", 0x0987 )
+>     , ( "ibopomofo", 0x3127 )
+>     , ( "ibreve", 0x012d )
+>     , ( "icaron", 0x01d0 )
+>     , ( "icircle", 0x24d8 )
+>     , ( "icircumflex", 0x00ee )
+>     , ( "icyrillic", 0x0456 )
+>     , ( "idblgrave", 0x0209 )
+>     , ( "ideographearthcircle", 0x328f )
+>     , ( "ideographfirecircle", 0x328b )
+>     , ( "ideographicallianceparen", 0x323f )
+>     , ( "ideographiccallparen", 0x323a )
+>     , ( "ideographiccentrecircle", 0x32a5 )
+>     , ( "ideographicclose", 0x3006 )
+>     , ( "ideographiccomma", 0x3001 )
+>     , ( "ideographiccommaleft", 0xff64 )
+>     , ( "ideographiccongratulationparen", 0x3237 )
+>     , ( "ideographiccorrectcircle", 0x32a3 )
+>     , ( "ideographicearthparen", 0x322f )
+>     , ( "ideographicenterpriseparen", 0x323d )
+>     , ( "ideographicexcellentcircle", 0x329d )
+>     , ( "ideographicfestivalparen", 0x3240 )
+>     , ( "ideographicfinancialcircle", 0x3296 )
+>     , ( "ideographicfinancialparen", 0x3236 )
+>     , ( "ideographicfireparen", 0x322b )
+>     , ( "ideographichaveparen", 0x3232 )
+>     , ( "ideographichighcircle", 0x32a4 )
+>     , ( "ideographiciterationmark", 0x3005 )
+>     , ( "ideographiclaborcircle", 0x3298 )
+>     , ( "ideographiclaborparen", 0x3238 )
+>     , ( "ideographicleftcircle", 0x32a7 )
+>     , ( "ideographiclowcircle", 0x32a6 )
+>     , ( "ideographicmedicinecircle", 0x32a9 )
+>     , ( "ideographicmetalparen", 0x322e )
+>     , ( "ideographicmoonparen", 0x322a )
+>     , ( "ideographicnameparen", 0x3234 )
+>     , ( "ideographicperiod", 0x3002 )
+>     , ( "ideographicprintcircle", 0x329e )
+>     , ( "ideographicreachparen", 0x3243 )
+>     , ( "ideographicrepresentparen", 0x3239 )
+>     , ( "ideographicresourceparen", 0x323e )
+>     , ( "ideographicrightcircle", 0x32a8 )
+>     , ( "ideographicsecretcircle", 0x3299 )
+>     , ( "ideographicselfparen", 0x3242 )
+>     , ( "ideographicsocietyparen", 0x3233 )
+>     , ( "ideographicspace", 0x3000 )
+>     , ( "ideographicspecialparen", 0x3235 )
+>     , ( "ideographicstockparen", 0x3231 )
+>     , ( "ideographicstudyparen", 0x323b )
+>     , ( "ideographicsunparen", 0x3230 )
+>     , ( "ideographicsuperviseparen", 0x323c )
+>     , ( "ideographicwaterparen", 0x322c )
+>     , ( "ideographicwoodparen", 0x322d )
+>     , ( "ideographiczero", 0x3007 )
+>     , ( "ideographmetalcircle", 0x328e )
+>     , ( "ideographmooncircle", 0x328a )
+>     , ( "ideographnamecircle", 0x3294 )
+>     , ( "ideographsuncircle", 0x3290 )
+>     , ( "ideographwatercircle", 0x328c )
+>     , ( "ideographwoodcircle", 0x328d )
+>     , ( "ideva", 0x0907 )
+>     , ( "idieresis", 0x00ef )
+>     , ( "idieresisacute", 0x1e2f )
+>     , ( "idieresiscyrillic", 0x04e5 )
+>     , ( "idotbelow", 0x1ecb )
+>     , ( "iebrevecyrillic", 0x04d7 )
+>     , ( "iecyrillic", 0x0435 )
+>     , ( "ieungacirclekorean", 0x3275 )
+>     , ( "ieungaparenkorean", 0x3215 )
+>     , ( "ieungcirclekorean", 0x3267 )
+>     , ( "ieungkorean", 0x3147 )
+>     , ( "ieungparenkorean", 0x3207 )
+>     , ( "igrave", 0x00ec )
+>     , ( "igujarati", 0x0a87 )
+>     , ( "igurmukhi", 0x0a07 )
+>     , ( "ihiragana", 0x3044 )
+>     , ( "ihookabove", 0x1ec9 )
+>     , ( "iibengali", 0x0988 )
+>     , ( "iicyrillic", 0x0438 )
+>     , ( "iideva", 0x0908 )
+>     , ( "iigujarati", 0x0a88 )
+>     , ( "iigurmukhi", 0x0a08 )
+>     , ( "iimatragurmukhi", 0x0a40 )
+>     , ( "iinvertedbreve", 0x020b )
+>     , ( "iishortcyrillic", 0x0439 )
+>     , ( "iivowelsignbengali", 0x09c0 )
+>     , ( "iivowelsigndeva", 0x0940 )
+>     , ( "iivowelsigngujarati", 0x0ac0 )
+>     , ( "ij", 0x0133 )
+>     , ( "ikatakana", 0x30a4 )
+>     , ( "ikatakanahalfwidth", 0xff72 )
+>     , ( "ikorean", 0x3163 )
+>     , ( "ilde", 0x02dc )
+>     , ( "iluyhebrew", 0x05ac )
+>     , ( "imacron", 0x012b )
+>     , ( "imacroncyrillic", 0x04e3 )
+>     , ( "imageorapproximatelyequal", 0x2253 )
+>     , ( "imatragurmukhi", 0x0a3f )
+>     , ( "imonospace", 0xff49 )
+>     , ( "increment", 0x2206 )
+>     , ( "infinity", 0x221e )
+>     , ( "iniarmenian", 0x056b )
+>     , ( "integral", 0x222b )
+>     , ( "integralbottom", 0x2321 )
+>     , ( "integralbt", 0x2321 )
+>     , ( "integralex", 0xf8f5 )
+>     , ( "integraltop", 0x2320 )
+>     , ( "integraltp", 0x2320 )
+>     , ( "intersection", 0x2229 )
+>     , ( "intisquare", 0x3305 )
+>     , ( "invbullet", 0x25d8 )
+>     , ( "invcircle", 0x25d9 )
+>     , ( "invsmileface", 0x263b )
+>     , ( "iocyrillic", 0x0451 )
+>     , ( "iogonek", 0x012f )
+>     , ( "iota", 0x03b9 )
+>     , ( "iotadieresis", 0x03ca )
+>     , ( "iotadieresistonos", 0x0390 )
+>     , ( "iotalatin", 0x0269 )
+>     , ( "iotatonos", 0x03af )
+>     , ( "iparen", 0x24a4 )
+>     , ( "irigurmukhi", 0x0a72 )
+>     , ( "ismallhiragana", 0x3043 )
+>     , ( "ismallkatakana", 0x30a3 )
+>     , ( "ismallkatakanahalfwidth", 0xff68 )
+>     , ( "issharbengali", 0x09fa )
+>     , ( "istroke", 0x0268 )
+>     , ( "isuperior", 0xf6ed )
+>     , ( "iterationhiragana", 0x309d )
+>     , ( "iterationkatakana", 0x30fd )
+>     , ( "itilde", 0x0129 )
+>     , ( "itildebelow", 0x1e2d )
+>     , ( "iubopomofo", 0x3129 )
+>     , ( "iucyrillic", 0x044e )
+>     , ( "ivowelsignbengali", 0x09bf )
+>     , ( "ivowelsigndeva", 0x093f )
+>     , ( "ivowelsigngujarati", 0x0abf )
+>     , ( "izhitsacyrillic", 0x0475 )
+>     , ( "izhitsadblgravecyrillic", 0x0477 )
+>     , ( "j", 0x006a )
+>     , ( "jaarmenian", 0x0571 )
+>     , ( "jabengali", 0x099c )
+>     , ( "jadeva", 0x091c )
+>     , ( "jagujarati", 0x0a9c )
+>     , ( "jagurmukhi", 0x0a1c )
+>     , ( "jbopomofo", 0x3110 )
+>     , ( "jcaron", 0x01f0 )
+>     , ( "jcircle", 0x24d9 )
+>     , ( "jcircumflex", 0x0135 )
+>     , ( "jcrossedtail", 0x029d )
+>     , ( "jdotlessstroke", 0x025f )
+>     , ( "jecyrillic", 0x0458 )
+>     , ( "jeemarabic", 0x062c )
+>     , ( "jeemfinalarabic", 0xfe9e )
+>     , ( "jeeminitialarabic", 0xfe9f )
+>     , ( "jeemmedialarabic", 0xfea0 )
+>     , ( "jeharabic", 0x0698 )
+>     , ( "jehfinalarabic", 0xfb8b )
+>     , ( "jhabengali", 0x099d )
+>     , ( "jhadeva", 0x091d )
+>     , ( "jhagujarati", 0x0a9d )
+>     , ( "jhagurmukhi", 0x0a1d )
+>     , ( "jheharmenian", 0x057b )
+>     , ( "jis", 0x3004 )
+>     , ( "jmonospace", 0xff4a )
+>     , ( "jparen", 0x24a5 )
+>     , ( "jsuperior", 0x02b2 )
+>     , ( "k", 0x006b )
+>     , ( "kabashkircyrillic", 0x04a1 )
+>     , ( "kabengali", 0x0995 )
+>     , ( "kacute", 0x1e31 )
+>     , ( "kacyrillic", 0x043a )
+>     , ( "kadescendercyrillic", 0x049b )
+>     , ( "kadeva", 0x0915 )
+>     , ( "kaf", 0x05db )
+>     , ( "kafarabic", 0x0643 )
+>     , ( "kafdagesh", 0xfb3b )
+>     , ( "kafdageshhebrew", 0xfb3b )
+>     , ( "kaffinalarabic", 0xfeda )
+>     , ( "kafhebrew", 0x05db )
+>     , ( "kafinitialarabic", 0xfedb )
+>     , ( "kafmedialarabic", 0xfedc )
+>     , ( "kafrafehebrew", 0xfb4d )
+>     , ( "kagujarati", 0x0a95 )
+>     , ( "kagurmukhi", 0x0a15 )
+>     , ( "kahiragana", 0x304b )
+>     , ( "kahookcyrillic", 0x04c4 )
+>     , ( "kakatakana", 0x30ab )
+>     , ( "kakatakanahalfwidth", 0xff76 )
+>     , ( "kappa", 0x03ba )
+>     , ( "kappasymbolgreek", 0x03f0 )
+>     , ( "kapyeounmieumkorean", 0x3171 )
+>     , ( "kapyeounphieuphkorean", 0x3184 )
+>     , ( "kapyeounpieupkorean", 0x3178 )
+>     , ( "kapyeounssangpieupkorean", 0x3179 )
+>     , ( "karoriisquare", 0x330d )
+>     , ( "kashidaautoarabic", 0x0640 )
+>     , ( "kashidaautonosidebearingarabic", 0x0640 )
+>     , ( "kasmallkatakana", 0x30f5 )
+>     , ( "kasquare", 0x3384 )
+>     , ( "kasraarabic", 0x0650 )
+>     , ( "kasratanarabic", 0x064d )
+>     , ( "kastrokecyrillic", 0x049f )
+>     , ( "katahiraprolongmarkhalfwidth", 0xff70 )
+>     , ( "kaverticalstrokecyrillic", 0x049d )
+>     , ( "kbopomofo", 0x310e )
+>     , ( "kcalsquare", 0x3389 )
+>     , ( "kcaron", 0x01e9 )
+>     , ( "kcedilla", 0x0137 )
+>     , ( "kcircle", 0x24da )
+>     , ( "kcommaaccent", 0x0137 )
+>     , ( "kdotbelow", 0x1e33 )
+>     , ( "keharmenian", 0x0584 )
+>     , ( "kehiragana", 0x3051 )
+>     , ( "kekatakana", 0x30b1 )
+>     , ( "kekatakanahalfwidth", 0xff79 )
+>     , ( "kenarmenian", 0x056f )
+>     , ( "kesmallkatakana", 0x30f6 )
+>     , ( "kgreenlandic", 0x0138 )
+>     , ( "khabengali", 0x0996 )
+>     , ( "khacyrillic", 0x0445 )
+>     , ( "khadeva", 0x0916 )
+>     , ( "khagujarati", 0x0a96 )
+>     , ( "khagurmukhi", 0x0a16 )
+>     , ( "khaharabic", 0x062e )
+>     , ( "khahfinalarabic", 0xfea6 )
+>     , ( "khahinitialarabic", 0xfea7 )
+>     , ( "khahmedialarabic", 0xfea8 )
+>     , ( "kheicoptic", 0x03e7 )
+>     , ( "khhadeva", 0x0959 )
+>     , ( "khhagurmukhi", 0x0a59 )
+>     , ( "khieukhacirclekorean", 0x3278 )
+>     , ( "khieukhaparenkorean", 0x3218 )
+>     , ( "khieukhcirclekorean", 0x326a )
+>     , ( "khieukhkorean", 0x314b )
+>     , ( "khieukhparenkorean", 0x320a )
+>     , ( "khokhaithai", 0x0e02 )
+>     , ( "khokhonthai", 0x0e05 )
+>     , ( "khokhuatthai", 0x0e03 )
+>     , ( "khokhwaithai", 0x0e04 )
+>     , ( "khomutthai", 0x0e5b )
+>     , ( "khook", 0x0199 )
+>     , ( "khorakhangthai", 0x0e06 )
+>     , ( "khzsquare", 0x3391 )
+>     , ( "kihiragana", 0x304d )
+>     , ( "kikatakana", 0x30ad )
+>     , ( "kikatakanahalfwidth", 0xff77 )
+>     , ( "kiroguramusquare", 0x3315 )
+>     , ( "kiromeetorusquare", 0x3316 )
+>     , ( "kirosquare", 0x3314 )
+>     , ( "kiyeokacirclekorean", 0x326e )
+>     , ( "kiyeokaparenkorean", 0x320e )
+>     , ( "kiyeokcirclekorean", 0x3260 )
+>     , ( "kiyeokkorean", 0x3131 )
+>     , ( "kiyeokparenkorean", 0x3200 )
+>     , ( "kiyeoksioskorean", 0x3133 )
+>     , ( "kjecyrillic", 0x045c )
+>     , ( "klinebelow", 0x1e35 )
+>     , ( "klsquare", 0x3398 )
+>     , ( "kmcubedsquare", 0x33a6 )
+>     , ( "kmonospace", 0xff4b )
+>     , ( "kmsquaredsquare", 0x33a2 )
+>     , ( "kohiragana", 0x3053 )
+>     , ( "kohmsquare", 0x33c0 )
+>     , ( "kokaithai", 0x0e01 )
+>     , ( "kokatakana", 0x30b3 )
+>     , ( "kokatakanahalfwidth", 0xff7a )
+>     , ( "kooposquare", 0x331e )
+>     , ( "koppacyrillic", 0x0481 )
+>     , ( "koreanstandardsymbol", 0x327f )
+>     , ( "koroniscmb", 0x0343 )
+>     , ( "kparen", 0x24a6 )
+>     , ( "kpasquare", 0x33aa )
+>     , ( "ksicyrillic", 0x046f )
+>     , ( "ktsquare", 0x33cf )
+>     , ( "kturned", 0x029e )
+>     , ( "kuhiragana", 0x304f )
+>     , ( "kukatakana", 0x30af )
+>     , ( "kukatakanahalfwidth", 0xff78 )
+>     , ( "kvsquare", 0x33b8 )
+>     , ( "kwsquare", 0x33be )
+>     , ( "l", 0x006c )
+>     , ( "labengali", 0x09b2 )
+>     , ( "lacute", 0x013a )
+>     , ( "ladeva", 0x0932 )
+>     , ( "lagujarati", 0x0ab2 )
+>     , ( "lagurmukhi", 0x0a32 )
+>     , ( "lakkhangyaothai", 0x0e45 )
+>     , ( "lamaleffinalarabic", 0xfefc )
+>     , ( "lamalefhamzaabovefinalarabic", 0xfef8 )
+>     , ( "lamalefhamzaaboveisolatedarabic", 0xfef7 )
+>     , ( "lamalefhamzabelowfinalarabic", 0xfefa )
+>     , ( "lamalefhamzabelowisolatedarabic", 0xfef9 )
+>     , ( "lamalefisolatedarabic", 0xfefb )
+>     , ( "lamalefmaddaabovefinalarabic", 0xfef6 )
+>     , ( "lamalefmaddaaboveisolatedarabic", 0xfef5 )
+>     , ( "lamarabic", 0x0644 )
+>     , ( "lambda", 0x03bb )
+>     , ( "lambdastroke", 0x019b )
+>     , ( "lamed", 0x05dc )
+>     , ( "lameddagesh", 0xfb3c )
+>     , ( "lameddageshhebrew", 0xfb3c )
+>     , ( "lamedhebrew", 0x05dc )
+>     , ( "lamedholam", 0x05dc )
+>     , ( "lamedholamdagesh", 0x05dc )
+>     , ( "lamedholamdageshhebrew", 0x05dc )
+>     , ( "lamedholamhebrew", 0x05dc )
+>     , ( "lamfinalarabic", 0xfede )
+>     , ( "lamhahinitialarabic", 0xfcca )
+>     , ( "laminitialarabic", 0xfedf )
+>     , ( "lamjeeminitialarabic", 0xfcc9 )
+>     , ( "lamkhahinitialarabic", 0xfccb )
+>     , ( "lamlamhehisolatedarabic", 0xfdf2 )
+>     , ( "lammedialarabic", 0xfee0 )
+>     , ( "lammeemhahinitialarabic", 0xfd88 )
+>     , ( "lammeeminitialarabic", 0xfccc )
+>     , ( "lammeemjeeminitialarabic", 0xfedf )
+>     , ( "lammeemkhahinitialarabic", 0xfedf )
+>     , ( "largecircle", 0x25ef )
+>     , ( "lbar", 0x019a )
+>     , ( "lbelt", 0x026c )
+>     , ( "lbopomofo", 0x310c )
+>     , ( "lcaron", 0x013e )
+>     , ( "lcedilla", 0x013c )
+>     , ( "lcircle", 0x24db )
+>     , ( "lcircumflexbelow", 0x1e3d )
+>     , ( "lcommaaccent", 0x013c )
+>     , ( "ldot", 0x0140 )
+>     , ( "ldotaccent", 0x0140 )
+>     , ( "ldotbelow", 0x1e37 )
+>     , ( "ldotbelowmacron", 0x1e39 )
+>     , ( "leftangleabovecmb", 0x031a )
+>     , ( "lefttackbelowcmb", 0x0318 )
+>     , ( "less", 0x003c )
+>     , ( "lessequal", 0x2264 )
+>     , ( "lessequalorgreater", 0x22da )
+>     , ( "lessmonospace", 0xff1c )
+>     , ( "lessorequivalent", 0x2272 )
+>     , ( "lessorgreater", 0x2276 )
+>     , ( "lessoverequal", 0x2266 )
+>     , ( "lesssmall", 0xfe64 )
+>     , ( "lezh", 0x026e )
+>     , ( "lfblock", 0x258c )
+>     , ( "lhookretroflex", 0x026d )
+>     , ( "lira", 0x20a4 )
+>     , ( "liwnarmenian", 0x056c )
+>     , ( "lj", 0x01c9 )
+>     , ( "ljecyrillic", 0x0459 )
+>     , ( "ll", 0xf6c0 )
+>     , ( "lladeva", 0x0933 )
+>     , ( "llagujarati", 0x0ab3 )
+>     , ( "llinebelow", 0x1e3b )
+>     , ( "llladeva", 0x0934 )
+>     , ( "llvocalicbengali", 0x09e1 )
+>     , ( "llvocalicdeva", 0x0961 )
+>     , ( "llvocalicvowelsignbengali", 0x09e3 )
+>     , ( "llvocalicvowelsigndeva", 0x0963 )
+>     , ( "lmiddletilde", 0x026b )
+>     , ( "lmonospace", 0xff4c )
+>     , ( "lmsquare", 0x33d0 )
+>     , ( "lochulathai", 0x0e2c )
+>     , ( "logicaland", 0x2227 )
+>     , ( "logicalnot", 0x00ac )
+>     , ( "logicalnotreversed", 0x2310 )
+>     , ( "logicalor", 0x2228 )
+>     , ( "lolingthai", 0x0e25 )
+>     , ( "longs", 0x017f )
+>     , ( "lowlinecenterline", 0xfe4e )
+>     , ( "lowlinecmb", 0x0332 )
+>     , ( "lowlinedashed", 0xfe4d )
+>     , ( "lozenge", 0x25ca )
+>     , ( "lparen", 0x24a7 )
+>     , ( "lslash", 0x0142 )
+>     , ( "lsquare", 0x2113 )
+>     , ( "lsuperior", 0xf6ee )
+>     , ( "ltshade", 0x2591 )
+>     , ( "luthai", 0x0e26 )
+>     , ( "lvocalicbengali", 0x098c )
+>     , ( "lvocalicdeva", 0x090c )
+>     , ( "lvocalicvowelsignbengali", 0x09e2 )
+>     , ( "lvocalicvowelsigndeva", 0x0962 )
+>     , ( "lxsquare", 0x33d3 )
+>     , ( "m", 0x006d )
+>     , ( "mabengali", 0x09ae )
+>     , ( "macron", 0x00af )
+>     , ( "macronbelowcmb", 0x0331 )
+>     , ( "macroncmb", 0x0304 )
+>     , ( "macronlowmod", 0x02cd )
+>     , ( "macronmonospace", 0xffe3 )
+>     , ( "macute", 0x1e3f )
+>     , ( "madeva", 0x092e )
+>     , ( "magujarati", 0x0aae )
+>     , ( "magurmukhi", 0x0a2e )
+>     , ( "mahapakhhebrew", 0x05a4 )
+>     , ( "mahapakhlefthebrew", 0x05a4 )
+>     , ( "mahiragana", 0x307e )
+>     , ( "maichattawalowleftthai", 0xf895 )
+>     , ( "maichattawalowrightthai", 0xf894 )
+>     , ( "maichattawathai", 0x0e4b )
+>     , ( "maichattawaupperleftthai", 0xf893 )
+>     , ( "maieklowleftthai", 0xf88c )
+>     , ( "maieklowrightthai", 0xf88b )
+>     , ( "maiekthai", 0x0e48 )
+>     , ( "maiekupperleftthai", 0xf88a )
+>     , ( "maihanakatleftthai", 0xf884 )
+>     , ( "maihanakatthai", 0x0e31 )
+>     , ( "maitaikhuleftthai", 0xf889 )
+>     , ( "maitaikhuthai", 0x0e47 )
+>     , ( "maitholowleftthai", 0xf88f )
+>     , ( "maitholowrightthai", 0xf88e )
+>     , ( "maithothai", 0x0e49 )
+>     , ( "maithoupperleftthai", 0xf88d )
+>     , ( "maitrilowleftthai", 0xf892 )
+>     , ( "maitrilowrightthai", 0xf891 )
+>     , ( "maitrithai", 0x0e4a )
+>     , ( "maitriupperleftthai", 0xf890 )
+>     , ( "maiyamokthai", 0x0e46 )
+>     , ( "makatakana", 0x30de )
+>     , ( "makatakanahalfwidth", 0xff8f )
+>     , ( "male", 0x2642 )
+>     , ( "mansyonsquare", 0x3347 )
+>     , ( "maqafhebrew", 0x05be )
+>     , ( "mars", 0x2642 )
+>     , ( "masoracirclehebrew", 0x05af )
+>     , ( "masquare", 0x3383 )
+>     , ( "mbopomofo", 0x3107 )
+>     , ( "mbsquare", 0x33d4 )
+>     , ( "mcircle", 0x24dc )
+>     , ( "mcubedsquare", 0x33a5 )
+>     , ( "mdotaccent", 0x1e41 )
+>     , ( "mdotbelow", 0x1e43 )
+>     , ( "meemarabic", 0x0645 )
+>     , ( "meemfinalarabic", 0xfee2 )
+>     , ( "meeminitialarabic", 0xfee3 )
+>     , ( "meemmedialarabic", 0xfee4 )
+>     , ( "meemmeeminitialarabic", 0xfcd1 )
+>     , ( "meemmeemisolatedarabic", 0xfc48 )
+>     , ( "meetorusquare", 0x334d )
+>     , ( "mehiragana", 0x3081 )
+>     , ( "meizierasquare", 0x337e )
+>     , ( "mekatakana", 0x30e1 )
+>     , ( "mekatakanahalfwidth", 0xff92 )
+>     , ( "mem", 0x05de )
+>     , ( "memdagesh", 0xfb3e )
+>     , ( "memdageshhebrew", 0xfb3e )
+>     , ( "memhebrew", 0x05de )
+>     , ( "menarmenian", 0x0574 )
+>     , ( "merkhahebrew", 0x05a5 )
+>     , ( "merkhakefulahebrew", 0x05a6 )
+>     , ( "merkhakefulalefthebrew", 0x05a6 )
+>     , ( "merkhalefthebrew", 0x05a5 )
+>     , ( "mhook", 0x0271 )
+>     , ( "mhzsquare", 0x3392 )
+>     , ( "middledotkatakanahalfwidth", 0xff65 )
+>     , ( "middot", 0x00b7 )
+>     , ( "mieumacirclekorean", 0x3272 )
+>     , ( "mieumaparenkorean", 0x3212 )
+>     , ( "mieumcirclekorean", 0x3264 )
+>     , ( "mieumkorean", 0x3141 )
+>     , ( "mieumpansioskorean", 0x3170 )
+>     , ( "mieumparenkorean", 0x3204 )
+>     , ( "mieumpieupkorean", 0x316e )
+>     , ( "mieumsioskorean", 0x316f )
+>     , ( "mihiragana", 0x307f )
+>     , ( "mikatakana", 0x30df )
+>     , ( "mikatakanahalfwidth", 0xff90 )
+>     , ( "minus", 0x2212 )
+>     , ( "minusbelowcmb", 0x0320 )
+>     , ( "minuscircle", 0x2296 )
+>     , ( "minusmod", 0x02d7 )
+>     , ( "minusplus", 0x2213 )
+>     , ( "minute", 0x2032 )
+>     , ( "miribaarusquare", 0x334a )
+>     , ( "mirisquare", 0x3349 )
+>     , ( "mlonglegturned", 0x0270 )
+>     , ( "mlsquare", 0x3396 )
+>     , ( "mmcubedsquare", 0x33a3 )
+>     , ( "mmonospace", 0xff4d )
+>     , ( "mmsquaredsquare", 0x339f )
+>     , ( "mohiragana", 0x3082 )
+>     , ( "mohmsquare", 0x33c1 )
+>     , ( "mokatakana", 0x30e2 )
+>     , ( "mokatakanahalfwidth", 0xff93 )
+>     , ( "molsquare", 0x33d6 )
+>     , ( "momathai", 0x0e21 )
+>     , ( "moverssquare", 0x33a7 )
+>     , ( "moverssquaredsquare", 0x33a8 )
+>     , ( "mparen", 0x24a8 )
+>     , ( "mpasquare", 0x33ab )
+>     , ( "mssquare", 0x33b3 )
+>     , ( "msuperior", 0xf6ef )
+>     , ( "mturned", 0x026f )
+>     , ( "mu", 0x00b5 )
+>     , ( "mu1", 0x00b5 )
+>     , ( "muasquare", 0x3382 )
+>     , ( "muchgreater", 0x226b )
+>     , ( "muchless", 0x226a )
+>     , ( "mufsquare", 0x338c )
+>     , ( "mugreek", 0x03bc )
+>     , ( "mugsquare", 0x338d )
+>     , ( "muhiragana", 0x3080 )
+>     , ( "mukatakana", 0x30e0 )
+>     , ( "mukatakanahalfwidth", 0xff91 )
+>     , ( "mulsquare", 0x3395 )
+>     , ( "multiply", 0x00d7 )
+>     , ( "mumsquare", 0x339b )
+>     , ( "munahhebrew", 0x05a3 )
+>     , ( "munahlefthebrew", 0x05a3 )
+>     , ( "musicalnote", 0x266a )
+>     , ( "musicalnotedbl", 0x266b )
+>     , ( "musicflatsign", 0x266d )
+>     , ( "musicsharpsign", 0x266f )
+>     , ( "mussquare", 0x33b2 )
+>     , ( "muvsquare", 0x33b6 )
+>     , ( "muwsquare", 0x33bc )
+>     , ( "mvmegasquare", 0x33b9 )
+>     , ( "mvsquare", 0x33b7 )
+>     , ( "mwmegasquare", 0x33bf )
+>     , ( "mwsquare", 0x33bd )
+>     , ( "n", 0x006e )
+>     , ( "nabengali", 0x09a8 )
+>     , ( "nabla", 0x2207 )
+>     , ( "nacute", 0x0144 )
+>     , ( "nadeva", 0x0928 )
+>     , ( "nagujarati", 0x0aa8 )
+>     , ( "nagurmukhi", 0x0a28 )
+>     , ( "nahiragana", 0x306a )
+>     , ( "nakatakana", 0x30ca )
+>     , ( "nakatakanahalfwidth", 0xff85 )
+>     , ( "napostrophe", 0x0149 )
+>     , ( "nasquare", 0x3381 )
+>     , ( "nbopomofo", 0x310b )
+>     , ( "nbspace", 0x00a0 )
+>     , ( "ncaron", 0x0148 )
+>     , ( "ncedilla", 0x0146 )
+>     , ( "ncircle", 0x24dd )
+>     , ( "ncircumflexbelow", 0x1e4b )
+>     , ( "ncommaaccent", 0x0146 )
+>     , ( "ndotaccent", 0x1e45 )
+>     , ( "ndotbelow", 0x1e47 )
+>     , ( "nehiragana", 0x306d )
+>     , ( "nekatakana", 0x30cd )
+>     , ( "nekatakanahalfwidth", 0xff88 )
+>     , ( "newsheqelsign", 0x20aa )
+>     , ( "nfsquare", 0x338b )
+>     , ( "ngabengali", 0x0999 )
+>     , ( "ngadeva", 0x0919 )
+>     , ( "ngagujarati", 0x0a99 )
+>     , ( "ngagurmukhi", 0x0a19 )
+>     , ( "ngonguthai", 0x0e07 )
+>     , ( "nhiragana", 0x3093 )
+>     , ( "nhookleft", 0x0272 )
+>     , ( "nhookretroflex", 0x0273 )
+>     , ( "nieunacirclekorean", 0x326f )
+>     , ( "nieunaparenkorean", 0x320f )
+>     , ( "nieuncieuckorean", 0x3135 )
+>     , ( "nieuncirclekorean", 0x3261 )
+>     , ( "nieunhieuhkorean", 0x3136 )
+>     , ( "nieunkorean", 0x3134 )
+>     , ( "nieunpansioskorean", 0x3168 )
+>     , ( "nieunparenkorean", 0x3201 )
+>     , ( "nieunsioskorean", 0x3167 )
+>     , ( "nieuntikeutkorean", 0x3166 )
+>     , ( "nihiragana", 0x306b )
+>     , ( "nikatakana", 0x30cb )
+>     , ( "nikatakanahalfwidth", 0xff86 )
+>     , ( "nikhahitleftthai", 0xf899 )
+>     , ( "nikhahitthai", 0x0e4d )
+>     , ( "nine", 0x0039 )
+>     , ( "ninearabic", 0x0669 )
+>     , ( "ninebengali", 0x09ef )
+>     , ( "ninecircle", 0x2468 )
+>     , ( "ninecircleinversesansserif", 0x2792 )
+>     , ( "ninedeva", 0x096f )
+>     , ( "ninegujarati", 0x0aef )
+>     , ( "ninegurmukhi", 0x0a6f )
+>     , ( "ninehackarabic", 0x0669 )
+>     , ( "ninehangzhou", 0x3029 )
+>     , ( "nineideographicparen", 0x3228 )
+>     , ( "nineinferior", 0x2089 )
+>     , ( "ninemonospace", 0xff19 )
+>     , ( "nineoldstyle", 0xf739 )
+>     , ( "nineparen", 0x247c )
+>     , ( "nineperiod", 0x2490 )
+>     , ( "ninepersian", 0x06f9 )
+>     , ( "nineroman", 0x2178 )
+>     , ( "ninesuperior", 0x2079 )
+>     , ( "nineteencircle", 0x2472 )
+>     , ( "nineteenparen", 0x2486 )
+>     , ( "nineteenperiod", 0x249a )
+>     , ( "ninethai", 0x0e59 )
+>     , ( "nj", 0x01cc )
+>     , ( "njecyrillic", 0x045a )
+>     , ( "nkatakana", 0x30f3 )
+>     , ( "nkatakanahalfwidth", 0xff9d )
+>     , ( "nlegrightlong", 0x019e )
+>     , ( "nlinebelow", 0x1e49 )
+>     , ( "nmonospace", 0xff4e )
+>     , ( "nmsquare", 0x339a )
+>     , ( "nnabengali", 0x09a3 )
+>     , ( "nnadeva", 0x0923 )
+>     , ( "nnagujarati", 0x0aa3 )
+>     , ( "nnagurmukhi", 0x0a23 )
+>     , ( "nnnadeva", 0x0929 )
+>     , ( "nohiragana", 0x306e )
+>     , ( "nokatakana", 0x30ce )
+>     , ( "nokatakanahalfwidth", 0xff89 )
+>     , ( "nonbreakingspace", 0x00a0 )
+>     , ( "nonenthai", 0x0e13 )
+>     , ( "nonuthai", 0x0e19 )
+>     , ( "noonarabic", 0x0646 )
+>     , ( "noonfinalarabic", 0xfee6 )
+>     , ( "noonghunnaarabic", 0x06ba )
+>     , ( "noonghunnafinalarabic", 0xfb9f )
+>     , ( "noonhehinitialarabic", 0xfee7 )
+>     , ( "nooninitialarabic", 0xfee7 )
+>     , ( "noonjeeminitialarabic", 0xfcd2 )
+>     , ( "noonjeemisolatedarabic", 0xfc4b )
+>     , ( "noonmedialarabic", 0xfee8 )
+>     , ( "noonmeeminitialarabic", 0xfcd5 )
+>     , ( "noonmeemisolatedarabic", 0xfc4e )
+>     , ( "noonnoonfinalarabic", 0xfc8d )
+>     , ( "notcontains", 0x220c )
+>     , ( "notelement", 0x2209 )
+>     , ( "notelementof", 0x2209 )
+>     , ( "notequal", 0x2260 )
+>     , ( "notgreater", 0x226f )
+>     , ( "notgreaternorequal", 0x2271 )
+>     , ( "notgreaternorless", 0x2279 )
+>     , ( "notidentical", 0x2262 )
+>     , ( "notless", 0x226e )
+>     , ( "notlessnorequal", 0x2270 )
+>     , ( "notparallel", 0x2226 )
+>     , ( "notprecedes", 0x2280 )
+>     , ( "notsubset", 0x2284 )
+>     , ( "notsucceeds", 0x2281 )
+>     , ( "notsuperset", 0x2285 )
+>     , ( "nowarmenian", 0x0576 )
+>     , ( "nparen", 0x24a9 )
+>     , ( "nssquare", 0x33b1 )
+>     , ( "nsuperior", 0x207f )
+>     , ( "ntilde", 0x00f1 )
+>     , ( "nu", 0x03bd )
+>     , ( "nuhiragana", 0x306c )
+>     , ( "nukatakana", 0x30cc )
+>     , ( "nukatakanahalfwidth", 0xff87 )
+>     , ( "nuktabengali", 0x09bc )
+>     , ( "nuktadeva", 0x093c )
+>     , ( "nuktagujarati", 0x0abc )
+>     , ( "nuktagurmukhi", 0x0a3c )
+>     , ( "numbersign", 0x0023 )
+>     , ( "numbersignmonospace", 0xff03 )
+>     , ( "numbersignsmall", 0xfe5f )
+>     , ( "numeralsigngreek", 0x0374 )
+>     , ( "numeralsignlowergreek", 0x0375 )
+>     , ( "numero", 0x2116 )
+>     , ( "nun", 0x05e0 )
+>     , ( "nundagesh", 0xfb40 )
+>     , ( "nundageshhebrew", 0xfb40 )
+>     , ( "nunhebrew", 0x05e0 )
+>     , ( "nvsquare", 0x33b5 )
+>     , ( "nwsquare", 0x33bb )
+>     , ( "nyabengali", 0x099e )
+>     , ( "nyadeva", 0x091e )
+>     , ( "nyagujarati", 0x0a9e )
+>     , ( "nyagurmukhi", 0x0a1e )
+>     , ( "o", 0x006f )
+>     , ( "oacute", 0x00f3 )
+>     , ( "oangthai", 0x0e2d )
+>     , ( "obarred", 0x0275 )
+>     , ( "obarredcyrillic", 0x04e9 )
+>     , ( "obarreddieresiscyrillic", 0x04eb )
+>     , ( "obengali", 0x0993 )
+>     , ( "obopomofo", 0x311b )
+>     , ( "obreve", 0x014f )
+>     , ( "ocandradeva", 0x0911 )
+>     , ( "ocandragujarati", 0x0a91 )
+>     , ( "ocandravowelsigndeva", 0x0949 )
+>     , ( "ocandravowelsigngujarati", 0x0ac9 )
+>     , ( "ocaron", 0x01d2 )
+>     , ( "ocircle", 0x24de )
+>     , ( "ocircumflex", 0x00f4 )
+>     , ( "ocircumflexacute", 0x1ed1 )
+>     , ( "ocircumflexdotbelow", 0x1ed9 )
+>     , ( "ocircumflexgrave", 0x1ed3 )
+>     , ( "ocircumflexhookabove", 0x1ed5 )
+>     , ( "ocircumflextilde", 0x1ed7 )
+>     , ( "ocyrillic", 0x043e )
+>     , ( "odblacute", 0x0151 )
+>     , ( "odblgrave", 0x020d )
+>     , ( "odeva", 0x0913 )
+>     , ( "odieresis", 0x00f6 )
+>     , ( "odieresiscyrillic", 0x04e7 )
+>     , ( "odotbelow", 0x1ecd )
+>     , ( "oe", 0x0153 )
+>     , ( "oekorean", 0x315a )
+>     , ( "ogonek", 0x02db )
+>     , ( "ogonekcmb", 0x0328 )
+>     , ( "ograve", 0x00f2 )
+>     , ( "ogujarati", 0x0a93 )
+>     , ( "oharmenian", 0x0585 )
+>     , ( "ohiragana", 0x304a )
+>     , ( "ohookabove", 0x1ecf )
+>     , ( "ohorn", 0x01a1 )
+>     , ( "ohornacute", 0x1edb )
+>     , ( "ohorndotbelow", 0x1ee3 )
+>     , ( "ohorngrave", 0x1edd )
+>     , ( "ohornhookabove", 0x1edf )
+>     , ( "ohorntilde", 0x1ee1 )
+>     , ( "ohungarumlaut", 0x0151 )
+>     , ( "oi", 0x01a3 )
+>     , ( "oinvertedbreve", 0x020f )
+>     , ( "okatakana", 0x30aa )
+>     , ( "okatakanahalfwidth", 0xff75 )
+>     , ( "okorean", 0x3157 )
+>     , ( "olehebrew", 0x05ab )
+>     , ( "omacron", 0x014d )
+>     , ( "omacronacute", 0x1e53 )
+>     , ( "omacrongrave", 0x1e51 )
+>     , ( "omdeva", 0x0950 )
+>     , ( "omega", 0x03c9 )
+>     , ( "omega1", 0x03d6 )
+>     , ( "omegacyrillic", 0x0461 )
+>     , ( "omegalatinclosed", 0x0277 )
+>     , ( "omegaroundcyrillic", 0x047b )
+>     , ( "omegatitlocyrillic", 0x047d )
+>     , ( "omegatonos", 0x03ce )
+>     , ( "omgujarati", 0x0ad0 )
+>     , ( "omicron", 0x03bf )
+>     , ( "omicrontonos", 0x03cc )
+>     , ( "omonospace", 0xff4f )
+>     , ( "one", 0x0031 )
+>     , ( "onearabic", 0x0661 )
+>     , ( "onebengali", 0x09e7 )
+>     , ( "onecircle", 0x2460 )
+>     , ( "onecircleinversesansserif", 0x278a )
+>     , ( "onedeva", 0x0967 )
+>     , ( "onedotenleader", 0x2024 )
+>     , ( "oneeighth", 0x215b )
+>     , ( "onefitted", 0xf6dc )
+>     , ( "onegujarati", 0x0ae7 )
+>     , ( "onegurmukhi", 0x0a67 )
+>     , ( "onehackarabic", 0x0661 )
+>     , ( "onehalf", 0x00bd )
+>     , ( "onehangzhou", 0x3021 )
+>     , ( "oneideographicparen", 0x3220 )
+>     , ( "oneinferior", 0x2081 )
+>     , ( "onemonospace", 0xff11 )
+>     , ( "onenumeratorbengali", 0x09f4 )
+>     , ( "oneoldstyle", 0xf731 )
+>     , ( "oneparen", 0x2474 )
+>     , ( "oneperiod", 0x2488 )
+>     , ( "onepersian", 0x06f1 )
+>     , ( "onequarter", 0x00bc )
+>     , ( "oneroman", 0x2170 )
+>     , ( "onesuperior", 0x00b9 )
+>     , ( "onethai", 0x0e51 )
+>     , ( "onethird", 0x2153 )
+>     , ( "oogonek", 0x01eb )
+>     , ( "oogonekmacron", 0x01ed )
+>     , ( "oogurmukhi", 0x0a13 )
+>     , ( "oomatragurmukhi", 0x0a4b )
+>     , ( "oopen", 0x0254 )
+>     , ( "oparen", 0x24aa )
+>     , ( "openbullet", 0x25e6 )
+>     , ( "option", 0x2325 )
+>     , ( "ordfeminine", 0x00aa )
+>     , ( "ordmasculine", 0x00ba )
+>     , ( "orthogonal", 0x221f )
+>     , ( "oshortdeva", 0x0912 )
+>     , ( "oshortvowelsigndeva", 0x094a )
+>     , ( "oslash", 0x00f8 )
+>     , ( "oslashacute", 0x01ff )
+>     , ( "osmallhiragana", 0x3049 )
+>     , ( "osmallkatakana", 0x30a9 )
+>     , ( "osmallkatakanahalfwidth", 0xff6b )
+>     , ( "ostrokeacute", 0x01ff )
+>     , ( "osuperior", 0xf6f0 )
+>     , ( "otcyrillic", 0x047f )
+>     , ( "otilde", 0x00f5 )
+>     , ( "otildeacute", 0x1e4d )
+>     , ( "otildedieresis", 0x1e4f )
+>     , ( "oubopomofo", 0x3121 )
+>     , ( "overline", 0x203e )
+>     , ( "overlinecenterline", 0xfe4a )
+>     , ( "overlinecmb", 0x0305 )
+>     , ( "overlinedashed", 0xfe49 )
+>     , ( "overlinedblwavy", 0xfe4c )
+>     , ( "overlinewavy", 0xfe4b )
+>     , ( "overscore", 0x00af )
+>     , ( "ovowelsignbengali", 0x09cb )
+>     , ( "ovowelsigndeva", 0x094b )
+>     , ( "ovowelsigngujarati", 0x0acb )
+>     , ( "p", 0x0070 )
+>     , ( "paampssquare", 0x3380 )
+>     , ( "paasentosquare", 0x332b )
+>     , ( "pabengali", 0x09aa )
+>     , ( "pacute", 0x1e55 )
+>     , ( "padeva", 0x092a )
+>     , ( "pagedown", 0x21df )
+>     , ( "pageup", 0x21de )
+>     , ( "pagujarati", 0x0aaa )
+>     , ( "pagurmukhi", 0x0a2a )
+>     , ( "pahiragana", 0x3071 )
+>     , ( "paiyannoithai", 0x0e2f )
+>     , ( "pakatakana", 0x30d1 )
+>     , ( "palatalizationcyrilliccmb", 0x0484 )
+>     , ( "palochkacyrillic", 0x04c0 )
+>     , ( "pansioskorean", 0x317f )
+>     , ( "paragraph", 0x00b6 )
+>     , ( "parallel", 0x2225 )
+>     , ( "parenleft", 0x0028 )
+>     , ( "parenleftaltonearabic", 0xfd3e )
+>     , ( "parenleftbt", 0xf8ed )
+>     , ( "parenleftex", 0xf8ec )
+>     , ( "parenleftinferior", 0x208d )
+>     , ( "parenleftmonospace", 0xff08 )
+>     , ( "parenleftsmall", 0xfe59 )
+>     , ( "parenleftsuperior", 0x207d )
+>     , ( "parenlefttp", 0xf8eb )
+>     , ( "parenleftvertical", 0xfe35 )
+>     , ( "parenright", 0x0029 )
+>     , ( "parenrightaltonearabic", 0xfd3f )
+>     , ( "parenrightbt", 0xf8f8 )
+>     , ( "parenrightex", 0xf8f7 )
+>     , ( "parenrightinferior", 0x208e )
+>     , ( "parenrightmonospace", 0xff09 )
+>     , ( "parenrightsmall", 0xfe5a )
+>     , ( "parenrightsuperior", 0x207e )
+>     , ( "parenrighttp", 0xf8f6 )
+>     , ( "parenrightvertical", 0xfe36 )
+>     , ( "partialdiff", 0x2202 )
+>     , ( "paseqhebrew", 0x05c0 )
+>     , ( "pashtahebrew", 0x0599 )
+>     , ( "pasquare", 0x33a9 )
+>     , ( "patah", 0x05b7 )
+>     , ( "patah11", 0x05b7 )
+>     , ( "patah1d", 0x05b7 )
+>     , ( "patah2a", 0x05b7 )
+>     , ( "patahhebrew", 0x05b7 )
+>     , ( "patahnarrowhebrew", 0x05b7 )
+>     , ( "patahquarterhebrew", 0x05b7 )
+>     , ( "patahwidehebrew", 0x05b7 )
+>     , ( "pazerhebrew", 0x05a1 )
+>     , ( "pbopomofo", 0x3106 )
+>     , ( "pcircle", 0x24df )
+>     , ( "pdotaccent", 0x1e57 )
+>     , ( "pe", 0x05e4 )
+>     , ( "pecyrillic", 0x043f )
+>     , ( "pedagesh", 0xfb44 )
+>     , ( "pedageshhebrew", 0xfb44 )
+>     , ( "peezisquare", 0x333b )
+>     , ( "pefinaldageshhebrew", 0xfb43 )
+>     , ( "peharabic", 0x067e )
+>     , ( "peharmenian", 0x057a )
+>     , ( "pehebrew", 0x05e4 )
+>     , ( "pehfinalarabic", 0xfb57 )
+>     , ( "pehinitialarabic", 0xfb58 )
+>     , ( "pehiragana", 0x307a )
+>     , ( "pehmedialarabic", 0xfb59 )
+>     , ( "pekatakana", 0x30da )
+>     , ( "pemiddlehookcyrillic", 0x04a7 )
+>     , ( "perafehebrew", 0xfb4e )
+>     , ( "percent", 0x0025 )
+>     , ( "percentarabic", 0x066a )
+>     , ( "percentmonospace", 0xff05 )
+>     , ( "percentsmall", 0xfe6a )
+>     , ( "period", 0x002e )
+>     , ( "periodarmenian", 0x0589 )
+>     , ( "periodcentered", 0x00b7 )
+>     , ( "periodhalfwidth", 0xff61 )
+>     , ( "periodinferior", 0xf6e7 )
+>     , ( "periodmonospace", 0xff0e )
+>     , ( "periodsmall", 0xfe52 )
+>     , ( "periodsuperior", 0xf6e8 )
+>     , ( "perispomenigreekcmb", 0x0342 )
+>     , ( "perpendicular", 0x22a5 )
+>     , ( "perthousand", 0x2030 )
+>     , ( "peseta", 0x20a7 )
+>     , ( "pfsquare", 0x338a )
+>     , ( "phabengali", 0x09ab )
+>     , ( "phadeva", 0x092b )
+>     , ( "phagujarati", 0x0aab )
+>     , ( "phagurmukhi", 0x0a2b )
+>     , ( "phi", 0x03c6 )
+>     , ( "phi1", 0x03d5 )
+>     , ( "phieuphacirclekorean", 0x327a )
+>     , ( "phieuphaparenkorean", 0x321a )
+>     , ( "phieuphcirclekorean", 0x326c )
+>     , ( "phieuphkorean", 0x314d )
+>     , ( "phieuphparenkorean", 0x320c )
+>     , ( "philatin", 0x0278 )
+>     , ( "phinthuthai", 0x0e3a )
+>     , ( "phisymbolgreek", 0x03d5 )
+>     , ( "phook", 0x01a5 )
+>     , ( "phophanthai", 0x0e1e )
+>     , ( "phophungthai", 0x0e1c )
+>     , ( "phosamphaothai", 0x0e20 )
+>     , ( "pi", 0x03c0 )
+>     , ( "pieupacirclekorean", 0x3273 )
+>     , ( "pieupaparenkorean", 0x3213 )
+>     , ( "pieupcieuckorean", 0x3176 )
+>     , ( "pieupcirclekorean", 0x3265 )
+>     , ( "pieupkiyeokkorean", 0x3172 )
+>     , ( "pieupkorean", 0x3142 )
+>     , ( "pieupparenkorean", 0x3205 )
+>     , ( "pieupsioskiyeokkorean", 0x3174 )
+>     , ( "pieupsioskorean", 0x3144 )
+>     , ( "pieupsiostikeutkorean", 0x3175 )
+>     , ( "pieupthieuthkorean", 0x3177 )
+>     , ( "pieuptikeutkorean", 0x3173 )
+>     , ( "pihiragana", 0x3074 )
+>     , ( "pikatakana", 0x30d4 )
+>     , ( "pisymbolgreek", 0x03d6 )
+>     , ( "piwrarmenian", 0x0583 )
+>     , ( "plus", 0x002b )
+>     , ( "plusbelowcmb", 0x031f )
+>     , ( "pluscircle", 0x2295 )
+>     , ( "plusminus", 0x00b1 )
+>     , ( "plusmod", 0x02d6 )
+>     , ( "plusmonospace", 0xff0b )
+>     , ( "plussmall", 0xfe62 )
+>     , ( "plussuperior", 0x207a )
+>     , ( "pmonospace", 0xff50 )
+>     , ( "pmsquare", 0x33d8 )
+>     , ( "pohiragana", 0x307d )
+>     , ( "pointingindexdownwhite", 0x261f )
+>     , ( "pointingindexleftwhite", 0x261c )
+>     , ( "pointingindexrightwhite", 0x261e )
+>     , ( "pointingindexupwhite", 0x261d )
+>     , ( "pokatakana", 0x30dd )
+>     , ( "poplathai", 0x0e1b )
+>     , ( "postalmark", 0x3012 )
+>     , ( "postalmarkface", 0x3020 )
+>     , ( "pparen", 0x24ab )
+>     , ( "precedes", 0x227a )
+>     , ( "prescription", 0x211e )
+>     , ( "primemod", 0x02b9 )
+>     , ( "primereversed", 0x2035 )
+>     , ( "product", 0x220f )
+>     , ( "projective", 0x2305 )
+>     , ( "prolongedkana", 0x30fc )
+>     , ( "propellor", 0x2318 )
+>     , ( "propersubset", 0x2282 )
+>     , ( "propersuperset", 0x2283 )
+>     , ( "proportion", 0x2237 )
+>     , ( "proportional", 0x221d )
+>     , ( "psi", 0x03c8 )
+>     , ( "psicyrillic", 0x0471 )
+>     , ( "psilipneumatacyrilliccmb", 0x0486 )
+>     , ( "pssquare", 0x33b0 )
+>     , ( "puhiragana", 0x3077 )
+>     , ( "pukatakana", 0x30d7 )
+>     , ( "pvsquare", 0x33b4 )
+>     , ( "pwsquare", 0x33ba )
+>     , ( "q", 0x0071 )
+>     , ( "qadeva", 0x0958 )
+>     , ( "qadmahebrew", 0x05a8 )
+>     , ( "qafarabic", 0x0642 )
+>     , ( "qaffinalarabic", 0xfed6 )
+>     , ( "qafinitialarabic", 0xfed7 )
+>     , ( "qafmedialarabic", 0xfed8 )
+>     , ( "qamats", 0x05b8 )
+>     , ( "qamats10", 0x05b8 )
+>     , ( "qamats1a", 0x05b8 )
+>     , ( "qamats1c", 0x05b8 )
+>     , ( "qamats27", 0x05b8 )
+>     , ( "qamats29", 0x05b8 )
+>     , ( "qamats33", 0x05b8 )
+>     , ( "qamatsde", 0x05b8 )
+>     , ( "qamatshebrew", 0x05b8 )
+>     , ( "qamatsnarrowhebrew", 0x05b8 )
+>     , ( "qamatsqatanhebrew", 0x05b8 )
+>     , ( "qamatsqatannarrowhebrew", 0x05b8 )
+>     , ( "qamatsqatanquarterhebrew", 0x05b8 )
+>     , ( "qamatsqatanwidehebrew", 0x05b8 )
+>     , ( "qamatsquarterhebrew", 0x05b8 )
+>     , ( "qamatswidehebrew", 0x05b8 )
+>     , ( "qarneyparahebrew", 0x059f )
+>     , ( "qbopomofo", 0x3111 )
+>     , ( "qcircle", 0x24e0 )
+>     , ( "qhook", 0x02a0 )
+>     , ( "qmonospace", 0xff51 )
+>     , ( "qof", 0x05e7 )
+>     , ( "qofdagesh", 0xfb47 )
+>     , ( "qofdageshhebrew", 0xfb47 )
+>     , ( "qofhatafpatah", 0x05e7 )
+>     , ( "qofhatafpatahhebrew", 0x05e7 )
+>     , ( "qofhatafsegol", 0x05e7 )
+>     , ( "qofhatafsegolhebrew", 0x05e7 )
+>     , ( "qofhebrew", 0x05e7 )
+>     , ( "qofhiriq", 0x05e7 )
+>     , ( "qofhiriqhebrew", 0x05e7 )
+>     , ( "qofholam", 0x05e7 )
+>     , ( "qofholamhebrew", 0x05e7 )
+>     , ( "qofpatah", 0x05e7 )
+>     , ( "qofpatahhebrew", 0x05e7 )
+>     , ( "qofqamats", 0x05e7 )
+>     , ( "qofqamatshebrew", 0x05e7 )
+>     , ( "qofqubuts", 0x05e7 )
+>     , ( "qofqubutshebrew", 0x05e7 )
+>     , ( "qofsegol", 0x05e7 )
+>     , ( "qofsegolhebrew", 0x05e7 )
+>     , ( "qofsheva", 0x05e7 )
+>     , ( "qofshevahebrew", 0x05e7 )
+>     , ( "qoftsere", 0x05e7 )
+>     , ( "qoftserehebrew", 0x05e7 )
+>     , ( "qparen", 0x24ac )
+>     , ( "quarternote", 0x2669 )
+>     , ( "qubuts", 0x05bb )
+>     , ( "qubuts18", 0x05bb )
+>     , ( "qubuts25", 0x05bb )
+>     , ( "qubuts31", 0x05bb )
+>     , ( "qubutshebrew", 0x05bb )
+>     , ( "qubutsnarrowhebrew", 0x05bb )
+>     , ( "qubutsquarterhebrew", 0x05bb )
+>     , ( "qubutswidehebrew", 0x05bb )
+>     , ( "question", 0x003f )
+>     , ( "questionarabic", 0x061f )
+>     , ( "questionarmenian", 0x055e )
+>     , ( "questiondown", 0x00bf )
+>     , ( "questiondownsmall", 0xf7bf )
+>     , ( "questiongreek", 0x037e )
+>     , ( "questionmonospace", 0xff1f )
+>     , ( "questionsmall", 0xf73f )
+>     , ( "quotedbl", 0x0022 )
+>     , ( "quotedblbase", 0x201e )
+>     , ( "quotedblleft", 0x201c )
+>     , ( "quotedblmonospace", 0xff02 )
+>     , ( "quotedblprime", 0x301e )
+>     , ( "quotedblprimereversed", 0x301d )
+>     , ( "quotedblright", 0x201d )
+>     , ( "quoteleft", 0x2018 )
+>     , ( "quoteleftreversed", 0x201b )
+>     , ( "quotereversed", 0x201b )
+>     , ( "quoteright", 0x2019 )
+>     , ( "quoterightn", 0x0149 )
+>     , ( "quotesinglbase", 0x201a )
+>     , ( "quotesingle", 0x0027 )
+>     , ( "quotesinglemonospace", 0xff07 )
+>     , ( "r", 0x0072 )
+>     , ( "raarmenian", 0x057c )
+>     , ( "rabengali", 0x09b0 )
+>     , ( "racute", 0x0155 )
+>     , ( "radeva", 0x0930 )
+>     , ( "radical", 0x221a )
+>     , ( "radicalex", 0xf8e5 )
+>     , ( "radoverssquare", 0x33ae )
+>     , ( "radoverssquaredsquare", 0x33af )
+>     , ( "radsquare", 0x33ad )
+>     , ( "rafe", 0x05bf )
+>     , ( "rafehebrew", 0x05bf )
+>     , ( "ragujarati", 0x0ab0 )
+>     , ( "ragurmukhi", 0x0a30 )
+>     , ( "rahiragana", 0x3089 )
+>     , ( "rakatakana", 0x30e9 )
+>     , ( "rakatakanahalfwidth", 0xff97 )
+>     , ( "ralowerdiagonalbengali", 0x09f1 )
+>     , ( "ramiddlediagonalbengali", 0x09f0 )
+>     , ( "ramshorn", 0x0264 )
+>     , ( "ratio", 0x2236 )
+>     , ( "rbopomofo", 0x3116 )
+>     , ( "rcaron", 0x0159 )
+>     , ( "rcedilla", 0x0157 )
+>     , ( "rcircle", 0x24e1 )
+>     , ( "rcommaaccent", 0x0157 )
+>     , ( "rdblgrave", 0x0211 )
+>     , ( "rdotaccent", 0x1e59 )
+>     , ( "rdotbelow", 0x1e5b )
+>     , ( "rdotbelowmacron", 0x1e5d )
+>     , ( "referencemark", 0x203b )
+>     , ( "reflexsubset", 0x2286 )
+>     , ( "reflexsuperset", 0x2287 )
+>     , ( "registered", 0x00ae )
+>     , ( "registersans", 0xf8e8 )
+>     , ( "registerserif", 0xf6da )
+>     , ( "reharabic", 0x0631 )
+>     , ( "reharmenian", 0x0580 )
+>     , ( "rehfinalarabic", 0xfeae )
+>     , ( "rehiragana", 0x308c )
+>     , ( "rehyehaleflamarabic", 0x0631 )
+>     , ( "rekatakana", 0x30ec )
+>     , ( "rekatakanahalfwidth", 0xff9a )
+>     , ( "resh", 0x05e8 )
+>     , ( "reshdageshhebrew", 0xfb48 )
+>     , ( "reshhatafpatah", 0x05e8 )
+>     , ( "reshhatafpatahhebrew", 0x05e8 )
+>     , ( "reshhatafsegol", 0x05e8 )
+>     , ( "reshhatafsegolhebrew", 0x05e8 )
+>     , ( "reshhebrew", 0x05e8 )
+>     , ( "reshhiriq", 0x05e8 )
+>     , ( "reshhiriqhebrew", 0x05e8 )
+>     , ( "reshholam", 0x05e8 )
+>     , ( "reshholamhebrew", 0x05e8 )
+>     , ( "reshpatah", 0x05e8 )
+>     , ( "reshpatahhebrew", 0x05e8 )
+>     , ( "reshqamats", 0x05e8 )
+>     , ( "reshqamatshebrew", 0x05e8 )
+>     , ( "reshqubuts", 0x05e8 )
+>     , ( "reshqubutshebrew", 0x05e8 )
+>     , ( "reshsegol", 0x05e8 )
+>     , ( "reshsegolhebrew", 0x05e8 )
+>     , ( "reshsheva", 0x05e8 )
+>     , ( "reshshevahebrew", 0x05e8 )
+>     , ( "reshtsere", 0x05e8 )
+>     , ( "reshtserehebrew", 0x05e8 )
+>     , ( "reversedtilde", 0x223d )
+>     , ( "reviahebrew", 0x0597 )
+>     , ( "reviamugrashhebrew", 0x0597 )
+>     , ( "revlogicalnot", 0x2310 )
+>     , ( "rfishhook", 0x027e )
+>     , ( "rfishhookreversed", 0x027f )
+>     , ( "rhabengali", 0x09dd )
+>     , ( "rhadeva", 0x095d )
+>     , ( "rho", 0x03c1 )
+>     , ( "rhook", 0x027d )
+>     , ( "rhookturned", 0x027b )
+>     , ( "rhookturnedsuperior", 0x02b5 )
+>     , ( "rhosymbolgreek", 0x03f1 )
+>     , ( "rhotichookmod", 0x02de )
+>     , ( "rieulacirclekorean", 0x3271 )
+>     , ( "rieulaparenkorean", 0x3211 )
+>     , ( "rieulcirclekorean", 0x3263 )
+>     , ( "rieulhieuhkorean", 0x3140 )
+>     , ( "rieulkiyeokkorean", 0x313a )
+>     , ( "rieulkiyeoksioskorean", 0x3169 )
+>     , ( "rieulkorean", 0x3139 )
+>     , ( "rieulmieumkorean", 0x313b )
+>     , ( "rieulpansioskorean", 0x316c )
+>     , ( "rieulparenkorean", 0x3203 )
+>     , ( "rieulphieuphkorean", 0x313f )
+>     , ( "rieulpieupkorean", 0x313c )
+>     , ( "rieulpieupsioskorean", 0x316b )
+>     , ( "rieulsioskorean", 0x313d )
+>     , ( "rieulthieuthkorean", 0x313e )
+>     , ( "rieultikeutkorean", 0x316a )
+>     , ( "rieulyeorinhieuhkorean", 0x316d )
+>     , ( "rightangle", 0x221f )
+>     , ( "righttackbelowcmb", 0x0319 )
+>     , ( "righttriangle", 0x22bf )
+>     , ( "rihiragana", 0x308a )
+>     , ( "rikatakana", 0x30ea )
+>     , ( "rikatakanahalfwidth", 0xff98 )
+>     , ( "ring", 0x02da )
+>     , ( "ringbelowcmb", 0x0325 )
+>     , ( "ringcmb", 0x030a )
+>     , ( "ringhalfleft", 0x02bf )
+>     , ( "ringhalfleftarmenian", 0x0559 )
+>     , ( "ringhalfleftbelowcmb", 0x031c )
+>     , ( "ringhalfleftcentered", 0x02d3 )
+>     , ( "ringhalfright", 0x02be )
+>     , ( "ringhalfrightbelowcmb", 0x0339 )
+>     , ( "ringhalfrightcentered", 0x02d2 )
+>     , ( "rinvertedbreve", 0x0213 )
+>     , ( "rittorusquare", 0x3351 )
+>     , ( "rlinebelow", 0x1e5f )
+>     , ( "rlongleg", 0x027c )
+>     , ( "rlonglegturned", 0x027a )
+>     , ( "rmonospace", 0xff52 )
+>     , ( "rohiragana", 0x308d )
+>     , ( "rokatakana", 0x30ed )
+>     , ( "rokatakanahalfwidth", 0xff9b )
+>     , ( "roruathai", 0x0e23 )
+>     , ( "rparen", 0x24ad )
+>     , ( "rrabengali", 0x09dc )
+>     , ( "rradeva", 0x0931 )
+>     , ( "rragurmukhi", 0x0a5c )
+>     , ( "rreharabic", 0x0691 )
+>     , ( "rrehfinalarabic", 0xfb8d )
+>     , ( "rrvocalicbengali", 0x09e0 )
+>     , ( "rrvocalicdeva", 0x0960 )
+>     , ( "rrvocalicgujarati", 0x0ae0 )
+>     , ( "rrvocalicvowelsignbengali", 0x09c4 )
+>     , ( "rrvocalicvowelsigndeva", 0x0944 )
+>     , ( "rrvocalicvowelsigngujarati", 0x0ac4 )
+>     , ( "rsuperior", 0xf6f1 )
+>     , ( "rtblock", 0x2590 )
+>     , ( "rturned", 0x0279 )
+>     , ( "rturnedsuperior", 0x02b4 )
+>     , ( "ruhiragana", 0x308b )
+>     , ( "rukatakana", 0x30eb )
+>     , ( "rukatakanahalfwidth", 0xff99 )
+>     , ( "rupeemarkbengali", 0x09f2 )
+>     , ( "rupeesignbengali", 0x09f3 )
+>     , ( "rupiah", 0xf6dd )
+>     , ( "ruthai", 0x0e24 )
+>     , ( "rvocalicbengali", 0x098b )
+>     , ( "rvocalicdeva", 0x090b )
+>     , ( "rvocalicgujarati", 0x0a8b )
+>     , ( "rvocalicvowelsignbengali", 0x09c3 )
+>     , ( "rvocalicvowelsigndeva", 0x0943 )
+>     , ( "rvocalicvowelsigngujarati", 0x0ac3 )
+>     , ( "s", 0x0073 )
+>     , ( "sabengali", 0x09b8 )
+>     , ( "sacute", 0x015b )
+>     , ( "sacutedotaccent", 0x1e65 )
+>     , ( "sadarabic", 0x0635 )
+>     , ( "sadeva", 0x0938 )
+>     , ( "sadfinalarabic", 0xfeba )
+>     , ( "sadinitialarabic", 0xfebb )
+>     , ( "sadmedialarabic", 0xfebc )
+>     , ( "sagujarati", 0x0ab8 )
+>     , ( "sagurmukhi", 0x0a38 )
+>     , ( "sahiragana", 0x3055 )
+>     , ( "sakatakana", 0x30b5 )
+>     , ( "sakatakanahalfwidth", 0xff7b )
+>     , ( "sallallahoualayhewasallamarabic", 0xfdfa )
+>     , ( "samekh", 0x05e1 )
+>     , ( "samekhdagesh", 0xfb41 )
+>     , ( "samekhdageshhebrew", 0xfb41 )
+>     , ( "samekhhebrew", 0x05e1 )
+>     , ( "saraaathai", 0x0e32 )
+>     , ( "saraaethai", 0x0e41 )
+>     , ( "saraaimaimalaithai", 0x0e44 )
+>     , ( "saraaimaimuanthai", 0x0e43 )
+>     , ( "saraamthai", 0x0e33 )
+>     , ( "saraathai", 0x0e30 )
+>     , ( "saraethai", 0x0e40 )
+>     , ( "saraiileftthai", 0xf886 )
+>     , ( "saraiithai", 0x0e35 )
+>     , ( "saraileftthai", 0xf885 )
+>     , ( "saraithai", 0x0e34 )
+>     , ( "saraothai", 0x0e42 )
+>     , ( "saraueeleftthai", 0xf888 )
+>     , ( "saraueethai", 0x0e37 )
+>     , ( "saraueleftthai", 0xf887 )
+>     , ( "sarauethai", 0x0e36 )
+>     , ( "sarauthai", 0x0e38 )
+>     , ( "sarauuthai", 0x0e39 )
+>     , ( "sbopomofo", 0x3119 )
+>     , ( "scaron", 0x0161 )
+>     , ( "scarondotaccent", 0x1e67 )
+>     , ( "scedilla", 0x015f )
+>     , ( "schwa", 0x0259 )
+>     , ( "schwacyrillic", 0x04d9 )
+>     , ( "schwadieresiscyrillic", 0x04db )
+>     , ( "schwahook", 0x025a )
+>     , ( "scircle", 0x24e2 )
+>     , ( "scircumflex", 0x015d )
+>     , ( "scommaaccent", 0x0219 )
+>     , ( "sdotaccent", 0x1e61 )
+>     , ( "sdotbelow", 0x1e63 )
+>     , ( "sdotbelowdotaccent", 0x1e69 )
+>     , ( "seagullbelowcmb", 0x033c )
+>     , ( "second", 0x2033 )
+>     , ( "secondtonechinese", 0x02ca )
+>     , ( "section", 0x00a7 )
+>     , ( "seenarabic", 0x0633 )
+>     , ( "seenfinalarabic", 0xfeb2 )
+>     , ( "seeninitialarabic", 0xfeb3 )
+>     , ( "seenmedialarabic", 0xfeb4 )
+>     , ( "segol", 0x05b6 )
+>     , ( "segol13", 0x05b6 )
+>     , ( "segol1f", 0x05b6 )
+>     , ( "segol2c", 0x05b6 )
+>     , ( "segolhebrew", 0x05b6 )
+>     , ( "segolnarrowhebrew", 0x05b6 )
+>     , ( "segolquarterhebrew", 0x05b6 )
+>     , ( "segoltahebrew", 0x0592 )
+>     , ( "segolwidehebrew", 0x05b6 )
+>     , ( "seharmenian", 0x057d )
+>     , ( "sehiragana", 0x305b )
+>     , ( "sekatakana", 0x30bb )
+>     , ( "sekatakanahalfwidth", 0xff7e )
+>     , ( "semicolon", 0x003b )
+>     , ( "semicolonarabic", 0x061b )
+>     , ( "semicolonmonospace", 0xff1b )
+>     , ( "semicolonsmall", 0xfe54 )
+>     , ( "semivoicedmarkkana", 0x309c )
+>     , ( "semivoicedmarkkanahalfwidth", 0xff9f )
+>     , ( "sentisquare", 0x3322 )
+>     , ( "sentosquare", 0x3323 )
+>     , ( "seven", 0x0037 )
+>     , ( "sevenarabic", 0x0667 )
+>     , ( "sevenbengali", 0x09ed )
+>     , ( "sevencircle", 0x2466 )
+>     , ( "sevencircleinversesansserif", 0x2790 )
+>     , ( "sevendeva", 0x096d )
+>     , ( "seveneighths", 0x215e )
+>     , ( "sevengujarati", 0x0aed )
+>     , ( "sevengurmukhi", 0x0a6d )
+>     , ( "sevenhackarabic", 0x0667 )
+>     , ( "sevenhangzhou", 0x3027 )
+>     , ( "sevenideographicparen", 0x3226 )
+>     , ( "seveninferior", 0x2087 )
+>     , ( "sevenmonospace", 0xff17 )
+>     , ( "sevenoldstyle", 0xf737 )
+>     , ( "sevenparen", 0x247a )
+>     , ( "sevenperiod", 0x248e )
+>     , ( "sevenpersian", 0x06f7 )
+>     , ( "sevenroman", 0x2176 )
+>     , ( "sevensuperior", 0x2077 )
+>     , ( "seventeencircle", 0x2470 )
+>     , ( "seventeenparen", 0x2484 )
+>     , ( "seventeenperiod", 0x2498 )
+>     , ( "seventhai", 0x0e57 )
+>     , ( "sfthyphen", 0x00ad )
+>     , ( "shaarmenian", 0x0577 )
+>     , ( "shabengali", 0x09b6 )
+>     , ( "shacyrillic", 0x0448 )
+>     , ( "shaddaarabic", 0x0651 )
+>     , ( "shaddadammaarabic", 0xfc61 )
+>     , ( "shaddadammatanarabic", 0xfc5e )
+>     , ( "shaddafathaarabic", 0xfc60 )
+>     , ( "shaddafathatanarabic", 0x0651 )
+>     , ( "shaddakasraarabic", 0xfc62 )
+>     , ( "shaddakasratanarabic", 0xfc5f )
+>     , ( "shade", 0x2592 )
+>     , ( "shadedark", 0x2593 )
+>     , ( "shadelight", 0x2591 )
+>     , ( "shademedium", 0x2592 )
+>     , ( "shadeva", 0x0936 )
+>     , ( "shagujarati", 0x0ab6 )
+>     , ( "shagurmukhi", 0x0a36 )
+>     , ( "shalshelethebrew", 0x0593 )
+>     , ( "shbopomofo", 0x3115 )
+>     , ( "shchacyrillic", 0x0449 )
+>     , ( "sheenarabic", 0x0634 )
+>     , ( "sheenfinalarabic", 0xfeb6 )
+>     , ( "sheeninitialarabic", 0xfeb7 )
+>     , ( "sheenmedialarabic", 0xfeb8 )
+>     , ( "sheicoptic", 0x03e3 )
+>     , ( "sheqel", 0x20aa )
+>     , ( "sheqelhebrew", 0x20aa )
+>     , ( "sheva", 0x05b0 )
+>     , ( "sheva115", 0x05b0 )
+>     , ( "sheva15", 0x05b0 )
+>     , ( "sheva22", 0x05b0 )
+>     , ( "sheva2e", 0x05b0 )
+>     , ( "shevahebrew", 0x05b0 )
+>     , ( "shevanarrowhebrew", 0x05b0 )
+>     , ( "shevaquarterhebrew", 0x05b0 )
+>     , ( "shevawidehebrew", 0x05b0 )
+>     , ( "shhacyrillic", 0x04bb )
+>     , ( "shimacoptic", 0x03ed )
+>     , ( "shin", 0x05e9 )
+>     , ( "shindagesh", 0xfb49 )
+>     , ( "shindageshhebrew", 0xfb49 )
+>     , ( "shindageshshindot", 0xfb2c )
+>     , ( "shindageshshindothebrew", 0xfb2c )
+>     , ( "shindageshsindot", 0xfb2d )
+>     , ( "shindageshsindothebrew", 0xfb2d )
+>     , ( "shindothebrew", 0x05c1 )
+>     , ( "shinhebrew", 0x05e9 )
+>     , ( "shinshindot", 0xfb2a )
+>     , ( "shinshindothebrew", 0xfb2a )
+>     , ( "shinsindot", 0xfb2b )
+>     , ( "shinsindothebrew", 0xfb2b )
+>     , ( "shook", 0x0282 )
+>     , ( "sigma", 0x03c3 )
+>     , ( "sigma1", 0x03c2 )
+>     , ( "sigmafinal", 0x03c2 )
+>     , ( "sigmalunatesymbolgreek", 0x03f2 )
+>     , ( "sihiragana", 0x3057 )
+>     , ( "sikatakana", 0x30b7 )
+>     , ( "sikatakanahalfwidth", 0xff7c )
+>     , ( "siluqhebrew", 0x05bd )
+>     , ( "siluqlefthebrew", 0x05bd )
+>     , ( "similar", 0x223c )
+>     , ( "sindothebrew", 0x05c2 )
+>     , ( "siosacirclekorean", 0x3274 )
+>     , ( "siosaparenkorean", 0x3214 )
+>     , ( "sioscieuckorean", 0x317e )
+>     , ( "sioscirclekorean", 0x3266 )
+>     , ( "sioskiyeokkorean", 0x317a )
+>     , ( "sioskorean", 0x3145 )
+>     , ( "siosnieunkorean", 0x317b )
+>     , ( "siosparenkorean", 0x3206 )
+>     , ( "siospieupkorean", 0x317d )
+>     , ( "siostikeutkorean", 0x317c )
+>     , ( "six", 0x0036 )
+>     , ( "sixarabic", 0x0666 )
+>     , ( "sixbengali", 0x09ec )
+>     , ( "sixcircle", 0x2465 )
+>     , ( "sixcircleinversesansserif", 0x278f )
+>     , ( "sixdeva", 0x096c )
+>     , ( "sixgujarati", 0x0aec )
+>     , ( "sixgurmukhi", 0x0a6c )
+>     , ( "sixhackarabic", 0x0666 )
+>     , ( "sixhangzhou", 0x3026 )
+>     , ( "sixideographicparen", 0x3225 )
+>     , ( "sixinferior", 0x2086 )
+>     , ( "sixmonospace", 0xff16 )
+>     , ( "sixoldstyle", 0xf736 )
+>     , ( "sixparen", 0x2479 )
+>     , ( "sixperiod", 0x248d )
+>     , ( "sixpersian", 0x06f6 )
+>     , ( "sixroman", 0x2175 )
+>     , ( "sixsuperior", 0x2076 )
+>     , ( "sixteencircle", 0x246f )
+>     , ( "sixteencurrencydenominatorbengali", 0x09f9 )
+>     , ( "sixteenparen", 0x2483 )
+>     , ( "sixteenperiod", 0x2497 )
+>     , ( "sixthai", 0x0e56 )
+>     , ( "slash", 0x002f )
+>     , ( "slashmonospace", 0xff0f )
+>     , ( "slong", 0x017f )
+>     , ( "slongdotaccent", 0x1e9b )
+>     , ( "smileface", 0x263a )
+>     , ( "smonospace", 0xff53 )
+>     , ( "sofpasuqhebrew", 0x05c3 )
+>     , ( "softhyphen", 0x00ad )
+>     , ( "softsigncyrillic", 0x044c )
+>     , ( "sohiragana", 0x305d )
+>     , ( "sokatakana", 0x30bd )
+>     , ( "sokatakanahalfwidth", 0xff7f )
+>     , ( "soliduslongoverlaycmb", 0x0338 )
+>     , ( "solidusshortoverlaycmb", 0x0337 )
+>     , ( "sorusithai", 0x0e29 )
+>     , ( "sosalathai", 0x0e28 )
+>     , ( "sosothai", 0x0e0b )
+>     , ( "sosuathai", 0x0e2a )
+>     , ( "space", 0x0020 )
+>     , ( "spacehackarabic", 0x0020 )
+>     , ( "spade", 0x2660 )
+>     , ( "spadesuitblack", 0x2660 )
+>     , ( "spadesuitwhite", 0x2664 )
+>     , ( "sparen", 0x24ae )
+>     , ( "squarebelowcmb", 0x033b )
+>     , ( "squarecc", 0x33c4 )
+>     , ( "squarecm", 0x339d )
+>     , ( "squarediagonalcrosshatchfill", 0x25a9 )
+>     , ( "squarehorizontalfill", 0x25a4 )
+>     , ( "squarekg", 0x338f )
+>     , ( "squarekm", 0x339e )
+>     , ( "squarekmcapital", 0x33ce )
+>     , ( "squareln", 0x33d1 )
+>     , ( "squarelog", 0x33d2 )
+>     , ( "squaremg", 0x338e )
+>     , ( "squaremil", 0x33d5 )
+>     , ( "squaremm", 0x339c )
+>     , ( "squaremsquared", 0x33a1 )
+>     , ( "squareorthogonalcrosshatchfill", 0x25a6 )
+>     , ( "squareupperlefttolowerrightfill", 0x25a7 )
+>     , ( "squareupperrighttolowerleftfill", 0x25a8 )
+>     , ( "squareverticalfill", 0x25a5 )
+>     , ( "squarewhitewithsmallblack", 0x25a3 )
+>     , ( "srsquare", 0x33db )
+>     , ( "ssabengali", 0x09b7 )
+>     , ( "ssadeva", 0x0937 )
+>     , ( "ssagujarati", 0x0ab7 )
+>     , ( "ssangcieuckorean", 0x3149 )
+>     , ( "ssanghieuhkorean", 0x3185 )
+>     , ( "ssangieungkorean", 0x3180 )
+>     , ( "ssangkiyeokkorean", 0x3132 )
+>     , ( "ssangnieunkorean", 0x3165 )
+>     , ( "ssangpieupkorean", 0x3143 )
+>     , ( "ssangsioskorean", 0x3146 )
+>     , ( "ssangtikeutkorean", 0x3138 )
+>     , ( "ssuperior", 0xf6f2 )
+>     , ( "sterling", 0x00a3 )
+>     , ( "sterlingmonospace", 0xffe1 )
+>     , ( "strokelongoverlaycmb", 0x0336 )
+>     , ( "strokeshortoverlaycmb", 0x0335 )
+>     , ( "subset", 0x2282 )
+>     , ( "subsetnotequal", 0x228a )
+>     , ( "subsetorequal", 0x2286 )
+>     , ( "succeeds", 0x227b )
+>     , ( "suchthat", 0x220b )
+>     , ( "suhiragana", 0x3059 )
+>     , ( "sukatakana", 0x30b9 )
+>     , ( "sukatakanahalfwidth", 0xff7d )
+>     , ( "sukunarabic", 0x0652 )
+>     , ( "summation", 0x2211 )
+>     , ( "sun", 0x263c )
+>     , ( "superset", 0x2283 )
+>     , ( "supersetnotequal", 0x228b )
+>     , ( "supersetorequal", 0x2287 )
+>     , ( "svsquare", 0x33dc )
+>     , ( "syouwaerasquare", 0x337c )
+>     , ( "t", 0x0074 )
+>     , ( "tabengali", 0x09a4 )
+>     , ( "tackdown", 0x22a4 )
+>     , ( "tackleft", 0x22a3 )
+>     , ( "tadeva", 0x0924 )
+>     , ( "tagujarati", 0x0aa4 )
+>     , ( "tagurmukhi", 0x0a24 )
+>     , ( "taharabic", 0x0637 )
+>     , ( "tahfinalarabic", 0xfec2 )
+>     , ( "tahinitialarabic", 0xfec3 )
+>     , ( "tahiragana", 0x305f )
+>     , ( "tahmedialarabic", 0xfec4 )
+>     , ( "taisyouerasquare", 0x337d )
+>     , ( "takatakana", 0x30bf )
+>     , ( "takatakanahalfwidth", 0xff80 )
+>     , ( "tatweelarabic", 0x0640 )
+>     , ( "tau", 0x03c4 )
+>     , ( "tav", 0x05ea )
+>     , ( "tavdages", 0xfb4a )
+>     , ( "tavdagesh", 0xfb4a )
+>     , ( "tavdageshhebrew", 0xfb4a )
+>     , ( "tavhebrew", 0x05ea )
+>     , ( "tbar", 0x0167 )
+>     , ( "tbopomofo", 0x310a )
+>     , ( "tcaron", 0x0165 )
+>     , ( "tccurl", 0x02a8 )
+>     , ( "tcedilla", 0x0163 )
+>     , ( "tcheharabic", 0x0686 )
+>     , ( "tchehfinalarabic", 0xfb7b )
+>     , ( "tchehinitialarabic", 0xfb7c )
+>     , ( "tchehmedialarabic", 0xfb7d )
+>     , ( "tchehmeeminitialarabic", 0xfb7c )
+>     , ( "tcircle", 0x24e3 )
+>     , ( "tcircumflexbelow", 0x1e71 )
+>     , ( "tcommaaccent", 0x0163 )
+>     , ( "tdieresis", 0x1e97 )
+>     , ( "tdotaccent", 0x1e6b )
+>     , ( "tdotbelow", 0x1e6d )
+>     , ( "tecyrillic", 0x0442 )
+>     , ( "tedescendercyrillic", 0x04ad )
+>     , ( "teharabic", 0x062a )
+>     , ( "tehfinalarabic", 0xfe96 )
+>     , ( "tehhahinitialarabic", 0xfca2 )
+>     , ( "tehhahisolatedarabic", 0xfc0c )
+>     , ( "tehinitialarabic", 0xfe97 )
+>     , ( "tehiragana", 0x3066 )
+>     , ( "tehjeeminitialarabic", 0xfca1 )
+>     , ( "tehjeemisolatedarabic", 0xfc0b )
+>     , ( "tehmarbutaarabic", 0x0629 )
+>     , ( "tehmarbutafinalarabic", 0xfe94 )
+>     , ( "tehmedialarabic", 0xfe98 )
+>     , ( "tehmeeminitialarabic", 0xfca4 )
+>     , ( "tehmeemisolatedarabic", 0xfc0e )
+>     , ( "tehnoonfinalarabic", 0xfc73 )
+>     , ( "tekatakana", 0x30c6 )
+>     , ( "tekatakanahalfwidth", 0xff83 )
+>     , ( "telephone", 0x2121 )
+>     , ( "telephoneblack", 0x260e )
+>     , ( "telishagedolahebrew", 0x05a0 )
+>     , ( "telishaqetanahebrew", 0x05a9 )
+>     , ( "tencircle", 0x2469 )
+>     , ( "tenideographicparen", 0x3229 )
+>     , ( "tenparen", 0x247d )
+>     , ( "tenperiod", 0x2491 )
+>     , ( "tenroman", 0x2179 )
+>     , ( "tesh", 0x02a7 )
+>     , ( "tet", 0x05d8 )
+>     , ( "tetdagesh", 0xfb38 )
+>     , ( "tetdageshhebrew", 0xfb38 )
+>     , ( "tethebrew", 0x05d8 )
+>     , ( "tetsecyrillic", 0x04b5 )
+>     , ( "tevirhebrew", 0x059b )
+>     , ( "tevirlefthebrew", 0x059b )
+>     , ( "thabengali", 0x09a5 )
+>     , ( "thadeva", 0x0925 )
+>     , ( "thagujarati", 0x0aa5 )
+>     , ( "thagurmukhi", 0x0a25 )
+>     , ( "thalarabic", 0x0630 )
+>     , ( "thalfinalarabic", 0xfeac )
+>     , ( "thanthakhatlowleftthai", 0xf898 )
+>     , ( "thanthakhatlowrightthai", 0xf897 )
+>     , ( "thanthakhatthai", 0x0e4c )
+>     , ( "thanthakhatupperleftthai", 0xf896 )
+>     , ( "theharabic", 0x062b )
+>     , ( "thehfinalarabic", 0xfe9a )
+>     , ( "thehinitialarabic", 0xfe9b )
+>     , ( "thehmedialarabic", 0xfe9c )
+>     , ( "thereexists", 0x2203 )
+>     , ( "therefore", 0x2234 )
+>     , ( "theta", 0x03b8 )
+>     , ( "theta1", 0x03d1 )
+>     , ( "thetasymbolgreek", 0x03d1 )
+>     , ( "thieuthacirclekorean", 0x3279 )
+>     , ( "thieuthaparenkorean", 0x3219 )
+>     , ( "thieuthcirclekorean", 0x326b )
+>     , ( "thieuthkorean", 0x314c )
+>     , ( "thieuthparenkorean", 0x320b )
+>     , ( "thirteencircle", 0x246c )
+>     , ( "thirteenparen", 0x2480 )
+>     , ( "thirteenperiod", 0x2494 )
+>     , ( "thonangmonthothai", 0x0e11 )
+>     , ( "thook", 0x01ad )
+>     , ( "thophuthaothai", 0x0e12 )
+>     , ( "thorn", 0x00fe )
+>     , ( "thothahanthai", 0x0e17 )
+>     , ( "thothanthai", 0x0e10 )
+>     , ( "thothongthai", 0x0e18 )
+>     , ( "thothungthai", 0x0e16 )
+>     , ( "thousandcyrillic", 0x0482 )
+>     , ( "thousandsseparatorarabic", 0x066c )
+>     , ( "thousandsseparatorpersian", 0x066c )
+>     , ( "three", 0x0033 )
+>     , ( "threearabic", 0x0663 )
+>     , ( "threebengali", 0x09e9 )
+>     , ( "threecircle", 0x2462 )
+>     , ( "threecircleinversesansserif", 0x278c )
+>     , ( "threedeva", 0x0969 )
+>     , ( "threeeighths", 0x215c )
+>     , ( "threegujarati", 0x0ae9 )
+>     , ( "threegurmukhi", 0x0a69 )
+>     , ( "threehackarabic", 0x0663 )
+>     , ( "threehangzhou", 0x3023 )
+>     , ( "threeideographicparen", 0x3222 )
+>     , ( "threeinferior", 0x2083 )
+>     , ( "threemonospace", 0xff13 )
+>     , ( "threenumeratorbengali", 0x09f6 )
+>     , ( "threeoldstyle", 0xf733 )
+>     , ( "threeparen", 0x2476 )
+>     , ( "threeperiod", 0x248a )
+>     , ( "threepersian", 0x06f3 )
+>     , ( "threequarters", 0x00be )
+>     , ( "threequartersemdash", 0xf6de )
+>     , ( "threeroman", 0x2172 )
+>     , ( "threesuperior", 0x00b3 )
+>     , ( "threethai", 0x0e53 )
+>     , ( "thzsquare", 0x3394 )
+>     , ( "tihiragana", 0x3061 )
+>     , ( "tikatakana", 0x30c1 )
+>     , ( "tikatakanahalfwidth", 0xff81 )
+>     , ( "tikeutacirclekorean", 0x3270 )
+>     , ( "tikeutaparenkorean", 0x3210 )
+>     , ( "tikeutcirclekorean", 0x3262 )
+>     , ( "tikeutkorean", 0x3137 )
+>     , ( "tikeutparenkorean", 0x3202 )
+>     , ( "tilde", 0x02dc )
+>     , ( "tildebelowcmb", 0x0330 )
+>     , ( "tildecmb", 0x0303 )
+>     , ( "tildecomb", 0x0303 )
+>     , ( "tildedoublecmb", 0x0360 )
+>     , ( "tildeoperator", 0x223c )
+>     , ( "tildeoverlaycmb", 0x0334 )
+>     , ( "tildeverticalcmb", 0x033e )
+>     , ( "timescircle", 0x2297 )
+>     , ( "tipehahebrew", 0x0596 )
+>     , ( "tipehalefthebrew", 0x0596 )
+>     , ( "tippigurmukhi", 0x0a70 )
+>     , ( "titlocyrilliccmb", 0x0483 )
+>     , ( "tiwnarmenian", 0x057f )
+>     , ( "tlinebelow", 0x1e6f )
+>     , ( "tmonospace", 0xff54 )
+>     , ( "toarmenian", 0x0569 )
+>     , ( "tohiragana", 0x3068 )
+>     , ( "tokatakana", 0x30c8 )
+>     , ( "tokatakanahalfwidth", 0xff84 )
+>     , ( "tonebarextrahighmod", 0x02e5 )
+>     , ( "tonebarextralowmod", 0x02e9 )
+>     , ( "tonebarhighmod", 0x02e6 )
+>     , ( "tonebarlowmod", 0x02e8 )
+>     , ( "tonebarmidmod", 0x02e7 )
+>     , ( "tonefive", 0x01bd )
+>     , ( "tonesix", 0x0185 )
+>     , ( "tonetwo", 0x01a8 )
+>     , ( "tonos", 0x0384 )
+>     , ( "tonsquare", 0x3327 )
+>     , ( "topatakthai", 0x0e0f )
+>     , ( "tortoiseshellbracketleft", 0x3014 )
+>     , ( "tortoiseshellbracketleftsmall", 0xfe5d )
+>     , ( "tortoiseshellbracketleftvertical", 0xfe39 )
+>     , ( "tortoiseshellbracketright", 0x3015 )
+>     , ( "tortoiseshellbracketrightsmall", 0xfe5e )
+>     , ( "tortoiseshellbracketrightvertical", 0xfe3a )
+>     , ( "totaothai", 0x0e15 )
+>     , ( "tpalatalhook", 0x01ab )
+>     , ( "tparen", 0x24af )
+>     , ( "trademark", 0x2122 )
+>     , ( "trademarksans", 0xf8ea )
+>     , ( "trademarkserif", 0xf6db )
+>     , ( "tretroflexhook", 0x0288 )
+>     , ( "triagdn", 0x25bc )
+>     , ( "triaglf", 0x25c4 )
+>     , ( "triagrt", 0x25ba )
+>     , ( "triagup", 0x25b2 )
+>     , ( "ts", 0x02a6 )
+>     , ( "tsadi", 0x05e6 )
+>     , ( "tsadidagesh", 0xfb46 )
+>     , ( "tsadidageshhebrew", 0xfb46 )
+>     , ( "tsadihebrew", 0x05e6 )
+>     , ( "tsecyrillic", 0x0446 )
+>     , ( "tsere", 0x05b5 )
+>     , ( "tsere12", 0x05b5 )
+>     , ( "tsere1e", 0x05b5 )
+>     , ( "tsere2b", 0x05b5 )
+>     , ( "tserehebrew", 0x05b5 )
+>     , ( "tserenarrowhebrew", 0x05b5 )
+>     , ( "tserequarterhebrew", 0x05b5 )
+>     , ( "tserewidehebrew", 0x05b5 )
+>     , ( "tshecyrillic", 0x045b )
+>     , ( "tsuperior", 0xf6f3 )
+>     , ( "ttabengali", 0x099f )
+>     , ( "ttadeva", 0x091f )
+>     , ( "ttagujarati", 0x0a9f )
+>     , ( "ttagurmukhi", 0x0a1f )
+>     , ( "tteharabic", 0x0679 )
+>     , ( "ttehfinalarabic", 0xfb67 )
+>     , ( "ttehinitialarabic", 0xfb68 )
+>     , ( "ttehmedialarabic", 0xfb69 )
+>     , ( "tthabengali", 0x09a0 )
+>     , ( "tthadeva", 0x0920 )
+>     , ( "tthagujarati", 0x0aa0 )
+>     , ( "tthagurmukhi", 0x0a20 )
+>     , ( "tturned", 0x0287 )
+>     , ( "tuhiragana", 0x3064 )
+>     , ( "tukatakana", 0x30c4 )
+>     , ( "tukatakanahalfwidth", 0xff82 )
+>     , ( "tusmallhiragana", 0x3063 )
+>     , ( "tusmallkatakana", 0x30c3 )
+>     , ( "tusmallkatakanahalfwidth", 0xff6f )
+>     , ( "twelvecircle", 0x246b )
+>     , ( "twelveparen", 0x247f )
+>     , ( "twelveperiod", 0x2493 )
+>     , ( "twelveroman", 0x217b )
+>     , ( "twentycircle", 0x2473 )
+>     , ( "twentyhangzhou", 0x5344 )
+>     , ( "twentyparen", 0x2487 )
+>     , ( "twentyperiod", 0x249b )
+>     , ( "two", 0x0032 )
+>     , ( "twoarabic", 0x0662 )
+>     , ( "twobengali", 0x09e8 )
+>     , ( "twocircle", 0x2461 )
+>     , ( "twocircleinversesansserif", 0x278b )
+>     , ( "twodeva", 0x0968 )
+>     , ( "twodotenleader", 0x2025 )
+>     , ( "twodotleader", 0x2025 )
+>     , ( "twodotleadervertical", 0xfe30 )
+>     , ( "twogujarati", 0x0ae8 )
+>     , ( "twogurmukhi", 0x0a68 )
+>     , ( "twohackarabic", 0x0662 )
+>     , ( "twohangzhou", 0x3022 )
+>     , ( "twoideographicparen", 0x3221 )
+>     , ( "twoinferior", 0x2082 )
+>     , ( "twomonospace", 0xff12 )
+>     , ( "twonumeratorbengali", 0x09f5 )
+>     , ( "twooldstyle", 0xf732 )
+>     , ( "twoparen", 0x2475 )
+>     , ( "twoperiod", 0x2489 )
+>     , ( "twopersian", 0x06f2 )
+>     , ( "tworoman", 0x2171 )
+>     , ( "twostroke", 0x01bb )
+>     , ( "twosuperior", 0x00b2 )
+>     , ( "twothai", 0x0e52 )
+>     , ( "twothirds", 0x2154 )
+>     , ( "u", 0x0075 )
+>     , ( "uacute", 0x00fa )
+>     , ( "ubar", 0x0289 )
+>     , ( "ubengali", 0x0989 )
+>     , ( "ubopomofo", 0x3128 )
+>     , ( "ubreve", 0x016d )
+>     , ( "ucaron", 0x01d4 )
+>     , ( "ucircle", 0x24e4 )
+>     , ( "ucircumflex", 0x00fb )
+>     , ( "ucircumflexbelow", 0x1e77 )
+>     , ( "ucyrillic", 0x0443 )
+>     , ( "udattadeva", 0x0951 )
+>     , ( "udblacute", 0x0171 )
+>     , ( "udblgrave", 0x0215 )
+>     , ( "udeva", 0x0909 )
+>     , ( "udieresis", 0x00fc )
+>     , ( "udieresisacute", 0x01d8 )
+>     , ( "udieresisbelow", 0x1e73 )
+>     , ( "udieresiscaron", 0x01da )
+>     , ( "udieresiscyrillic", 0x04f1 )
+>     , ( "udieresisgrave", 0x01dc )
+>     , ( "udieresismacron", 0x01d6 )
+>     , ( "udotbelow", 0x1ee5 )
+>     , ( "ugrave", 0x00f9 )
+>     , ( "ugujarati", 0x0a89 )
+>     , ( "ugurmukhi", 0x0a09 )
+>     , ( "uhiragana", 0x3046 )
+>     , ( "uhookabove", 0x1ee7 )
+>     , ( "uhorn", 0x01b0 )
+>     , ( "uhornacute", 0x1ee9 )
+>     , ( "uhorndotbelow", 0x1ef1 )
+>     , ( "uhorngrave", 0x1eeb )
+>     , ( "uhornhookabove", 0x1eed )
+>     , ( "uhorntilde", 0x1eef )
+>     , ( "uhungarumlaut", 0x0171 )
+>     , ( "uhungarumlautcyrillic", 0x04f3 )
+>     , ( "uinvertedbreve", 0x0217 )
+>     , ( "ukatakana", 0x30a6 )
+>     , ( "ukatakanahalfwidth", 0xff73 )
+>     , ( "ukcyrillic", 0x0479 )
+>     , ( "ukorean", 0x315c )
+>     , ( "umacron", 0x016b )
+>     , ( "umacroncyrillic", 0x04ef )
+>     , ( "umacrondieresis", 0x1e7b )
+>     , ( "umatragurmukhi", 0x0a41 )
+>     , ( "umonospace", 0xff55 )
+>     , ( "underscore", 0x005f )
+>     , ( "underscoredbl", 0x2017 )
+>     , ( "underscoremonospace", 0xff3f )
+>     , ( "underscorevertical", 0xfe33 )
+>     , ( "underscorewavy", 0xfe4f )
+>     , ( "union", 0x222a )
+>     , ( "universal", 0x2200 )
+>     , ( "uogonek", 0x0173 )
+>     , ( "uparen", 0x24b0 )
+>     , ( "upblock", 0x2580 )
+>     , ( "upperdothebrew", 0x05c4 )
+>     , ( "upsilon", 0x03c5 )
+>     , ( "upsilondieresis", 0x03cb )
+>     , ( "upsilondieresistonos", 0x03b0 )
+>     , ( "upsilonlatin", 0x028a )
+>     , ( "upsilontonos", 0x03cd )
+>     , ( "uptackbelowcmb", 0x031d )
+>     , ( "uptackmod", 0x02d4 )
+>     , ( "uragurmukhi", 0x0a73 )
+>     , ( "uring", 0x016f )
+>     , ( "ushortcyrillic", 0x045e )
+>     , ( "usmallhiragana", 0x3045 )
+>     , ( "usmallkatakana", 0x30a5 )
+>     , ( "usmallkatakanahalfwidth", 0xff69 )
+>     , ( "ustraightcyrillic", 0x04af )
+>     , ( "ustraightstrokecyrillic", 0x04b1 )
+>     , ( "utilde", 0x0169 )
+>     , ( "utildeacute", 0x1e79 )
+>     , ( "utildebelow", 0x1e75 )
+>     , ( "uubengali", 0x098a )
+>     , ( "uudeva", 0x090a )
+>     , ( "uugujarati", 0x0a8a )
+>     , ( "uugurmukhi", 0x0a0a )
+>     , ( "uumatragurmukhi", 0x0a42 )
+>     , ( "uuvowelsignbengali", 0x09c2 )
+>     , ( "uuvowelsigndeva", 0x0942 )
+>     , ( "uuvowelsigngujarati", 0x0ac2 )
+>     , ( "uvowelsignbengali", 0x09c1 )
+>     , ( "uvowelsigndeva", 0x0941 )
+>     , ( "uvowelsigngujarati", 0x0ac1 )
+>     , ( "v", 0x0076 )
+>     , ( "vadeva", 0x0935 )
+>     , ( "vagujarati", 0x0ab5 )
+>     , ( "vagurmukhi", 0x0a35 )
+>     , ( "vakatakana", 0x30f7 )
+>     , ( "vav", 0x05d5 )
+>     , ( "vavdagesh", 0xfb35 )
+>     , ( "vavdagesh65", 0xfb35 )
+>     , ( "vavdageshhebrew", 0xfb35 )
+>     , ( "vavhebrew", 0x05d5 )
+>     , ( "vavholam", 0xfb4b )
+>     , ( "vavholamhebrew", 0xfb4b )
+>     , ( "vavvavhebrew", 0x05f0 )
+>     , ( "vavyodhebrew", 0x05f1 )
+>     , ( "vcircle", 0x24e5 )
+>     , ( "vdotbelow", 0x1e7f )
+>     , ( "vecyrillic", 0x0432 )
+>     , ( "veharabic", 0x06a4 )
+>     , ( "vehfinalarabic", 0xfb6b )
+>     , ( "vehinitialarabic", 0xfb6c )
+>     , ( "vehmedialarabic", 0xfb6d )
+>     , ( "vekatakana", 0x30f9 )
+>     , ( "venus", 0x2640 )
+>     , ( "verticalbar", 0x007c )
+>     , ( "verticallineabovecmb", 0x030d )
+>     , ( "verticallinebelowcmb", 0x0329 )
+>     , ( "verticallinelowmod", 0x02cc )
+>     , ( "verticallinemod", 0x02c8 )
+>     , ( "vewarmenian", 0x057e )
+>     , ( "vhook", 0x028b )
+>     , ( "vikatakana", 0x30f8 )
+>     , ( "viramabengali", 0x09cd )
+>     , ( "viramadeva", 0x094d )
+>     , ( "viramagujarati", 0x0acd )
+>     , ( "visargabengali", 0x0983 )
+>     , ( "visargadeva", 0x0903 )
+>     , ( "visargagujarati", 0x0a83 )
+>     , ( "vmonospace", 0xff56 )
+>     , ( "voarmenian", 0x0578 )
+>     , ( "voicediterationhiragana", 0x309e )
+>     , ( "voicediterationkatakana", 0x30fe )
+>     , ( "voicedmarkkana", 0x309b )
+>     , ( "voicedmarkkanahalfwidth", 0xff9e )
+>     , ( "vokatakana", 0x30fa )
+>     , ( "vparen", 0x24b1 )
+>     , ( "vtilde", 0x1e7d )
+>     , ( "vturned", 0x028c )
+>     , ( "vuhiragana", 0x3094 )
+>     , ( "vukatakana", 0x30f4 )
+>     , ( "w", 0x0077 )
+>     , ( "wacute", 0x1e83 )
+>     , ( "waekorean", 0x3159 )
+>     , ( "wahiragana", 0x308f )
+>     , ( "wakatakana", 0x30ef )
+>     , ( "wakatakanahalfwidth", 0xff9c )
+>     , ( "wakorean", 0x3158 )
+>     , ( "wasmallhiragana", 0x308e )
+>     , ( "wasmallkatakana", 0x30ee )
+>     , ( "wattosquare", 0x3357 )
+>     , ( "wavedash", 0x301c )
+>     , ( "wavyunderscorevertical", 0xfe34 )
+>     , ( "wawarabic", 0x0648 )
+>     , ( "wawfinalarabic", 0xfeee )
+>     , ( "wawhamzaabovearabic", 0x0624 )
+>     , ( "wawhamzaabovefinalarabic", 0xfe86 )
+>     , ( "wbsquare", 0x33dd )
+>     , ( "wcircle", 0x24e6 )
+>     , ( "wcircumflex", 0x0175 )
+>     , ( "wdieresis", 0x1e85 )
+>     , ( "wdotaccent", 0x1e87 )
+>     , ( "wdotbelow", 0x1e89 )
+>     , ( "wehiragana", 0x3091 )
+>     , ( "weierstrass", 0x2118 )
+>     , ( "wekatakana", 0x30f1 )
+>     , ( "wekorean", 0x315e )
+>     , ( "weokorean", 0x315d )
+>     , ( "wgrave", 0x1e81 )
+>     , ( "whitebullet", 0x25e6 )
+>     , ( "whitecircle", 0x25cb )
+>     , ( "whitecircleinverse", 0x25d9 )
+>     , ( "whitecornerbracketleft", 0x300e )
+>     , ( "whitecornerbracketleftvertical", 0xfe43 )
+>     , ( "whitecornerbracketright", 0x300f )
+>     , ( "whitecornerbracketrightvertical", 0xfe44 )
+>     , ( "whitediamond", 0x25c7 )
+>     , ( "whitediamondcontainingblacksmalldiamond", 0x25c8 )
+>     , ( "whitedownpointingsmalltriangle", 0x25bf )
+>     , ( "whitedownpointingtriangle", 0x25bd )
+>     , ( "whiteleftpointingsmalltriangle", 0x25c3 )
+>     , ( "whiteleftpointingtriangle", 0x25c1 )
+>     , ( "whitelenticularbracketleft", 0x3016 )
+>     , ( "whitelenticularbracketright", 0x3017 )
+>     , ( "whiterightpointingsmalltriangle", 0x25b9 )
+>     , ( "whiterightpointingtriangle", 0x25b7 )
+>     , ( "whitesmallsquare", 0x25ab )
+>     , ( "whitesmilingface", 0x263a )
+>     , ( "whitesquare", 0x25a1 )
+>     , ( "whitestar", 0x2606 )
+>     , ( "whitetelephone", 0x260f )
+>     , ( "whitetortoiseshellbracketleft", 0x3018 )
+>     , ( "whitetortoiseshellbracketright", 0x3019 )
+>     , ( "whiteuppointingsmalltriangle", 0x25b5 )
+>     , ( "whiteuppointingtriangle", 0x25b3 )
+>     , ( "wihiragana", 0x3090 )
+>     , ( "wikatakana", 0x30f0 )
+>     , ( "wikorean", 0x315f )
+>     , ( "wmonospace", 0xff57 )
+>     , ( "wohiragana", 0x3092 )
+>     , ( "wokatakana", 0x30f2 )
+>     , ( "wokatakanahalfwidth", 0xff66 )
+>     , ( "won", 0x20a9 )
+>     , ( "wonmonospace", 0xffe6 )
+>     , ( "wowaenthai", 0x0e27 )
+>     , ( "wparen", 0x24b2 )
+>     , ( "wring", 0x1e98 )
+>     , ( "wsuperior", 0x02b7 )
+>     , ( "wturned", 0x028d )
+>     , ( "wynn", 0x01bf )
+>     , ( "x", 0x0078 )
+>     , ( "xabovecmb", 0x033d )
+>     , ( "xbopomofo", 0x3112 )
+>     , ( "xcircle", 0x24e7 )
+>     , ( "xdieresis", 0x1e8d )
+>     , ( "xdotaccent", 0x1e8b )
+>     , ( "xeharmenian", 0x056d )
+>     , ( "xi", 0x03be )
+>     , ( "xmonospace", 0xff58 )
+>     , ( "xparen", 0x24b3 )
+>     , ( "xsuperior", 0x02e3 )
+>     , ( "y", 0x0079 )
+>     , ( "yaadosquare", 0x334e )
+>     , ( "yabengali", 0x09af )
+>     , ( "yacute", 0x00fd )
+>     , ( "yadeva", 0x092f )
+>     , ( "yaekorean", 0x3152 )
+>     , ( "yagujarati", 0x0aaf )
+>     , ( "yagurmukhi", 0x0a2f )
+>     , ( "yahiragana", 0x3084 )
+>     , ( "yakatakana", 0x30e4 )
+>     , ( "yakatakanahalfwidth", 0xff94 )
+>     , ( "yakorean", 0x3151 )
+>     , ( "yamakkanthai", 0x0e4e )
+>     , ( "yasmallhiragana", 0x3083 )
+>     , ( "yasmallkatakana", 0x30e3 )
+>     , ( "yasmallkatakanahalfwidth", 0xff6c )
+>     , ( "yatcyrillic", 0x0463 )
+>     , ( "ycircle", 0x24e8 )
+>     , ( "ycircumflex", 0x0177 )
+>     , ( "ydieresis", 0x00ff )
+>     , ( "ydotaccent", 0x1e8f )
+>     , ( "ydotbelow", 0x1ef5 )
+>     , ( "yeharabic", 0x064a )
+>     , ( "yehbarreearabic", 0x06d2 )
+>     , ( "yehbarreefinalarabic", 0xfbaf )
+>     , ( "yehfinalarabic", 0xfef2 )
+>     , ( "yehhamzaabovearabic", 0x0626 )
+>     , ( "yehhamzaabovefinalarabic", 0xfe8a )
+>     , ( "yehhamzaaboveinitialarabic", 0xfe8b )
+>     , ( "yehhamzaabovemedialarabic", 0xfe8c )
+>     , ( "yehinitialarabic", 0xfef3 )
+>     , ( "yehmedialarabic", 0xfef4 )
+>     , ( "yehmeeminitialarabic", 0xfcdd )
+>     , ( "yehmeemisolatedarabic", 0xfc58 )
+>     , ( "yehnoonfinalarabic", 0xfc94 )
+>     , ( "yehthreedotsbelowarabic", 0x06d1 )
+>     , ( "yekorean", 0x3156 )
+>     , ( "yen", 0x00a5 )
+>     , ( "yenmonospace", 0xffe5 )
+>     , ( "yeokorean", 0x3155 )
+>     , ( "yeorinhieuhkorean", 0x3186 )
+>     , ( "yerahbenyomohebrew", 0x05aa )
+>     , ( "yerahbenyomolefthebrew", 0x05aa )
+>     , ( "yericyrillic", 0x044b )
+>     , ( "yerudieresiscyrillic", 0x04f9 )
+>     , ( "yesieungkorean", 0x3181 )
+>     , ( "yesieungpansioskorean", 0x3183 )
+>     , ( "yesieungsioskorean", 0x3182 )
+>     , ( "yetivhebrew", 0x059a )
+>     , ( "ygrave", 0x1ef3 )
+>     , ( "yhook", 0x01b4 )
+>     , ( "yhookabove", 0x1ef7 )
+>     , ( "yiarmenian", 0x0575 )
+>     , ( "yicyrillic", 0x0457 )
+>     , ( "yikorean", 0x3162 )
+>     , ( "yinyang", 0x262f )
+>     , ( "yiwnarmenian", 0x0582 )
+>     , ( "ymonospace", 0xff59 )
+>     , ( "yod", 0x05d9 )
+>     , ( "yoddagesh", 0xfb39 )
+>     , ( "yoddageshhebrew", 0xfb39 )
+>     , ( "yodhebrew", 0x05d9 )
+>     , ( "yodyodhebrew", 0x05f2 )
+>     , ( "yodyodpatahhebrew", 0xfb1f )
+>     , ( "yohiragana", 0x3088 )
+>     , ( "yoikorean", 0x3189 )
+>     , ( "yokatakana", 0x30e8 )
+>     , ( "yokatakanahalfwidth", 0xff96 )
+>     , ( "yokorean", 0x315b )
+>     , ( "yosmallhiragana", 0x3087 )
+>     , ( "yosmallkatakana", 0x30e7 )
+>     , ( "yosmallkatakanahalfwidth", 0xff6e )
+>     , ( "yotgreek", 0x03f3 )
+>     , ( "yoyaekorean", 0x3188 )
+>     , ( "yoyakorean", 0x3187 )
+>     , ( "yoyakthai", 0x0e22 )
+>     , ( "yoyingthai", 0x0e0d )
+>     , ( "yparen", 0x24b4 )
+>     , ( "ypogegrammeni", 0x037a )
+>     , ( "ypogegrammenigreekcmb", 0x0345 )
+>     , ( "yr", 0x01a6 )
+>     , ( "yring", 0x1e99 )
+>     , ( "ysuperior", 0x02b8 )
+>     , ( "ytilde", 0x1ef9 )
+>     , ( "yturned", 0x028e )
+>     , ( "yuhiragana", 0x3086 )
+>     , ( "yuikorean", 0x318c )
+>     , ( "yukatakana", 0x30e6 )
+>     , ( "yukatakanahalfwidth", 0xff95 )
+>     , ( "yukorean", 0x3160 )
+>     , ( "yusbigcyrillic", 0x046b )
+>     , ( "yusbigiotifiedcyrillic", 0x046d )
+>     , ( "yuslittlecyrillic", 0x0467 )
+>     , ( "yuslittleiotifiedcyrillic", 0x0469 )
+>     , ( "yusmallhiragana", 0x3085 )
+>     , ( "yusmallkatakana", 0x30e5 )
+>     , ( "yusmallkatakanahalfwidth", 0xff6d )
+>     , ( "yuyekorean", 0x318b )
+>     , ( "yuyeokorean", 0x318a )
+>     , ( "yyabengali", 0x09df )
+>     , ( "yyadeva", 0x095f )
+>     , ( "z", 0x007a )
+>     , ( "zaarmenian", 0x0566 )
+>     , ( "zacute", 0x017a )
+>     , ( "zadeva", 0x095b )
+>     , ( "zagurmukhi", 0x0a5b )
+>     , ( "zaharabic", 0x0638 )
+>     , ( "zahfinalarabic", 0xfec6 )
+>     , ( "zahinitialarabic", 0xfec7 )
+>     , ( "zahiragana", 0x3056 )
+>     , ( "zahmedialarabic", 0xfec8 )
+>     , ( "zainarabic", 0x0632 )
+>     , ( "zainfinalarabic", 0xfeb0 )
+>     , ( "zakatakana", 0x30b6 )
+>     , ( "zaqefgadolhebrew", 0x0595 )
+>     , ( "zaqefqatanhebrew", 0x0594 )
+>     , ( "zarqahebrew", 0x0598 )
+>     , ( "zayin", 0x05d6 )
+>     , ( "zayindagesh", 0xfb36 )
+>     , ( "zayindageshhebrew", 0xfb36 )
+>     , ( "zayinhebrew", 0x05d6 )
+>     , ( "zbopomofo", 0x3117 )
+>     , ( "zcaron", 0x017e )
+>     , ( "zcircle", 0x24e9 )
+>     , ( "zcircumflex", 0x1e91 )
+>     , ( "zcurl", 0x0291 )
+>     , ( "zdot", 0x017c )
+>     , ( "zdotaccent", 0x017c )
+>     , ( "zdotbelow", 0x1e93 )
+>     , ( "zecyrillic", 0x0437 )
+>     , ( "zedescendercyrillic", 0x0499 )
+>     , ( "zedieresiscyrillic", 0x04df )
+>     , ( "zehiragana", 0x305c )
+>     , ( "zekatakana", 0x30bc )
+>     , ( "zero", 0x0030 )
+>     , ( "zeroarabic", 0x0660 )
+>     , ( "zerobengali", 0x09e6 )
+>     , ( "zerodeva", 0x0966 )
+>     , ( "zerogujarati", 0x0ae6 )
+>     , ( "zerogurmukhi", 0x0a66 )
+>     , ( "zerohackarabic", 0x0660 )
+>     , ( "zeroinferior", 0x2080 )
+>     , ( "zeromonospace", 0xff10 )
+>     , ( "zerooldstyle", 0xf730 )
+>     , ( "zeropersian", 0x06f0 )
+>     , ( "zerosuperior", 0x2070 )
+>     , ( "zerothai", 0x0e50 )
+>     , ( "zerowidthjoiner", 0xfeff )
+>     , ( "zerowidthnonjoiner", 0x200c )
+>     , ( "zerowidthspace", 0x200b )
+>     , ( "zeta", 0x03b6 )
+>     , ( "zhbopomofo", 0x3113 )
+>     , ( "zhearmenian", 0x056a )
+>     , ( "zhebrevecyrillic", 0x04c2 )
+>     , ( "zhecyrillic", 0x0436 )
+>     , ( "zhedescendercyrillic", 0x0497 )
+>     , ( "zhedieresiscyrillic", 0x04dd )
+>     , ( "zihiragana", 0x3058 )
+>     , ( "zikatakana", 0x30b8 )
+>     , ( "zinorhebrew", 0x05ae )
+>     , ( "zlinebelow", 0x1e95 )
+>     , ( "zmonospace", 0xff5a )
+>     , ( "zohiragana", 0x305e )
+>     , ( "zokatakana", 0x30be )
+>     , ( "zparen", 0x24b5 )
+>     , ( "zretroflexhook", 0x0290 )
+>     , ( "zstroke", 0x01b6 )
+>     , ( "zuhiragana", 0x305a )
+>     , ( "zukatakana", 0x30ba )
+>     ]
+ src/Wumpus/Core/Text/GlyphNames.lhs view
@@ -0,0 +1,3714 @@+{-# OPTIONS -Wall #-}
+
+> ------------------------------------------------------------------------------
+> -- | 
+> -- Module       :   Wumpus.Core.Text.GlyphNames
+> -- Copyright    :   (c) Stephen Tetley 2010
+> -- License      :   BSD3
+> -- 
+> -- Maintainer   :   Stephen Tetley <stephen.tetley@gmail.com>
+> -- Stability    :   unstable
+> -- Portability  :   GHC
+> -- 
+> -- Map of Unicode code points to PostScript glyph names.
+> -- 
+> -- \*\* This file is auto-generated. \*\*
+> -- 
+> -- Generated - 2010-11-13 15:30
+> -- 
+> ------------------------------------------------------------------------------
+
+> module Wumpus.Core.Text.GlyphNames
+>   (
+>      ps_glyph_names
+>   ) where
+
+> import Data.IntMap ( IntMap, fromAscList )
+
+> -- | Index table mapping from Unicode code point to the
+> -- corresponding PostScript name defined by the Adobe
+> -- glyphlist.
+
+> ps_glyph_names :: IntMap String
+> ps_glyph_names = fromAscList $
+>     [ ( 0x0001, "controlSTX" )
+>     , ( 0x0002, "controlSOT" )
+>     , ( 0x0003, "controlETX" )
+>     , ( 0x0004, "controlEOT" )
+>     , ( 0x0005, "controlENQ" )
+>     , ( 0x0006, "controlACK" )
+>     , ( 0x0007, "controlBEL" )
+>     , ( 0x0008, "controlBS" )
+>     , ( 0x0009, "controlHT" )
+>     , ( 0x000a, "controlLF" )
+>     , ( 0x000b, "controlVT" )
+>     , ( 0x000c, "controlFF" )
+>     , ( 0x000d, "controlCR" )
+>     , ( 0x000e, "controlSO" )
+>     , ( 0x000f, "controlSI" )
+>     , ( 0x0010, "controlDLE" )
+>     , ( 0x0011, "controlDC1" )
+>     , ( 0x0012, "controlDC2" )
+>     , ( 0x0013, "controlDC3" )
+>     , ( 0x0014, "controlDC4" )
+>     , ( 0x0015, "controlNAK" )
+>     , ( 0x0016, "controlSYN" )
+>     , ( 0x0017, "controlETB" )
+>     , ( 0x0018, "controlCAN" )
+>     , ( 0x0019, "controlEM" )
+>     , ( 0x001a, "controlSUB" )
+>     , ( 0x001b, "controlESC" )
+>     , ( 0x001c, "controlFS" )
+>     , ( 0x001d, "controlGS" )
+>     , ( 0x001e, "controlRS" )
+>     , ( 0x001f, "controlUS" )
+>     , ( 0x0020, "space" )
+>     , ( 0x0021, "exclam" )
+>     , ( 0x0022, "quotedbl" )
+>     , ( 0x0023, "numbersign" )
+>     , ( 0x0024, "dollar" )
+>     , ( 0x0025, "percent" )
+>     , ( 0x0026, "ampersand" )
+>     , ( 0x0027, "quotesingle" )
+>     , ( 0x0028, "parenleft" )
+>     , ( 0x0029, "parenright" )
+>     , ( 0x002a, "asterisk" )
+>     , ( 0x002b, "plus" )
+>     , ( 0x002c, "comma" )
+>     , ( 0x002d, "hyphen" )
+>     , ( 0x002e, "period" )
+>     , ( 0x002f, "slash" )
+>     , ( 0x0030, "zero" )
+>     , ( 0x0031, "one" )
+>     , ( 0x0032, "two" )
+>     , ( 0x0033, "three" )
+>     , ( 0x0034, "four" )
+>     , ( 0x0035, "five" )
+>     , ( 0x0036, "six" )
+>     , ( 0x0037, "seven" )
+>     , ( 0x0038, "eight" )
+>     , ( 0x0039, "nine" )
+>     , ( 0x003a, "colon" )
+>     , ( 0x003b, "semicolon" )
+>     , ( 0x003c, "less" )
+>     , ( 0x003d, "equal" )
+>     , ( 0x003e, "greater" )
+>     , ( 0x003f, "question" )
+>     , ( 0x0040, "at" )
+>     , ( 0x0041, "A" )
+>     , ( 0x0042, "B" )
+>     , ( 0x0043, "C" )
+>     , ( 0x0044, "D" )
+>     , ( 0x0045, "E" )
+>     , ( 0x0046, "F" )
+>     , ( 0x0047, "G" )
+>     , ( 0x0048, "H" )
+>     , ( 0x0049, "I" )
+>     , ( 0x004a, "J" )
+>     , ( 0x004b, "K" )
+>     , ( 0x004c, "L" )
+>     , ( 0x004d, "M" )
+>     , ( 0x004e, "N" )
+>     , ( 0x004f, "O" )
+>     , ( 0x0050, "P" )
+>     , ( 0x0051, "Q" )
+>     , ( 0x0052, "R" )
+>     , ( 0x0053, "S" )
+>     , ( 0x0054, "T" )
+>     , ( 0x0055, "U" )
+>     , ( 0x0056, "V" )
+>     , ( 0x0057, "W" )
+>     , ( 0x0058, "X" )
+>     , ( 0x0059, "Y" )
+>     , ( 0x005a, "Z" )
+>     , ( 0x005b, "bracketleft" )
+>     , ( 0x005c, "backslash" )
+>     , ( 0x005d, "bracketright" )
+>     , ( 0x005e, "asciicircum" )
+>     , ( 0x005f, "underscore" )
+>     , ( 0x0060, "grave" )
+>     , ( 0x0061, "a" )
+>     , ( 0x0062, "b" )
+>     , ( 0x0063, "c" )
+>     , ( 0x0064, "d" )
+>     , ( 0x0065, "e" )
+>     , ( 0x0066, "f" )
+>     , ( 0x0067, "g" )
+>     , ( 0x0068, "h" )
+>     , ( 0x0069, "i" )
+>     , ( 0x006a, "j" )
+>     , ( 0x006b, "k" )
+>     , ( 0x006c, "l" )
+>     , ( 0x006d, "m" )
+>     , ( 0x006e, "n" )
+>     , ( 0x006f, "o" )
+>     , ( 0x0070, "p" )
+>     , ( 0x0071, "q" )
+>     , ( 0x0072, "r" )
+>     , ( 0x0073, "s" )
+>     , ( 0x0074, "t" )
+>     , ( 0x0075, "u" )
+>     , ( 0x0076, "v" )
+>     , ( 0x0077, "w" )
+>     , ( 0x0078, "x" )
+>     , ( 0x0079, "y" )
+>     , ( 0x007a, "z" )
+>     , ( 0x007b, "braceleft" )
+>     , ( 0x007c, "bar" )
+>     , ( 0x007d, "braceright" )
+>     , ( 0x007e, "asciitilde" )
+>     , ( 0x007f, "controlDEL" )
+>     , ( 0x00a0, "nbspace" )
+>     , ( 0x00a1, "exclamdown" )
+>     , ( 0x00a2, "cent" )
+>     , ( 0x00a3, "sterling" )
+>     , ( 0x00a4, "currency" )
+>     , ( 0x00a5, "yen" )
+>     , ( 0x00a6, "brokenbar" )
+>     , ( 0x00a7, "section" )
+>     , ( 0x00a8, "dieresis" )
+>     , ( 0x00a9, "copyright" )
+>     , ( 0x00aa, "ordfeminine" )
+>     , ( 0x00ab, "guillemotleft" )
+>     , ( 0x00ac, "logicalnot" )
+>     , ( 0x00ad, "sfthyphen" )
+>     , ( 0x00ae, "registered" )
+>     , ( 0x00af, "macron" )
+>     , ( 0x00b0, "degree" )
+>     , ( 0x00b1, "plusminus" )
+>     , ( 0x00b2, "twosuperior" )
+>     , ( 0x00b3, "threesuperior" )
+>     , ( 0x00b4, "acute" )
+>     , ( 0x00b5, "mu" )
+>     , ( 0x00b6, "paragraph" )
+>     , ( 0x00b7, "middot" )
+>     , ( 0x00b8, "cedilla" )
+>     , ( 0x00b9, "onesuperior" )
+>     , ( 0x00ba, "ordmasculine" )
+>     , ( 0x00bb, "guillemotright" )
+>     , ( 0x00bc, "onequarter" )
+>     , ( 0x00bd, "onehalf" )
+>     , ( 0x00be, "threequarters" )
+>     , ( 0x00bf, "questiondown" )
+>     , ( 0x00c0, "Agrave" )
+>     , ( 0x00c1, "Aacute" )
+>     , ( 0x00c2, "Acircumflex" )
+>     , ( 0x00c3, "Atilde" )
+>     , ( 0x00c4, "Adieresis" )
+>     , ( 0x00c5, "Aring" )
+>     , ( 0x00c6, "AE" )
+>     , ( 0x00c7, "Ccedilla" )
+>     , ( 0x00c8, "Egrave" )
+>     , ( 0x00c9, "Eacute" )
+>     , ( 0x00ca, "Ecircumflex" )
+>     , ( 0x00cb, "Edieresis" )
+>     , ( 0x00cc, "Igrave" )
+>     , ( 0x00cd, "Iacute" )
+>     , ( 0x00ce, "Icircumflex" )
+>     , ( 0x00cf, "Idieresis" )
+>     , ( 0x00d0, "Eth" )
+>     , ( 0x00d1, "Ntilde" )
+>     , ( 0x00d2, "Ograve" )
+>     , ( 0x00d3, "Oacute" )
+>     , ( 0x00d4, "Ocircumflex" )
+>     , ( 0x00d5, "Otilde" )
+>     , ( 0x00d6, "Odieresis" )
+>     , ( 0x00d7, "multiply" )
+>     , ( 0x00d8, "Oslash" )
+>     , ( 0x00d9, "Ugrave" )
+>     , ( 0x00da, "Uacute" )
+>     , ( 0x00db, "Ucircumflex" )
+>     , ( 0x00dc, "Udieresis" )
+>     , ( 0x00dd, "Yacute" )
+>     , ( 0x00de, "Thorn" )
+>     , ( 0x00df, "germandbls" )
+>     , ( 0x00e0, "agrave" )
+>     , ( 0x00e1, "aacute" )
+>     , ( 0x00e2, "acircumflex" )
+>     , ( 0x00e3, "atilde" )
+>     , ( 0x00e4, "adieresis" )
+>     , ( 0x00e5, "aring" )
+>     , ( 0x00e6, "ae" )
+>     , ( 0x00e7, "ccedilla" )
+>     , ( 0x00e8, "egrave" )
+>     , ( 0x00e9, "eacute" )
+>     , ( 0x00ea, "ecircumflex" )
+>     , ( 0x00eb, "edieresis" )
+>     , ( 0x00ec, "igrave" )
+>     , ( 0x00ed, "iacute" )
+>     , ( 0x00ee, "icircumflex" )
+>     , ( 0x00ef, "idieresis" )
+>     , ( 0x00f0, "eth" )
+>     , ( 0x00f1, "ntilde" )
+>     , ( 0x00f2, "ograve" )
+>     , ( 0x00f3, "oacute" )
+>     , ( 0x00f4, "ocircumflex" )
+>     , ( 0x00f5, "otilde" )
+>     , ( 0x00f6, "odieresis" )
+>     , ( 0x00f7, "divide" )
+>     , ( 0x00f8, "oslash" )
+>     , ( 0x00f9, "ugrave" )
+>     , ( 0x00fa, "uacute" )
+>     , ( 0x00fb, "ucircumflex" )
+>     , ( 0x00fc, "udieresis" )
+>     , ( 0x00fd, "yacute" )
+>     , ( 0x00fe, "thorn" )
+>     , ( 0x00ff, "ydieresis" )
+>     , ( 0x0100, "Amacron" )
+>     , ( 0x0101, "amacron" )
+>     , ( 0x0102, "Abreve" )
+>     , ( 0x0103, "abreve" )
+>     , ( 0x0104, "Aogonek" )
+>     , ( 0x0105, "aogonek" )
+>     , ( 0x0106, "Cacute" )
+>     , ( 0x0107, "cacute" )
+>     , ( 0x0108, "Ccircumflex" )
+>     , ( 0x0109, "ccircumflex" )
+>     , ( 0x010a, "Cdot" )
+>     , ( 0x010b, "cdot" )
+>     , ( 0x010c, "Ccaron" )
+>     , ( 0x010d, "ccaron" )
+>     , ( 0x010e, "Dcaron" )
+>     , ( 0x010f, "dcaron" )
+>     , ( 0x0110, "Dcroat" )
+>     , ( 0x0111, "dcroat" )
+>     , ( 0x0112, "Emacron" )
+>     , ( 0x0113, "emacron" )
+>     , ( 0x0114, "Ebreve" )
+>     , ( 0x0115, "ebreve" )
+>     , ( 0x0116, "Edot" )
+>     , ( 0x0117, "edot" )
+>     , ( 0x0118, "Eogonek" )
+>     , ( 0x0119, "eogonek" )
+>     , ( 0x011a, "Ecaron" )
+>     , ( 0x011b, "ecaron" )
+>     , ( 0x011c, "Gcircumflex" )
+>     , ( 0x011d, "gcircumflex" )
+>     , ( 0x011e, "Gbreve" )
+>     , ( 0x011f, "gbreve" )
+>     , ( 0x0120, "Gdot" )
+>     , ( 0x0121, "gdot" )
+>     , ( 0x0122, "Gcedilla" )
+>     , ( 0x0123, "gcedilla" )
+>     , ( 0x0124, "Hcircumflex" )
+>     , ( 0x0125, "hcircumflex" )
+>     , ( 0x0126, "Hbar" )
+>     , ( 0x0127, "hbar" )
+>     , ( 0x0128, "Itilde" )
+>     , ( 0x0129, "itilde" )
+>     , ( 0x012a, "Imacron" )
+>     , ( 0x012b, "imacron" )
+>     , ( 0x012c, "Ibreve" )
+>     , ( 0x012d, "ibreve" )
+>     , ( 0x012e, "Iogonek" )
+>     , ( 0x012f, "iogonek" )
+>     , ( 0x0130, "Idot" )
+>     , ( 0x0131, "dotlessi" )
+>     , ( 0x0132, "IJ" )
+>     , ( 0x0133, "ij" )
+>     , ( 0x0134, "Jcircumflex" )
+>     , ( 0x0135, "jcircumflex" )
+>     , ( 0x0136, "Kcedilla" )
+>     , ( 0x0137, "kcedilla" )
+>     , ( 0x0138, "kgreenlandic" )
+>     , ( 0x0139, "Lacute" )
+>     , ( 0x013a, "lacute" )
+>     , ( 0x013b, "Lcedilla" )
+>     , ( 0x013c, "lcedilla" )
+>     , ( 0x013d, "Lcaron" )
+>     , ( 0x013e, "lcaron" )
+>     , ( 0x013f, "Ldot" )
+>     , ( 0x0140, "ldot" )
+>     , ( 0x0141, "Lslash" )
+>     , ( 0x0142, "lslash" )
+>     , ( 0x0143, "Nacute" )
+>     , ( 0x0144, "nacute" )
+>     , ( 0x0145, "Ncedilla" )
+>     , ( 0x0146, "ncedilla" )
+>     , ( 0x0147, "Ncaron" )
+>     , ( 0x0148, "ncaron" )
+>     , ( 0x0149, "napostrophe" )
+>     , ( 0x014a, "Eng" )
+>     , ( 0x014b, "eng" )
+>     , ( 0x014c, "Omacron" )
+>     , ( 0x014d, "omacron" )
+>     , ( 0x014e, "Obreve" )
+>     , ( 0x014f, "obreve" )
+>     , ( 0x0150, "Odblacute" )
+>     , ( 0x0151, "odblacute" )
+>     , ( 0x0152, "OE" )
+>     , ( 0x0153, "oe" )
+>     , ( 0x0154, "Racute" )
+>     , ( 0x0155, "racute" )
+>     , ( 0x0156, "Rcedilla" )
+>     , ( 0x0157, "rcedilla" )
+>     , ( 0x0158, "Rcaron" )
+>     , ( 0x0159, "rcaron" )
+>     , ( 0x015a, "Sacute" )
+>     , ( 0x015b, "sacute" )
+>     , ( 0x015c, "Scircumflex" )
+>     , ( 0x015d, "scircumflex" )
+>     , ( 0x015e, "Scedilla" )
+>     , ( 0x015f, "scedilla" )
+>     , ( 0x0160, "Scaron" )
+>     , ( 0x0161, "scaron" )
+>     , ( 0x0162, "Tcedilla" )
+>     , ( 0x0163, "tcedilla" )
+>     , ( 0x0164, "Tcaron" )
+>     , ( 0x0165, "tcaron" )
+>     , ( 0x0166, "Tbar" )
+>     , ( 0x0167, "tbar" )
+>     , ( 0x0168, "Utilde" )
+>     , ( 0x0169, "utilde" )
+>     , ( 0x016a, "Umacron" )
+>     , ( 0x016b, "umacron" )
+>     , ( 0x016c, "Ubreve" )
+>     , ( 0x016d, "ubreve" )
+>     , ( 0x016e, "Uring" )
+>     , ( 0x016f, "uring" )
+>     , ( 0x0170, "Udblacute" )
+>     , ( 0x0171, "udblacute" )
+>     , ( 0x0172, "Uogonek" )
+>     , ( 0x0173, "uogonek" )
+>     , ( 0x0174, "Wcircumflex" )
+>     , ( 0x0175, "wcircumflex" )
+>     , ( 0x0176, "Ycircumflex" )
+>     , ( 0x0177, "ycircumflex" )
+>     , ( 0x0178, "Ydieresis" )
+>     , ( 0x0179, "Zacute" )
+>     , ( 0x017a, "zacute" )
+>     , ( 0x017b, "Zdot" )
+>     , ( 0x017c, "zdot" )
+>     , ( 0x017d, "Zcaron" )
+>     , ( 0x017e, "zcaron" )
+>     , ( 0x017f, "longs" )
+>     , ( 0x0180, "bstroke" )
+>     , ( 0x0181, "Bhook" )
+>     , ( 0x0182, "Btopbar" )
+>     , ( 0x0183, "btopbar" )
+>     , ( 0x0184, "Tonesix" )
+>     , ( 0x0185, "tonesix" )
+>     , ( 0x0186, "Oopen" )
+>     , ( 0x0187, "Chook" )
+>     , ( 0x0188, "chook" )
+>     , ( 0x0189, "Dafrican" )
+>     , ( 0x018a, "Dhook" )
+>     , ( 0x018b, "Dtopbar" )
+>     , ( 0x018c, "dtopbar" )
+>     , ( 0x018d, "deltaturned" )
+>     , ( 0x018e, "Ereversed" )
+>     , ( 0x018f, "Schwa" )
+>     , ( 0x0190, "Eopen" )
+>     , ( 0x0191, "Fhook" )
+>     , ( 0x0192, "florin" )
+>     , ( 0x0193, "Ghook" )
+>     , ( 0x0194, "Gammaafrican" )
+>     , ( 0x0195, "hv" )
+>     , ( 0x0196, "Iotaafrican" )
+>     , ( 0x0197, "Istroke" )
+>     , ( 0x0198, "Khook" )
+>     , ( 0x0199, "khook" )
+>     , ( 0x019a, "lbar" )
+>     , ( 0x019b, "lambdastroke" )
+>     , ( 0x019c, "Mturned" )
+>     , ( 0x019d, "Nhookleft" )
+>     , ( 0x019e, "nlegrightlong" )
+>     , ( 0x019f, "Ocenteredtilde" )
+>     , ( 0x01a0, "Ohorn" )
+>     , ( 0x01a1, "ohorn" )
+>     , ( 0x01a2, "Oi" )
+>     , ( 0x01a3, "oi" )
+>     , ( 0x01a4, "Phook" )
+>     , ( 0x01a5, "phook" )
+>     , ( 0x01a6, "yr" )
+>     , ( 0x01a7, "Tonetwo" )
+>     , ( 0x01a8, "tonetwo" )
+>     , ( 0x01a9, "Esh" )
+>     , ( 0x01aa, "eshreversedloop" )
+>     , ( 0x01ab, "tpalatalhook" )
+>     , ( 0x01ac, "Thook" )
+>     , ( 0x01ad, "thook" )
+>     , ( 0x01ae, "Tretroflexhook" )
+>     , ( 0x01af, "Uhorn" )
+>     , ( 0x01b0, "uhorn" )
+>     , ( 0x01b1, "Upsilonafrican" )
+>     , ( 0x01b2, "Vhook" )
+>     , ( 0x01b3, "Yhook" )
+>     , ( 0x01b4, "yhook" )
+>     , ( 0x01b5, "Zstroke" )
+>     , ( 0x01b6, "zstroke" )
+>     , ( 0x01b7, "Ezh" )
+>     , ( 0x01b8, "Ezhreversed" )
+>     , ( 0x01b9, "ezhreversed" )
+>     , ( 0x01ba, "ezhtail" )
+>     , ( 0x01bb, "twostroke" )
+>     , ( 0x01bc, "Tonefive" )
+>     , ( 0x01bd, "tonefive" )
+>     , ( 0x01be, "glottalinvertedstroke" )
+>     , ( 0x01bf, "wynn" )
+>     , ( 0x01c0, "clickdental" )
+>     , ( 0x01c1, "clicklateral" )
+>     , ( 0x01c2, "clickalveolar" )
+>     , ( 0x01c3, "clickretroflex" )
+>     , ( 0x01c4, "DZcaron" )
+>     , ( 0x01c5, "Dzcaron" )
+>     , ( 0x01c6, "dzcaron" )
+>     , ( 0x01c7, "LJ" )
+>     , ( 0x01c8, "Lj" )
+>     , ( 0x01c9, "lj" )
+>     , ( 0x01ca, "NJ" )
+>     , ( 0x01cb, "Nj" )
+>     , ( 0x01cc, "nj" )
+>     , ( 0x01cd, "Acaron" )
+>     , ( 0x01ce, "acaron" )
+>     , ( 0x01cf, "Icaron" )
+>     , ( 0x01d0, "icaron" )
+>     , ( 0x01d1, "Ocaron" )
+>     , ( 0x01d2, "ocaron" )
+>     , ( 0x01d3, "Ucaron" )
+>     , ( 0x01d4, "ucaron" )
+>     , ( 0x01d5, "Udieresismacron" )
+>     , ( 0x01d6, "udieresismacron" )
+>     , ( 0x01d7, "Udieresisacute" )
+>     , ( 0x01d8, "udieresisacute" )
+>     , ( 0x01d9, "Udieresiscaron" )
+>     , ( 0x01da, "udieresiscaron" )
+>     , ( 0x01db, "Udieresisgrave" )
+>     , ( 0x01dc, "udieresisgrave" )
+>     , ( 0x01dd, "eturned" )
+>     , ( 0x01de, "Adieresismacron" )
+>     , ( 0x01df, "adieresismacron" )
+>     , ( 0x01e0, "Adotmacron" )
+>     , ( 0x01e1, "adotmacron" )
+>     , ( 0x01e2, "AEmacron" )
+>     , ( 0x01e3, "aemacron" )
+>     , ( 0x01e4, "Gstroke" )
+>     , ( 0x01e5, "gstroke" )
+>     , ( 0x01e6, "Gcaron" )
+>     , ( 0x01e7, "gcaron" )
+>     , ( 0x01e8, "Kcaron" )
+>     , ( 0x01e9, "kcaron" )
+>     , ( 0x01ea, "Oogonek" )
+>     , ( 0x01eb, "oogonek" )
+>     , ( 0x01ec, "Oogonekmacron" )
+>     , ( 0x01ed, "oogonekmacron" )
+>     , ( 0x01ee, "Ezhcaron" )
+>     , ( 0x01ef, "ezhcaron" )
+>     , ( 0x01f0, "jcaron" )
+>     , ( 0x01f1, "DZ" )
+>     , ( 0x01f2, "Dz" )
+>     , ( 0x01f3, "dz" )
+>     , ( 0x01f4, "Gacute" )
+>     , ( 0x01f5, "gacute" )
+>     , ( 0x01fa, "Aringacute" )
+>     , ( 0x01fb, "aringacute" )
+>     , ( 0x01fc, "AEacute" )
+>     , ( 0x01fd, "aeacute" )
+>     , ( 0x01fe, "Oslashacute" )
+>     , ( 0x01ff, "oslashacute" )
+>     , ( 0x0200, "Adblgrave" )
+>     , ( 0x0201, "adblgrave" )
+>     , ( 0x0202, "Ainvertedbreve" )
+>     , ( 0x0203, "ainvertedbreve" )
+>     , ( 0x0204, "Edblgrave" )
+>     , ( 0x0205, "edblgrave" )
+>     , ( 0x0206, "Einvertedbreve" )
+>     , ( 0x0207, "einvertedbreve" )
+>     , ( 0x0208, "Idblgrave" )
+>     , ( 0x0209, "idblgrave" )
+>     , ( 0x020a, "Iinvertedbreve" )
+>     , ( 0x020b, "iinvertedbreve" )
+>     , ( 0x020c, "Odblgrave" )
+>     , ( 0x020d, "odblgrave" )
+>     , ( 0x020e, "Oinvertedbreve" )
+>     , ( 0x020f, "oinvertedbreve" )
+>     , ( 0x0210, "Rdblgrave" )
+>     , ( 0x0211, "rdblgrave" )
+>     , ( 0x0212, "Rinvertedbreve" )
+>     , ( 0x0213, "rinvertedbreve" )
+>     , ( 0x0214, "Udblgrave" )
+>     , ( 0x0215, "udblgrave" )
+>     , ( 0x0216, "Uinvertedbreve" )
+>     , ( 0x0217, "uinvertedbreve" )
+>     , ( 0x0218, "Scommaaccent" )
+>     , ( 0x0219, "scommaaccent" )
+>     , ( 0x0250, "aturned" )
+>     , ( 0x0251, "ascript" )
+>     , ( 0x0252, "ascriptturned" )
+>     , ( 0x0253, "bhook" )
+>     , ( 0x0254, "oopen" )
+>     , ( 0x0255, "ccurl" )
+>     , ( 0x0256, "dtail" )
+>     , ( 0x0257, "dhook" )
+>     , ( 0x0258, "ereversed" )
+>     , ( 0x0259, "schwa" )
+>     , ( 0x025a, "schwahook" )
+>     , ( 0x025b, "eopen" )
+>     , ( 0x025c, "eopenreversed" )
+>     , ( 0x025d, "eopenreversedhook" )
+>     , ( 0x025e, "eopenreversedclosed" )
+>     , ( 0x025f, "jdotlessstroke" )
+>     , ( 0x0260, "ghook" )
+>     , ( 0x0261, "gscript" )
+>     , ( 0x0263, "gammalatinsmall" )
+>     , ( 0x0264, "ramshorn" )
+>     , ( 0x0265, "hturned" )
+>     , ( 0x0266, "hhook" )
+>     , ( 0x0267, "henghook" )
+>     , ( 0x0268, "istroke" )
+>     , ( 0x0269, "iotalatin" )
+>     , ( 0x026b, "lmiddletilde" )
+>     , ( 0x026c, "lbelt" )
+>     , ( 0x026d, "lhookretroflex" )
+>     , ( 0x026e, "lezh" )
+>     , ( 0x026f, "mturned" )
+>     , ( 0x0270, "mlonglegturned" )
+>     , ( 0x0271, "mhook" )
+>     , ( 0x0272, "nhookleft" )
+>     , ( 0x0273, "nhookretroflex" )
+>     , ( 0x0275, "obarred" )
+>     , ( 0x0277, "omegalatinclosed" )
+>     , ( 0x0278, "philatin" )
+>     , ( 0x0279, "rturned" )
+>     , ( 0x027a, "rlonglegturned" )
+>     , ( 0x027b, "rhookturned" )
+>     , ( 0x027c, "rlongleg" )
+>     , ( 0x027d, "rhook" )
+>     , ( 0x027e, "rfishhook" )
+>     , ( 0x027f, "rfishhookreversed" )
+>     , ( 0x0281, "Rsmallinverted" )
+>     , ( 0x0282, "shook" )
+>     , ( 0x0283, "esh" )
+>     , ( 0x0284, "dotlessjstrokehook" )
+>     , ( 0x0285, "eshsquatreversed" )
+>     , ( 0x0286, "eshcurl" )
+>     , ( 0x0287, "tturned" )
+>     , ( 0x0288, "tretroflexhook" )
+>     , ( 0x0289, "ubar" )
+>     , ( 0x028a, "upsilonlatin" )
+>     , ( 0x028b, "vhook" )
+>     , ( 0x028c, "vturned" )
+>     , ( 0x028d, "wturned" )
+>     , ( 0x028e, "yturned" )
+>     , ( 0x0290, "zretroflexhook" )
+>     , ( 0x0291, "zcurl" )
+>     , ( 0x0292, "ezh" )
+>     , ( 0x0293, "ezhcurl" )
+>     , ( 0x0294, "glottalstop" )
+>     , ( 0x0295, "glottalstopreversed" )
+>     , ( 0x0296, "glottalstopinverted" )
+>     , ( 0x0297, "cstretched" )
+>     , ( 0x0298, "bilabialclick" )
+>     , ( 0x029a, "eopenclosed" )
+>     , ( 0x029b, "Gsmallhook" )
+>     , ( 0x029d, "jcrossedtail" )
+>     , ( 0x029e, "kturned" )
+>     , ( 0x02a0, "qhook" )
+>     , ( 0x02a1, "glottalstopstroke" )
+>     , ( 0x02a2, "glottalstopstrokereversed" )
+>     , ( 0x02a3, "dzaltone" )
+>     , ( 0x02a4, "dezh" )
+>     , ( 0x02a5, "dzcurl" )
+>     , ( 0x02a6, "ts" )
+>     , ( 0x02a7, "tesh" )
+>     , ( 0x02a8, "tccurl" )
+>     , ( 0x02b0, "hsuperior" )
+>     , ( 0x02b1, "hhooksuperior" )
+>     , ( 0x02b2, "jsuperior" )
+>     , ( 0x02b4, "rturnedsuperior" )
+>     , ( 0x02b5, "rhookturnedsuperior" )
+>     , ( 0x02b6, "Rsmallinvertedsuperior" )
+>     , ( 0x02b7, "wsuperior" )
+>     , ( 0x02b8, "ysuperior" )
+>     , ( 0x02b9, "primemod" )
+>     , ( 0x02ba, "dblprimemod" )
+>     , ( 0x02bb, "commaturnedmod" )
+>     , ( 0x02bc, "afii57929" )
+>     , ( 0x02bd, "afii64937" )
+>     , ( 0x02be, "ringhalfright" )
+>     , ( 0x02bf, "ringhalfleft" )
+>     , ( 0x02c0, "glottalstopmod" )
+>     , ( 0x02c1, "glottalstopreversedmod" )
+>     , ( 0x02c2, "arrowheadleftmod" )
+>     , ( 0x02c3, "arrowheadrightmod" )
+>     , ( 0x02c4, "arrowheadupmod" )
+>     , ( 0x02c5, "arrowheaddownmod" )
+>     , ( 0x02c6, "circumflex" )
+>     , ( 0x02c7, "caron" )
+>     , ( 0x02c8, "verticallinemod" )
+>     , ( 0x02c9, "firsttonechinese" )
+>     , ( 0x02ca, "secondtonechinese" )
+>     , ( 0x02cb, "fourthtonechinese" )
+>     , ( 0x02cc, "verticallinelowmod" )
+>     , ( 0x02cd, "macronlowmod" )
+>     , ( 0x02ce, "gravelowmod" )
+>     , ( 0x02cf, "acutelowmod" )
+>     , ( 0x02d0, "colontriangularmod" )
+>     , ( 0x02d1, "colontriangularhalfmod" )
+>     , ( 0x02d2, "ringhalfrightcentered" )
+>     , ( 0x02d3, "ringhalfleftcentered" )
+>     , ( 0x02d4, "uptackmod" )
+>     , ( 0x02d5, "downtackmod" )
+>     , ( 0x02d6, "plusmod" )
+>     , ( 0x02d7, "minusmod" )
+>     , ( 0x02d8, "breve" )
+>     , ( 0x02d9, "dotaccent" )
+>     , ( 0x02da, "ring" )
+>     , ( 0x02db, "ogonek" )
+>     , ( 0x02dc, "ilde" )
+>     , ( 0x02dd, "hungarumlaut" )
+>     , ( 0x02de, "rhotichookmod" )
+>     , ( 0x02e0, "gammasuperior" )
+>     , ( 0x02e3, "xsuperior" )
+>     , ( 0x02e4, "glottalstopreversedsuperior" )
+>     , ( 0x02e5, "tonebarextrahighmod" )
+>     , ( 0x02e6, "tonebarhighmod" )
+>     , ( 0x02e7, "tonebarmidmod" )
+>     , ( 0x02e8, "tonebarlowmod" )
+>     , ( 0x02e9, "tonebarextralowmod" )
+>     , ( 0x0300, "gravecmb" )
+>     , ( 0x0301, "acutecmb" )
+>     , ( 0x0302, "circumflexcmb" )
+>     , ( 0x0303, "tildecmb" )
+>     , ( 0x0304, "macroncmb" )
+>     , ( 0x0305, "overlinecmb" )
+>     , ( 0x0306, "brevecmb" )
+>     , ( 0x0307, "dotaccentcmb" )
+>     , ( 0x0308, "dieresiscmb" )
+>     , ( 0x0309, "hookabovecomb" )
+>     , ( 0x030a, "ringcmb" )
+>     , ( 0x030b, "hungarumlautcmb" )
+>     , ( 0x030c, "caroncmb" )
+>     , ( 0x030d, "verticallineabovecmb" )
+>     , ( 0x030e, "dblverticallineabovecmb" )
+>     , ( 0x030f, "dblgravecmb" )
+>     , ( 0x0310, "candrabinducmb" )
+>     , ( 0x0311, "breveinvertedcmb" )
+>     , ( 0x0312, "commaturnedabovecmb" )
+>     , ( 0x0313, "commaabovecmb" )
+>     , ( 0x0314, "commareversedabovecmb" )
+>     , ( 0x0315, "commaaboverightcmb" )
+>     , ( 0x0316, "gravebelowcmb" )
+>     , ( 0x0317, "acutebelowcmb" )
+>     , ( 0x0318, "lefttackbelowcmb" )
+>     , ( 0x0319, "righttackbelowcmb" )
+>     , ( 0x031a, "leftangleabovecmb" )
+>     , ( 0x031b, "horncmb" )
+>     , ( 0x031c, "ringhalfleftbelowcmb" )
+>     , ( 0x031d, "uptackbelowcmb" )
+>     , ( 0x031e, "downtackbelowcmb" )
+>     , ( 0x031f, "plusbelowcmb" )
+>     , ( 0x0320, "minusbelowcmb" )
+>     , ( 0x0321, "hookpalatalizedbelowcmb" )
+>     , ( 0x0322, "hookretroflexbelowcmb" )
+>     , ( 0x0323, "dotbelowcmb" )
+>     , ( 0x0324, "dieresisbelowcmb" )
+>     , ( 0x0325, "ringbelowcmb" )
+>     , ( 0x0327, "cedillacmb" )
+>     , ( 0x0328, "ogonekcmb" )
+>     , ( 0x0329, "verticallinebelowcmb" )
+>     , ( 0x032a, "bridgebelowcmb" )
+>     , ( 0x032b, "dblarchinvertedbelowcmb" )
+>     , ( 0x032c, "caronbelowcmb" )
+>     , ( 0x032d, "circumflexbelowcmb" )
+>     , ( 0x032e, "brevebelowcmb" )
+>     , ( 0x032f, "breveinvertedbelowcmb" )
+>     , ( 0x0330, "tildebelowcmb" )
+>     , ( 0x0331, "macronbelowcmb" )
+>     , ( 0x0332, "lowlinecmb" )
+>     , ( 0x0333, "dbllowlinecmb" )
+>     , ( 0x0334, "tildeoverlaycmb" )
+>     , ( 0x0335, "strokeshortoverlaycmb" )
+>     , ( 0x0336, "strokelongoverlaycmb" )
+>     , ( 0x0337, "solidusshortoverlaycmb" )
+>     , ( 0x0338, "soliduslongoverlaycmb" )
+>     , ( 0x0339, "ringhalfrightbelowcmb" )
+>     , ( 0x033a, "bridgeinvertedbelowcmb" )
+>     , ( 0x033b, "squarebelowcmb" )
+>     , ( 0x033c, "seagullbelowcmb" )
+>     , ( 0x033d, "xabovecmb" )
+>     , ( 0x033e, "tildeverticalcmb" )
+>     , ( 0x033f, "dbloverlinecmb" )
+>     , ( 0x0340, "gravetonecmb" )
+>     , ( 0x0341, "acutetonecmb" )
+>     , ( 0x0342, "perispomenigreekcmb" )
+>     , ( 0x0343, "koroniscmb" )
+>     , ( 0x0344, "dialytikatonoscmb" )
+>     , ( 0x0345, "ypogegrammenigreekcmb" )
+>     , ( 0x0360, "tildedoublecmb" )
+>     , ( 0x0361, "breveinverteddoublecmb" )
+>     , ( 0x0374, "numeralsigngreek" )
+>     , ( 0x0375, "numeralsignlowergreek" )
+>     , ( 0x037a, "ypogegrammeni" )
+>     , ( 0x037e, "questiongreek" )
+>     , ( 0x0384, "tonos" )
+>     , ( 0x0385, "dialytikatonos" )
+>     , ( 0x0386, "Alphatonos" )
+>     , ( 0x0387, "anoteleia" )
+>     , ( 0x0388, "Epsilontonos" )
+>     , ( 0x0389, "Etatonos" )
+>     , ( 0x038a, "Iotatonos" )
+>     , ( 0x038c, "Omicrontonos" )
+>     , ( 0x038e, "Upsilontonos" )
+>     , ( 0x038f, "Omegatonos" )
+>     , ( 0x0390, "iotadieresistonos" )
+>     , ( 0x0391, "Alpha" )
+>     , ( 0x0392, "Beta" )
+>     , ( 0x0393, "Gamma" )
+>     , ( 0x0394, "Deltagreek" )
+>     , ( 0x0395, "Epsilon" )
+>     , ( 0x0396, "Zeta" )
+>     , ( 0x0397, "Eta" )
+>     , ( 0x0398, "Theta" )
+>     , ( 0x0399, "Iota" )
+>     , ( 0x039a, "Kappa" )
+>     , ( 0x039b, "Lambda" )
+>     , ( 0x039c, "Mu" )
+>     , ( 0x039d, "Nu" )
+>     , ( 0x039e, "Xi" )
+>     , ( 0x039f, "Omicron" )
+>     , ( 0x03a0, "Pi" )
+>     , ( 0x03a1, "Rho" )
+>     , ( 0x03a3, "Sigma" )
+>     , ( 0x03a4, "Tau" )
+>     , ( 0x03a5, "Upsilon" )
+>     , ( 0x03a6, "Phi" )
+>     , ( 0x03a7, "Chi" )
+>     , ( 0x03a8, "Psi" )
+>     , ( 0x03a9, "Omegagreek" )
+>     , ( 0x03aa, "Iotadieresis" )
+>     , ( 0x03ab, "Upsilondieresis" )
+>     , ( 0x03ac, "alphatonos" )
+>     , ( 0x03ad, "epsilontonos" )
+>     , ( 0x03ae, "etatonos" )
+>     , ( 0x03af, "iotatonos" )
+>     , ( 0x03b0, "upsilondieresistonos" )
+>     , ( 0x03b1, "alpha" )
+>     , ( 0x03b2, "beta" )
+>     , ( 0x03b3, "gamma" )
+>     , ( 0x03b4, "delta" )
+>     , ( 0x03b5, "epsilon" )
+>     , ( 0x03b6, "zeta" )
+>     , ( 0x03b7, "eta" )
+>     , ( 0x03b8, "theta" )
+>     , ( 0x03b9, "iota" )
+>     , ( 0x03ba, "kappa" )
+>     , ( 0x03bb, "lambda" )
+>     , ( 0x03bc, "mugreek" )
+>     , ( 0x03bd, "nu" )
+>     , ( 0x03be, "xi" )
+>     , ( 0x03bf, "omicron" )
+>     , ( 0x03c0, "pi" )
+>     , ( 0x03c1, "rho" )
+>     , ( 0x03c2, "sigma1" )
+>     , ( 0x03c3, "sigma" )
+>     , ( 0x03c4, "tau" )
+>     , ( 0x03c5, "upsilon" )
+>     , ( 0x03c6, "phi" )
+>     , ( 0x03c7, "chi" )
+>     , ( 0x03c8, "psi" )
+>     , ( 0x03c9, "omega" )
+>     , ( 0x03ca, "iotadieresis" )
+>     , ( 0x03cb, "upsilondieresis" )
+>     , ( 0x03cc, "omicrontonos" )
+>     , ( 0x03cd, "upsilontonos" )
+>     , ( 0x03ce, "omegatonos" )
+>     , ( 0x03d0, "betasymbolgreek" )
+>     , ( 0x03d1, "theta1" )
+>     , ( 0x03d2, "Upsilon1" )
+>     , ( 0x03d3, "Upsilonacutehooksymbolgreek" )
+>     , ( 0x03d4, "Upsilondieresishooksymbolgreek" )
+>     , ( 0x03d5, "phi1" )
+>     , ( 0x03d6, "omega1" )
+>     , ( 0x03da, "Stigmagreek" )
+>     , ( 0x03dc, "Digammagreek" )
+>     , ( 0x03de, "Koppagreek" )
+>     , ( 0x03e0, "Sampigreek" )
+>     , ( 0x03e2, "Sheicoptic" )
+>     , ( 0x03e3, "sheicoptic" )
+>     , ( 0x03e4, "Feicoptic" )
+>     , ( 0x03e5, "feicoptic" )
+>     , ( 0x03e6, "Kheicoptic" )
+>     , ( 0x03e7, "kheicoptic" )
+>     , ( 0x03e8, "Horicoptic" )
+>     , ( 0x03e9, "horicoptic" )
+>     , ( 0x03ea, "Gangiacoptic" )
+>     , ( 0x03eb, "gangiacoptic" )
+>     , ( 0x03ec, "Shimacoptic" )
+>     , ( 0x03ed, "shimacoptic" )
+>     , ( 0x03ee, "Deicoptic" )
+>     , ( 0x03ef, "deicoptic" )
+>     , ( 0x03f0, "kappasymbolgreek" )
+>     , ( 0x03f1, "rhosymbolgreek" )
+>     , ( 0x03f2, "sigmalunatesymbolgreek" )
+>     , ( 0x03f3, "yotgreek" )
+>     , ( 0x0401, "Iocyrillic" )
+>     , ( 0x0402, "Djecyrillic" )
+>     , ( 0x0403, "Gjecyrillic" )
+>     , ( 0x0404, "Ecyrillic" )
+>     , ( 0x0405, "Dzecyrillic" )
+>     , ( 0x0406, "Icyrillic" )
+>     , ( 0x0407, "Yicyrillic" )
+>     , ( 0x0408, "Jecyrillic" )
+>     , ( 0x0409, "Ljecyrillic" )
+>     , ( 0x040a, "Njecyrillic" )
+>     , ( 0x040b, "Tshecyrillic" )
+>     , ( 0x040c, "Kjecyrillic" )
+>     , ( 0x040e, "Ushortcyrillic" )
+>     , ( 0x040f, "Dzhecyrillic" )
+>     , ( 0x0410, "Acyrillic" )
+>     , ( 0x0411, "Becyrillic" )
+>     , ( 0x0412, "Vecyrillic" )
+>     , ( 0x0413, "Gecyrillic" )
+>     , ( 0x0414, "Decyrillic" )
+>     , ( 0x0415, "Iecyrillic" )
+>     , ( 0x0416, "Zhecyrillic" )
+>     , ( 0x0417, "Zecyrillic" )
+>     , ( 0x0418, "Iicyrillic" )
+>     , ( 0x0419, "Iishortcyrillic" )
+>     , ( 0x041a, "Kacyrillic" )
+>     , ( 0x041b, "Elcyrillic" )
+>     , ( 0x041c, "Emcyrillic" )
+>     , ( 0x041d, "Encyrillic" )
+>     , ( 0x041e, "Ocyrillic" )
+>     , ( 0x041f, "Pecyrillic" )
+>     , ( 0x0420, "Ercyrillic" )
+>     , ( 0x0421, "Escyrillic" )
+>     , ( 0x0422, "Tecyrillic" )
+>     , ( 0x0423, "Ucyrillic" )
+>     , ( 0x0424, "Efcyrillic" )
+>     , ( 0x0425, "Khacyrillic" )
+>     , ( 0x0426, "Tsecyrillic" )
+>     , ( 0x0427, "Checyrillic" )
+>     , ( 0x0428, "Shacyrillic" )
+>     , ( 0x0429, "Shchacyrillic" )
+>     , ( 0x042a, "Hardsigncyrillic" )
+>     , ( 0x042b, "Yericyrillic" )
+>     , ( 0x042c, "Softsigncyrillic" )
+>     , ( 0x042d, "Ereversedcyrillic" )
+>     , ( 0x042e, "IUcyrillic" )
+>     , ( 0x042f, "IAcyrillic" )
+>     , ( 0x0430, "acyrillic" )
+>     , ( 0x0431, "afii10066" )
+>     , ( 0x0432, "afii10067" )
+>     , ( 0x0433, "afii10068" )
+>     , ( 0x0434, "afii10069" )
+>     , ( 0x0435, "afii10070" )
+>     , ( 0x0436, "afii10072" )
+>     , ( 0x0437, "afii10073" )
+>     , ( 0x0438, "afii10074" )
+>     , ( 0x0439, "afii10075" )
+>     , ( 0x043a, "afii10076" )
+>     , ( 0x043b, "afii10077" )
+>     , ( 0x043c, "afii10078" )
+>     , ( 0x043d, "afii10079" )
+>     , ( 0x043e, "afii10080" )
+>     , ( 0x043f, "afii10081" )
+>     , ( 0x0440, "afii10082" )
+>     , ( 0x0441, "afii10083" )
+>     , ( 0x0442, "afii10084" )
+>     , ( 0x0443, "afii10085" )
+>     , ( 0x0444, "afii10086" )
+>     , ( 0x0445, "afii10087" )
+>     , ( 0x0446, "afii10088" )
+>     , ( 0x0447, "afii10089" )
+>     , ( 0x0448, "afii10090" )
+>     , ( 0x0449, "afii10091" )
+>     , ( 0x044a, "afii10092" )
+>     , ( 0x044b, "afii10093" )
+>     , ( 0x044c, "afii10094" )
+>     , ( 0x044d, "afii10095" )
+>     , ( 0x044e, "afii10096" )
+>     , ( 0x044f, "afii10097" )
+>     , ( 0x0451, "afii10071" )
+>     , ( 0x0452, "afii10099" )
+>     , ( 0x0453, "afii10100" )
+>     , ( 0x0454, "afii10101" )
+>     , ( 0x0455, "afii10102" )
+>     , ( 0x0456, "afii10103" )
+>     , ( 0x0457, "afii10104" )
+>     , ( 0x0458, "afii10105" )
+>     , ( 0x0459, "afii10106" )
+>     , ( 0x045a, "afii10107" )
+>     , ( 0x045b, "afii10108" )
+>     , ( 0x045c, "afii10109" )
+>     , ( 0x045e, "afii10110" )
+>     , ( 0x045f, "afii10193" )
+>     , ( 0x0460, "Omegacyrillic" )
+>     , ( 0x0461, "omegacyrillic" )
+>     , ( 0x0462, "Yatcyrillic" )
+>     , ( 0x0463, "afii10194" )
+>     , ( 0x0464, "Eiotifiedcyrillic" )
+>     , ( 0x0465, "eiotifiedcyrillic" )
+>     , ( 0x0466, "Yuslittlecyrillic" )
+>     , ( 0x0467, "yuslittlecyrillic" )
+>     , ( 0x0468, "Yuslittleiotifiedcyrillic" )
+>     , ( 0x0469, "yuslittleiotifiedcyrillic" )
+>     , ( 0x046a, "Yusbigcyrillic" )
+>     , ( 0x046b, "yusbigcyrillic" )
+>     , ( 0x046c, "Yusbigiotifiedcyrillic" )
+>     , ( 0x046d, "yusbigiotifiedcyrillic" )
+>     , ( 0x046e, "Ksicyrillic" )
+>     , ( 0x046f, "ksicyrillic" )
+>     , ( 0x0470, "Psicyrillic" )
+>     , ( 0x0471, "psicyrillic" )
+>     , ( 0x0472, "Fitacyrillic" )
+>     , ( 0x0473, "afii10195" )
+>     , ( 0x0474, "Izhitsacyrillic" )
+>     , ( 0x0475, "afii10196" )
+>     , ( 0x0476, "Izhitsadblgravecyrillic" )
+>     , ( 0x0477, "izhitsadblgravecyrillic" )
+>     , ( 0x0478, "Ukcyrillic" )
+>     , ( 0x0479, "ukcyrillic" )
+>     , ( 0x047a, "Omegaroundcyrillic" )
+>     , ( 0x047b, "omegaroundcyrillic" )
+>     , ( 0x047c, "Omegatitlocyrillic" )
+>     , ( 0x047d, "omegatitlocyrillic" )
+>     , ( 0x047e, "Otcyrillic" )
+>     , ( 0x047f, "otcyrillic" )
+>     , ( 0x0480, "Koppacyrillic" )
+>     , ( 0x0481, "koppacyrillic" )
+>     , ( 0x0482, "thousandcyrillic" )
+>     , ( 0x0483, "titlocyrilliccmb" )
+>     , ( 0x0484, "palatalizationcyrilliccmb" )
+>     , ( 0x0485, "dasiapneumatacyrilliccmb" )
+>     , ( 0x0486, "psilipneumatacyrilliccmb" )
+>     , ( 0x0490, "Gheupturncyrillic" )
+>     , ( 0x0491, "afii10098" )
+>     , ( 0x0492, "Ghestrokecyrillic" )
+>     , ( 0x0493, "ghestrokecyrillic" )
+>     , ( 0x0494, "Ghemiddlehookcyrillic" )
+>     , ( 0x0495, "ghemiddlehookcyrillic" )
+>     , ( 0x0496, "Zhedescendercyrillic" )
+>     , ( 0x0497, "zhedescendercyrillic" )
+>     , ( 0x0498, "Zedescendercyrillic" )
+>     , ( 0x0499, "zedescendercyrillic" )
+>     , ( 0x049a, "Kadescendercyrillic" )
+>     , ( 0x049b, "kadescendercyrillic" )
+>     , ( 0x049c, "Kaverticalstrokecyrillic" )
+>     , ( 0x049d, "kaverticalstrokecyrillic" )
+>     , ( 0x049e, "Kastrokecyrillic" )
+>     , ( 0x049f, "kastrokecyrillic" )
+>     , ( 0x04a0, "Kabashkircyrillic" )
+>     , ( 0x04a1, "kabashkircyrillic" )
+>     , ( 0x04a2, "Endescendercyrillic" )
+>     , ( 0x04a3, "endescendercyrillic" )
+>     , ( 0x04a4, "Enghecyrillic" )
+>     , ( 0x04a5, "enghecyrillic" )
+>     , ( 0x04a6, "Pemiddlehookcyrillic" )
+>     , ( 0x04a7, "pemiddlehookcyrillic" )
+>     , ( 0x04a8, "Haabkhasiancyrillic" )
+>     , ( 0x04a9, "haabkhasiancyrillic" )
+>     , ( 0x04aa, "Esdescendercyrillic" )
+>     , ( 0x04ab, "esdescendercyrillic" )
+>     , ( 0x04ac, "Tedescendercyrillic" )
+>     , ( 0x04ad, "tedescendercyrillic" )
+>     , ( 0x04ae, "Ustraightcyrillic" )
+>     , ( 0x04af, "ustraightcyrillic" )
+>     , ( 0x04b0, "Ustraightstrokecyrillic" )
+>     , ( 0x04b1, "ustraightstrokecyrillic" )
+>     , ( 0x04b2, "Hadescendercyrillic" )
+>     , ( 0x04b3, "hadescendercyrillic" )
+>     , ( 0x04b4, "Tetsecyrillic" )
+>     , ( 0x04b5, "tetsecyrillic" )
+>     , ( 0x04b6, "Chedescendercyrillic" )
+>     , ( 0x04b7, "chedescendercyrillic" )
+>     , ( 0x04b8, "Cheverticalstrokecyrillic" )
+>     , ( 0x04b9, "cheverticalstrokecyrillic" )
+>     , ( 0x04ba, "Shhacyrillic" )
+>     , ( 0x04bb, "shhacyrillic" )
+>     , ( 0x04bc, "Cheabkhasiancyrillic" )
+>     , ( 0x04bd, "cheabkhasiancyrillic" )
+>     , ( 0x04be, "Chedescenderabkhasiancyrillic" )
+>     , ( 0x04bf, "chedescenderabkhasiancyrillic" )
+>     , ( 0x04c0, "palochkacyrillic" )
+>     , ( 0x04c1, "Zhebrevecyrillic" )
+>     , ( 0x04c2, "zhebrevecyrillic" )
+>     , ( 0x04c3, "Kahookcyrillic" )
+>     , ( 0x04c4, "kahookcyrillic" )
+>     , ( 0x04c7, "Enhookcyrillic" )
+>     , ( 0x04c8, "enhookcyrillic" )
+>     , ( 0x04cb, "Chekhakassiancyrillic" )
+>     , ( 0x04cc, "chekhakassiancyrillic" )
+>     , ( 0x04d0, "Abrevecyrillic" )
+>     , ( 0x04d1, "abrevecyrillic" )
+>     , ( 0x04d2, "Adieresiscyrillic" )
+>     , ( 0x04d3, "adieresiscyrillic" )
+>     , ( 0x04d4, "Aiecyrillic" )
+>     , ( 0x04d5, "aiecyrillic" )
+>     , ( 0x04d6, "Iebrevecyrillic" )
+>     , ( 0x04d7, "iebrevecyrillic" )
+>     , ( 0x04d8, "Schwacyrillic" )
+>     , ( 0x04d9, "afii10846" )
+>     , ( 0x04da, "Schwadieresiscyrillic" )
+>     , ( 0x04db, "schwadieresiscyrillic" )
+>     , ( 0x04dc, "Zhedieresiscyrillic" )
+>     , ( 0x04dd, "zhedieresiscyrillic" )
+>     , ( 0x04de, "Zedieresiscyrillic" )
+>     , ( 0x04df, "zedieresiscyrillic" )
+>     , ( 0x04e0, "Dzeabkhasiancyrillic" )
+>     , ( 0x04e1, "dzeabkhasiancyrillic" )
+>     , ( 0x04e2, "Imacroncyrillic" )
+>     , ( 0x04e3, "imacroncyrillic" )
+>     , ( 0x04e4, "Idieresiscyrillic" )
+>     , ( 0x04e5, "idieresiscyrillic" )
+>     , ( 0x04e6, "Odieresiscyrillic" )
+>     , ( 0x04e7, "odieresiscyrillic" )
+>     , ( 0x04e8, "Obarredcyrillic" )
+>     , ( 0x04e9, "obarredcyrillic" )
+>     , ( 0x04ea, "Obarreddieresiscyrillic" )
+>     , ( 0x04eb, "obarreddieresiscyrillic" )
+>     , ( 0x04ee, "Umacroncyrillic" )
+>     , ( 0x04ef, "umacroncyrillic" )
+>     , ( 0x04f0, "Udieresiscyrillic" )
+>     , ( 0x04f1, "udieresiscyrillic" )
+>     , ( 0x04f2, "Uhungarumlautcyrillic" )
+>     , ( 0x04f3, "uhungarumlautcyrillic" )
+>     , ( 0x04f4, "Chedieresiscyrillic" )
+>     , ( 0x04f5, "chedieresiscyrillic" )
+>     , ( 0x04f8, "Yerudieresiscyrillic" )
+>     , ( 0x04f9, "yerudieresiscyrillic" )
+>     , ( 0x0531, "Aybarmenian" )
+>     , ( 0x0532, "Benarmenian" )
+>     , ( 0x0533, "Gimarmenian" )
+>     , ( 0x0534, "Daarmenian" )
+>     , ( 0x0535, "Echarmenian" )
+>     , ( 0x0536, "Zaarmenian" )
+>     , ( 0x0537, "Eharmenian" )
+>     , ( 0x0538, "Etarmenian" )
+>     , ( 0x0539, "Toarmenian" )
+>     , ( 0x053a, "Zhearmenian" )
+>     , ( 0x053b, "Iniarmenian" )
+>     , ( 0x053c, "Liwnarmenian" )
+>     , ( 0x053d, "Xeharmenian" )
+>     , ( 0x053e, "Caarmenian" )
+>     , ( 0x053f, "Kenarmenian" )
+>     , ( 0x0540, "Hoarmenian" )
+>     , ( 0x0541, "Jaarmenian" )
+>     , ( 0x0542, "Ghadarmenian" )
+>     , ( 0x0543, "Cheharmenian" )
+>     , ( 0x0544, "Menarmenian" )
+>     , ( 0x0545, "Yiarmenian" )
+>     , ( 0x0546, "Nowarmenian" )
+>     , ( 0x0547, "Shaarmenian" )
+>     , ( 0x0548, "Voarmenian" )
+>     , ( 0x0549, "Chaarmenian" )
+>     , ( 0x054a, "Peharmenian" )
+>     , ( 0x054b, "Jheharmenian" )
+>     , ( 0x054c, "Raarmenian" )
+>     , ( 0x054d, "Seharmenian" )
+>     , ( 0x054e, "Vewarmenian" )
+>     , ( 0x054f, "Tiwnarmenian" )
+>     , ( 0x0550, "Reharmenian" )
+>     , ( 0x0551, "Coarmenian" )
+>     , ( 0x0552, "Yiwnarmenian" )
+>     , ( 0x0553, "Piwrarmenian" )
+>     , ( 0x0554, "Keharmenian" )
+>     , ( 0x0555, "Oharmenian" )
+>     , ( 0x0556, "Feharmenian" )
+>     , ( 0x0559, "ringhalfleftarmenian" )
+>     , ( 0x055a, "apostrophearmenian" )
+>     , ( 0x055b, "emphasismarkarmenian" )
+>     , ( 0x055c, "exclamarmenian" )
+>     , ( 0x055d, "commaarmenian" )
+>     , ( 0x055e, "questionarmenian" )
+>     , ( 0x055f, "abbreviationmarkarmenian" )
+>     , ( 0x0561, "aybarmenian" )
+>     , ( 0x0562, "benarmenian" )
+>     , ( 0x0563, "gimarmenian" )
+>     , ( 0x0564, "daarmenian" )
+>     , ( 0x0565, "echarmenian" )
+>     , ( 0x0566, "zaarmenian" )
+>     , ( 0x0567, "eharmenian" )
+>     , ( 0x0568, "etarmenian" )
+>     , ( 0x0569, "toarmenian" )
+>     , ( 0x056a, "zhearmenian" )
+>     , ( 0x056b, "iniarmenian" )
+>     , ( 0x056c, "liwnarmenian" )
+>     , ( 0x056d, "xeharmenian" )
+>     , ( 0x056e, "caarmenian" )
+>     , ( 0x056f, "kenarmenian" )
+>     , ( 0x0570, "hoarmenian" )
+>     , ( 0x0571, "jaarmenian" )
+>     , ( 0x0572, "ghadarmenian" )
+>     , ( 0x0573, "cheharmenian" )
+>     , ( 0x0574, "menarmenian" )
+>     , ( 0x0575, "yiarmenian" )
+>     , ( 0x0576, "nowarmenian" )
+>     , ( 0x0577, "shaarmenian" )
+>     , ( 0x0578, "voarmenian" )
+>     , ( 0x0579, "chaarmenian" )
+>     , ( 0x057a, "peharmenian" )
+>     , ( 0x057b, "jheharmenian" )
+>     , ( 0x057c, "raarmenian" )
+>     , ( 0x057d, "seharmenian" )
+>     , ( 0x057e, "vewarmenian" )
+>     , ( 0x057f, "tiwnarmenian" )
+>     , ( 0x0580, "reharmenian" )
+>     , ( 0x0581, "coarmenian" )
+>     , ( 0x0582, "yiwnarmenian" )
+>     , ( 0x0583, "piwrarmenian" )
+>     , ( 0x0584, "keharmenian" )
+>     , ( 0x0585, "oharmenian" )
+>     , ( 0x0586, "feharmenian" )
+>     , ( 0x0587, "echyiwnarmenian" )
+>     , ( 0x0589, "periodarmenian" )
+>     , ( 0x0591, "etnahtafoukhhebrew" )
+>     , ( 0x0592, "segoltahebrew" )
+>     , ( 0x0593, "shalshelethebrew" )
+>     , ( 0x0594, "zaqefqatanhebrew" )
+>     , ( 0x0595, "zaqefgadolhebrew" )
+>     , ( 0x0596, "tipehahebrew" )
+>     , ( 0x0597, "reviahebrew" )
+>     , ( 0x0598, "zarqahebrew" )
+>     , ( 0x0599, "pashtahebrew" )
+>     , ( 0x059a, "yetivhebrew" )
+>     , ( 0x059b, "tevirhebrew" )
+>     , ( 0x059c, "gereshaccenthebrew" )
+>     , ( 0x059d, "gereshmuqdamhebrew" )
+>     , ( 0x059e, "gershayimaccenthebrew" )
+>     , ( 0x059f, "qarneyparahebrew" )
+>     , ( 0x05a0, "telishagedolahebrew" )
+>     , ( 0x05a1, "pazerhebrew" )
+>     , ( 0x05a3, "munahhebrew" )
+>     , ( 0x05a4, "mahapakhhebrew" )
+>     , ( 0x05a5, "merkhahebrew" )
+>     , ( 0x05a6, "merkhakefulahebrew" )
+>     , ( 0x05a7, "dargahebrew" )
+>     , ( 0x05a8, "qadmahebrew" )
+>     , ( 0x05a9, "telishaqetanahebrew" )
+>     , ( 0x05aa, "yerahbenyomohebrew" )
+>     , ( 0x05ab, "olehebrew" )
+>     , ( 0x05ac, "iluyhebrew" )
+>     , ( 0x05ad, "dehihebrew" )
+>     , ( 0x05ae, "zinorhebrew" )
+>     , ( 0x05af, "masoracirclehebrew" )
+>     , ( 0x05b0, "afii57799" )
+>     , ( 0x05b1, "afii57801" )
+>     , ( 0x05b2, "afii57800" )
+>     , ( 0x05b3, "afii57802" )
+>     , ( 0x05b4, "afii57793" )
+>     , ( 0x05b5, "afii57794" )
+>     , ( 0x05b6, "afii57795" )
+>     , ( 0x05b7, "afii57798" )
+>     , ( 0x05b8, "afii57797" )
+>     , ( 0x05b9, "afii57806" )
+>     , ( 0x05bb, "afii57796" )
+>     , ( 0x05bc, "afii57807" )
+>     , ( 0x05bd, "afii57839" )
+>     , ( 0x05be, "afii57645" )
+>     , ( 0x05bf, "afii57841" )
+>     , ( 0x05c0, "afii57842" )
+>     , ( 0x05c1, "afii57804" )
+>     , ( 0x05c2, "afii57803" )
+>     , ( 0x05c3, "afii57658" )
+>     , ( 0x05c4, "upperdothebrew" )
+>     , ( 0x05d0, "afii57664" )
+>     , ( 0x05d1, "afii57665" )
+>     , ( 0x05d2, "afii57666" )
+>     , ( 0x05d3, "afii57667" )
+>     , ( 0x05d4, "afii57668" )
+>     , ( 0x05d5, "afii57669" )
+>     , ( 0x05d6, "afii57670" )
+>     , ( 0x05d7, "afii57671" )
+>     , ( 0x05d8, "afii57672" )
+>     , ( 0x05d9, "afii57673" )
+>     , ( 0x05da, "afii57674" )
+>     , ( 0x05db, "afii57675" )
+>     , ( 0x05dc, "afii57676" )
+>     , ( 0x05dd, "afii57677" )
+>     , ( 0x05de, "afii57678" )
+>     , ( 0x05df, "afii57679" )
+>     , ( 0x05e0, "afii57680" )
+>     , ( 0x05e1, "afii57681" )
+>     , ( 0x05e2, "afii57682" )
+>     , ( 0x05e3, "afii57683" )
+>     , ( 0x05e4, "afii57684" )
+>     , ( 0x05e5, "afii57685" )
+>     , ( 0x05e6, "afii57686" )
+>     , ( 0x05e7, "afii57687" )
+>     , ( 0x05e8, "afii57688" )
+>     , ( 0x05e9, "afii57689" )
+>     , ( 0x05ea, "afii57690" )
+>     , ( 0x05f0, "afii57716" )
+>     , ( 0x05f1, "afii57717" )
+>     , ( 0x05f2, "afii57718" )
+>     , ( 0x05f3, "gereshhebrew" )
+>     , ( 0x05f4, "gershayimhebrew" )
+>     , ( 0x060c, "afii57388" )
+>     , ( 0x061b, "afii57403" )
+>     , ( 0x061f, "afii57407" )
+>     , ( 0x0621, "afii57409" )
+>     , ( 0x0622, "afii57410" )
+>     , ( 0x0623, "afii57411" )
+>     , ( 0x0624, "afii57412" )
+>     , ( 0x0625, "afii57413" )
+>     , ( 0x0626, "afii57414" )
+>     , ( 0x0627, "afii57415" )
+>     , ( 0x0628, "afii57416" )
+>     , ( 0x0629, "afii57417" )
+>     , ( 0x062a, "afii57418" )
+>     , ( 0x062b, "afii57419" )
+>     , ( 0x062c, "afii57420" )
+>     , ( 0x062d, "afii57421" )
+>     , ( 0x062e, "afii57422" )
+>     , ( 0x062f, "afii57423" )
+>     , ( 0x0630, "afii57424" )
+>     , ( 0x0631, "afii57425" )
+>     , ( 0x0632, "afii57426" )
+>     , ( 0x0633, "afii57427" )
+>     , ( 0x0634, "afii57428" )
+>     , ( 0x0635, "afii57429" )
+>     , ( 0x0636, "afii57430" )
+>     , ( 0x0637, "afii57431" )
+>     , ( 0x0638, "afii57432" )
+>     , ( 0x0639, "afii57433" )
+>     , ( 0x063a, "afii57434" )
+>     , ( 0x0640, "afii57440" )
+>     , ( 0x0641, "afii57441" )
+>     , ( 0x0642, "afii57442" )
+>     , ( 0x0643, "afii57443" )
+>     , ( 0x0644, "afii57444" )
+>     , ( 0x0645, "afii57445" )
+>     , ( 0x0646, "afii57446" )
+>     , ( 0x0647, "afii57470" )
+>     , ( 0x0648, "afii57448" )
+>     , ( 0x0649, "afii57449" )
+>     , ( 0x064a, "afii57450" )
+>     , ( 0x064b, "afii57451" )
+>     , ( 0x064c, "afii57452" )
+>     , ( 0x064d, "afii57453" )
+>     , ( 0x064e, "afii57454" )
+>     , ( 0x064f, "afii57455" )
+>     , ( 0x0650, "afii57456" )
+>     , ( 0x0651, "afii57457" )
+>     , ( 0x0652, "afii57458" )
+>     , ( 0x0660, "afii57392" )
+>     , ( 0x0661, "afii57393" )
+>     , ( 0x0662, "afii57394" )
+>     , ( 0x0663, "afii57395" )
+>     , ( 0x0664, "afii57396" )
+>     , ( 0x0665, "afii57397" )
+>     , ( 0x0666, "afii57398" )
+>     , ( 0x0667, "afii57399" )
+>     , ( 0x0668, "afii57400" )
+>     , ( 0x0669, "afii57401" )
+>     , ( 0x066a, "afii57381" )
+>     , ( 0x066b, "decimalseparatorarabic" )
+>     , ( 0x066c, "thousandsseparatorarabic" )
+>     , ( 0x066d, "afii63167" )
+>     , ( 0x0679, "afii57511" )
+>     , ( 0x067e, "afii57506" )
+>     , ( 0x0686, "afii57507" )
+>     , ( 0x0688, "afii57512" )
+>     , ( 0x0691, "afii57513" )
+>     , ( 0x0698, "afii57508" )
+>     , ( 0x06a4, "afii57505" )
+>     , ( 0x06af, "afii57509" )
+>     , ( 0x06ba, "afii57514" )
+>     , ( 0x06c1, "haaltonearabic" )
+>     , ( 0x06d1, "yehthreedotsbelowarabic" )
+>     , ( 0x06d2, "afii57519" )
+>     , ( 0x06d5, "afii57534" )
+>     , ( 0x06f0, "zeropersian" )
+>     , ( 0x06f1, "onepersian" )
+>     , ( 0x06f2, "twopersian" )
+>     , ( 0x06f3, "threepersian" )
+>     , ( 0x06f4, "fourpersian" )
+>     , ( 0x06f5, "fivepersian" )
+>     , ( 0x06f6, "sixpersian" )
+>     , ( 0x06f7, "sevenpersian" )
+>     , ( 0x06f8, "eightpersian" )
+>     , ( 0x06f9, "ninepersian" )
+>     , ( 0x0901, "candrabindudeva" )
+>     , ( 0x0902, "anusvaradeva" )
+>     , ( 0x0903, "visargadeva" )
+>     , ( 0x0905, "adeva" )
+>     , ( 0x0906, "aadeva" )
+>     , ( 0x0907, "ideva" )
+>     , ( 0x0908, "iideva" )
+>     , ( 0x0909, "udeva" )
+>     , ( 0x090a, "uudeva" )
+>     , ( 0x090b, "rvocalicdeva" )
+>     , ( 0x090c, "lvocalicdeva" )
+>     , ( 0x090d, "ecandradeva" )
+>     , ( 0x090e, "eshortdeva" )
+>     , ( 0x090f, "edeva" )
+>     , ( 0x0910, "aideva" )
+>     , ( 0x0911, "ocandradeva" )
+>     , ( 0x0912, "oshortdeva" )
+>     , ( 0x0913, "odeva" )
+>     , ( 0x0914, "audeva" )
+>     , ( 0x0915, "kadeva" )
+>     , ( 0x0916, "khadeva" )
+>     , ( 0x0917, "gadeva" )
+>     , ( 0x0918, "ghadeva" )
+>     , ( 0x0919, "ngadeva" )
+>     , ( 0x091a, "cadeva" )
+>     , ( 0x091b, "chadeva" )
+>     , ( 0x091c, "jadeva" )
+>     , ( 0x091d, "jhadeva" )
+>     , ( 0x091e, "nyadeva" )
+>     , ( 0x091f, "ttadeva" )
+>     , ( 0x0920, "tthadeva" )
+>     , ( 0x0921, "ddadeva" )
+>     , ( 0x0922, "ddhadeva" )
+>     , ( 0x0923, "nnadeva" )
+>     , ( 0x0924, "tadeva" )
+>     , ( 0x0925, "thadeva" )
+>     , ( 0x0926, "dadeva" )
+>     , ( 0x0927, "dhadeva" )
+>     , ( 0x0928, "nadeva" )
+>     , ( 0x0929, "nnnadeva" )
+>     , ( 0x092a, "padeva" )
+>     , ( 0x092b, "phadeva" )
+>     , ( 0x092c, "badeva" )
+>     , ( 0x092d, "bhadeva" )
+>     , ( 0x092e, "madeva" )
+>     , ( 0x092f, "yadeva" )
+>     , ( 0x0930, "radeva" )
+>     , ( 0x0931, "rradeva" )
+>     , ( 0x0932, "ladeva" )
+>     , ( 0x0933, "lladeva" )
+>     , ( 0x0934, "llladeva" )
+>     , ( 0x0935, "vadeva" )
+>     , ( 0x0936, "shadeva" )
+>     , ( 0x0937, "ssadeva" )
+>     , ( 0x0938, "sadeva" )
+>     , ( 0x0939, "hadeva" )
+>     , ( 0x093c, "nuktadeva" )
+>     , ( 0x093d, "avagrahadeva" )
+>     , ( 0x093e, "aavowelsigndeva" )
+>     , ( 0x093f, "ivowelsigndeva" )
+>     , ( 0x0940, "iivowelsigndeva" )
+>     , ( 0x0941, "uvowelsigndeva" )
+>     , ( 0x0942, "uuvowelsigndeva" )
+>     , ( 0x0943, "rvocalicvowelsigndeva" )
+>     , ( 0x0944, "rrvocalicvowelsigndeva" )
+>     , ( 0x0945, "ecandravowelsigndeva" )
+>     , ( 0x0946, "eshortvowelsigndeva" )
+>     , ( 0x0947, "evowelsigndeva" )
+>     , ( 0x0948, "aivowelsigndeva" )
+>     , ( 0x0949, "ocandravowelsigndeva" )
+>     , ( 0x094a, "oshortvowelsigndeva" )
+>     , ( 0x094b, "ovowelsigndeva" )
+>     , ( 0x094c, "auvowelsigndeva" )
+>     , ( 0x094d, "viramadeva" )
+>     , ( 0x0950, "omdeva" )
+>     , ( 0x0951, "udattadeva" )
+>     , ( 0x0952, "anudattadeva" )
+>     , ( 0x0953, "gravedeva" )
+>     , ( 0x0954, "acutedeva" )
+>     , ( 0x0958, "qadeva" )
+>     , ( 0x0959, "khhadeva" )
+>     , ( 0x095a, "ghhadeva" )
+>     , ( 0x095b, "zadeva" )
+>     , ( 0x095c, "dddhadeva" )
+>     , ( 0x095d, "rhadeva" )
+>     , ( 0x095e, "fadeva" )
+>     , ( 0x095f, "yyadeva" )
+>     , ( 0x0960, "rrvocalicdeva" )
+>     , ( 0x0961, "llvocalicdeva" )
+>     , ( 0x0962, "lvocalicvowelsigndeva" )
+>     , ( 0x0963, "llvocalicvowelsigndeva" )
+>     , ( 0x0964, "danda" )
+>     , ( 0x0965, "dbldanda" )
+>     , ( 0x0966, "zerodeva" )
+>     , ( 0x0967, "onedeva" )
+>     , ( 0x0968, "twodeva" )
+>     , ( 0x0969, "threedeva" )
+>     , ( 0x096a, "fourdeva" )
+>     , ( 0x096b, "fivedeva" )
+>     , ( 0x096c, "sixdeva" )
+>     , ( 0x096d, "sevendeva" )
+>     , ( 0x096e, "eightdeva" )
+>     , ( 0x096f, "ninedeva" )
+>     , ( 0x0970, "abbreviationsigndeva" )
+>     , ( 0x0981, "candrabindubengali" )
+>     , ( 0x0982, "anusvarabengali" )
+>     , ( 0x0983, "visargabengali" )
+>     , ( 0x0985, "abengali" )
+>     , ( 0x0986, "aabengali" )
+>     , ( 0x0987, "ibengali" )
+>     , ( 0x0988, "iibengali" )
+>     , ( 0x0989, "ubengali" )
+>     , ( 0x098a, "uubengali" )
+>     , ( 0x098b, "rvocalicbengali" )
+>     , ( 0x098c, "lvocalicbengali" )
+>     , ( 0x098f, "ebengali" )
+>     , ( 0x0990, "aibengali" )
+>     , ( 0x0993, "obengali" )
+>     , ( 0x0994, "aubengali" )
+>     , ( 0x0995, "kabengali" )
+>     , ( 0x0996, "khabengali" )
+>     , ( 0x0997, "gabengali" )
+>     , ( 0x0998, "ghabengali" )
+>     , ( 0x0999, "ngabengali" )
+>     , ( 0x099a, "cabengali" )
+>     , ( 0x099b, "chabengali" )
+>     , ( 0x099c, "jabengali" )
+>     , ( 0x099d, "jhabengali" )
+>     , ( 0x099e, "nyabengali" )
+>     , ( 0x099f, "ttabengali" )
+>     , ( 0x09a0, "tthabengali" )
+>     , ( 0x09a1, "ddabengali" )
+>     , ( 0x09a2, "ddhabengali" )
+>     , ( 0x09a3, "nnabengali" )
+>     , ( 0x09a4, "tabengali" )
+>     , ( 0x09a5, "thabengali" )
+>     , ( 0x09a6, "dabengali" )
+>     , ( 0x09a7, "dhabengali" )
+>     , ( 0x09a8, "nabengali" )
+>     , ( 0x09aa, "pabengali" )
+>     , ( 0x09ab, "phabengali" )
+>     , ( 0x09ac, "babengali" )
+>     , ( 0x09ad, "bhabengali" )
+>     , ( 0x09ae, "mabengali" )
+>     , ( 0x09af, "yabengali" )
+>     , ( 0x09b0, "rabengali" )
+>     , ( 0x09b2, "labengali" )
+>     , ( 0x09b6, "shabengali" )
+>     , ( 0x09b7, "ssabengali" )
+>     , ( 0x09b8, "sabengali" )
+>     , ( 0x09b9, "habengali" )
+>     , ( 0x09bc, "nuktabengali" )
+>     , ( 0x09be, "aavowelsignbengali" )
+>     , ( 0x09bf, "ivowelsignbengali" )
+>     , ( 0x09c0, "iivowelsignbengali" )
+>     , ( 0x09c1, "uvowelsignbengali" )
+>     , ( 0x09c2, "uuvowelsignbengali" )
+>     , ( 0x09c3, "rvocalicvowelsignbengali" )
+>     , ( 0x09c4, "rrvocalicvowelsignbengali" )
+>     , ( 0x09c7, "evowelsignbengali" )
+>     , ( 0x09c8, "aivowelsignbengali" )
+>     , ( 0x09cb, "ovowelsignbengali" )
+>     , ( 0x09cc, "auvowelsignbengali" )
+>     , ( 0x09cd, "viramabengali" )
+>     , ( 0x09d7, "aulengthmarkbengali" )
+>     , ( 0x09dc, "rrabengali" )
+>     , ( 0x09dd, "rhabengali" )
+>     , ( 0x09df, "yyabengali" )
+>     , ( 0x09e0, "rrvocalicbengali" )
+>     , ( 0x09e1, "llvocalicbengali" )
+>     , ( 0x09e2, "lvocalicvowelsignbengali" )
+>     , ( 0x09e3, "llvocalicvowelsignbengali" )
+>     , ( 0x09e6, "zerobengali" )
+>     , ( 0x09e7, "onebengali" )
+>     , ( 0x09e8, "twobengali" )
+>     , ( 0x09e9, "threebengali" )
+>     , ( 0x09ea, "fourbengali" )
+>     , ( 0x09eb, "fivebengali" )
+>     , ( 0x09ec, "sixbengali" )
+>     , ( 0x09ed, "sevenbengali" )
+>     , ( 0x09ee, "eightbengali" )
+>     , ( 0x09ef, "ninebengali" )
+>     , ( 0x09f0, "ramiddlediagonalbengali" )
+>     , ( 0x09f1, "ralowerdiagonalbengali" )
+>     , ( 0x09f2, "rupeemarkbengali" )
+>     , ( 0x09f3, "rupeesignbengali" )
+>     , ( 0x09f4, "onenumeratorbengali" )
+>     , ( 0x09f5, "twonumeratorbengali" )
+>     , ( 0x09f6, "threenumeratorbengali" )
+>     , ( 0x09f7, "fournumeratorbengali" )
+>     , ( 0x09f8, "denominatorminusonenumeratorbengali" )
+>     , ( 0x09f9, "sixteencurrencydenominatorbengali" )
+>     , ( 0x09fa, "issharbengali" )
+>     , ( 0x0a02, "bindigurmukhi" )
+>     , ( 0x0a05, "agurmukhi" )
+>     , ( 0x0a06, "aagurmukhi" )
+>     , ( 0x0a07, "igurmukhi" )
+>     , ( 0x0a08, "iigurmukhi" )
+>     , ( 0x0a09, "ugurmukhi" )
+>     , ( 0x0a0a, "uugurmukhi" )
+>     , ( 0x0a0f, "eegurmukhi" )
+>     , ( 0x0a10, "aigurmukhi" )
+>     , ( 0x0a13, "oogurmukhi" )
+>     , ( 0x0a14, "augurmukhi" )
+>     , ( 0x0a15, "kagurmukhi" )
+>     , ( 0x0a16, "khagurmukhi" )
+>     , ( 0x0a17, "gagurmukhi" )
+>     , ( 0x0a18, "ghagurmukhi" )
+>     , ( 0x0a19, "ngagurmukhi" )
+>     , ( 0x0a1a, "cagurmukhi" )
+>     , ( 0x0a1b, "chagurmukhi" )
+>     , ( 0x0a1c, "jagurmukhi" )
+>     , ( 0x0a1d, "jhagurmukhi" )
+>     , ( 0x0a1e, "nyagurmukhi" )
+>     , ( 0x0a1f, "ttagurmukhi" )
+>     , ( 0x0a20, "tthagurmukhi" )
+>     , ( 0x0a21, "ddagurmukhi" )
+>     , ( 0x0a22, "ddhagurmukhi" )
+>     , ( 0x0a23, "nnagurmukhi" )
+>     , ( 0x0a24, "tagurmukhi" )
+>     , ( 0x0a25, "thagurmukhi" )
+>     , ( 0x0a26, "dagurmukhi" )
+>     , ( 0x0a27, "dhagurmukhi" )
+>     , ( 0x0a28, "nagurmukhi" )
+>     , ( 0x0a2a, "pagurmukhi" )
+>     , ( 0x0a2b, "phagurmukhi" )
+>     , ( 0x0a2c, "bagurmukhi" )
+>     , ( 0x0a2d, "bhagurmukhi" )
+>     , ( 0x0a2e, "magurmukhi" )
+>     , ( 0x0a2f, "yagurmukhi" )
+>     , ( 0x0a30, "ragurmukhi" )
+>     , ( 0x0a32, "lagurmukhi" )
+>     , ( 0x0a35, "vagurmukhi" )
+>     , ( 0x0a36, "shagurmukhi" )
+>     , ( 0x0a38, "sagurmukhi" )
+>     , ( 0x0a39, "hagurmukhi" )
+>     , ( 0x0a3c, "nuktagurmukhi" )
+>     , ( 0x0a3e, "aamatragurmukhi" )
+>     , ( 0x0a3f, "imatragurmukhi" )
+>     , ( 0x0a40, "iimatragurmukhi" )
+>     , ( 0x0a41, "umatragurmukhi" )
+>     , ( 0x0a42, "uumatragurmukhi" )
+>     , ( 0x0a47, "eematragurmukhi" )
+>     , ( 0x0a48, "aimatragurmukhi" )
+>     , ( 0x0a4b, "oomatragurmukhi" )
+>     , ( 0x0a4c, "aumatragurmukhi" )
+>     , ( 0x0a4d, "halantgurmukhi" )
+>     , ( 0x0a59, "khhagurmukhi" )
+>     , ( 0x0a5a, "ghhagurmukhi" )
+>     , ( 0x0a5b, "zagurmukhi" )
+>     , ( 0x0a5c, "rragurmukhi" )
+>     , ( 0x0a5e, "fagurmukhi" )
+>     , ( 0x0a66, "zerogurmukhi" )
+>     , ( 0x0a67, "onegurmukhi" )
+>     , ( 0x0a68, "twogurmukhi" )
+>     , ( 0x0a69, "threegurmukhi" )
+>     , ( 0x0a6a, "fourgurmukhi" )
+>     , ( 0x0a6b, "fivegurmukhi" )
+>     , ( 0x0a6c, "sixgurmukhi" )
+>     , ( 0x0a6d, "sevengurmukhi" )
+>     , ( 0x0a6e, "eightgurmukhi" )
+>     , ( 0x0a6f, "ninegurmukhi" )
+>     , ( 0x0a70, "tippigurmukhi" )
+>     , ( 0x0a71, "addakgurmukhi" )
+>     , ( 0x0a72, "irigurmukhi" )
+>     , ( 0x0a73, "uragurmukhi" )
+>     , ( 0x0a74, "ekonkargurmukhi" )
+>     , ( 0x0a81, "candrabindugujarati" )
+>     , ( 0x0a82, "anusvaragujarati" )
+>     , ( 0x0a83, "visargagujarati" )
+>     , ( 0x0a85, "agujarati" )
+>     , ( 0x0a86, "aagujarati" )
+>     , ( 0x0a87, "igujarati" )
+>     , ( 0x0a88, "iigujarati" )
+>     , ( 0x0a89, "ugujarati" )
+>     , ( 0x0a8a, "uugujarati" )
+>     , ( 0x0a8b, "rvocalicgujarati" )
+>     , ( 0x0a8d, "ecandragujarati" )
+>     , ( 0x0a8f, "egujarati" )
+>     , ( 0x0a90, "aigujarati" )
+>     , ( 0x0a91, "ocandragujarati" )
+>     , ( 0x0a93, "ogujarati" )
+>     , ( 0x0a94, "augujarati" )
+>     , ( 0x0a95, "kagujarati" )
+>     , ( 0x0a96, "khagujarati" )
+>     , ( 0x0a97, "gagujarati" )
+>     , ( 0x0a98, "ghagujarati" )
+>     , ( 0x0a99, "ngagujarati" )
+>     , ( 0x0a9a, "cagujarati" )
+>     , ( 0x0a9b, "chagujarati" )
+>     , ( 0x0a9c, "jagujarati" )
+>     , ( 0x0a9d, "jhagujarati" )
+>     , ( 0x0a9e, "nyagujarati" )
+>     , ( 0x0a9f, "ttagujarati" )
+>     , ( 0x0aa0, "tthagujarati" )
+>     , ( 0x0aa1, "ddagujarati" )
+>     , ( 0x0aa2, "ddhagujarati" )
+>     , ( 0x0aa3, "nnagujarati" )
+>     , ( 0x0aa4, "tagujarati" )
+>     , ( 0x0aa5, "thagujarati" )
+>     , ( 0x0aa6, "dagujarati" )
+>     , ( 0x0aa7, "dhagujarati" )
+>     , ( 0x0aa8, "nagujarati" )
+>     , ( 0x0aaa, "pagujarati" )
+>     , ( 0x0aab, "phagujarati" )
+>     , ( 0x0aac, "bagujarati" )
+>     , ( 0x0aad, "bhagujarati" )
+>     , ( 0x0aae, "magujarati" )
+>     , ( 0x0aaf, "yagujarati" )
+>     , ( 0x0ab0, "ragujarati" )
+>     , ( 0x0ab2, "lagujarati" )
+>     , ( 0x0ab3, "llagujarati" )
+>     , ( 0x0ab5, "vagujarati" )
+>     , ( 0x0ab6, "shagujarati" )
+>     , ( 0x0ab7, "ssagujarati" )
+>     , ( 0x0ab8, "sagujarati" )
+>     , ( 0x0ab9, "hagujarati" )
+>     , ( 0x0abc, "nuktagujarati" )
+>     , ( 0x0abe, "aavowelsigngujarati" )
+>     , ( 0x0abf, "ivowelsigngujarati" )
+>     , ( 0x0ac0, "iivowelsigngujarati" )
+>     , ( 0x0ac1, "uvowelsigngujarati" )
+>     , ( 0x0ac2, "uuvowelsigngujarati" )
+>     , ( 0x0ac3, "rvocalicvowelsigngujarati" )
+>     , ( 0x0ac4, "rrvocalicvowelsigngujarati" )
+>     , ( 0x0ac5, "ecandravowelsigngujarati" )
+>     , ( 0x0ac7, "evowelsigngujarati" )
+>     , ( 0x0ac8, "aivowelsigngujarati" )
+>     , ( 0x0ac9, "ocandravowelsigngujarati" )
+>     , ( 0x0acb, "ovowelsigngujarati" )
+>     , ( 0x0acc, "auvowelsigngujarati" )
+>     , ( 0x0acd, "viramagujarati" )
+>     , ( 0x0ad0, "omgujarati" )
+>     , ( 0x0ae0, "rrvocalicgujarati" )
+>     , ( 0x0ae6, "zerogujarati" )
+>     , ( 0x0ae7, "onegujarati" )
+>     , ( 0x0ae8, "twogujarati" )
+>     , ( 0x0ae9, "threegujarati" )
+>     , ( 0x0aea, "fourgujarati" )
+>     , ( 0x0aeb, "fivegujarati" )
+>     , ( 0x0aec, "sixgujarati" )
+>     , ( 0x0aed, "sevengujarati" )
+>     , ( 0x0aee, "eightgujarati" )
+>     , ( 0x0aef, "ninegujarati" )
+>     , ( 0x0e01, "kokaithai" )
+>     , ( 0x0e02, "khokhaithai" )
+>     , ( 0x0e03, "khokhuatthai" )
+>     , ( 0x0e04, "khokhwaithai" )
+>     , ( 0x0e05, "khokhonthai" )
+>     , ( 0x0e06, "khorakhangthai" )
+>     , ( 0x0e07, "ngonguthai" )
+>     , ( 0x0e08, "chochanthai" )
+>     , ( 0x0e09, "chochingthai" )
+>     , ( 0x0e0a, "chochangthai" )
+>     , ( 0x0e0b, "sosothai" )
+>     , ( 0x0e0c, "chochoethai" )
+>     , ( 0x0e0d, "yoyingthai" )
+>     , ( 0x0e0e, "dochadathai" )
+>     , ( 0x0e0f, "topatakthai" )
+>     , ( 0x0e10, "thothanthai" )
+>     , ( 0x0e11, "thonangmonthothai" )
+>     , ( 0x0e12, "thophuthaothai" )
+>     , ( 0x0e13, "nonenthai" )
+>     , ( 0x0e14, "dodekthai" )
+>     , ( 0x0e15, "totaothai" )
+>     , ( 0x0e16, "thothungthai" )
+>     , ( 0x0e17, "thothahanthai" )
+>     , ( 0x0e18, "thothongthai" )
+>     , ( 0x0e19, "nonuthai" )
+>     , ( 0x0e1a, "bobaimaithai" )
+>     , ( 0x0e1b, "poplathai" )
+>     , ( 0x0e1c, "phophungthai" )
+>     , ( 0x0e1d, "fofathai" )
+>     , ( 0x0e1e, "phophanthai" )
+>     , ( 0x0e1f, "fofanthai" )
+>     , ( 0x0e20, "phosamphaothai" )
+>     , ( 0x0e21, "momathai" )
+>     , ( 0x0e22, "yoyakthai" )
+>     , ( 0x0e23, "roruathai" )
+>     , ( 0x0e24, "ruthai" )
+>     , ( 0x0e25, "lolingthai" )
+>     , ( 0x0e26, "luthai" )
+>     , ( 0x0e27, "wowaenthai" )
+>     , ( 0x0e28, "sosalathai" )
+>     , ( 0x0e29, "sorusithai" )
+>     , ( 0x0e2a, "sosuathai" )
+>     , ( 0x0e2b, "hohipthai" )
+>     , ( 0x0e2c, "lochulathai" )
+>     , ( 0x0e2d, "oangthai" )
+>     , ( 0x0e2e, "honokhukthai" )
+>     , ( 0x0e2f, "paiyannoithai" )
+>     , ( 0x0e30, "saraathai" )
+>     , ( 0x0e31, "maihanakatthai" )
+>     , ( 0x0e32, "saraaathai" )
+>     , ( 0x0e33, "saraamthai" )
+>     , ( 0x0e34, "saraithai" )
+>     , ( 0x0e35, "saraiithai" )
+>     , ( 0x0e36, "sarauethai" )
+>     , ( 0x0e37, "saraueethai" )
+>     , ( 0x0e38, "sarauthai" )
+>     , ( 0x0e39, "sarauuthai" )
+>     , ( 0x0e3a, "phinthuthai" )
+>     , ( 0x0e3f, "bahtthai" )
+>     , ( 0x0e40, "saraethai" )
+>     , ( 0x0e41, "saraaethai" )
+>     , ( 0x0e42, "saraothai" )
+>     , ( 0x0e43, "saraaimaimuanthai" )
+>     , ( 0x0e44, "saraaimaimalaithai" )
+>     , ( 0x0e45, "lakkhangyaothai" )
+>     , ( 0x0e46, "maiyamokthai" )
+>     , ( 0x0e47, "maitaikhuthai" )
+>     , ( 0x0e48, "maiekthai" )
+>     , ( 0x0e49, "maithothai" )
+>     , ( 0x0e4a, "maitrithai" )
+>     , ( 0x0e4b, "maichattawathai" )
+>     , ( 0x0e4c, "thanthakhatthai" )
+>     , ( 0x0e4d, "nikhahitthai" )
+>     , ( 0x0e4e, "yamakkanthai" )
+>     , ( 0x0e4f, "fongmanthai" )
+>     , ( 0x0e50, "zerothai" )
+>     , ( 0x0e51, "onethai" )
+>     , ( 0x0e52, "twothai" )
+>     , ( 0x0e53, "threethai" )
+>     , ( 0x0e54, "fourthai" )
+>     , ( 0x0e55, "fivethai" )
+>     , ( 0x0e56, "sixthai" )
+>     , ( 0x0e57, "seventhai" )
+>     , ( 0x0e58, "eightthai" )
+>     , ( 0x0e59, "ninethai" )
+>     , ( 0x0e5a, "angkhankhuthai" )
+>     , ( 0x0e5b, "khomutthai" )
+>     , ( 0x1e00, "Aringbelow" )
+>     , ( 0x1e01, "aringbelow" )
+>     , ( 0x1e02, "Bdotaccent" )
+>     , ( 0x1e03, "bdotaccent" )
+>     , ( 0x1e04, "Bdotbelow" )
+>     , ( 0x1e05, "bdotbelow" )
+>     , ( 0x1e06, "Blinebelow" )
+>     , ( 0x1e07, "blinebelow" )
+>     , ( 0x1e08, "Ccedillaacute" )
+>     , ( 0x1e09, "ccedillaacute" )
+>     , ( 0x1e0a, "Ddotaccent" )
+>     , ( 0x1e0b, "ddotaccent" )
+>     , ( 0x1e0c, "Ddotbelow" )
+>     , ( 0x1e0d, "ddotbelow" )
+>     , ( 0x1e0e, "Dlinebelow" )
+>     , ( 0x1e0f, "dlinebelow" )
+>     , ( 0x1e10, "Dcedilla" )
+>     , ( 0x1e11, "dcedilla" )
+>     , ( 0x1e12, "Dcircumflexbelow" )
+>     , ( 0x1e13, "dcircumflexbelow" )
+>     , ( 0x1e14, "Emacrongrave" )
+>     , ( 0x1e15, "emacrongrave" )
+>     , ( 0x1e16, "Emacronacute" )
+>     , ( 0x1e17, "emacronacute" )
+>     , ( 0x1e18, "Ecircumflexbelow" )
+>     , ( 0x1e19, "ecircumflexbelow" )
+>     , ( 0x1e1a, "Etildebelow" )
+>     , ( 0x1e1b, "etildebelow" )
+>     , ( 0x1e1c, "Ecedillabreve" )
+>     , ( 0x1e1d, "ecedillabreve" )
+>     , ( 0x1e1e, "Fdotaccent" )
+>     , ( 0x1e1f, "fdotaccent" )
+>     , ( 0x1e20, "Gmacron" )
+>     , ( 0x1e21, "gmacron" )
+>     , ( 0x1e22, "Hdotaccent" )
+>     , ( 0x1e23, "hdotaccent" )
+>     , ( 0x1e24, "Hdotbelow" )
+>     , ( 0x1e25, "hdotbelow" )
+>     , ( 0x1e26, "Hdieresis" )
+>     , ( 0x1e27, "hdieresis" )
+>     , ( 0x1e28, "Hcedilla" )
+>     , ( 0x1e29, "hcedilla" )
+>     , ( 0x1e2a, "Hbrevebelow" )
+>     , ( 0x1e2b, "hbrevebelow" )
+>     , ( 0x1e2c, "Itildebelow" )
+>     , ( 0x1e2d, "itildebelow" )
+>     , ( 0x1e2e, "Idieresisacute" )
+>     , ( 0x1e2f, "idieresisacute" )
+>     , ( 0x1e30, "Kacute" )
+>     , ( 0x1e31, "kacute" )
+>     , ( 0x1e32, "Kdotbelow" )
+>     , ( 0x1e33, "kdotbelow" )
+>     , ( 0x1e34, "Klinebelow" )
+>     , ( 0x1e35, "klinebelow" )
+>     , ( 0x1e36, "Ldotbelow" )
+>     , ( 0x1e37, "ldotbelow" )
+>     , ( 0x1e38, "Ldotbelowmacron" )
+>     , ( 0x1e39, "ldotbelowmacron" )
+>     , ( 0x1e3a, "Llinebelow" )
+>     , ( 0x1e3b, "llinebelow" )
+>     , ( 0x1e3c, "Lcircumflexbelow" )
+>     , ( 0x1e3d, "lcircumflexbelow" )
+>     , ( 0x1e3e, "Macute" )
+>     , ( 0x1e3f, "macute" )
+>     , ( 0x1e40, "Mdotaccent" )
+>     , ( 0x1e41, "mdotaccent" )
+>     , ( 0x1e42, "Mdotbelow" )
+>     , ( 0x1e43, "mdotbelow" )
+>     , ( 0x1e44, "Ndotaccent" )
+>     , ( 0x1e45, "ndotaccent" )
+>     , ( 0x1e46, "Ndotbelow" )
+>     , ( 0x1e47, "ndotbelow" )
+>     , ( 0x1e48, "Nlinebelow" )
+>     , ( 0x1e49, "nlinebelow" )
+>     , ( 0x1e4a, "Ncircumflexbelow" )
+>     , ( 0x1e4b, "ncircumflexbelow" )
+>     , ( 0x1e4c, "Otildeacute" )
+>     , ( 0x1e4d, "otildeacute" )
+>     , ( 0x1e4e, "Otildedieresis" )
+>     , ( 0x1e4f, "otildedieresis" )
+>     , ( 0x1e50, "Omacrongrave" )
+>     , ( 0x1e51, "omacrongrave" )
+>     , ( 0x1e52, "Omacronacute" )
+>     , ( 0x1e53, "omacronacute" )
+>     , ( 0x1e54, "Pacute" )
+>     , ( 0x1e55, "pacute" )
+>     , ( 0x1e56, "Pdotaccent" )
+>     , ( 0x1e57, "pdotaccent" )
+>     , ( 0x1e58, "Rdotaccent" )
+>     , ( 0x1e59, "rdotaccent" )
+>     , ( 0x1e5a, "Rdotbelow" )
+>     , ( 0x1e5b, "rdotbelow" )
+>     , ( 0x1e5c, "Rdotbelowmacron" )
+>     , ( 0x1e5d, "rdotbelowmacron" )
+>     , ( 0x1e5e, "Rlinebelow" )
+>     , ( 0x1e5f, "rlinebelow" )
+>     , ( 0x1e60, "Sdotaccent" )
+>     , ( 0x1e61, "sdotaccent" )
+>     , ( 0x1e62, "Sdotbelow" )
+>     , ( 0x1e63, "sdotbelow" )
+>     , ( 0x1e64, "Sacutedotaccent" )
+>     , ( 0x1e65, "sacutedotaccent" )
+>     , ( 0x1e66, "Scarondotaccent" )
+>     , ( 0x1e67, "scarondotaccent" )
+>     , ( 0x1e68, "Sdotbelowdotaccent" )
+>     , ( 0x1e69, "sdotbelowdotaccent" )
+>     , ( 0x1e6a, "Tdotaccent" )
+>     , ( 0x1e6b, "tdotaccent" )
+>     , ( 0x1e6c, "Tdotbelow" )
+>     , ( 0x1e6d, "tdotbelow" )
+>     , ( 0x1e6e, "Tlinebelow" )
+>     , ( 0x1e6f, "tlinebelow" )
+>     , ( 0x1e70, "Tcircumflexbelow" )
+>     , ( 0x1e71, "tcircumflexbelow" )
+>     , ( 0x1e72, "Udieresisbelow" )
+>     , ( 0x1e73, "udieresisbelow" )
+>     , ( 0x1e74, "Utildebelow" )
+>     , ( 0x1e75, "utildebelow" )
+>     , ( 0x1e76, "Ucircumflexbelow" )
+>     , ( 0x1e77, "ucircumflexbelow" )
+>     , ( 0x1e78, "Utildeacute" )
+>     , ( 0x1e79, "utildeacute" )
+>     , ( 0x1e7a, "Umacrondieresis" )
+>     , ( 0x1e7b, "umacrondieresis" )
+>     , ( 0x1e7c, "Vtilde" )
+>     , ( 0x1e7d, "vtilde" )
+>     , ( 0x1e7e, "Vdotbelow" )
+>     , ( 0x1e7f, "vdotbelow" )
+>     , ( 0x1e80, "Wgrave" )
+>     , ( 0x1e81, "wgrave" )
+>     , ( 0x1e82, "Wacute" )
+>     , ( 0x1e83, "wacute" )
+>     , ( 0x1e84, "Wdieresis" )
+>     , ( 0x1e85, "wdieresis" )
+>     , ( 0x1e86, "Wdotaccent" )
+>     , ( 0x1e87, "wdotaccent" )
+>     , ( 0x1e88, "Wdotbelow" )
+>     , ( 0x1e89, "wdotbelow" )
+>     , ( 0x1e8a, "Xdotaccent" )
+>     , ( 0x1e8b, "xdotaccent" )
+>     , ( 0x1e8c, "Xdieresis" )
+>     , ( 0x1e8d, "xdieresis" )
+>     , ( 0x1e8e, "Ydotaccent" )
+>     , ( 0x1e8f, "ydotaccent" )
+>     , ( 0x1e90, "Zcircumflex" )
+>     , ( 0x1e91, "zcircumflex" )
+>     , ( 0x1e92, "Zdotbelow" )
+>     , ( 0x1e93, "zdotbelow" )
+>     , ( 0x1e94, "Zlinebelow" )
+>     , ( 0x1e95, "zlinebelow" )
+>     , ( 0x1e96, "hlinebelow" )
+>     , ( 0x1e97, "tdieresis" )
+>     , ( 0x1e98, "wring" )
+>     , ( 0x1e99, "yring" )
+>     , ( 0x1e9a, "arighthalfring" )
+>     , ( 0x1e9b, "slongdotaccent" )
+>     , ( 0x1ea0, "Adotbelow" )
+>     , ( 0x1ea1, "adotbelow" )
+>     , ( 0x1ea2, "Ahookabove" )
+>     , ( 0x1ea3, "ahookabove" )
+>     , ( 0x1ea4, "Acircumflexacute" )
+>     , ( 0x1ea5, "acircumflexacute" )
+>     , ( 0x1ea6, "Acircumflexgrave" )
+>     , ( 0x1ea7, "acircumflexgrave" )
+>     , ( 0x1ea8, "Acircumflexhookabove" )
+>     , ( 0x1ea9, "acircumflexhookabove" )
+>     , ( 0x1eaa, "Acircumflextilde" )
+>     , ( 0x1eab, "acircumflextilde" )
+>     , ( 0x1eac, "Acircumflexdotbelow" )
+>     , ( 0x1ead, "acircumflexdotbelow" )
+>     , ( 0x1eae, "Abreveacute" )
+>     , ( 0x1eaf, "abreveacute" )
+>     , ( 0x1eb0, "Abrevegrave" )
+>     , ( 0x1eb1, "abrevegrave" )
+>     , ( 0x1eb2, "Abrevehookabove" )
+>     , ( 0x1eb3, "abrevehookabove" )
+>     , ( 0x1eb4, "Abrevetilde" )
+>     , ( 0x1eb5, "abrevetilde" )
+>     , ( 0x1eb6, "Abrevedotbelow" )
+>     , ( 0x1eb7, "abrevedotbelow" )
+>     , ( 0x1eb8, "Edotbelow" )
+>     , ( 0x1eb9, "edotbelow" )
+>     , ( 0x1eba, "Ehookabove" )
+>     , ( 0x1ebb, "ehookabove" )
+>     , ( 0x1ebc, "Etilde" )
+>     , ( 0x1ebd, "etilde" )
+>     , ( 0x1ebe, "Ecircumflexacute" )
+>     , ( 0x1ebf, "ecircumflexacute" )
+>     , ( 0x1ec0, "Ecircumflexgrave" )
+>     , ( 0x1ec1, "ecircumflexgrave" )
+>     , ( 0x1ec2, "Ecircumflexhookabove" )
+>     , ( 0x1ec3, "ecircumflexhookabove" )
+>     , ( 0x1ec4, "Ecircumflextilde" )
+>     , ( 0x1ec5, "ecircumflextilde" )
+>     , ( 0x1ec6, "Ecircumflexdotbelow" )
+>     , ( 0x1ec7, "ecircumflexdotbelow" )
+>     , ( 0x1ec8, "Ihookabove" )
+>     , ( 0x1ec9, "ihookabove" )
+>     , ( 0x1eca, "Idotbelow" )
+>     , ( 0x1ecb, "idotbelow" )
+>     , ( 0x1ecc, "Odotbelow" )
+>     , ( 0x1ecd, "odotbelow" )
+>     , ( 0x1ece, "Ohookabove" )
+>     , ( 0x1ecf, "ohookabove" )
+>     , ( 0x1ed0, "Ocircumflexacute" )
+>     , ( 0x1ed1, "ocircumflexacute" )
+>     , ( 0x1ed2, "Ocircumflexgrave" )
+>     , ( 0x1ed3, "ocircumflexgrave" )
+>     , ( 0x1ed4, "Ocircumflexhookabove" )
+>     , ( 0x1ed5, "ocircumflexhookabove" )
+>     , ( 0x1ed6, "Ocircumflextilde" )
+>     , ( 0x1ed7, "ocircumflextilde" )
+>     , ( 0x1ed8, "Ocircumflexdotbelow" )
+>     , ( 0x1ed9, "ocircumflexdotbelow" )
+>     , ( 0x1eda, "Ohornacute" )
+>     , ( 0x1edb, "ohornacute" )
+>     , ( 0x1edc, "Ohorngrave" )
+>     , ( 0x1edd, "ohorngrave" )
+>     , ( 0x1ede, "Ohornhookabove" )
+>     , ( 0x1edf, "ohornhookabove" )
+>     , ( 0x1ee0, "Ohorntilde" )
+>     , ( 0x1ee1, "ohorntilde" )
+>     , ( 0x1ee2, "Ohorndotbelow" )
+>     , ( 0x1ee3, "ohorndotbelow" )
+>     , ( 0x1ee4, "Udotbelow" )
+>     , ( 0x1ee5, "udotbelow" )
+>     , ( 0x1ee6, "Uhookabove" )
+>     , ( 0x1ee7, "uhookabove" )
+>     , ( 0x1ee8, "Uhornacute" )
+>     , ( 0x1ee9, "uhornacute" )
+>     , ( 0x1eea, "Uhorngrave" )
+>     , ( 0x1eeb, "uhorngrave" )
+>     , ( 0x1eec, "Uhornhookabove" )
+>     , ( 0x1eed, "uhornhookabove" )
+>     , ( 0x1eee, "Uhorntilde" )
+>     , ( 0x1eef, "uhorntilde" )
+>     , ( 0x1ef0, "Uhorndotbelow" )
+>     , ( 0x1ef1, "uhorndotbelow" )
+>     , ( 0x1ef2, "Ygrave" )
+>     , ( 0x1ef3, "ygrave" )
+>     , ( 0x1ef4, "Ydotbelow" )
+>     , ( 0x1ef5, "ydotbelow" )
+>     , ( 0x1ef6, "Yhookabove" )
+>     , ( 0x1ef7, "yhookabove" )
+>     , ( 0x1ef8, "Ytilde" )
+>     , ( 0x1ef9, "ytilde" )
+>     , ( 0x2002, "enspace" )
+>     , ( 0x200b, "zerowidthspace" )
+>     , ( 0x200c, "afii61664" )
+>     , ( 0x200d, "afii301" )
+>     , ( 0x200e, "afii299" )
+>     , ( 0x200f, "afii300" )
+>     , ( 0x2010, "hyphentwo" )
+>     , ( 0x2012, "figuredash" )
+>     , ( 0x2013, "endash" )
+>     , ( 0x2014, "emdash" )
+>     , ( 0x2015, "afii00208" )
+>     , ( 0x2016, "dblverticalbar" )
+>     , ( 0x2017, "dbllowline" )
+>     , ( 0x2018, "quoteleft" )
+>     , ( 0x2019, "quoteright" )
+>     , ( 0x201a, "quotesinglbase" )
+>     , ( 0x201b, "quoteleftreversed" )
+>     , ( 0x201c, "quotedblleft" )
+>     , ( 0x201d, "quotedblright" )
+>     , ( 0x201e, "quotedblbase" )
+>     , ( 0x2020, "dagger" )
+>     , ( 0x2021, "daggerdbl" )
+>     , ( 0x2022, "bullet" )
+>     , ( 0x2024, "onedotenleader" )
+>     , ( 0x2025, "twodotenleader" )
+>     , ( 0x2026, "ellipsis" )
+>     , ( 0x202c, "afii61573" )
+>     , ( 0x202d, "afii61574" )
+>     , ( 0x202e, "afii61575" )
+>     , ( 0x2030, "perthousand" )
+>     , ( 0x2032, "minute" )
+>     , ( 0x2033, "second" )
+>     , ( 0x2035, "primereversed" )
+>     , ( 0x2039, "guilsinglleft" )
+>     , ( 0x203a, "guilsinglright" )
+>     , ( 0x203b, "referencemark" )
+>     , ( 0x203c, "exclamdbl" )
+>     , ( 0x203e, "overline" )
+>     , ( 0x2042, "asterism" )
+>     , ( 0x2044, "fraction" )
+>     , ( 0x2070, "zerosuperior" )
+>     , ( 0x2074, "foursuperior" )
+>     , ( 0x2075, "fivesuperior" )
+>     , ( 0x2076, "sixsuperior" )
+>     , ( 0x2077, "sevensuperior" )
+>     , ( 0x2078, "eightsuperior" )
+>     , ( 0x2079, "ninesuperior" )
+>     , ( 0x207a, "plussuperior" )
+>     , ( 0x207c, "equalsuperior" )
+>     , ( 0x207d, "parenleftsuperior" )
+>     , ( 0x207e, "parenrightsuperior" )
+>     , ( 0x207f, "nsuperior" )
+>     , ( 0x2080, "zeroinferior" )
+>     , ( 0x2081, "oneinferior" )
+>     , ( 0x2082, "twoinferior" )
+>     , ( 0x2083, "threeinferior" )
+>     , ( 0x2084, "fourinferior" )
+>     , ( 0x2085, "fiveinferior" )
+>     , ( 0x2086, "sixinferior" )
+>     , ( 0x2087, "seveninferior" )
+>     , ( 0x2088, "eightinferior" )
+>     , ( 0x2089, "nineinferior" )
+>     , ( 0x208d, "parenleftinferior" )
+>     , ( 0x208e, "parenrightinferior" )
+>     , ( 0x20a1, "colonmonetary" )
+>     , ( 0x20a2, "cruzeiro" )
+>     , ( 0x20a3, "franc" )
+>     , ( 0x20a4, "afii08941" )
+>     , ( 0x20a7, "peseta" )
+>     , ( 0x20a9, "won" )
+>     , ( 0x20aa, "afii57636" )
+>     , ( 0x20ab, "dong" )
+>     , ( 0x20ac, "Euro" )
+>     , ( 0x2103, "centigrade" )
+>     , ( 0x2105, "afii61248" )
+>     , ( 0x2109, "fahrenheit" )
+>     , ( 0x2111, "Ifraktur" )
+>     , ( 0x2113, "afii61289" )
+>     , ( 0x2116, "afii61352" )
+>     , ( 0x2118, "weierstrass" )
+>     , ( 0x211c, "Rfraktur" )
+>     , ( 0x211e, "prescription" )
+>     , ( 0x2121, "telephone" )
+>     , ( 0x2122, "trademark" )
+>     , ( 0x2126, "Ohm" )
+>     , ( 0x212b, "angstrom" )
+>     , ( 0x212e, "estimated" )
+>     , ( 0x2135, "aleph" )
+>     , ( 0x2153, "onethird" )
+>     , ( 0x2154, "twothirds" )
+>     , ( 0x215b, "oneeighth" )
+>     , ( 0x215c, "threeeighths" )
+>     , ( 0x215d, "fiveeighths" )
+>     , ( 0x215e, "seveneighths" )
+>     , ( 0x2160, "Oneroman" )
+>     , ( 0x2161, "Tworoman" )
+>     , ( 0x2162, "Threeroman" )
+>     , ( 0x2163, "Fourroman" )
+>     , ( 0x2164, "Fiveroman" )
+>     , ( 0x2165, "Sixroman" )
+>     , ( 0x2166, "Sevenroman" )
+>     , ( 0x2167, "Eightroman" )
+>     , ( 0x2168, "Nineroman" )
+>     , ( 0x2169, "Tenroman" )
+>     , ( 0x216a, "Elevenroman" )
+>     , ( 0x216b, "Twelveroman" )
+>     , ( 0x2170, "oneroman" )
+>     , ( 0x2171, "tworoman" )
+>     , ( 0x2172, "threeroman" )
+>     , ( 0x2173, "fourroman" )
+>     , ( 0x2174, "fiveroman" )
+>     , ( 0x2175, "sixroman" )
+>     , ( 0x2176, "sevenroman" )
+>     , ( 0x2177, "eightroman" )
+>     , ( 0x2178, "nineroman" )
+>     , ( 0x2179, "tenroman" )
+>     , ( 0x217a, "elevenroman" )
+>     , ( 0x217b, "twelveroman" )
+>     , ( 0x2190, "arrowleft" )
+>     , ( 0x2191, "arrowup" )
+>     , ( 0x2192, "arrowright" )
+>     , ( 0x2193, "arrowdown" )
+>     , ( 0x2194, "arrowboth" )
+>     , ( 0x2195, "arrowupdn" )
+>     , ( 0x2196, "arrowupleft" )
+>     , ( 0x2197, "arrowupright" )
+>     , ( 0x2198, "arrowdownright" )
+>     , ( 0x2199, "arrowdownleft" )
+>     , ( 0x21a8, "arrowupdnbse" )
+>     , ( 0x21b5, "carriagereturn" )
+>     , ( 0x21bc, "harpoonleftbarbup" )
+>     , ( 0x21c0, "harpoonrightbarbup" )
+>     , ( 0x21c4, "arrowrightoverleft" )
+>     , ( 0x21c5, "arrowupleftofdown" )
+>     , ( 0x21c6, "arrowleftoverright" )
+>     , ( 0x21cd, "arrowleftdblstroke" )
+>     , ( 0x21cf, "arrowrightdblstroke" )
+>     , ( 0x21d0, "arrowdblleft" )
+>     , ( 0x21d1, "arrowdblup" )
+>     , ( 0x21d2, "arrowdblright" )
+>     , ( 0x21d3, "arrowdbldown" )
+>     , ( 0x21d4, "arrowdblboth" )
+>     , ( 0x21de, "pageup" )
+>     , ( 0x21df, "pagedown" )
+>     , ( 0x21e0, "arrowdashleft" )
+>     , ( 0x21e1, "arrowdashup" )
+>     , ( 0x21e2, "arrowdashright" )
+>     , ( 0x21e3, "arrowdashdown" )
+>     , ( 0x21e4, "arrowtableft" )
+>     , ( 0x21e5, "arrowtabright" )
+>     , ( 0x21e6, "arrowleftwhite" )
+>     , ( 0x21e7, "arrowupwhite" )
+>     , ( 0x21e8, "arrowrightwhite" )
+>     , ( 0x21e9, "arrowdownwhite" )
+>     , ( 0x21ea, "capslock" )
+>     , ( 0x2200, "forall" )
+>     , ( 0x2202, "partialdiff" )
+>     , ( 0x2203, "existential" )
+>     , ( 0x2205, "emptyset" )
+>     , ( 0x2206, "Delta" )
+>     , ( 0x2207, "gradient" )
+>     , ( 0x2208, "element" )
+>     , ( 0x2209, "notelement" )
+>     , ( 0x220b, "suchthat" )
+>     , ( 0x220c, "notcontains" )
+>     , ( 0x220f, "product" )
+>     , ( 0x2211, "summation" )
+>     , ( 0x2212, "minus" )
+>     , ( 0x2213, "minusplus" )
+>     , ( 0x2215, "divisionslash" )
+>     , ( 0x2217, "asteriskmath" )
+>     , ( 0x2219, "bulletoperator" )
+>     , ( 0x221a, "radical" )
+>     , ( 0x221d, "proportional" )
+>     , ( 0x221e, "infinity" )
+>     , ( 0x221f, "orthogonal" )
+>     , ( 0x2220, "angle" )
+>     , ( 0x2223, "divides" )
+>     , ( 0x2225, "parallel" )
+>     , ( 0x2226, "notparallel" )
+>     , ( 0x2227, "logicaland" )
+>     , ( 0x2228, "logicalor" )
+>     , ( 0x2229, "intersection" )
+>     , ( 0x222a, "union" )
+>     , ( 0x222b, "integral" )
+>     , ( 0x222c, "dblintegral" )
+>     , ( 0x222e, "contourintegral" )
+>     , ( 0x2234, "therefore" )
+>     , ( 0x2235, "because" )
+>     , ( 0x2236, "ratio" )
+>     , ( 0x2237, "proportion" )
+>     , ( 0x223c, "similar" )
+>     , ( 0x223d, "reversedtilde" )
+>     , ( 0x2243, "asymptoticallyequal" )
+>     , ( 0x2245, "approximatelyequal" )
+>     , ( 0x2248, "approxequal" )
+>     , ( 0x224c, "allequal" )
+>     , ( 0x2250, "approaches" )
+>     , ( 0x2251, "geometricallyequal" )
+>     , ( 0x2252, "approxequalorimage" )
+>     , ( 0x2253, "imageorapproximatelyequal" )
+>     , ( 0x2260, "notequal" )
+>     , ( 0x2261, "equivalence" )
+>     , ( 0x2262, "notidentical" )
+>     , ( 0x2264, "lessequal" )
+>     , ( 0x2265, "greaterequal" )
+>     , ( 0x2266, "lessoverequal" )
+>     , ( 0x2267, "greateroverequal" )
+>     , ( 0x226a, "muchless" )
+>     , ( 0x226b, "muchgreater" )
+>     , ( 0x226e, "notless" )
+>     , ( 0x226f, "notgreater" )
+>     , ( 0x2270, "notlessnorequal" )
+>     , ( 0x2271, "notgreaternorequal" )
+>     , ( 0x2272, "lessorequivalent" )
+>     , ( 0x2273, "greaterorequivalent" )
+>     , ( 0x2276, "lessorgreater" )
+>     , ( 0x2277, "greaterorless" )
+>     , ( 0x2279, "notgreaternorless" )
+>     , ( 0x227a, "precedes" )
+>     , ( 0x227b, "succeeds" )
+>     , ( 0x2280, "notprecedes" )
+>     , ( 0x2281, "notsucceeds" )
+>     , ( 0x2282, "propersubset" )
+>     , ( 0x2283, "propersuperset" )
+>     , ( 0x2284, "notsubset" )
+>     , ( 0x2285, "notsuperset" )
+>     , ( 0x2286, "reflexsubset" )
+>     , ( 0x2287, "reflexsuperset" )
+>     , ( 0x228a, "subsetnotequal" )
+>     , ( 0x228b, "supersetnotequal" )
+>     , ( 0x2295, "circleplus" )
+>     , ( 0x2296, "minuscircle" )
+>     , ( 0x2297, "circlemultiply" )
+>     , ( 0x2299, "circleot" )
+>     , ( 0x22a3, "tackleft" )
+>     , ( 0x22a4, "tackdown" )
+>     , ( 0x22a5, "perpendicular" )
+>     , ( 0x22bf, "righttriangle" )
+>     , ( 0x22c5, "dotmath" )
+>     , ( 0x22ce, "curlyor" )
+>     , ( 0x22cf, "curlyand" )
+>     , ( 0x22da, "lessequalorgreater" )
+>     , ( 0x22db, "greaterequalorless" )
+>     , ( 0x22ee, "ellipsisvertical" )
+>     , ( 0x2302, "house" )
+>     , ( 0x2303, "control" )
+>     , ( 0x2305, "projective" )
+>     , ( 0x2310, "logicalnotreversed" )
+>     , ( 0x2312, "arc" )
+>     , ( 0x2318, "propellor" )
+>     , ( 0x2320, "integraltop" )
+>     , ( 0x2321, "integralbottom" )
+>     , ( 0x2325, "option" )
+>     , ( 0x2326, "deleteright" )
+>     , ( 0x2327, "clear" )
+>     , ( 0x2329, "angleleft" )
+>     , ( 0x232a, "angleright" )
+>     , ( 0x232b, "deleteleft" )
+>     , ( 0x2423, "blank" )
+>     , ( 0x2460, "onecircle" )
+>     , ( 0x2461, "twocircle" )
+>     , ( 0x2462, "threecircle" )
+>     , ( 0x2463, "fourcircle" )
+>     , ( 0x2464, "fivecircle" )
+>     , ( 0x2465, "sixcircle" )
+>     , ( 0x2466, "sevencircle" )
+>     , ( 0x2467, "eightcircle" )
+>     , ( 0x2468, "ninecircle" )
+>     , ( 0x2469, "tencircle" )
+>     , ( 0x246a, "elevencircle" )
+>     , ( 0x246b, "twelvecircle" )
+>     , ( 0x246c, "thirteencircle" )
+>     , ( 0x246d, "fourteencircle" )
+>     , ( 0x246e, "fifteencircle" )
+>     , ( 0x246f, "sixteencircle" )
+>     , ( 0x2470, "seventeencircle" )
+>     , ( 0x2471, "eighteencircle" )
+>     , ( 0x2472, "nineteencircle" )
+>     , ( 0x2473, "twentycircle" )
+>     , ( 0x2474, "oneparen" )
+>     , ( 0x2475, "twoparen" )
+>     , ( 0x2476, "threeparen" )
+>     , ( 0x2477, "fourparen" )
+>     , ( 0x2478, "fiveparen" )
+>     , ( 0x2479, "sixparen" )
+>     , ( 0x247a, "sevenparen" )
+>     , ( 0x247b, "eightparen" )
+>     , ( 0x247c, "nineparen" )
+>     , ( 0x247d, "tenparen" )
+>     , ( 0x247e, "elevenparen" )
+>     , ( 0x247f, "twelveparen" )
+>     , ( 0x2480, "thirteenparen" )
+>     , ( 0x2481, "fourteenparen" )
+>     , ( 0x2482, "fifteenparen" )
+>     , ( 0x2483, "sixteenparen" )
+>     , ( 0x2484, "seventeenparen" )
+>     , ( 0x2485, "eighteenparen" )
+>     , ( 0x2486, "nineteenparen" )
+>     , ( 0x2487, "twentyparen" )
+>     , ( 0x2488, "oneperiod" )
+>     , ( 0x2489, "twoperiod" )
+>     , ( 0x248a, "threeperiod" )
+>     , ( 0x248b, "fourperiod" )
+>     , ( 0x248c, "fiveperiod" )
+>     , ( 0x248d, "sixperiod" )
+>     , ( 0x248e, "sevenperiod" )
+>     , ( 0x248f, "eightperiod" )
+>     , ( 0x2490, "nineperiod" )
+>     , ( 0x2491, "tenperiod" )
+>     , ( 0x2492, "elevenperiod" )
+>     , ( 0x2493, "twelveperiod" )
+>     , ( 0x2494, "thirteenperiod" )
+>     , ( 0x2495, "fourteenperiod" )
+>     , ( 0x2496, "fifteenperiod" )
+>     , ( 0x2497, "sixteenperiod" )
+>     , ( 0x2498, "seventeenperiod" )
+>     , ( 0x2499, "eighteenperiod" )
+>     , ( 0x249a, "nineteenperiod" )
+>     , ( 0x249b, "twentyperiod" )
+>     , ( 0x249c, "aparen" )
+>     , ( 0x249d, "bparen" )
+>     , ( 0x249e, "cparen" )
+>     , ( 0x249f, "dparen" )
+>     , ( 0x24a0, "eparen" )
+>     , ( 0x24a1, "fparen" )
+>     , ( 0x24a2, "gparen" )
+>     , ( 0x24a3, "hparen" )
+>     , ( 0x24a4, "iparen" )
+>     , ( 0x24a5, "jparen" )
+>     , ( 0x24a6, "kparen" )
+>     , ( 0x24a7, "lparen" )
+>     , ( 0x24a8, "mparen" )
+>     , ( 0x24a9, "nparen" )
+>     , ( 0x24aa, "oparen" )
+>     , ( 0x24ab, "pparen" )
+>     , ( 0x24ac, "qparen" )
+>     , ( 0x24ad, "rparen" )
+>     , ( 0x24ae, "sparen" )
+>     , ( 0x24af, "tparen" )
+>     , ( 0x24b0, "uparen" )
+>     , ( 0x24b1, "vparen" )
+>     , ( 0x24b2, "wparen" )
+>     , ( 0x24b3, "xparen" )
+>     , ( 0x24b4, "yparen" )
+>     , ( 0x24b5, "zparen" )
+>     , ( 0x24b6, "Acircle" )
+>     , ( 0x24b7, "Bcircle" )
+>     , ( 0x24b8, "Ccircle" )
+>     , ( 0x24b9, "Dcircle" )
+>     , ( 0x24ba, "Ecircle" )
+>     , ( 0x24bb, "Fcircle" )
+>     , ( 0x24bc, "Gcircle" )
+>     , ( 0x24bd, "Hcircle" )
+>     , ( 0x24be, "Icircle" )
+>     , ( 0x24bf, "Jcircle" )
+>     , ( 0x24c0, "Kcircle" )
+>     , ( 0x24c1, "Lcircle" )
+>     , ( 0x24c2, "Mcircle" )
+>     , ( 0x24c3, "Ncircle" )
+>     , ( 0x24c4, "Ocircle" )
+>     , ( 0x24c5, "Pcircle" )
+>     , ( 0x24c6, "Qcircle" )
+>     , ( 0x24c7, "Rcircle" )
+>     , ( 0x24c8, "Scircle" )
+>     , ( 0x24c9, "Tcircle" )
+>     , ( 0x24ca, "Ucircle" )
+>     , ( 0x24cb, "Vcircle" )
+>     , ( 0x24cc, "Wcircle" )
+>     , ( 0x24cd, "Xcircle" )
+>     , ( 0x24ce, "Ycircle" )
+>     , ( 0x24cf, "Zcircle" )
+>     , ( 0x24d0, "acircle" )
+>     , ( 0x24d1, "bcircle" )
+>     , ( 0x24d2, "ccircle" )
+>     , ( 0x24d3, "dcircle" )
+>     , ( 0x24d4, "ecircle" )
+>     , ( 0x24d5, "fcircle" )
+>     , ( 0x24d6, "gcircle" )
+>     , ( 0x24d7, "hcircle" )
+>     , ( 0x24d8, "icircle" )
+>     , ( 0x24d9, "jcircle" )
+>     , ( 0x24da, "kcircle" )
+>     , ( 0x24db, "lcircle" )
+>     , ( 0x24dc, "mcircle" )
+>     , ( 0x24dd, "ncircle" )
+>     , ( 0x24de, "ocircle" )
+>     , ( 0x24df, "pcircle" )
+>     , ( 0x24e0, "qcircle" )
+>     , ( 0x24e1, "rcircle" )
+>     , ( 0x24e2, "scircle" )
+>     , ( 0x24e3, "tcircle" )
+>     , ( 0x24e4, "ucircle" )
+>     , ( 0x24e5, "vcircle" )
+>     , ( 0x24e6, "wcircle" )
+>     , ( 0x24e7, "xcircle" )
+>     , ( 0x24e8, "ycircle" )
+>     , ( 0x24e9, "zcircle" )
+>     , ( 0x2500, "SF100000" )
+>     , ( 0x2502, "SF110000" )
+>     , ( 0x250c, "SF010000" )
+>     , ( 0x2510, "SF030000" )
+>     , ( 0x2514, "SF020000" )
+>     , ( 0x2518, "SF040000" )
+>     , ( 0x251c, "SF080000" )
+>     , ( 0x2524, "SF090000" )
+>     , ( 0x252c, "SF060000" )
+>     , ( 0x2534, "SF070000" )
+>     , ( 0x253c, "SF050000" )
+>     , ( 0x2550, "SF430000" )
+>     , ( 0x2551, "SF240000" )
+>     , ( 0x2552, "SF510000" )
+>     , ( 0x2553, "SF520000" )
+>     , ( 0x2554, "SF390000" )
+>     , ( 0x2555, "SF220000" )
+>     , ( 0x2556, "SF210000" )
+>     , ( 0x2557, "SF250000" )
+>     , ( 0x2558, "SF500000" )
+>     , ( 0x2559, "SF490000" )
+>     , ( 0x255a, "SF380000" )
+>     , ( 0x255b, "SF280000" )
+>     , ( 0x255c, "SF270000" )
+>     , ( 0x255d, "SF260000" )
+>     , ( 0x255e, "SF360000" )
+>     , ( 0x255f, "SF370000" )
+>     , ( 0x2560, "SF420000" )
+>     , ( 0x2561, "SF190000" )
+>     , ( 0x2562, "SF200000" )
+>     , ( 0x2563, "SF230000" )
+>     , ( 0x2564, "SF470000" )
+>     , ( 0x2565, "SF480000" )
+>     , ( 0x2566, "SF410000" )
+>     , ( 0x2567, "SF450000" )
+>     , ( 0x2568, "SF460000" )
+>     , ( 0x2569, "SF400000" )
+>     , ( 0x256a, "SF540000" )
+>     , ( 0x256b, "SF530000" )
+>     , ( 0x256c, "SF440000" )
+>     , ( 0x2580, "upblock" )
+>     , ( 0x2584, "dnblock" )
+>     , ( 0x2588, "block" )
+>     , ( 0x258c, "lfblock" )
+>     , ( 0x2590, "rtblock" )
+>     , ( 0x2591, "ltshade" )
+>     , ( 0x2592, "shade" )
+>     , ( 0x2593, "dkshade" )
+>     , ( 0x25a0, "blacksquare" )
+>     , ( 0x25a1, "H22073" )
+>     , ( 0x25a3, "squarewhitewithsmallblack" )
+>     , ( 0x25a4, "squarehorizontalfill" )
+>     , ( 0x25a5, "squareverticalfill" )
+>     , ( 0x25a6, "squareorthogonalcrosshatchfill" )
+>     , ( 0x25a7, "squareupperlefttolowerrightfill" )
+>     , ( 0x25a8, "squareupperrighttolowerleftfill" )
+>     , ( 0x25a9, "squarediagonalcrosshatchfill" )
+>     , ( 0x25aa, "H18543" )
+>     , ( 0x25ab, "H18551" )
+>     , ( 0x25ac, "blackrectangle" )
+>     , ( 0x25b2, "blackuppointingtriangle" )
+>     , ( 0x25b3, "whiteuppointingtriangle" )
+>     , ( 0x25b4, "blackuppointingsmalltriangle" )
+>     , ( 0x25b5, "whiteuppointingsmalltriangle" )
+>     , ( 0x25b6, "blackrightpointingtriangle" )
+>     , ( 0x25b7, "whiterightpointingtriangle" )
+>     , ( 0x25b9, "whiterightpointingsmalltriangle" )
+>     , ( 0x25ba, "blackrightpointingpointer" )
+>     , ( 0x25bc, "blackdownpointingtriangle" )
+>     , ( 0x25bd, "whitedownpointingtriangle" )
+>     , ( 0x25bf, "whitedownpointingsmalltriangle" )
+>     , ( 0x25c0, "blackleftpointingtriangle" )
+>     , ( 0x25c1, "whiteleftpointingtriangle" )
+>     , ( 0x25c3, "whiteleftpointingsmalltriangle" )
+>     , ( 0x25c4, "blackleftpointingpointer" )
+>     , ( 0x25c6, "blackdiamond" )
+>     , ( 0x25c7, "whitediamond" )
+>     , ( 0x25c8, "whitediamondcontainingblacksmalldiamond" )
+>     , ( 0x25c9, "fisheye" )
+>     , ( 0x25ca, "lozenge" )
+>     , ( 0x25cb, "circle" )
+>     , ( 0x25cc, "dottedcircle" )
+>     , ( 0x25ce, "bullseye" )
+>     , ( 0x25cf, "H18533" )
+>     , ( 0x25d0, "circlewithlefthalfblack" )
+>     , ( 0x25d1, "circlewithrighthalfblack" )
+>     , ( 0x25d8, "bulletinverse" )
+>     , ( 0x25d9, "invcircle" )
+>     , ( 0x25e2, "blacklowerrighttriangle" )
+>     , ( 0x25e3, "blacklowerlefttriangle" )
+>     , ( 0x25e4, "blackupperlefttriangle" )
+>     , ( 0x25e5, "blackupperrighttriangle" )
+>     , ( 0x25e6, "openbullet" )
+>     , ( 0x25ef, "largecircle" )
+>     , ( 0x2605, "blackstar" )
+>     , ( 0x2606, "whitestar" )
+>     , ( 0x260e, "telephoneblack" )
+>     , ( 0x260f, "whitetelephone" )
+>     , ( 0x261c, "pointingindexleftwhite" )
+>     , ( 0x261d, "pointingindexupwhite" )
+>     , ( 0x261e, "pointingindexrightwhite" )
+>     , ( 0x261f, "pointingindexdownwhite" )
+>     , ( 0x262f, "yinyang" )
+>     , ( 0x263a, "smileface" )
+>     , ( 0x263b, "blacksmilingface" )
+>     , ( 0x263c, "compass" )
+>     , ( 0x2640, "female" )
+>     , ( 0x2641, "earth" )
+>     , ( 0x2642, "male" )
+>     , ( 0x2660, "spade" )
+>     , ( 0x2661, "heartsuitwhite" )
+>     , ( 0x2662, "diamondsuitwhite" )
+>     , ( 0x2663, "club" )
+>     , ( 0x2664, "spadesuitwhite" )
+>     , ( 0x2665, "heart" )
+>     , ( 0x2666, "diamond" )
+>     , ( 0x2667, "clubsuitwhite" )
+>     , ( 0x2668, "hotsprings" )
+>     , ( 0x2669, "quarternote" )
+>     , ( 0x266a, "musicalnote" )
+>     , ( 0x266b, "eighthnotebeamed" )
+>     , ( 0x266c, "beamedsixteenthnotes" )
+>     , ( 0x266d, "musicflatsign" )
+>     , ( 0x266f, "musicsharpsign" )
+>     , ( 0x2713, "checkmark" )
+>     , ( 0x278a, "onecircleinversesansserif" )
+>     , ( 0x278b, "twocircleinversesansserif" )
+>     , ( 0x278c, "threecircleinversesansserif" )
+>     , ( 0x278d, "fourcircleinversesansserif" )
+>     , ( 0x278e, "fivecircleinversesansserif" )
+>     , ( 0x278f, "sixcircleinversesansserif" )
+>     , ( 0x2790, "sevencircleinversesansserif" )
+>     , ( 0x2791, "eightcircleinversesansserif" )
+>     , ( 0x2792, "ninecircleinversesansserif" )
+>     , ( 0x279e, "arrowrightheavy" )
+>     , ( 0x3000, "ideographicspace" )
+>     , ( 0x3001, "ideographiccomma" )
+>     , ( 0x3002, "ideographicperiod" )
+>     , ( 0x3003, "dittomark" )
+>     , ( 0x3004, "jis" )
+>     , ( 0x3005, "ideographiciterationmark" )
+>     , ( 0x3006, "ideographicclose" )
+>     , ( 0x3007, "ideographiczero" )
+>     , ( 0x3008, "anglebracketleft" )
+>     , ( 0x3009, "anglebracketright" )
+>     , ( 0x300a, "dblanglebracketleft" )
+>     , ( 0x300b, "dblanglebracketright" )
+>     , ( 0x300c, "cornerbracketleft" )
+>     , ( 0x300d, "cornerbracketright" )
+>     , ( 0x300e, "whitecornerbracketleft" )
+>     , ( 0x300f, "whitecornerbracketright" )
+>     , ( 0x3010, "blacklenticularbracketleft" )
+>     , ( 0x3011, "blacklenticularbracketright" )
+>     , ( 0x3012, "postalmark" )
+>     , ( 0x3013, "getamark" )
+>     , ( 0x3014, "tortoiseshellbracketleft" )
+>     , ( 0x3015, "tortoiseshellbracketright" )
+>     , ( 0x3016, "whitelenticularbracketleft" )
+>     , ( 0x3017, "whitelenticularbracketright" )
+>     , ( 0x3018, "whitetortoiseshellbracketleft" )
+>     , ( 0x3019, "whitetortoiseshellbracketright" )
+>     , ( 0x301c, "wavedash" )
+>     , ( 0x301d, "quotedblprimereversed" )
+>     , ( 0x301e, "quotedblprime" )
+>     , ( 0x3020, "postalmarkface" )
+>     , ( 0x3021, "onehangzhou" )
+>     , ( 0x3022, "twohangzhou" )
+>     , ( 0x3023, "threehangzhou" )
+>     , ( 0x3024, "fourhangzhou" )
+>     , ( 0x3025, "fivehangzhou" )
+>     , ( 0x3026, "sixhangzhou" )
+>     , ( 0x3027, "sevenhangzhou" )
+>     , ( 0x3028, "eighthangzhou" )
+>     , ( 0x3029, "ninehangzhou" )
+>     , ( 0x3036, "circlepostalmark" )
+>     , ( 0x3041, "asmallhiragana" )
+>     , ( 0x3042, "ahiragana" )
+>     , ( 0x3043, "ismallhiragana" )
+>     , ( 0x3044, "ihiragana" )
+>     , ( 0x3045, "usmallhiragana" )
+>     , ( 0x3046, "uhiragana" )
+>     , ( 0x3047, "esmallhiragana" )
+>     , ( 0x3048, "ehiragana" )
+>     , ( 0x3049, "osmallhiragana" )
+>     , ( 0x304a, "ohiragana" )
+>     , ( 0x304b, "kahiragana" )
+>     , ( 0x304c, "gahiragana" )
+>     , ( 0x304d, "kihiragana" )
+>     , ( 0x304e, "gihiragana" )
+>     , ( 0x304f, "kuhiragana" )
+>     , ( 0x3050, "guhiragana" )
+>     , ( 0x3051, "kehiragana" )
+>     , ( 0x3052, "gehiragana" )
+>     , ( 0x3053, "kohiragana" )
+>     , ( 0x3054, "gohiragana" )
+>     , ( 0x3055, "sahiragana" )
+>     , ( 0x3056, "zahiragana" )
+>     , ( 0x3057, "sihiragana" )
+>     , ( 0x3058, "zihiragana" )
+>     , ( 0x3059, "suhiragana" )
+>     , ( 0x305a, "zuhiragana" )
+>     , ( 0x305b, "sehiragana" )
+>     , ( 0x305c, "zehiragana" )
+>     , ( 0x305d, "sohiragana" )
+>     , ( 0x305e, "zohiragana" )
+>     , ( 0x305f, "tahiragana" )
+>     , ( 0x3060, "dahiragana" )
+>     , ( 0x3061, "tihiragana" )
+>     , ( 0x3062, "dihiragana" )
+>     , ( 0x3063, "tusmallhiragana" )
+>     , ( 0x3064, "tuhiragana" )
+>     , ( 0x3065, "duhiragana" )
+>     , ( 0x3066, "tehiragana" )
+>     , ( 0x3067, "dehiragana" )
+>     , ( 0x3068, "tohiragana" )
+>     , ( 0x3069, "dohiragana" )
+>     , ( 0x306a, "nahiragana" )
+>     , ( 0x306b, "nihiragana" )
+>     , ( 0x306c, "nuhiragana" )
+>     , ( 0x306d, "nehiragana" )
+>     , ( 0x306e, "nohiragana" )
+>     , ( 0x306f, "hahiragana" )
+>     , ( 0x3070, "bahiragana" )
+>     , ( 0x3071, "pahiragana" )
+>     , ( 0x3072, "hihiragana" )
+>     , ( 0x3073, "bihiragana" )
+>     , ( 0x3074, "pihiragana" )
+>     , ( 0x3075, "huhiragana" )
+>     , ( 0x3076, "buhiragana" )
+>     , ( 0x3077, "puhiragana" )
+>     , ( 0x3078, "hehiragana" )
+>     , ( 0x3079, "behiragana" )
+>     , ( 0x307a, "pehiragana" )
+>     , ( 0x307b, "hohiragana" )
+>     , ( 0x307c, "bohiragana" )
+>     , ( 0x307d, "pohiragana" )
+>     , ( 0x307e, "mahiragana" )
+>     , ( 0x307f, "mihiragana" )
+>     , ( 0x3080, "muhiragana" )
+>     , ( 0x3081, "mehiragana" )
+>     , ( 0x3082, "mohiragana" )
+>     , ( 0x3083, "yasmallhiragana" )
+>     , ( 0x3084, "yahiragana" )
+>     , ( 0x3085, "yusmallhiragana" )
+>     , ( 0x3086, "yuhiragana" )
+>     , ( 0x3087, "yosmallhiragana" )
+>     , ( 0x3088, "yohiragana" )
+>     , ( 0x3089, "rahiragana" )
+>     , ( 0x308a, "rihiragana" )
+>     , ( 0x308b, "ruhiragana" )
+>     , ( 0x308c, "rehiragana" )
+>     , ( 0x308d, "rohiragana" )
+>     , ( 0x308e, "wasmallhiragana" )
+>     , ( 0x308f, "wahiragana" )
+>     , ( 0x3090, "wihiragana" )
+>     , ( 0x3091, "wehiragana" )
+>     , ( 0x3092, "wohiragana" )
+>     , ( 0x3093, "nhiragana" )
+>     , ( 0x3094, "vuhiragana" )
+>     , ( 0x309b, "voicedmarkkana" )
+>     , ( 0x309c, "semivoicedmarkkana" )
+>     , ( 0x309d, "iterationhiragana" )
+>     , ( 0x309e, "voicediterationhiragana" )
+>     , ( 0x30a1, "asmallkatakana" )
+>     , ( 0x30a2, "akatakana" )
+>     , ( 0x30a3, "ismallkatakana" )
+>     , ( 0x30a4, "ikatakana" )
+>     , ( 0x30a5, "usmallkatakana" )
+>     , ( 0x30a6, "ukatakana" )
+>     , ( 0x30a7, "esmallkatakana" )
+>     , ( 0x30a8, "ekatakana" )
+>     , ( 0x30a9, "osmallkatakana" )
+>     , ( 0x30aa, "okatakana" )
+>     , ( 0x30ab, "kakatakana" )
+>     , ( 0x30ac, "gakatakana" )
+>     , ( 0x30ad, "kikatakana" )
+>     , ( 0x30ae, "gikatakana" )
+>     , ( 0x30af, "kukatakana" )
+>     , ( 0x30b0, "gukatakana" )
+>     , ( 0x30b1, "kekatakana" )
+>     , ( 0x30b2, "gekatakana" )
+>     , ( 0x30b3, "kokatakana" )
+>     , ( 0x30b4, "gokatakana" )
+>     , ( 0x30b5, "sakatakana" )
+>     , ( 0x30b6, "zakatakana" )
+>     , ( 0x30b7, "sikatakana" )
+>     , ( 0x30b8, "zikatakana" )
+>     , ( 0x30b9, "sukatakana" )
+>     , ( 0x30ba, "zukatakana" )
+>     , ( 0x30bb, "sekatakana" )
+>     , ( 0x30bc, "zekatakana" )
+>     , ( 0x30bd, "sokatakana" )
+>     , ( 0x30be, "zokatakana" )
+>     , ( 0x30bf, "takatakana" )
+>     , ( 0x30c0, "dakatakana" )
+>     , ( 0x30c1, "tikatakana" )
+>     , ( 0x30c2, "dikatakana" )
+>     , ( 0x30c3, "tusmallkatakana" )
+>     , ( 0x30c4, "tukatakana" )
+>     , ( 0x30c5, "dukatakana" )
+>     , ( 0x30c6, "tekatakana" )
+>     , ( 0x30c7, "dekatakana" )
+>     , ( 0x30c8, "tokatakana" )
+>     , ( 0x30c9, "dokatakana" )
+>     , ( 0x30ca, "nakatakana" )
+>     , ( 0x30cb, "nikatakana" )
+>     , ( 0x30cc, "nukatakana" )
+>     , ( 0x30cd, "nekatakana" )
+>     , ( 0x30ce, "nokatakana" )
+>     , ( 0x30cf, "hakatakana" )
+>     , ( 0x30d0, "bakatakana" )
+>     , ( 0x30d1, "pakatakana" )
+>     , ( 0x30d2, "hikatakana" )
+>     , ( 0x30d3, "bikatakana" )
+>     , ( 0x30d4, "pikatakana" )
+>     , ( 0x30d5, "hukatakana" )
+>     , ( 0x30d6, "bukatakana" )
+>     , ( 0x30d7, "pukatakana" )
+>     , ( 0x30d8, "hekatakana" )
+>     , ( 0x30d9, "bekatakana" )
+>     , ( 0x30da, "pekatakana" )
+>     , ( 0x30db, "hokatakana" )
+>     , ( 0x30dc, "bokatakana" )
+>     , ( 0x30dd, "pokatakana" )
+>     , ( 0x30de, "makatakana" )
+>     , ( 0x30df, "mikatakana" )
+>     , ( 0x30e0, "mukatakana" )
+>     , ( 0x30e1, "mekatakana" )
+>     , ( 0x30e2, "mokatakana" )
+>     , ( 0x30e3, "yasmallkatakana" )
+>     , ( 0x30e4, "yakatakana" )
+>     , ( 0x30e5, "yusmallkatakana" )
+>     , ( 0x30e6, "yukatakana" )
+>     , ( 0x30e7, "yosmallkatakana" )
+>     , ( 0x30e8, "yokatakana" )
+>     , ( 0x30e9, "rakatakana" )
+>     , ( 0x30ea, "rikatakana" )
+>     , ( 0x30eb, "rukatakana" )
+>     , ( 0x30ec, "rekatakana" )
+>     , ( 0x30ed, "rokatakana" )
+>     , ( 0x30ee, "wasmallkatakana" )
+>     , ( 0x30ef, "wakatakana" )
+>     , ( 0x30f0, "wikatakana" )
+>     , ( 0x30f1, "wekatakana" )
+>     , ( 0x30f2, "wokatakana" )
+>     , ( 0x30f3, "nkatakana" )
+>     , ( 0x30f4, "vukatakana" )
+>     , ( 0x30f5, "kasmallkatakana" )
+>     , ( 0x30f6, "kesmallkatakana" )
+>     , ( 0x30f7, "vakatakana" )
+>     , ( 0x30f8, "vikatakana" )
+>     , ( 0x30f9, "vekatakana" )
+>     , ( 0x30fa, "vokatakana" )
+>     , ( 0x30fb, "dotkatakana" )
+>     , ( 0x30fc, "prolongedkana" )
+>     , ( 0x30fd, "iterationkatakana" )
+>     , ( 0x30fe, "voicediterationkatakana" )
+>     , ( 0x3105, "bbopomofo" )
+>     , ( 0x3106, "pbopomofo" )
+>     , ( 0x3107, "mbopomofo" )
+>     , ( 0x3108, "fbopomofo" )
+>     , ( 0x3109, "dbopomofo" )
+>     , ( 0x310a, "tbopomofo" )
+>     , ( 0x310b, "nbopomofo" )
+>     , ( 0x310c, "lbopomofo" )
+>     , ( 0x310d, "gbopomofo" )
+>     , ( 0x310e, "kbopomofo" )
+>     , ( 0x310f, "hbopomofo" )
+>     , ( 0x3110, "jbopomofo" )
+>     , ( 0x3111, "qbopomofo" )
+>     , ( 0x3112, "xbopomofo" )
+>     , ( 0x3113, "zhbopomofo" )
+>     , ( 0x3114, "chbopomofo" )
+>     , ( 0x3115, "shbopomofo" )
+>     , ( 0x3116, "rbopomofo" )
+>     , ( 0x3117, "zbopomofo" )
+>     , ( 0x3118, "cbopomofo" )
+>     , ( 0x3119, "sbopomofo" )
+>     , ( 0x311a, "abopomofo" )
+>     , ( 0x311b, "obopomofo" )
+>     , ( 0x311c, "ebopomofo" )
+>     , ( 0x311d, "ehbopomofo" )
+>     , ( 0x311e, "aibopomofo" )
+>     , ( 0x311f, "eibopomofo" )
+>     , ( 0x3120, "aubopomofo" )
+>     , ( 0x3121, "oubopomofo" )
+>     , ( 0x3122, "anbopomofo" )
+>     , ( 0x3123, "enbopomofo" )
+>     , ( 0x3124, "angbopomofo" )
+>     , ( 0x3125, "engbopomofo" )
+>     , ( 0x3126, "erbopomofo" )
+>     , ( 0x3127, "ibopomofo" )
+>     , ( 0x3128, "ubopomofo" )
+>     , ( 0x3129, "iubopomofo" )
+>     , ( 0x3131, "kiyeokkorean" )
+>     , ( 0x3132, "ssangkiyeokkorean" )
+>     , ( 0x3133, "kiyeoksioskorean" )
+>     , ( 0x3134, "nieunkorean" )
+>     , ( 0x3135, "nieuncieuckorean" )
+>     , ( 0x3136, "nieunhieuhkorean" )
+>     , ( 0x3137, "tikeutkorean" )
+>     , ( 0x3138, "ssangtikeutkorean" )
+>     , ( 0x3139, "rieulkorean" )
+>     , ( 0x313a, "rieulkiyeokkorean" )
+>     , ( 0x313b, "rieulmieumkorean" )
+>     , ( 0x313c, "rieulpieupkorean" )
+>     , ( 0x313d, "rieulsioskorean" )
+>     , ( 0x313e, "rieulthieuthkorean" )
+>     , ( 0x313f, "rieulphieuphkorean" )
+>     , ( 0x3140, "rieulhieuhkorean" )
+>     , ( 0x3141, "mieumkorean" )
+>     , ( 0x3142, "pieupkorean" )
+>     , ( 0x3143, "ssangpieupkorean" )
+>     , ( 0x3144, "pieupsioskorean" )
+>     , ( 0x3145, "sioskorean" )
+>     , ( 0x3146, "ssangsioskorean" )
+>     , ( 0x3147, "ieungkorean" )
+>     , ( 0x3148, "cieuckorean" )
+>     , ( 0x3149, "ssangcieuckorean" )
+>     , ( 0x314a, "chieuchkorean" )
+>     , ( 0x314b, "khieukhkorean" )
+>     , ( 0x314c, "thieuthkorean" )
+>     , ( 0x314d, "phieuphkorean" )
+>     , ( 0x314e, "hieuhkorean" )
+>     , ( 0x314f, "akorean" )
+>     , ( 0x3150, "aekorean" )
+>     , ( 0x3151, "yakorean" )
+>     , ( 0x3152, "yaekorean" )
+>     , ( 0x3153, "eokorean" )
+>     , ( 0x3154, "ekorean" )
+>     , ( 0x3155, "yeokorean" )
+>     , ( 0x3156, "yekorean" )
+>     , ( 0x3157, "okorean" )
+>     , ( 0x3158, "wakorean" )
+>     , ( 0x3159, "waekorean" )
+>     , ( 0x315a, "oekorean" )
+>     , ( 0x315b, "yokorean" )
+>     , ( 0x315c, "ukorean" )
+>     , ( 0x315d, "weokorean" )
+>     , ( 0x315e, "wekorean" )
+>     , ( 0x315f, "wikorean" )
+>     , ( 0x3160, "yukorean" )
+>     , ( 0x3161, "eukorean" )
+>     , ( 0x3162, "yikorean" )
+>     , ( 0x3163, "ikorean" )
+>     , ( 0x3164, "hangulfiller" )
+>     , ( 0x3165, "ssangnieunkorean" )
+>     , ( 0x3166, "nieuntikeutkorean" )
+>     , ( 0x3167, "nieunsioskorean" )
+>     , ( 0x3168, "nieunpansioskorean" )
+>     , ( 0x3169, "rieulkiyeoksioskorean" )
+>     , ( 0x316a, "rieultikeutkorean" )
+>     , ( 0x316b, "rieulpieupsioskorean" )
+>     , ( 0x316c, "rieulpansioskorean" )
+>     , ( 0x316d, "rieulyeorinhieuhkorean" )
+>     , ( 0x316e, "mieumpieupkorean" )
+>     , ( 0x316f, "mieumsioskorean" )
+>     , ( 0x3170, "mieumpansioskorean" )
+>     , ( 0x3171, "kapyeounmieumkorean" )
+>     , ( 0x3172, "pieupkiyeokkorean" )
+>     , ( 0x3173, "pieuptikeutkorean" )
+>     , ( 0x3174, "pieupsioskiyeokkorean" )
+>     , ( 0x3175, "pieupsiostikeutkorean" )
+>     , ( 0x3176, "pieupcieuckorean" )
+>     , ( 0x3177, "pieupthieuthkorean" )
+>     , ( 0x3178, "kapyeounpieupkorean" )
+>     , ( 0x3179, "kapyeounssangpieupkorean" )
+>     , ( 0x317a, "sioskiyeokkorean" )
+>     , ( 0x317b, "siosnieunkorean" )
+>     , ( 0x317c, "siostikeutkorean" )
+>     , ( 0x317d, "siospieupkorean" )
+>     , ( 0x317e, "sioscieuckorean" )
+>     , ( 0x317f, "pansioskorean" )
+>     , ( 0x3180, "ssangieungkorean" )
+>     , ( 0x3181, "yesieungkorean" )
+>     , ( 0x3182, "yesieungsioskorean" )
+>     , ( 0x3183, "yesieungpansioskorean" )
+>     , ( 0x3184, "kapyeounphieuphkorean" )
+>     , ( 0x3185, "ssanghieuhkorean" )
+>     , ( 0x3186, "yeorinhieuhkorean" )
+>     , ( 0x3187, "yoyakorean" )
+>     , ( 0x3188, "yoyaekorean" )
+>     , ( 0x3189, "yoikorean" )
+>     , ( 0x318a, "yuyeokorean" )
+>     , ( 0x318b, "yuyekorean" )
+>     , ( 0x318c, "yuikorean" )
+>     , ( 0x318d, "araeakorean" )
+>     , ( 0x318e, "araeaekorean" )
+>     , ( 0x3200, "kiyeokparenkorean" )
+>     , ( 0x3201, "nieunparenkorean" )
+>     , ( 0x3202, "tikeutparenkorean" )
+>     , ( 0x3203, "rieulparenkorean" )
+>     , ( 0x3204, "mieumparenkorean" )
+>     , ( 0x3205, "pieupparenkorean" )
+>     , ( 0x3206, "siosparenkorean" )
+>     , ( 0x3207, "ieungparenkorean" )
+>     , ( 0x3208, "cieucparenkorean" )
+>     , ( 0x3209, "chieuchparenkorean" )
+>     , ( 0x320a, "khieukhparenkorean" )
+>     , ( 0x320b, "thieuthparenkorean" )
+>     , ( 0x320c, "phieuphparenkorean" )
+>     , ( 0x320d, "hieuhparenkorean" )
+>     , ( 0x320e, "kiyeokaparenkorean" )
+>     , ( 0x320f, "nieunaparenkorean" )
+>     , ( 0x3210, "tikeutaparenkorean" )
+>     , ( 0x3211, "rieulaparenkorean" )
+>     , ( 0x3212, "mieumaparenkorean" )
+>     , ( 0x3213, "pieupaparenkorean" )
+>     , ( 0x3214, "siosaparenkorean" )
+>     , ( 0x3215, "ieungaparenkorean" )
+>     , ( 0x3216, "cieucaparenkorean" )
+>     , ( 0x3217, "chieuchaparenkorean" )
+>     , ( 0x3218, "khieukhaparenkorean" )
+>     , ( 0x3219, "thieuthaparenkorean" )
+>     , ( 0x321a, "phieuphaparenkorean" )
+>     , ( 0x321b, "hieuhaparenkorean" )
+>     , ( 0x321c, "cieucuparenkorean" )
+>     , ( 0x3220, "oneideographicparen" )
+>     , ( 0x3221, "twoideographicparen" )
+>     , ( 0x3222, "threeideographicparen" )
+>     , ( 0x3223, "fourideographicparen" )
+>     , ( 0x3224, "fiveideographicparen" )
+>     , ( 0x3225, "sixideographicparen" )
+>     , ( 0x3226, "sevenideographicparen" )
+>     , ( 0x3227, "eightideographicparen" )
+>     , ( 0x3228, "nineideographicparen" )
+>     , ( 0x3229, "tenideographicparen" )
+>     , ( 0x322a, "ideographicmoonparen" )
+>     , ( 0x322b, "ideographicfireparen" )
+>     , ( 0x322c, "ideographicwaterparen" )
+>     , ( 0x322d, "ideographicwoodparen" )
+>     , ( 0x322e, "ideographicmetalparen" )
+>     , ( 0x322f, "ideographicearthparen" )
+>     , ( 0x3230, "ideographicsunparen" )
+>     , ( 0x3231, "ideographicstockparen" )
+>     , ( 0x3232, "ideographichaveparen" )
+>     , ( 0x3233, "ideographicsocietyparen" )
+>     , ( 0x3234, "ideographicnameparen" )
+>     , ( 0x3235, "ideographicspecialparen" )
+>     , ( 0x3236, "ideographicfinancialparen" )
+>     , ( 0x3237, "ideographiccongratulationparen" )
+>     , ( 0x3238, "ideographiclaborparen" )
+>     , ( 0x3239, "ideographicrepresentparen" )
+>     , ( 0x323a, "ideographiccallparen" )
+>     , ( 0x323b, "ideographicstudyparen" )
+>     , ( 0x323c, "ideographicsuperviseparen" )
+>     , ( 0x323d, "ideographicenterpriseparen" )
+>     , ( 0x323e, "ideographicresourceparen" )
+>     , ( 0x323f, "ideographicallianceparen" )
+>     , ( 0x3240, "ideographicfestivalparen" )
+>     , ( 0x3242, "ideographicselfparen" )
+>     , ( 0x3243, "ideographicreachparen" )
+>     , ( 0x3260, "kiyeokcirclekorean" )
+>     , ( 0x3261, "nieuncirclekorean" )
+>     , ( 0x3262, "tikeutcirclekorean" )
+>     , ( 0x3263, "rieulcirclekorean" )
+>     , ( 0x3264, "mieumcirclekorean" )
+>     , ( 0x3265, "pieupcirclekorean" )
+>     , ( 0x3266, "sioscirclekorean" )
+>     , ( 0x3267, "ieungcirclekorean" )
+>     , ( 0x3268, "cieuccirclekorean" )
+>     , ( 0x3269, "chieuchcirclekorean" )
+>     , ( 0x326a, "khieukhcirclekorean" )
+>     , ( 0x326b, "thieuthcirclekorean" )
+>     , ( 0x326c, "phieuphcirclekorean" )
+>     , ( 0x326d, "hieuhcirclekorean" )
+>     , ( 0x326e, "kiyeokacirclekorean" )
+>     , ( 0x326f, "nieunacirclekorean" )
+>     , ( 0x3270, "tikeutacirclekorean" )
+>     , ( 0x3271, "rieulacirclekorean" )
+>     , ( 0x3272, "mieumacirclekorean" )
+>     , ( 0x3273, "pieupacirclekorean" )
+>     , ( 0x3274, "siosacirclekorean" )
+>     , ( 0x3275, "ieungacirclekorean" )
+>     , ( 0x3276, "cieucacirclekorean" )
+>     , ( 0x3277, "chieuchacirclekorean" )
+>     , ( 0x3278, "khieukhacirclekorean" )
+>     , ( 0x3279, "thieuthacirclekorean" )
+>     , ( 0x327a, "phieuphacirclekorean" )
+>     , ( 0x327b, "hieuhacirclekorean" )
+>     , ( 0x327f, "koreanstandardsymbol" )
+>     , ( 0x328a, "ideographmooncircle" )
+>     , ( 0x328b, "ideographfirecircle" )
+>     , ( 0x328c, "ideographwatercircle" )
+>     , ( 0x328d, "ideographwoodcircle" )
+>     , ( 0x328e, "ideographmetalcircle" )
+>     , ( 0x328f, "ideographearthcircle" )
+>     , ( 0x3290, "ideographsuncircle" )
+>     , ( 0x3294, "ideographnamecircle" )
+>     , ( 0x3296, "ideographicfinancialcircle" )
+>     , ( 0x3298, "ideographiclaborcircle" )
+>     , ( 0x3299, "ideographicsecretcircle" )
+>     , ( 0x329d, "ideographicexcellentcircle" )
+>     , ( 0x329e, "ideographicprintcircle" )
+>     , ( 0x32a3, "ideographiccorrectcircle" )
+>     , ( 0x32a4, "ideographichighcircle" )
+>     , ( 0x32a5, "ideographiccentrecircle" )
+>     , ( 0x32a6, "ideographiclowcircle" )
+>     , ( 0x32a7, "ideographicleftcircle" )
+>     , ( 0x32a8, "ideographicrightcircle" )
+>     , ( 0x32a9, "ideographicmedicinecircle" )
+>     , ( 0x3300, "apaatosquare" )
+>     , ( 0x3303, "aarusquare" )
+>     , ( 0x3305, "intisquare" )
+>     , ( 0x330d, "karoriisquare" )
+>     , ( 0x3314, "kirosquare" )
+>     , ( 0x3315, "kiroguramusquare" )
+>     , ( 0x3316, "kiromeetorusquare" )
+>     , ( 0x3318, "guramusquare" )
+>     , ( 0x331e, "kooposquare" )
+>     , ( 0x3322, "sentisquare" )
+>     , ( 0x3323, "sentosquare" )
+>     , ( 0x3326, "dorusquare" )
+>     , ( 0x3327, "tonsquare" )
+>     , ( 0x332a, "haitusquare" )
+>     , ( 0x332b, "paasentosquare" )
+>     , ( 0x3331, "birusquare" )
+>     , ( 0x3333, "huiitosquare" )
+>     , ( 0x3336, "hekutaarusquare" )
+>     , ( 0x3339, "herutusquare" )
+>     , ( 0x333b, "peezisquare" )
+>     , ( 0x3342, "hoonsquare" )
+>     , ( 0x3347, "mansyonsquare" )
+>     , ( 0x3349, "mirisquare" )
+>     , ( 0x334a, "miribaarusquare" )
+>     , ( 0x334d, "meetorusquare" )
+>     , ( 0x334e, "yaadosquare" )
+>     , ( 0x3351, "rittorusquare" )
+>     , ( 0x3357, "wattosquare" )
+>     , ( 0x337b, "heiseierasquare" )
+>     , ( 0x337c, "syouwaerasquare" )
+>     , ( 0x337d, "taisyouerasquare" )
+>     , ( 0x337e, "meizierasquare" )
+>     , ( 0x337f, "corporationsquare" )
+>     , ( 0x3380, "paampssquare" )
+>     , ( 0x3381, "nasquare" )
+>     , ( 0x3382, "muasquare" )
+>     , ( 0x3383, "masquare" )
+>     , ( 0x3384, "kasquare" )
+>     , ( 0x3385, "KBsquare" )
+>     , ( 0x3386, "MBsquare" )
+>     , ( 0x3387, "GBsquare" )
+>     , ( 0x3388, "calsquare" )
+>     , ( 0x3389, "kcalsquare" )
+>     , ( 0x338a, "pfsquare" )
+>     , ( 0x338b, "nfsquare" )
+>     , ( 0x338c, "mufsquare" )
+>     , ( 0x338d, "mugsquare" )
+>     , ( 0x338e, "squaremg" )
+>     , ( 0x338f, "squarekg" )
+>     , ( 0x3390, "Hzsquare" )
+>     , ( 0x3391, "khzsquare" )
+>     , ( 0x3392, "mhzsquare" )
+>     , ( 0x3393, "ghzsquare" )
+>     , ( 0x3394, "thzsquare" )
+>     , ( 0x3395, "mulsquare" )
+>     , ( 0x3396, "mlsquare" )
+>     , ( 0x3397, "dlsquare" )
+>     , ( 0x3398, "klsquare" )
+>     , ( 0x3399, "fmsquare" )
+>     , ( 0x339a, "nmsquare" )
+>     , ( 0x339b, "mumsquare" )
+>     , ( 0x339c, "squaremm" )
+>     , ( 0x339d, "squarecm" )
+>     , ( 0x339e, "squarekm" )
+>     , ( 0x339f, "mmsquaredsquare" )
+>     , ( 0x33a0, "cmsquaredsquare" )
+>     , ( 0x33a1, "squaremsquared" )
+>     , ( 0x33a2, "kmsquaredsquare" )
+>     , ( 0x33a3, "mmcubedsquare" )
+>     , ( 0x33a4, "cmcubedsquare" )
+>     , ( 0x33a5, "mcubedsquare" )
+>     , ( 0x33a6, "kmcubedsquare" )
+>     , ( 0x33a7, "moverssquare" )
+>     , ( 0x33a8, "moverssquaredsquare" )
+>     , ( 0x33a9, "pasquare" )
+>     , ( 0x33aa, "kpasquare" )
+>     , ( 0x33ab, "mpasquare" )
+>     , ( 0x33ac, "gpasquare" )
+>     , ( 0x33ad, "radsquare" )
+>     , ( 0x33ae, "radoverssquare" )
+>     , ( 0x33af, "radoverssquaredsquare" )
+>     , ( 0x33b0, "pssquare" )
+>     , ( 0x33b1, "nssquare" )
+>     , ( 0x33b2, "mussquare" )
+>     , ( 0x33b3, "mssquare" )
+>     , ( 0x33b4, "pvsquare" )
+>     , ( 0x33b5, "nvsquare" )
+>     , ( 0x33b6, "muvsquare" )
+>     , ( 0x33b7, "mvsquare" )
+>     , ( 0x33b8, "kvsquare" )
+>     , ( 0x33b9, "mvmegasquare" )
+>     , ( 0x33ba, "pwsquare" )
+>     , ( 0x33bb, "nwsquare" )
+>     , ( 0x33bc, "muwsquare" )
+>     , ( 0x33bd, "mwsquare" )
+>     , ( 0x33be, "kwsquare" )
+>     , ( 0x33bf, "mwmegasquare" )
+>     , ( 0x33c0, "kohmsquare" )
+>     , ( 0x33c1, "mohmsquare" )
+>     , ( 0x33c2, "amsquare" )
+>     , ( 0x33c3, "bqsquare" )
+>     , ( 0x33c4, "squarecc" )
+>     , ( 0x33c5, "cdsquare" )
+>     , ( 0x33c6, "coverkgsquare" )
+>     , ( 0x33c7, "cosquare" )
+>     , ( 0x33c8, "dbsquare" )
+>     , ( 0x33c9, "gysquare" )
+>     , ( 0x33ca, "hasquare" )
+>     , ( 0x33cb, "HPsquare" )
+>     , ( 0x33cd, "KKsquare" )
+>     , ( 0x33ce, "squarekmcapital" )
+>     , ( 0x33cf, "ktsquare" )
+>     , ( 0x33d0, "lmsquare" )
+>     , ( 0x33d1, "squareln" )
+>     , ( 0x33d2, "squarelog" )
+>     , ( 0x33d3, "lxsquare" )
+>     , ( 0x33d4, "mbsquare" )
+>     , ( 0x33d5, "squaremil" )
+>     , ( 0x33d6, "molsquare" )
+>     , ( 0x33d8, "pmsquare" )
+>     , ( 0x33db, "srsquare" )
+>     , ( 0x33dc, "svsquare" )
+>     , ( 0x33dd, "wbsquare" )
+>     , ( 0x5344, "twentyhangzhou" )
+>     , ( 0xf6be, "dotlessj" )
+>     , ( 0xf6bf, "LL" )
+>     , ( 0xf6c0, "ll" )
+>     , ( 0xf6c3, "commaaccent" )
+>     , ( 0xf6c4, "afii10063" )
+>     , ( 0xf6c5, "afii10064" )
+>     , ( 0xf6c6, "afii10192" )
+>     , ( 0xf6c7, "afii10831" )
+>     , ( 0xf6c8, "afii10832" )
+>     , ( 0xf6c9, "Acute" )
+>     , ( 0xf6ca, "Caron" )
+>     , ( 0xf6cb, "Dieresis" )
+>     , ( 0xf6cc, "DieresisAcute" )
+>     , ( 0xf6cd, "DieresisGrave" )
+>     , ( 0xf6ce, "Grave" )
+>     , ( 0xf6cf, "Hungarumlaut" )
+>     , ( 0xf6d0, "Macron" )
+>     , ( 0xf6d1, "cyrBreve" )
+>     , ( 0xf6d2, "cyrFlex" )
+>     , ( 0xf6d3, "dblGrave" )
+>     , ( 0xf6d4, "cyrbreve" )
+>     , ( 0xf6d5, "cyrflex" )
+>     , ( 0xf6d6, "dblgrave" )
+>     , ( 0xf6d7, "dieresisacute" )
+>     , ( 0xf6d8, "dieresisgrave" )
+>     , ( 0xf6d9, "copyrightserif" )
+>     , ( 0xf6da, "registerserif" )
+>     , ( 0xf6db, "trademarkserif" )
+>     , ( 0xf6dc, "onefitted" )
+>     , ( 0xf6dd, "rupiah" )
+>     , ( 0xf6de, "threequartersemdash" )
+>     , ( 0xf6df, "centinferior" )
+>     , ( 0xf6e0, "centsuperior" )
+>     , ( 0xf6e1, "commainferior" )
+>     , ( 0xf6e2, "commasuperior" )
+>     , ( 0xf6e3, "dollarinferior" )
+>     , ( 0xf6e4, "dollarsuperior" )
+>     , ( 0xf6e5, "hypheninferior" )
+>     , ( 0xf6e6, "hyphensuperior" )
+>     , ( 0xf6e7, "periodinferior" )
+>     , ( 0xf6e8, "periodsuperior" )
+>     , ( 0xf6e9, "asuperior" )
+>     , ( 0xf6ea, "bsuperior" )
+>     , ( 0xf6eb, "dsuperior" )
+>     , ( 0xf6ec, "esuperior" )
+>     , ( 0xf6ed, "isuperior" )
+>     , ( 0xf6ee, "lsuperior" )
+>     , ( 0xf6ef, "msuperior" )
+>     , ( 0xf6f0, "osuperior" )
+>     , ( 0xf6f1, "rsuperior" )
+>     , ( 0xf6f2, "ssuperior" )
+>     , ( 0xf6f3, "tsuperior" )
+>     , ( 0xf6f4, "Brevesmall" )
+>     , ( 0xf6f5, "Caronsmall" )
+>     , ( 0xf6f6, "Circumflexsmall" )
+>     , ( 0xf6f7, "Dotaccentsmall" )
+>     , ( 0xf6f8, "Hungarumlautsmall" )
+>     , ( 0xf6f9, "Lslashsmall" )
+>     , ( 0xf6fa, "OEsmall" )
+>     , ( 0xf6fb, "Ogoneksmall" )
+>     , ( 0xf6fc, "Ringsmall" )
+>     , ( 0xf6fd, "Scaronsmall" )
+>     , ( 0xf6fe, "Tildesmall" )
+>     , ( 0xf6ff, "Zcaronsmall" )
+>     , ( 0xf721, "exclamsmall" )
+>     , ( 0xf724, "dollaroldstyle" )
+>     , ( 0xf726, "ampersandsmall" )
+>     , ( 0xf730, "zerooldstyle" )
+>     , ( 0xf731, "oneoldstyle" )
+>     , ( 0xf732, "twooldstyle" )
+>     , ( 0xf733, "threeoldstyle" )
+>     , ( 0xf734, "fouroldstyle" )
+>     , ( 0xf735, "fiveoldstyle" )
+>     , ( 0xf736, "sixoldstyle" )
+>     , ( 0xf737, "sevenoldstyle" )
+>     , ( 0xf738, "eightoldstyle" )
+>     , ( 0xf739, "nineoldstyle" )
+>     , ( 0xf73f, "questionsmall" )
+>     , ( 0xf760, "Gravesmall" )
+>     , ( 0xf761, "Asmall" )
+>     , ( 0xf762, "Bsmall" )
+>     , ( 0xf763, "Csmall" )
+>     , ( 0xf764, "Dsmall" )
+>     , ( 0xf765, "Esmall" )
+>     , ( 0xf766, "Fsmall" )
+>     , ( 0xf767, "Gsmall" )
+>     , ( 0xf768, "Hsmall" )
+>     , ( 0xf769, "Ismall" )
+>     , ( 0xf76a, "Jsmall" )
+>     , ( 0xf76b, "Ksmall" )
+>     , ( 0xf76c, "Lsmall" )
+>     , ( 0xf76d, "Msmall" )
+>     , ( 0xf76e, "Nsmall" )
+>     , ( 0xf76f, "Osmall" )
+>     , ( 0xf770, "Psmall" )
+>     , ( 0xf771, "Qsmall" )
+>     , ( 0xf772, "Rsmall" )
+>     , ( 0xf773, "Ssmall" )
+>     , ( 0xf774, "Tsmall" )
+>     , ( 0xf775, "Usmall" )
+>     , ( 0xf776, "Vsmall" )
+>     , ( 0xf777, "Wsmall" )
+>     , ( 0xf778, "Xsmall" )
+>     , ( 0xf779, "Ysmall" )
+>     , ( 0xf77a, "Zsmall" )
+>     , ( 0xf7a1, "exclamdownsmall" )
+>     , ( 0xf7a2, "centoldstyle" )
+>     , ( 0xf7a8, "Dieresissmall" )
+>     , ( 0xf7af, "Macronsmall" )
+>     , ( 0xf7b4, "Acutesmall" )
+>     , ( 0xf7b8, "Cedillasmall" )
+>     , ( 0xf7bf, "questiondownsmall" )
+>     , ( 0xf7e0, "Agravesmall" )
+>     , ( 0xf7e1, "Aacutesmall" )
+>     , ( 0xf7e2, "Acircumflexsmall" )
+>     , ( 0xf7e3, "Atildesmall" )
+>     , ( 0xf7e4, "Adieresissmall" )
+>     , ( 0xf7e5, "Aringsmall" )
+>     , ( 0xf7e6, "AEsmall" )
+>     , ( 0xf7e7, "Ccedillasmall" )
+>     , ( 0xf7e8, "Egravesmall" )
+>     , ( 0xf7e9, "Eacutesmall" )
+>     , ( 0xf7ea, "Ecircumflexsmall" )
+>     , ( 0xf7eb, "Edieresissmall" )
+>     , ( 0xf7ec, "Igravesmall" )
+>     , ( 0xf7ed, "Iacutesmall" )
+>     , ( 0xf7ee, "Icircumflexsmall" )
+>     , ( 0xf7ef, "Idieresissmall" )
+>     , ( 0xf7f0, "Ethsmall" )
+>     , ( 0xf7f1, "Ntildesmall" )
+>     , ( 0xf7f2, "Ogravesmall" )
+>     , ( 0xf7f3, "Oacutesmall" )
+>     , ( 0xf7f4, "Ocircumflexsmall" )
+>     , ( 0xf7f5, "Otildesmall" )
+>     , ( 0xf7f6, "Odieresissmall" )
+>     , ( 0xf7f8, "Oslashsmall" )
+>     , ( 0xf7f9, "Ugravesmall" )
+>     , ( 0xf7fa, "Uacutesmall" )
+>     , ( 0xf7fb, "Ucircumflexsmall" )
+>     , ( 0xf7fc, "Udieresissmall" )
+>     , ( 0xf7fd, "Yacutesmall" )
+>     , ( 0xf7fe, "Thornsmall" )
+>     , ( 0xf7ff, "Ydieresissmall" )
+>     , ( 0xf884, "maihanakatleftthai" )
+>     , ( 0xf885, "saraileftthai" )
+>     , ( 0xf886, "saraiileftthai" )
+>     , ( 0xf887, "saraueleftthai" )
+>     , ( 0xf888, "saraueeleftthai" )
+>     , ( 0xf889, "maitaikhuleftthai" )
+>     , ( 0xf88a, "maiekupperleftthai" )
+>     , ( 0xf88b, "maieklowrightthai" )
+>     , ( 0xf88c, "maieklowleftthai" )
+>     , ( 0xf88d, "maithoupperleftthai" )
+>     , ( 0xf88e, "maitholowrightthai" )
+>     , ( 0xf88f, "maitholowleftthai" )
+>     , ( 0xf890, "maitriupperleftthai" )
+>     , ( 0xf891, "maitrilowrightthai" )
+>     , ( 0xf892, "maitrilowleftthai" )
+>     , ( 0xf893, "maichattawaupperleftthai" )
+>     , ( 0xf894, "maichattawalowrightthai" )
+>     , ( 0xf895, "maichattawalowleftthai" )
+>     , ( 0xf896, "thanthakhatupperleftthai" )
+>     , ( 0xf897, "thanthakhatlowrightthai" )
+>     , ( 0xf898, "thanthakhatlowleftthai" )
+>     , ( 0xf899, "nikhahitleftthai" )
+>     , ( 0xf8e5, "radicalex" )
+>     , ( 0xf8e6, "arrowvertex" )
+>     , ( 0xf8e7, "arrowhorizex" )
+>     , ( 0xf8e8, "registersans" )
+>     , ( 0xf8e9, "copyrightsans" )
+>     , ( 0xf8ea, "trademarksans" )
+>     , ( 0xf8eb, "parenlefttp" )
+>     , ( 0xf8ec, "parenleftex" )
+>     , ( 0xf8ed, "parenleftbt" )
+>     , ( 0xf8ee, "bracketlefttp" )
+>     , ( 0xf8ef, "bracketleftex" )
+>     , ( 0xf8f0, "bracketleftbt" )
+>     , ( 0xf8f1, "bracelefttp" )
+>     , ( 0xf8f2, "braceleftmid" )
+>     , ( 0xf8f3, "braceleftbt" )
+>     , ( 0xf8f4, "braceex" )
+>     , ( 0xf8f5, "integralex" )
+>     , ( 0xf8f6, "parenrighttp" )
+>     , ( 0xf8f7, "parenrightex" )
+>     , ( 0xf8f8, "parenrightbt" )
+>     , ( 0xf8f9, "bracketrighttp" )
+>     , ( 0xf8fa, "bracketrightex" )
+>     , ( 0xf8fb, "bracketrightbt" )
+>     , ( 0xf8fc, "bracerighttp" )
+>     , ( 0xf8fd, "bracerightmid" )
+>     , ( 0xf8fe, "bracerightbt" )
+>     , ( 0xf8ff, "apple" )
+>     , ( 0xfb00, "ff" )
+>     , ( 0xfb01, "fi" )
+>     , ( 0xfb02, "fl" )
+>     , ( 0xfb03, "ffi" )
+>     , ( 0xfb04, "ffl" )
+>     , ( 0xfb1f, "afii57705" )
+>     , ( 0xfb20, "ayinaltonehebrew" )
+>     , ( 0xfb2a, "afii57694" )
+>     , ( 0xfb2b, "afii57695" )
+>     , ( 0xfb2c, "shindageshshindot" )
+>     , ( 0xfb2d, "shindageshsindot" )
+>     , ( 0xfb2e, "alefpatahhebrew" )
+>     , ( 0xfb2f, "alefqamatshebrew" )
+>     , ( 0xfb30, "alefdageshhebrew" )
+>     , ( 0xfb31, "betdagesh" )
+>     , ( 0xfb32, "gimeldagesh" )
+>     , ( 0xfb33, "daletdagesh" )
+>     , ( 0xfb34, "hedagesh" )
+>     , ( 0xfb35, "afii57723" )
+>     , ( 0xfb36, "zayindagesh" )
+>     , ( 0xfb38, "tetdagesh" )
+>     , ( 0xfb39, "yoddagesh" )
+>     , ( 0xfb3a, "finalkafdagesh" )
+>     , ( 0xfb3b, "kafdagesh" )
+>     , ( 0xfb3c, "lameddagesh" )
+>     , ( 0xfb3e, "memdagesh" )
+>     , ( 0xfb40, "nundagesh" )
+>     , ( 0xfb41, "samekhdagesh" )
+>     , ( 0xfb43, "pefinaldageshhebrew" )
+>     , ( 0xfb44, "pedagesh" )
+>     , ( 0xfb46, "tsadidagesh" )
+>     , ( 0xfb47, "qofdagesh" )
+>     , ( 0xfb48, "reshdageshhebrew" )
+>     , ( 0xfb49, "shindagesh" )
+>     , ( 0xfb4a, "tavdages" )
+>     , ( 0xfb4b, "afii57700" )
+>     , ( 0xfb4c, "betrafehebrew" )
+>     , ( 0xfb4d, "kafrafehebrew" )
+>     , ( 0xfb4e, "perafehebrew" )
+>     , ( 0xfb4f, "aleflamedhebrew" )
+>     , ( 0xfb57, "pehfinalarabic" )
+>     , ( 0xfb58, "pehinitialarabic" )
+>     , ( 0xfb59, "pehmedialarabic" )
+>     , ( 0xfb67, "ttehfinalarabic" )
+>     , ( 0xfb68, "ttehinitialarabic" )
+>     , ( 0xfb69, "ttehmedialarabic" )
+>     , ( 0xfb6b, "vehfinalarabic" )
+>     , ( 0xfb6c, "vehinitialarabic" )
+>     , ( 0xfb6d, "vehmedialarabic" )
+>     , ( 0xfb7b, "tchehfinalarabic" )
+>     , ( 0xfb7c, "tchehinitialarabic" )
+>     , ( 0xfb7d, "tchehmedialarabic" )
+>     , ( 0xfb89, "ddalfinalarabic" )
+>     , ( 0xfb8b, "jehfinalarabic" )
+>     , ( 0xfb8d, "rrehfinalarabic" )
+>     , ( 0xfb93, "gaffinalarabic" )
+>     , ( 0xfb94, "gafinitialarabic" )
+>     , ( 0xfb95, "gafmedialarabic" )
+>     , ( 0xfb9f, "noonghunnafinalarabic" )
+>     , ( 0xfba4, "hehhamzaaboveisolatedarabic" )
+>     , ( 0xfba5, "hehhamzaabovefinalarabic" )
+>     , ( 0xfba7, "hehfinalaltonearabic" )
+>     , ( 0xfba8, "hehinitialaltonearabic" )
+>     , ( 0xfba9, "hehmedialaltonearabic" )
+>     , ( 0xfbaf, "yehbarreefinalarabic" )
+>     , ( 0xfc08, "behmeemisolatedarabic" )
+>     , ( 0xfc0b, "tehjeemisolatedarabic" )
+>     , ( 0xfc0c, "tehhahisolatedarabic" )
+>     , ( 0xfc0e, "tehmeemisolatedarabic" )
+>     , ( 0xfc48, "meemmeemisolatedarabic" )
+>     , ( 0xfc4b, "noonjeemisolatedarabic" )
+>     , ( 0xfc4e, "noonmeemisolatedarabic" )
+>     , ( 0xfc58, "yehmeemisolatedarabic" )
+>     , ( 0xfc5e, "shaddadammatanarabic" )
+>     , ( 0xfc5f, "shaddakasratanarabic" )
+>     , ( 0xfc60, "shaddafathaarabic" )
+>     , ( 0xfc61, "shaddadammaarabic" )
+>     , ( 0xfc62, "shaddakasraarabic" )
+>     , ( 0xfc6d, "behnoonfinalarabic" )
+>     , ( 0xfc73, "tehnoonfinalarabic" )
+>     , ( 0xfc8d, "noonnoonfinalarabic" )
+>     , ( 0xfc94, "yehnoonfinalarabic" )
+>     , ( 0xfc9f, "behmeeminitialarabic" )
+>     , ( 0xfca1, "tehjeeminitialarabic" )
+>     , ( 0xfca2, "tehhahinitialarabic" )
+>     , ( 0xfca4, "tehmeeminitialarabic" )
+>     , ( 0xfcc9, "lamjeeminitialarabic" )
+>     , ( 0xfcca, "lamhahinitialarabic" )
+>     , ( 0xfccb, "lamkhahinitialarabic" )
+>     , ( 0xfccc, "lammeeminitialarabic" )
+>     , ( 0xfcd1, "meemmeeminitialarabic" )
+>     , ( 0xfcd2, "noonjeeminitialarabic" )
+>     , ( 0xfcd5, "noonmeeminitialarabic" )
+>     , ( 0xfcdd, "yehmeeminitialarabic" )
+>     , ( 0xfd3e, "parenleftaltonearabic" )
+>     , ( 0xfd3f, "parenrightaltonearabic" )
+>     , ( 0xfd88, "lammeemhahinitialarabic" )
+>     , ( 0xfdf2, "lamlamhehisolatedarabic" )
+>     , ( 0xfdfa, "sallallahoualayhewasallamarabic" )
+>     , ( 0xfe30, "twodotleadervertical" )
+>     , ( 0xfe31, "emdashvertical" )
+>     , ( 0xfe32, "endashvertical" )
+>     , ( 0xfe33, "underscorevertical" )
+>     , ( 0xfe34, "wavyunderscorevertical" )
+>     , ( 0xfe35, "parenleftvertical" )
+>     , ( 0xfe36, "parenrightvertical" )
+>     , ( 0xfe37, "braceleftvertical" )
+>     , ( 0xfe38, "bracerightvertical" )
+>     , ( 0xfe39, "tortoiseshellbracketleftvertical" )
+>     , ( 0xfe3a, "tortoiseshellbracketrightvertical" )
+>     , ( 0xfe3b, "blacklenticularbracketleftvertical" )
+>     , ( 0xfe3c, "blacklenticularbracketrightvertical" )
+>     , ( 0xfe3d, "dblanglebracketleftvertical" )
+>     , ( 0xfe3e, "dblanglebracketrightvertical" )
+>     , ( 0xfe3f, "anglebracketleftvertical" )
+>     , ( 0xfe40, "anglebracketrightvertical" )
+>     , ( 0xfe41, "cornerbracketleftvertical" )
+>     , ( 0xfe42, "cornerbracketrightvertical" )
+>     , ( 0xfe43, "whitecornerbracketleftvertical" )
+>     , ( 0xfe44, "whitecornerbracketrightvertical" )
+>     , ( 0xfe49, "overlinedashed" )
+>     , ( 0xfe4a, "overlinecenterline" )
+>     , ( 0xfe4b, "overlinewavy" )
+>     , ( 0xfe4c, "overlinedblwavy" )
+>     , ( 0xfe4d, "lowlinedashed" )
+>     , ( 0xfe4e, "lowlinecenterline" )
+>     , ( 0xfe4f, "underscorewavy" )
+>     , ( 0xfe50, "commasmall" )
+>     , ( 0xfe52, "periodsmall" )
+>     , ( 0xfe54, "semicolonsmall" )
+>     , ( 0xfe55, "colonsmall" )
+>     , ( 0xfe59, "parenleftsmall" )
+>     , ( 0xfe5a, "parenrightsmall" )
+>     , ( 0xfe5b, "braceleftsmall" )
+>     , ( 0xfe5c, "bracerightsmall" )
+>     , ( 0xfe5d, "tortoiseshellbracketleftsmall" )
+>     , ( 0xfe5e, "tortoiseshellbracketrightsmall" )
+>     , ( 0xfe5f, "numbersignsmall" )
+>     , ( 0xfe61, "asterisksmall" )
+>     , ( 0xfe62, "plussmall" )
+>     , ( 0xfe63, "hyphensmall" )
+>     , ( 0xfe64, "lesssmall" )
+>     , ( 0xfe65, "greatersmall" )
+>     , ( 0xfe66, "equalsmall" )
+>     , ( 0xfe69, "dollarsmall" )
+>     , ( 0xfe6a, "percentsmall" )
+>     , ( 0xfe6b, "atsmall" )
+>     , ( 0xfe82, "alefmaddaabovefinalarabic" )
+>     , ( 0xfe84, "alefhamzaabovefinalarabic" )
+>     , ( 0xfe86, "wawhamzaabovefinalarabic" )
+>     , ( 0xfe88, "alefhamzabelowfinalarabic" )
+>     , ( 0xfe8a, "yehhamzaabovefinalarabic" )
+>     , ( 0xfe8b, "yehhamzaaboveinitialarabic" )
+>     , ( 0xfe8c, "yehhamzaabovemedialarabic" )
+>     , ( 0xfe8e, "aleffinalarabic" )
+>     , ( 0xfe90, "behfinalarabic" )
+>     , ( 0xfe91, "behinitialarabic" )
+>     , ( 0xfe92, "behmedialarabic" )
+>     , ( 0xfe94, "tehmarbutafinalarabic" )
+>     , ( 0xfe96, "tehfinalarabic" )
+>     , ( 0xfe97, "tehinitialarabic" )
+>     , ( 0xfe98, "tehmedialarabic" )
+>     , ( 0xfe9a, "thehfinalarabic" )
+>     , ( 0xfe9b, "thehinitialarabic" )
+>     , ( 0xfe9c, "thehmedialarabic" )
+>     , ( 0xfe9e, "jeemfinalarabic" )
+>     , ( 0xfe9f, "jeeminitialarabic" )
+>     , ( 0xfea0, "jeemmedialarabic" )
+>     , ( 0xfea2, "hahfinalarabic" )
+>     , ( 0xfea3, "hahinitialarabic" )
+>     , ( 0xfea4, "hahmedialarabic" )
+>     , ( 0xfea6, "khahfinalarabic" )
+>     , ( 0xfea7, "khahinitialarabic" )
+>     , ( 0xfea8, "khahmedialarabic" )
+>     , ( 0xfeaa, "dalfinalarabic" )
+>     , ( 0xfeac, "thalfinalarabic" )
+>     , ( 0xfeae, "rehfinalarabic" )
+>     , ( 0xfeb0, "zainfinalarabic" )
+>     , ( 0xfeb2, "seenfinalarabic" )
+>     , ( 0xfeb3, "seeninitialarabic" )
+>     , ( 0xfeb4, "seenmedialarabic" )
+>     , ( 0xfeb6, "sheenfinalarabic" )
+>     , ( 0xfeb7, "sheeninitialarabic" )
+>     , ( 0xfeb8, "sheenmedialarabic" )
+>     , ( 0xfeba, "sadfinalarabic" )
+>     , ( 0xfebb, "sadinitialarabic" )
+>     , ( 0xfebc, "sadmedialarabic" )
+>     , ( 0xfebe, "dadfinalarabic" )
+>     , ( 0xfebf, "dadinitialarabic" )
+>     , ( 0xfec0, "dadmedialarabic" )
+>     , ( 0xfec2, "tahfinalarabic" )
+>     , ( 0xfec3, "tahinitialarabic" )
+>     , ( 0xfec4, "tahmedialarabic" )
+>     , ( 0xfec6, "zahfinalarabic" )
+>     , ( 0xfec7, "zahinitialarabic" )
+>     , ( 0xfec8, "zahmedialarabic" )
+>     , ( 0xfeca, "ainfinalarabic" )
+>     , ( 0xfecb, "aininitialarabic" )
+>     , ( 0xfecc, "ainmedialarabic" )
+>     , ( 0xfece, "ghainfinalarabic" )
+>     , ( 0xfecf, "ghaininitialarabic" )
+>     , ( 0xfed0, "ghainmedialarabic" )
+>     , ( 0xfed2, "fehfinalarabic" )
+>     , ( 0xfed3, "fehinitialarabic" )
+>     , ( 0xfed4, "fehmedialarabic" )
+>     , ( 0xfed6, "qaffinalarabic" )
+>     , ( 0xfed7, "qafinitialarabic" )
+>     , ( 0xfed8, "qafmedialarabic" )
+>     , ( 0xfeda, "kaffinalarabic" )
+>     , ( 0xfedb, "kafinitialarabic" )
+>     , ( 0xfedc, "kafmedialarabic" )
+>     , ( 0xfede, "lamfinalarabic" )
+>     , ( 0xfedf, "laminitialarabic" )
+>     , ( 0xfee0, "lammedialarabic" )
+>     , ( 0xfee2, "meemfinalarabic" )
+>     , ( 0xfee3, "meeminitialarabic" )
+>     , ( 0xfee4, "lammeemjeeminitialarabic" )
+>     , ( 0xfee6, "noonfinalarabic" )
+>     , ( 0xfee7, "noonhehinitialarabic" )
+>     , ( 0xfee8, "noonmedialarabic" )
+>     , ( 0xfeea, "hehfinalalttwoarabic" )
+>     , ( 0xfeeb, "hehinitialarabic" )
+>     , ( 0xfeec, "hehmedialarabic" )
+>     , ( 0xfeee, "wawfinalarabic" )
+>     , ( 0xfef0, "alefmaksurafinalarabic" )
+>     , ( 0xfef2, "yehfinalarabic" )
+>     , ( 0xfef3, "alefmaksurainitialarabic" )
+>     , ( 0xfef4, "alefmaksuramedialarabic" )
+>     , ( 0xfef5, "lamalefmaddaaboveisolatedarabic" )
+>     , ( 0xfef6, "lamalefmaddaabovefinalarabic" )
+>     , ( 0xfef7, "lamalefhamzaaboveisolatedarabic" )
+>     , ( 0xfef8, "lamalefhamzaabovefinalarabic" )
+>     , ( 0xfef9, "lamalefhamzabelowisolatedarabic" )
+>     , ( 0xfefa, "lamalefhamzabelowfinalarabic" )
+>     , ( 0xfefb, "lamalefisolatedarabic" )
+>     , ( 0xfefc, "lamaleffinalarabic" )
+>     , ( 0xfeff, "zerowidthjoiner" )
+>     , ( 0xff01, "exclammonospace" )
+>     , ( 0xff02, "quotedblmonospace" )
+>     , ( 0xff03, "numbersignmonospace" )
+>     , ( 0xff04, "dollarmonospace" )
+>     , ( 0xff05, "percentmonospace" )
+>     , ( 0xff06, "ampersandmonospace" )
+>     , ( 0xff07, "quotesinglemonospace" )
+>     , ( 0xff08, "parenleftmonospace" )
+>     , ( 0xff09, "parenrightmonospace" )
+>     , ( 0xff0a, "asteriskmonospace" )
+>     , ( 0xff0b, "plusmonospace" )
+>     , ( 0xff0c, "commamonospace" )
+>     , ( 0xff0d, "hyphenmonospace" )
+>     , ( 0xff0e, "periodmonospace" )
+>     , ( 0xff0f, "slashmonospace" )
+>     , ( 0xff10, "zeromonospace" )
+>     , ( 0xff11, "onemonospace" )
+>     , ( 0xff12, "twomonospace" )
+>     , ( 0xff13, "threemonospace" )
+>     , ( 0xff14, "fourmonospace" )
+>     , ( 0xff15, "fivemonospace" )
+>     , ( 0xff16, "sixmonospace" )
+>     , ( 0xff17, "sevenmonospace" )
+>     , ( 0xff18, "eightmonospace" )
+>     , ( 0xff19, "ninemonospace" )
+>     , ( 0xff1a, "colonmonospace" )
+>     , ( 0xff1b, "semicolonmonospace" )
+>     , ( 0xff1c, "lessmonospace" )
+>     , ( 0xff1d, "equalmonospace" )
+>     , ( 0xff1e, "greatermonospace" )
+>     , ( 0xff1f, "questionmonospace" )
+>     , ( 0xff20, "atmonospace" )
+>     , ( 0xff21, "Amonospace" )
+>     , ( 0xff22, "Bmonospace" )
+>     , ( 0xff23, "Cmonospace" )
+>     , ( 0xff24, "Dmonospace" )
+>     , ( 0xff25, "Emonospace" )
+>     , ( 0xff26, "Fmonospace" )
+>     , ( 0xff27, "Gmonospace" )
+>     , ( 0xff28, "Hmonospace" )
+>     , ( 0xff29, "Imonospace" )
+>     , ( 0xff2a, "Jmonospace" )
+>     , ( 0xff2b, "Kmonospace" )
+>     , ( 0xff2c, "Lmonospace" )
+>     , ( 0xff2d, "Mmonospace" )
+>     , ( 0xff2e, "Nmonospace" )
+>     , ( 0xff2f, "Omonospace" )
+>     , ( 0xff30, "Pmonospace" )
+>     , ( 0xff31, "Qmonospace" )
+>     , ( 0xff32, "Rmonospace" )
+>     , ( 0xff33, "Smonospace" )
+>     , ( 0xff34, "Tmonospace" )
+>     , ( 0xff35, "Umonospace" )
+>     , ( 0xff36, "Vmonospace" )
+>     , ( 0xff37, "Wmonospace" )
+>     , ( 0xff38, "Xmonospace" )
+>     , ( 0xff39, "Ymonospace" )
+>     , ( 0xff3a, "Zmonospace" )
+>     , ( 0xff3b, "bracketleftmonospace" )
+>     , ( 0xff3c, "backslashmonospace" )
+>     , ( 0xff3d, "bracketrightmonospace" )
+>     , ( 0xff3e, "asciicircummonospace" )
+>     , ( 0xff3f, "underscoremonospace" )
+>     , ( 0xff40, "gravemonospace" )
+>     , ( 0xff41, "amonospace" )
+>     , ( 0xff42, "bmonospace" )
+>     , ( 0xff43, "cmonospace" )
+>     , ( 0xff44, "dmonospace" )
+>     , ( 0xff45, "emonospace" )
+>     , ( 0xff46, "fmonospace" )
+>     , ( 0xff47, "gmonospace" )
+>     , ( 0xff48, "hmonospace" )
+>     , ( 0xff49, "imonospace" )
+>     , ( 0xff4a, "jmonospace" )
+>     , ( 0xff4b, "kmonospace" )
+>     , ( 0xff4c, "lmonospace" )
+>     , ( 0xff4d, "mmonospace" )
+>     , ( 0xff4e, "nmonospace" )
+>     , ( 0xff4f, "omonospace" )
+>     , ( 0xff50, "pmonospace" )
+>     , ( 0xff51, "qmonospace" )
+>     , ( 0xff52, "rmonospace" )
+>     , ( 0xff53, "smonospace" )
+>     , ( 0xff54, "tmonospace" )
+>     , ( 0xff55, "umonospace" )
+>     , ( 0xff56, "vmonospace" )
+>     , ( 0xff57, "wmonospace" )
+>     , ( 0xff58, "xmonospace" )
+>     , ( 0xff59, "ymonospace" )
+>     , ( 0xff5a, "zmonospace" )
+>     , ( 0xff5b, "braceleftmonospace" )
+>     , ( 0xff5c, "barmonospace" )
+>     , ( 0xff5d, "bracerightmonospace" )
+>     , ( 0xff5e, "asciitildemonospace" )
+>     , ( 0xff61, "periodhalfwidth" )
+>     , ( 0xff62, "cornerbracketlefthalfwidth" )
+>     , ( 0xff63, "cornerbracketrighthalfwidth" )
+>     , ( 0xff64, "ideographiccommaleft" )
+>     , ( 0xff65, "middledotkatakanahalfwidth" )
+>     , ( 0xff66, "wokatakanahalfwidth" )
+>     , ( 0xff67, "asmallkatakanahalfwidth" )
+>     , ( 0xff68, "ismallkatakanahalfwidth" )
+>     , ( 0xff69, "usmallkatakanahalfwidth" )
+>     , ( 0xff6a, "esmallkatakanahalfwidth" )
+>     , ( 0xff6b, "osmallkatakanahalfwidth" )
+>     , ( 0xff6c, "yasmallkatakanahalfwidth" )
+>     , ( 0xff6d, "yusmallkatakanahalfwidth" )
+>     , ( 0xff6e, "yosmallkatakanahalfwidth" )
+>     , ( 0xff6f, "tusmallkatakanahalfwidth" )
+>     , ( 0xff70, "katahiraprolongmarkhalfwidth" )
+>     , ( 0xff71, "akatakanahalfwidth" )
+>     , ( 0xff72, "ikatakanahalfwidth" )
+>     , ( 0xff73, "ukatakanahalfwidth" )
+>     , ( 0xff74, "ekatakanahalfwidth" )
+>     , ( 0xff75, "okatakanahalfwidth" )
+>     , ( 0xff76, "kakatakanahalfwidth" )
+>     , ( 0xff77, "kikatakanahalfwidth" )
+>     , ( 0xff78, "kukatakanahalfwidth" )
+>     , ( 0xff79, "kekatakanahalfwidth" )
+>     , ( 0xff7a, "kokatakanahalfwidth" )
+>     , ( 0xff7b, "sakatakanahalfwidth" )
+>     , ( 0xff7c, "sikatakanahalfwidth" )
+>     , ( 0xff7d, "sukatakanahalfwidth" )
+>     , ( 0xff7e, "sekatakanahalfwidth" )
+>     , ( 0xff7f, "sokatakanahalfwidth" )
+>     , ( 0xff80, "takatakanahalfwidth" )
+>     , ( 0xff81, "tikatakanahalfwidth" )
+>     , ( 0xff82, "tukatakanahalfwidth" )
+>     , ( 0xff83, "tekatakanahalfwidth" )
+>     , ( 0xff84, "tokatakanahalfwidth" )
+>     , ( 0xff85, "nakatakanahalfwidth" )
+>     , ( 0xff86, "nikatakanahalfwidth" )
+>     , ( 0xff87, "nukatakanahalfwidth" )
+>     , ( 0xff88, "nekatakanahalfwidth" )
+>     , ( 0xff89, "nokatakanahalfwidth" )
+>     , ( 0xff8a, "hakatakanahalfwidth" )
+>     , ( 0xff8b, "hikatakanahalfwidth" )
+>     , ( 0xff8c, "hukatakanahalfwidth" )
+>     , ( 0xff8d, "hekatakanahalfwidth" )
+>     , ( 0xff8e, "hokatakanahalfwidth" )
+>     , ( 0xff8f, "makatakanahalfwidth" )
+>     , ( 0xff90, "mikatakanahalfwidth" )
+>     , ( 0xff91, "mukatakanahalfwidth" )
+>     , ( 0xff92, "mekatakanahalfwidth" )
+>     , ( 0xff93, "mokatakanahalfwidth" )
+>     , ( 0xff94, "yakatakanahalfwidth" )
+>     , ( 0xff95, "yukatakanahalfwidth" )
+>     , ( 0xff96, "yokatakanahalfwidth" )
+>     , ( 0xff97, "rakatakanahalfwidth" )
+>     , ( 0xff98, "rikatakanahalfwidth" )
+>     , ( 0xff99, "rukatakanahalfwidth" )
+>     , ( 0xff9a, "rekatakanahalfwidth" )
+>     , ( 0xff9b, "rokatakanahalfwidth" )
+>     , ( 0xff9c, "wakatakanahalfwidth" )
+>     , ( 0xff9d, "nkatakanahalfwidth" )
+>     , ( 0xff9e, "voicedmarkkanahalfwidth" )
+>     , ( 0xff9f, "semivoicedmarkkanahalfwidth" )
+>     , ( 0xffe0, "centmonospace" )
+>     , ( 0xffe1, "sterlingmonospace" )
+>     , ( 0xffe3, "macronmonospace" )
+>     , ( 0xffe5, "yenmonospace" )
+>     , ( 0xffe6, "wonmonospace" )
+>     ]
− src/Wumpus/Core/Text/Latin1.hs
@@ -1,257 +0,0 @@-{-# OPTIONS -Wall #-}------------------------------------------------------------------------------------- |--- Module      :  Wumpus.Core.Text.Latin1--- Copyright   :  (c) Stephen Tetley 2009-2010--- License     :  BSD3------ Maintainer  :  stephen.tetley@gmail.com--- Stability   :  unstable--- Portability :  GHC------ A @TextEncoder@ record instance for Latin1 characters.--- -----------------------------------------------------------------------------------module Wumpus.Core.Text.Latin1-  ( -  -    latin1_font_encoder-  , latin1FontEncoder-  , latin1FontAll--  ) where--import Wumpus.Core.Text.Encoder--import qualified Data.Map as Map----- | Latin1 Font Encoder name ---  --- (Number 0) ----latin1_font_encoder :: FontEncoderName-latin1_font_encoder = FontEncoderName 0---- | Latin1 FontEncoder instance.-latin1FontEncoder :: FontEncoder-latin1FontEncoder = FontEncoder -    { ps_lookup         = Map.lookup `flip` codeToName-    , svg_lookup        = Map.lookup `flip` nameToCode-    , ps_fallback       = "space"-    , svg_fallback      = 0o040-    }--nameToCode :: Map.Map GlyphName CharCode-nameToCode = Map.fromList latin1FontAll--codeToName :: Map.Map CharCode GlyphName-codeToName = foldr fn Map.empty latin1FontAll where-  fn (s,i) a = Map.insert i s a ---- | A lookup list of Latin 1 names to their octal code.-latin1FontAll :: [(GlyphName, CharCode)]-latin1FontAll = -    [ ("A",                     0o101)-    , ("AE",                    0o306)-    , ("Aacute",                0o301)-    , ("Acircumflex",           0o302)-    , ("Adieresis",             0o304)-    , ("Agrave",                0o300)-    , ("Aring",                 0o305)-    , ("Atilde",                0o303)-    , ("B",                     0o102)-    , ("C",                     0o103)-    , ("Ccedilla",              0o307)-    , ("D",                     0o104)-    , ("E",                     0o105)-    , ("Eacute",                0o311)-    , ("Ecircumflex",           0o312)-    , ("Edieresis",             0o313)-    , ("Egrave",                0o310)-    , ("Eth",                   0o320)-    , ("F",                     0o106)-    , ("G",                     0o107)-    , ("H",                     0o110)-    , ("I",                     0o111)-    , ("Iacute",                0o315)-    , ("Icircumflex",           0o316)-    , ("Idieresis",             0o317)-    , ("Igrave",                0o314)-    , ("J",                     0o112)-    , ("K",                     0o113)-    , ("L",                     0o114)-    , ("M",                     0o115)-    , ("N",                     0o116)-    , ("Ntilde",                0o321)-    , ("O",                     0o117)-    , ("Oacute",                0o323)-    , ("Ocircumflex",           0o324)-    , ("Odieresis",             0o326)-    , ("Ograve",                0o322)-    , ("Oslash",                0o351)-    , ("Otilde",                0o325)-    , ("P",                     0o120)-    , ("Q",                     0o121)-    , ("R",                     0o122)-    , ("S",                     0o123)-    , ("T",                     0o124)-    , ("Thorn",                 0o336)-    , ("U",                     0o125)-    , ("Uacute",                0o332)-    , ("Ucircumflex",           0o333)-    , ("Udieresis",             0o334)-    , ("Ugrave",                0o331)-    , ("V",                     0o126)-    , ("W",                     0o127)-    , ("X",                     0o130)-    , ("Y",                     0o131)-    , ("Yacute",                0o335)-    , ("Z",                     0o132)-    , ("a",                     0o141)-    , ("aacute",                0o341)-    , ("acircumflex",           0o342)-    , ("acute2",                0o264)-    , ("adieresis",             0o344)-    , ("ae",                    0o346)-    , ("agrave",                0o340)-    , ("ampersand",             0o046)-    , ("aring",                 0o345)-    , ("asciicircum",           0o136)-    , ("asciitilde",            0o176)-    , ("asterisk",              0o052)-    , ("at",                    0o100)-    , ("atilde",                0o343)-    , ("b",                     0o142)-    , ("backslash",             0o134)-    , ("bar",                   0o174)-    , ("braceleft",             0o173)-    , ("braceright",            0o175)-    , ("bracketleft",           0o133)-    , ("bracketright",          0o135)-    , ("breve",                 0o226)-    , ("brokenbar",             0o246)-    , ("c",                     0o143)-    , ("caron",                 0o237)-    , ("ccedilla",              0o347)-    , ("cedilla",               0o270)-    , ("cent",                  0o242)-    , ("circumflex",            0o223)-    , ("colon",                 0o072)-    , ("comma",                 0o054)-    , ("copyright",             0o251)-    , ("currency",              0o244)-    , ("d",                     0o144)-    , ("degree",                0o260)-    , ("dieresis",              0o250)-    , ("divide",                0o367)-    , ("dollar",                0o044)-    , ("dotaccent",             0o227)-    , ("dotlessi",              0o220)-    , ("e",                     0o145)-    , ("eacute",                0o351)-    , ("ecircumflex",           0o352)-    , ("edieresis",             0o353)-    , ("egrave",                0o350)-    , ("eight",                 0o070)-    , ("equal",                 0o075)-    , ("eth",                   0o360)-    , ("exclam",                0o041)-    , ("exclamdown",            0o241)-    , ("f",                     0o146)-    , ("five",                  0o065)-    , ("four",                  0o064)-    , ("g",                     0o147)-    , ("germandbls",            0o337)-    , ("grave",                 0o221)-    , ("greater",               0o076)-    , ("guillemotleft",         0o253)-    , ("guillemotright",        0o273)-    , ("h",                     0o150)-    , ("hungarumlaut",          0o235)-    , ("hyphen",                0o255)-    , ("i",                     0o151)-    , ("iacute",                0o355)-    , ("icircumflex",           0o356)-    , ("idieresis",             0o357)-    , ("igrave",                0o354)-    , ("j",                     0o152)-    , ("k",                     0o153)-    , ("l",                     0o154)-    , ("less",                  0o074)-    , ("logicalnot",            0o254)-    , ("m",                     0o155)-    , ("macron",                0o257)-    , ("minus",                 0o055)-    , ("mu",                    0o265)-    , ("multiply",              0o327)-    , ("n",                     0o156)-    , ("nine",                  0o071)-    , ("ntilde",                0o361)-    , ("numbersign",            0o043)-    , ("o",                     0o157)-    , ("oacute",                0o363)-    , ("ocircumflex",           0o364)-    , ("odieresis",             0o366)-    , ("ogonek",                0o236)-    , ("ograve",                0o362)-    , ("one",                   0o061)-    , ("onehalf",               0o275)-    , ("onequarter",            0o274)-    , ("onesuperior",           0o271)-    , ("ordfeminine",           0o252)-    , ("ordmasculine",          0o272)-    , ("oslash",                0o370)-    , ("otilde",                0o365)-    , ("p",                     0o160)-    , ("paragraph",             0o266)-    , ("parenleft",             0o050)-    , ("parenright",            0o051)-    , ("percent",               0o045)-    , ("period",                0o056)-    , ("periodcentered",        0o267)-    , ("plus",                  0o053)-    , ("plusminus",             0o261)-    , ("q",                     0o161)-    , ("question",              0o077)-    , ("questiondown",          0o277)-    , ("quotedbl",              0o042)-    , ("quoteleft",             0o140)-    , ("quoteright",            0o047)-    , ("r",                     0o162)-    , ("registered",            0o256)-    , ("ring",                  0o232)-    , ("s",                     0o163)-    , ("section",               0o247)-    , ("semicolon",             0o073)-    , ("seven",                 0o067)-    , ("six",                   0o066)-    , ("slash",                 0o057)-    , ("space",                 0o040)-    , ("sterling",              0o243)-    , ("t",                     0o164)-    , ("thorn",                 0o376)-    , ("three",                 0o063)-    , ("threequarters",         0o276)-    , ("threesuperior",         0o263)-    , ("tilde",                 0o224)-    , ("two",                   0o062)-    , ("twosuperior",           0o262)-    , ("u",                     0o165)-    , ("uacute",                0o372)-    , ("ucircumflex",           0o373)-    , ("udieresis",             0o374)-    , ("ugrave",                0o371)-    , ("underscore",            0o137)-    , ("v",                     0o166)-    , ("w",                     0o167)-    , ("x",                     0o170)-    , ("y",                     0o171)-    , ("yacute",                0o375)-    , ("ydieresis",             0o377)-    , ("yen",                   0o245)-    , ("z",                     0o172)-    , ("zero",                  0o060)-    ]
+ src/Wumpus/Core/Text/Latin1Encoding.lhs view
@@ -0,0 +1,235 @@+{-# OPTIONS -Wall #-}
+
+> ------------------------------------------------------------------------------
+> -- | 
+> -- Module       :   Wumpus.Core.Text.Latin1Encoding
+> -- Copyright    :   (c) Stephen Tetley 2010
+> -- License      :   BSD3
+> -- 
+> -- Maintainer   :   Stephen Tetley <stephen.tetley@gmail.com>
+> -- Stability    :   unstable
+> -- Portability  :   GHC
+> -- 
+> -- Encoding vector for the Latin1 Encoding.
+> -- 
+> -- \*\* This file is auto-generated. \*\*
+> -- 
+> -- Generated - 2010-11-17 15:24
+> -- 
+> ------------------------------------------------------------------------------
+
+> module Wumpus.Core.Text.Latin1Encoding
+>   (
+>      latin1_encoding
+>   ) where
+
+> import Wumpus.Core.Text.Base
+
+> import qualified Data.IntMap as IntMap
+
+
+> -- | Table mapping character numbers to glyph names for the
+> -- Latin1 Encoding.
+
+> latin1_encoding :: EncodingVector
+> latin1_encoding = IntMap.fromAscList $
+>     [ ( 0x0020, "space" )
+>     , ( 0x0021, "exclam" )
+>     , ( 0x0022, "quotedbl" )
+>     , ( 0x0023, "numbersign" )
+>     , ( 0x0024, "dollar" )
+>     , ( 0x0025, "percent" )
+>     , ( 0x0026, "ampersand" )
+>     , ( 0x0027, "quoteright" )
+>     , ( 0x0028, "parenleft" )
+>     , ( 0x0029, "parenright" )
+>     , ( 0x002a, "asterisk" )
+>     , ( 0x002b, "plus" )
+>     , ( 0x002c, "comma" )
+>     , ( 0x002d, "minus" )
+>     , ( 0x002e, "period" )
+>     , ( 0x002f, "slash" )
+>     , ( 0x0030, "zero" )
+>     , ( 0x0031, "one" )
+>     , ( 0x0032, "two" )
+>     , ( 0x0033, "three" )
+>     , ( 0x0034, "four" )
+>     , ( 0x0035, "five" )
+>     , ( 0x0036, "six" )
+>     , ( 0x0037, "seven" )
+>     , ( 0x0038, "eight" )
+>     , ( 0x0039, "nine" )
+>     , ( 0x003a, "colon" )
+>     , ( 0x003b, "semicolon" )
+>     , ( 0x003c, "less" )
+>     , ( 0x003d, "equal" )
+>     , ( 0x003e, "greater" )
+>     , ( 0x003f, "question" )
+>     , ( 0x0040, "at" )
+>     , ( 0x0041, "A" )
+>     , ( 0x0042, "B" )
+>     , ( 0x0043, "C" )
+>     , ( 0x0044, "D" )
+>     , ( 0x0045, "E" )
+>     , ( 0x0046, "F" )
+>     , ( 0x0047, "G" )
+>     , ( 0x0048, "H" )
+>     , ( 0x0049, "I" )
+>     , ( 0x004a, "J" )
+>     , ( 0x004b, "K" )
+>     , ( 0x004c, "L" )
+>     , ( 0x004d, "M" )
+>     , ( 0x004e, "N" )
+>     , ( 0x004f, "O" )
+>     , ( 0x0050, "P" )
+>     , ( 0x0051, "Q" )
+>     , ( 0x0052, "R" )
+>     , ( 0x0053, "S" )
+>     , ( 0x0054, "T" )
+>     , ( 0x0055, "U" )
+>     , ( 0x0056, "V" )
+>     , ( 0x0057, "W" )
+>     , ( 0x0058, "X" )
+>     , ( 0x0059, "Y" )
+>     , ( 0x005a, "Z" )
+>     , ( 0x005b, "bracketleft" )
+>     , ( 0x005c, "backslash" )
+>     , ( 0x005d, "bracketright" )
+>     , ( 0x005e, "asciicircum" )
+>     , ( 0x005f, "underscore" )
+>     , ( 0x0060, "quoteleft" )
+>     , ( 0x0061, "a" )
+>     , ( 0x0062, "b" )
+>     , ( 0x0063, "c" )
+>     , ( 0x0064, "d" )
+>     , ( 0x0065, "e" )
+>     , ( 0x0066, "f" )
+>     , ( 0x0067, "g" )
+>     , ( 0x0068, "h" )
+>     , ( 0x0069, "i" )
+>     , ( 0x006a, "j" )
+>     , ( 0x006b, "k" )
+>     , ( 0x006c, "l" )
+>     , ( 0x006d, "m" )
+>     , ( 0x006e, "n" )
+>     , ( 0x006f, "o" )
+>     , ( 0x0070, "p" )
+>     , ( 0x0071, "q" )
+>     , ( 0x0072, "r" )
+>     , ( 0x0073, "s" )
+>     , ( 0x0074, "t" )
+>     , ( 0x0075, "u" )
+>     , ( 0x0076, "v" )
+>     , ( 0x0077, "w" )
+>     , ( 0x0078, "x" )
+>     , ( 0x0079, "y" )
+>     , ( 0x007a, "z" )
+>     , ( 0x007b, "braceleft" )
+>     , ( 0x007c, "bar" )
+>     , ( 0x007d, "braceright" )
+>     , ( 0x007e, "asciitilde" )
+>     , ( 0x0090, "dotlessi" )
+>     , ( 0x0091, "grave" )
+>     , ( 0x0093, "circumflex" )
+>     , ( 0x0094, "tilde" )
+>     , ( 0x0096, "breve" )
+>     , ( 0x0097, "dotaccent" )
+>     , ( 0x009a, "ring" )
+>     , ( 0x009d, "hungarumlaut" )
+>     , ( 0x009e, "ogonek" )
+>     , ( 0x009f, "caron" )
+>     , ( 0x00a1, "exclamdown" )
+>     , ( 0x00a2, "cent" )
+>     , ( 0x00a3, "sterling" )
+>     , ( 0x00a4, "currency" )
+>     , ( 0x00a5, "yen" )
+>     , ( 0x00a6, "brokenbar" )
+>     , ( 0x00a7, "section" )
+>     , ( 0x00a8, "dieresis" )
+>     , ( 0x00a9, "copyright" )
+>     , ( 0x00aa, "ordfeminine" )
+>     , ( 0x00ab, "guillemotleft" )
+>     , ( 0x00ac, "logicalnot" )
+>     , ( 0x00ad, "hyphen" )
+>     , ( 0x00ae, "registered" )
+>     , ( 0x00af, "macron" )
+>     , ( 0x00b0, "degree" )
+>     , ( 0x00b1, "plusminus" )
+>     , ( 0x00b2, "twosuperior" )
+>     , ( 0x00b3, "threesuperior" )
+>     , ( 0x00b4, "acute2" )
+>     , ( 0x00b5, "mu" )
+>     , ( 0x00b6, "paragraph" )
+>     , ( 0x00b7, "periodcentered" )
+>     , ( 0x00b8, "cedilla" )
+>     , ( 0x00b9, "onesuperior" )
+>     , ( 0x00ba, "ordmasculine" )
+>     , ( 0x00bb, "guillemotright" )
+>     , ( 0x00bc, "onequarter" )
+>     , ( 0x00bd, "onehalf" )
+>     , ( 0x00be, "threequarters" )
+>     , ( 0x00bf, "questiondown" )
+>     , ( 0x00c0, "Agrave" )
+>     , ( 0x00c1, "Aacute" )
+>     , ( 0x00c2, "Acircumflex" )
+>     , ( 0x00c3, "Atilde" )
+>     , ( 0x00c4, "Adieresis" )
+>     , ( 0x00c5, "Aring" )
+>     , ( 0x00c6, "AE" )
+>     , ( 0x00c7, "Ccedilla" )
+>     , ( 0x00c8, "Egrave" )
+>     , ( 0x00c9, "Eacute" )
+>     , ( 0x00ca, "Ecircumflex" )
+>     , ( 0x00cb, "Edieresis" )
+>     , ( 0x00cc, "Igrave" )
+>     , ( 0x00cd, "Iacute" )
+>     , ( 0x00ce, "Icircumflex" )
+>     , ( 0x00cf, "Idieresis" )
+>     , ( 0x00d0, "Eth" )
+>     , ( 0x00d1, "Ntilde" )
+>     , ( 0x00d2, "Ograve" )
+>     , ( 0x00d3, "Oacute" )
+>     , ( 0x00d4, "Ocircumflex" )
+>     , ( 0x00d5, "Otilde" )
+>     , ( 0x00d6, "Odieresis" )
+>     , ( 0x00d7, "multiply" )
+>     , ( 0x00d9, "Ugrave" )
+>     , ( 0x00da, "Uacute" )
+>     , ( 0x00db, "Ucircumflex" )
+>     , ( 0x00dc, "Udieresis" )
+>     , ( 0x00dd, "Yacute" )
+>     , ( 0x00de, "Thorn" )
+>     , ( 0x00df, "germandbls" )
+>     , ( 0x00e0, "agrave" )
+>     , ( 0x00e1, "aacute" )
+>     , ( 0x00e2, "acircumflex" )
+>     , ( 0x00e3, "atilde" )
+>     , ( 0x00e4, "adieresis" )
+>     , ( 0x00e5, "aring" )
+>     , ( 0x00e6, "ae" )
+>     , ( 0x00e7, "ccedilla" )
+>     , ( 0x00e8, "egrave" )
+>     , ( 0x00e9, "Oslash" )
+>     , ( 0x00ea, "ecircumflex" )
+>     , ( 0x00eb, "edieresis" )
+>     , ( 0x00ec, "igrave" )
+>     , ( 0x00ed, "iacute" )
+>     , ( 0x00ee, "icircumflex" )
+>     , ( 0x00ef, "idieresis" )
+>     , ( 0x00f0, "eth" )
+>     , ( 0x00f1, "ntilde" )
+>     , ( 0x00f2, "ograve" )
+>     , ( 0x00f3, "oacute" )
+>     , ( 0x00f4, "ocircumflex" )
+>     , ( 0x00f5, "otilde" )
+>     , ( 0x00f6, "odieresis" )
+>     , ( 0x00f7, "divide" )
+>     , ( 0x00f8, "oslash" )
+>     , ( 0x00f9, "ugrave" )
+>     , ( 0x00fa, "uacute" )
+>     , ( 0x00fb, "ucircumflex" )
+>     , ( 0x00fc, "udieresis" )
+>     , ( 0x00fd, "yacute" )
+>     , ( 0x00fe, "thorn" )
+>     , ( 0x00ff, "ydieresis" )
+>     ]
+ src/Wumpus/Core/Text/StandardEncoding.lhs view
@@ -0,0 +1,185 @@+{-# OPTIONS -Wall #-}
+
+> ------------------------------------------------------------------------------
+> -- | 
+> -- Module       :   Wumpus.Core.Text.StandardEncoding
+> -- Copyright    :   (c) Stephen Tetley 2010
+> -- License      :   BSD3
+> -- 
+> -- Maintainer   :   Stephen Tetley <stephen.tetley@gmail.com>
+> -- Stability    :   unstable
+> -- Portability  :   GHC
+> -- 
+> -- Encoding vector for the Standard Encoding.
+> -- 
+> -- \*\* This file is auto-generated. \*\*
+> -- 
+> -- Generated - 2010-11-17 15:24
+> -- 
+> ------------------------------------------------------------------------------
+
+> module Wumpus.Core.Text.StandardEncoding
+>   (
+>      standard_encoding
+>   ) where
+
+> import Wumpus.Core.Text.Base
+
+> import qualified Data.IntMap as IntMap
+
+
+> -- | Table mapping character numbers to glyph names for the
+> -- Standard Encoding.
+
+> standard_encoding :: EncodingVector
+> standard_encoding = IntMap.fromAscList $
+>     [ ( 0x0020, "space" )
+>     , ( 0x0021, "exclam" )
+>     , ( 0x0022, "quotedbl" )
+>     , ( 0x0023, "numbersign" )
+>     , ( 0x0024, "dollar" )
+>     , ( 0x0025, "percent" )
+>     , ( 0x0026, "ampersand" )
+>     , ( 0x0027, "quoteright" )
+>     , ( 0x0028, "parenleft" )
+>     , ( 0x0029, "parenright" )
+>     , ( 0x002a, "asterisk" )
+>     , ( 0x002b, "plus" )
+>     , ( 0x002c, "comma" )
+>     , ( 0x002d, "hyphen" )
+>     , ( 0x002e, "period" )
+>     , ( 0x002f, "slash" )
+>     , ( 0x0030, "zero" )
+>     , ( 0x0031, "one" )
+>     , ( 0x0032, "two" )
+>     , ( 0x0033, "three" )
+>     , ( 0x0034, "four" )
+>     , ( 0x0035, "five" )
+>     , ( 0x0036, "six" )
+>     , ( 0x0037, "seven" )
+>     , ( 0x0038, "eight" )
+>     , ( 0x0039, "nine" )
+>     , ( 0x003a, "colon" )
+>     , ( 0x003b, "semicolon" )
+>     , ( 0x003c, "less" )
+>     , ( 0x003d, "equal" )
+>     , ( 0x003e, "greater" )
+>     , ( 0x003f, "question" )
+>     , ( 0x0040, "at" )
+>     , ( 0x0041, "A" )
+>     , ( 0x0042, "B" )
+>     , ( 0x0043, "C" )
+>     , ( 0x0044, "D" )
+>     , ( 0x0045, "E" )
+>     , ( 0x0046, "F" )
+>     , ( 0x0047, "G" )
+>     , ( 0x0048, "H" )
+>     , ( 0x0049, "I" )
+>     , ( 0x004a, "J" )
+>     , ( 0x004b, "K" )
+>     , ( 0x004c, "L" )
+>     , ( 0x004d, "M" )
+>     , ( 0x004e, "N" )
+>     , ( 0x004f, "O" )
+>     , ( 0x0050, "P" )
+>     , ( 0x0051, "Q" )
+>     , ( 0x0052, "R" )
+>     , ( 0x0053, "S" )
+>     , ( 0x0054, "T" )
+>     , ( 0x0055, "U" )
+>     , ( 0x0056, "V" )
+>     , ( 0x0057, "W" )
+>     , ( 0x0058, "X" )
+>     , ( 0x0059, "Y" )
+>     , ( 0x005a, "Z" )
+>     , ( 0x005b, "bracketleft" )
+>     , ( 0x005c, "backslash" )
+>     , ( 0x005d, "bracketright" )
+>     , ( 0x005e, "asciicircum" )
+>     , ( 0x005f, "underscore" )
+>     , ( 0x0060, "quoteleft" )
+>     , ( 0x0061, "a" )
+>     , ( 0x0062, "b" )
+>     , ( 0x0063, "c" )
+>     , ( 0x0064, "d" )
+>     , ( 0x0065, "e" )
+>     , ( 0x0066, "f" )
+>     , ( 0x0067, "g" )
+>     , ( 0x0068, "h" )
+>     , ( 0x0069, "i" )
+>     , ( 0x006a, "j" )
+>     , ( 0x006b, "k" )
+>     , ( 0x006c, "l" )
+>     , ( 0x006d, "m" )
+>     , ( 0x006e, "n" )
+>     , ( 0x006f, "o" )
+>     , ( 0x0070, "p" )
+>     , ( 0x0071, "q" )
+>     , ( 0x0072, "r" )
+>     , ( 0x0073, "s" )
+>     , ( 0x0074, "t" )
+>     , ( 0x0075, "u" )
+>     , ( 0x0076, "v" )
+>     , ( 0x0077, "w" )
+>     , ( 0x0078, "x" )
+>     , ( 0x0079, "y" )
+>     , ( 0x007a, "z" )
+>     , ( 0x007b, "braceleft" )
+>     , ( 0x007c, "bar" )
+>     , ( 0x007d, "braceright" )
+>     , ( 0x007e, "asciitilde" )
+>     , ( 0x00a1, "exclamdown" )
+>     , ( 0x00a2, "cent" )
+>     , ( 0x00a3, "sterling" )
+>     , ( 0x00a4, "fraction" )
+>     , ( 0x00a5, "yen" )
+>     , ( 0x00a6, "florin" )
+>     , ( 0x00a7, "section" )
+>     , ( 0x00a8, "currency" )
+>     , ( 0x00a9, "quotesingle" )
+>     , ( 0x00aa, "quotedblleft" )
+>     , ( 0x00ab, "guillemotleft" )
+>     , ( 0x00ac, "guilsinglleft" )
+>     , ( 0x00ad, "guilsinglright" )
+>     , ( 0x00ae, "fi" )
+>     , ( 0x00af, "fl" )
+>     , ( 0x00b1, "endash" )
+>     , ( 0x00b2, "dagger" )
+>     , ( 0x00b3, "daggerdbl" )
+>     , ( 0x00b4, "periodcentered" )
+>     , ( 0x00b6, "paragraph" )
+>     , ( 0x00b7, "bullet" )
+>     , ( 0x00b8, "quotesinglbase" )
+>     , ( 0x00b9, "quotedblbase" )
+>     , ( 0x00ba, "quotedblright" )
+>     , ( 0x00bb, "guillemotright" )
+>     , ( 0x00bc, "ellipsis" )
+>     , ( 0x00bd, "perthousand" )
+>     , ( 0x00bf, "questiondown" )
+>     , ( 0x00c1, "grave" )
+>     , ( 0x00c2, "acute" )
+>     , ( 0x00c3, "circumflex" )
+>     , ( 0x00c4, "tilde" )
+>     , ( 0x00c5, "macron" )
+>     , ( 0x00c6, "breve" )
+>     , ( 0x00c7, "dotaccent" )
+>     , ( 0x00c8, "dieresis" )
+>     , ( 0x00ca, "ring" )
+>     , ( 0x00cb, "cedilla" )
+>     , ( 0x00cd, "hungarumlaut" )
+>     , ( 0x00ce, "ogonek" )
+>     , ( 0x00cf, "caron" )
+>     , ( 0x00d0, "emdash" )
+>     , ( 0x00e1, "AE" )
+>     , ( 0x00e3, "ordfeminine" )
+>     , ( 0x00e8, "Lslash" )
+>     , ( 0x00e9, "Oslash" )
+>     , ( 0x00ea, "OE" )
+>     , ( 0x00eb, "ordmasculine" )
+>     , ( 0x00f1, "ae" )
+>     , ( 0x00f5, "dotlessi" )
+>     , ( 0x00f8, "lslash" )
+>     , ( 0x00f9, "oslash" )
+>     , ( 0x00fa, "oe" )
+>     , ( 0x00fb, "germandbls" )
+>     ]
+ src/Wumpus/Core/Text/Symbol.lhs view
@@ -0,0 +1,225 @@+{-# OPTIONS -Wall #-}
+
+> ------------------------------------------------------------------------------
+> -- | 
+> -- Module       :   Wumpus.Core.Text.Symbol
+> -- Copyright    :   (c) Stephen Tetley 2010
+> -- License      :   BSD3
+> -- 
+> -- Maintainer   :   Stephen Tetley <stephen.tetley@gmail.com>
+> -- Stability    :   unstable
+> -- Portability  :   GHC
+> -- 
+> -- Encoding vector for the Symbol font.
+> -- 
+> -- \*\* This file is auto-generated. \*\*
+> -- 
+> -- Generated - 2010-11-17 15:24
+> -- 
+> ------------------------------------------------------------------------------
+
+> module Wumpus.Core.Text.Symbol
+>   (
+>      symbol_encoding
+>   ) where
+
+> import Wumpus.Core.Text.Base
+
+> import qualified Data.IntMap as IntMap
+
+
+> -- | Table mapping character numbers to glyph names for the
+> -- Symbol font.
+
+> symbol_encoding :: EncodingVector
+> symbol_encoding = IntMap.fromAscList $
+>     [ ( 0x0020, "space" )
+>     , ( 0x0021, "exclam" )
+>     , ( 0x0022, "universal" )
+>     , ( 0x0023, "numbersign" )
+>     , ( 0x0024, "existential" )
+>     , ( 0x0025, "percent" )
+>     , ( 0x0026, "ampersand" )
+>     , ( 0x0027, "suchthat" )
+>     , ( 0x0028, "parenleft" )
+>     , ( 0x0029, "parenright" )
+>     , ( 0x002a, "asteriskmath" )
+>     , ( 0x002b, "plus" )
+>     , ( 0x002c, "comma" )
+>     , ( 0x002d, "minus" )
+>     , ( 0x002e, "period" )
+>     , ( 0x002f, "slash" )
+>     , ( 0x0030, "zero" )
+>     , ( 0x0031, "one" )
+>     , ( 0x0032, "two" )
+>     , ( 0x0033, "three" )
+>     , ( 0x0034, "four" )
+>     , ( 0x0035, "five" )
+>     , ( 0x0036, "six" )
+>     , ( 0x0037, "seven" )
+>     , ( 0x0038, "eight" )
+>     , ( 0x0039, "nine" )
+>     , ( 0x003a, "colon" )
+>     , ( 0x003b, "semicolon" )
+>     , ( 0x003c, "less" )
+>     , ( 0x003d, "equal" )
+>     , ( 0x003e, "greater" )
+>     , ( 0x003f, "question" )
+>     , ( 0x0040, "congruent" )
+>     , ( 0x0041, "Alpha" )
+>     , ( 0x0042, "Beta" )
+>     , ( 0x0043, "Chi" )
+>     , ( 0x0044, "Delta" )
+>     , ( 0x0045, "Epsilon" )
+>     , ( 0x0046, "Phi" )
+>     , ( 0x0047, "Gamma" )
+>     , ( 0x0048, "Eta" )
+>     , ( 0x0049, "Iota" )
+>     , ( 0x004a, "theta1" )
+>     , ( 0x004b, "Kappa" )
+>     , ( 0x004c, "Lambda" )
+>     , ( 0x004d, "Mu" )
+>     , ( 0x004e, "Nu" )
+>     , ( 0x004f, "Omicron" )
+>     , ( 0x0050, "Pi" )
+>     , ( 0x0051, "Theta" )
+>     , ( 0x0052, "Rho" )
+>     , ( 0x0053, "Sigma" )
+>     , ( 0x0054, "Tau" )
+>     , ( 0x0055, "Upsilon" )
+>     , ( 0x0056, "sigma1" )
+>     , ( 0x0057, "Omega" )
+>     , ( 0x0058, "Xi" )
+>     , ( 0x0059, "Psi" )
+>     , ( 0x005a, "Zeta" )
+>     , ( 0x005b, "bracketleft" )
+>     , ( 0x005c, "therefore" )
+>     , ( 0x005d, "bracketright" )
+>     , ( 0x005e, "perpendicular" )
+>     , ( 0x005f, "underscore" )
+>     , ( 0x0060, "radicalex" )
+>     , ( 0x0061, "alpha" )
+>     , ( 0x0062, "beta" )
+>     , ( 0x0063, "chi" )
+>     , ( 0x0064, "delta" )
+>     , ( 0x0065, "epsilon" )
+>     , ( 0x0066, "phi" )
+>     , ( 0x0067, "gamma" )
+>     , ( 0x0068, "eta" )
+>     , ( 0x0069, "iota" )
+>     , ( 0x006a, "phi1" )
+>     , ( 0x006b, "kappa" )
+>     , ( 0x006c, "lambda" )
+>     , ( 0x006d, "mu" )
+>     , ( 0x006e, "nu" )
+>     , ( 0x006f, "omicron" )
+>     , ( 0x0070, "pi" )
+>     , ( 0x0071, "theta" )
+>     , ( 0x0072, "rho" )
+>     , ( 0x0073, "sigma" )
+>     , ( 0x0074, "tau" )
+>     , ( 0x0075, "upsilon" )
+>     , ( 0x0076, "omega1" )
+>     , ( 0x0077, "omega" )
+>     , ( 0x0078, "xi" )
+>     , ( 0x0079, "psi" )
+>     , ( 0x007a, "zeta" )
+>     , ( 0x007b, "braceleft" )
+>     , ( 0x007c, "bar" )
+>     , ( 0x007d, "braceright" )
+>     , ( 0x007e, "similar" )
+>     , ( 0x00a0, "Euro" )
+>     , ( 0x00a1, "Upsilon1" )
+>     , ( 0x00a2, "minute" )
+>     , ( 0x00a3, "lessequal" )
+>     , ( 0x00a4, "fraction" )
+>     , ( 0x00a5, "infinity" )
+>     , ( 0x00a6, "florin" )
+>     , ( 0x00a7, "club" )
+>     , ( 0x00a8, "diamond" )
+>     , ( 0x00a9, "heart" )
+>     , ( 0x00aa, "spade" )
+>     , ( 0x00ab, "arrowboth" )
+>     , ( 0x00ac, "arrowleft" )
+>     , ( 0x00ad, "arrowup" )
+>     , ( 0x00ae, "arrowright" )
+>     , ( 0x00af, "arrowdown" )
+>     , ( 0x00b0, "degree" )
+>     , ( 0x00b1, "plusminus" )
+>     , ( 0x00b2, "second" )
+>     , ( 0x00b3, "greaterequal" )
+>     , ( 0x00b4, "multiply" )
+>     , ( 0x00b5, "proportional" )
+>     , ( 0x00b6, "partialdiff" )
+>     , ( 0x00b7, "bullet" )
+>     , ( 0x00b8, "divide" )
+>     , ( 0x00b9, "notequal" )
+>     , ( 0x00ba, "equivalence" )
+>     , ( 0x00bb, "approxequal" )
+>     , ( 0x00bc, "ellipsis" )
+>     , ( 0x00bd, "arrowvertex" )
+>     , ( 0x00be, "arrowhorizex" )
+>     , ( 0x00bf, "carriagereturn" )
+>     , ( 0x00c0, "aleph" )
+>     , ( 0x00c1, "Ifraktur" )
+>     , ( 0x00c2, "Rfraktur" )
+>     , ( 0x00c3, "weierstrass" )
+>     , ( 0x00c4, "circlemultiply" )
+>     , ( 0x00c5, "circleplus" )
+>     , ( 0x00c6, "emptyset" )
+>     , ( 0x00c7, "intersection" )
+>     , ( 0x00c8, "union" )
+>     , ( 0x00c9, "propersuperset" )
+>     , ( 0x00ca, "reflexsuperset" )
+>     , ( 0x00cb, "notsubset" )
+>     , ( 0x00cc, "propersubset" )
+>     , ( 0x00cd, "reflexsubset" )
+>     , ( 0x00ce, "element" )
+>     , ( 0x00cf, "notelement" )
+>     , ( 0x00d0, "angle" )
+>     , ( 0x00d1, "gradient" )
+>     , ( 0x00d2, "registerserif" )
+>     , ( 0x00d3, "copyrightserif" )
+>     , ( 0x00d4, "trademarkserif" )
+>     , ( 0x00d5, "product" )
+>     , ( 0x00d6, "radical" )
+>     , ( 0x00d7, "dotmath" )
+>     , ( 0x00d8, "logicalnot" )
+>     , ( 0x00d9, "logicaland" )
+>     , ( 0x00da, "logicalor" )
+>     , ( 0x00db, "arrowdblboth" )
+>     , ( 0x00dc, "arrowdblleft" )
+>     , ( 0x00dd, "arrowdblup" )
+>     , ( 0x00de, "arrowdblright" )
+>     , ( 0x00df, "arrowdbldown" )
+>     , ( 0x00e0, "lozenge" )
+>     , ( 0x00e1, "angleleft" )
+>     , ( 0x00e2, "registersans" )
+>     , ( 0x00e3, "copyrightsans" )
+>     , ( 0x00e4, "trademarksans" )
+>     , ( 0x00e5, "summation" )
+>     , ( 0x00e6, "parenlefttp" )
+>     , ( 0x00e7, "parenleftex" )
+>     , ( 0x00e8, "parenleftbt" )
+>     , ( 0x00e9, "bracketlefttp" )
+>     , ( 0x00ea, "bracketleftex" )
+>     , ( 0x00eb, "bracketleftbt" )
+>     , ( 0x00ec, "bracelefttp" )
+>     , ( 0x00ed, "braceleftmid" )
+>     , ( 0x00ee, "braceleftbt" )
+>     , ( 0x00ef, "braceex" )
+>     , ( 0x00f1, "angleright" )
+>     , ( 0x00f2, "integral" )
+>     , ( 0x00f3, "integraltp" )
+>     , ( 0x00f4, "integralex" )
+>     , ( 0x00f5, "integralbt" )
+>     , ( 0x00f6, "parenrighttp" )
+>     , ( 0x00f7, "parenrightex" )
+>     , ( 0x00f8, "parenrightbt" )
+>     , ( 0x00f9, "bracketrighttp" )
+>     , ( 0x00fa, "bracketrightex" )
+>     , ( 0x00fb, "bracketrightbt" )
+>     , ( 0x00fc, "bracerighttp" )
+>     , ( 0x00fd, "bracerightmid" )
+>     , ( 0x00fe, "bracerightbt" )
+>     ]
− src/Wumpus/Core/Text/SymbolFont.hs
@@ -1,249 +0,0 @@-{-# OPTIONS -Wall #-}------------------------------------------------------------------------------------- |--- Module      :  Wumpus.Core.Text.SymbolFont--- Copyright   :  (c) Stephen Tetley 2010--- License     :  BSD3------ Maintainer  :  stephen.tetley@gmail.com--- Stability   :  unstable--- Portability :  GHC------ A @TextEncoder@ record instance for Symbol font characters.--- -----------------------------------------------------------------------------------module Wumpus.Core.Text.SymbolFont-  ( -  -    symbol_font_encoder-  , symbolFontEncoder-  , symbolFontAll--  ) where--import Wumpus.Core.Text.Encoder--import qualified Data.Map as Map------ | Symbol Font Encoder name ------ (Number 1)--- -symbol_font_encoder :: FontEncoderName-symbol_font_encoder = FontEncoderName 1------ | Latin1 TextEncoder instance.-symbolFontEncoder :: FontEncoder-symbolFontEncoder = FontEncoder -    { ps_lookup         = Map.lookup `flip` codeToName-    , svg_lookup        = Map.lookup `flip` nameToCode-    , ps_fallback       = "space"-    , svg_fallback      = 0o040-    }--nameToCode :: Map.Map GlyphName CharCode-nameToCode = Map.fromList symbolFontAll--codeToName :: Map.Map CharCode GlyphName-codeToName = foldr fn Map.empty symbolFontAll where-  fn (s,i) a = Map.insert i s a ---- | A lookup list of Latin 1 names to their octal code.-symbolFontAll :: [(GlyphName, CharCode)]-symbolFontAll = -    [ ("Alpha",                 0o101)-    , ("Beta",                  0o102)-    , ("Chi",                   0o103)-    , ("Delta",                 0o104)-    , ("Epsilon",               0o105)-    , ("Eta",                   0o110)-    , ("Euro",                  0o240)-    , ("Gamma",                 0o107)-    , ("Ifraktur",              0o301)-    , ("Iota",                  0o111)-    , ("Kappa",                 0o113)-    , ("Lambda",                0o114)-    , ("Mu",                    0o115)-    , ("Nu",                    0o116)-    , ("Omega",                 0o127)-    , ("Omicron",               0o117)-    , ("Phi",                   0o106)-    , ("Pi",                    0o120)-    , ("Psi",                   0o131)-    , ("Rfraktur",              0o302)-    , ("Rho",                   0o122)-    , ("Sigma",                 0o123)-    , ("Tau",                   0o124)-    , ("Theta",                 0o121)-    , ("Upsilon",               0o125)-    , ("Upsilon1",              0o241)-    , ("Xi",                    0o130)-    , ("Zeta",                  0o132)-    , ("aleph",                 0o300)-    , ("alpha",                 0o141)-    , ("ampersand",             0o046)-    , ("angle",                 0o320)-    , ("angleleft",             0o341)-    , ("angleright",            0o361)-    , ("approxequal",           0o273)-    , ("arrowboth",             0o253)-    , ("arrowdblboth",          0o333)-    , ("arrowdbldown",          0o337)-    , ("arrowdblleft",          0o334)-    , ("arrowdblright",         0o336)-    , ("arrowdblup",            0o335)-    , ("arrowdown",             0o257)-    , ("arrowhorizex",          0o276)-    , ("arrowleft",             0o254)-    , ("arrowright",            0o256)-    , ("arrowup",               0o255)-    , ("arrowvertex",           0o275)-    , ("asteriskmath",          0o052)-    , ("bar",                   0o174)-    , ("beta",                  0o142)-    , ("braceleft",             0o173)-    , ("braceright",            0o175)-    , ("bracelefttp",           0o354)-    , ("braceleftmid",          0o355)-    , ("braceleftbt",           0o356)-    , ("bracerighttp",          0o374)-    , ("bracerightmid",         0o375)-    , ("bracerightbt",          0o376)-    , ("braceex",               0o357)-    , ("bracketleft",           0o133)-    , ("bracketright",          0o135)-    , ("bracketlefttp",         0o351)-    , ("bracketleftex",         0o352)-    , ("bracketleftbt",         0o353)-    , ("bracketrighttp",        0o371)-    , ("bracketrightex",        0o372)-    , ("bracketrightbt",        0o373)-    , ("bullet",                0o267)-    , ("carriagereturn",        0o277)-    , ("chi",                   0o143)-    , ("circlemultiply",        0o304)-    , ("circleplus",            0o305)-    , ("club",                  0o247)-    , ("colon",                 0o072)-    , ("comma",                 0o054)-    , ("congruent",             0o100)-    , ("copyrightsans",         0o343)-    , ("copyrightserif",        0o323)-    , ("degree",                0o260)-    , ("delta",                 0o144)-    , ("diamond",               0o250)-    , ("divide",                0o270)-    , ("dotmath",               0o327)-    , ("eight",                 0o070)-    , ("element",               0o316)-    , ("ellipsis",              0o274)-    , ("emptyset",              0o306)-    , ("epsilon",               0o145)-    , ("equal",                 0o075)-    , ("equivalence",           0o272)-    , ("eta",                   0o150)-    , ("exclam",                0o041)-    , ("existential",           0o044)-    , ("five",                  0o065)-    , ("florin",                0o246)-    , ("four",                  0o064)-    , ("fraction",              0o244)-    , ("gamma",                 0o147)-    , ("gradient",              0o321)-    , ("greater",               0o076)-    , ("greaterequal",          0o263)-    , ("heart",                 0o251)-    , ("infinity",              0o245)-    , ("integral",              0o362)-    , ("integraltp",            0o363)-    , ("integralex",            0o364)-    , ("integralbt",            0o365)-    , ("intersection",          0o307)-    , ("iota",                  0o151)-    , ("kappa",                 0o153)-    , ("lambda",                0o154)-    , ("less",                  0o074)-    , ("lessequal",             0o243)-    , ("logicaland",            0o331)-    , ("logicalnot",            0o330)-    , ("logicalor",             0o332)-    , ("lozenge",               0o340)-    , ("minus",                 0o055)-    , ("minute",                0o242)-    , ("mu",                    0o155)-    , ("multiply",              0o264)-    , ("nine",                  0o071)-    , ("notelement",            0o317)-    , ("notequal",              0o271)-    , ("notsubset",             0o313)-    , ("nu",                    0o156)-    , ("numbersign",            0o043)-    , ("omega",                 0o167)-    , ("omega1",                0o166)-    , ("omicron",               0o157)-    , ("one",                   0o061)-    , ("parenleft",             0o050)-    , ("parenright",            0o051)-    , ("parenlefttp",           0o346)-    , ("parenleftex",           0o347)-    , ("parenleftbt",           0o350)-    , ("parenrighttp",          0o366)-    , ("parenrightex",          0o367)-    , ("parenrightbt",          0o370)-    , ("partialdiff",           0o266)-    , ("percent",               0o045)-    , ("period",                0o056)-    , ("perpendicular",         0o136)-    , ("phi",                   0o146)-    , ("phi1",                  0o152)-    , ("pi",                    0o160)-    , ("plus",                  0o053)-    , ("plusminus",             0o261)-    , ("product",               0o325)-    , ("propersubset",          0o314)-    , ("propersuperset",        0o311)-    , ("proportional",          0o265)-    , ("psi",                   0o171)-    , ("question",              0o077)-    , ("radical",               0o326)-    , ("radicalex",             0o140)-    , ("reflexsubset",          0o315)-    , ("reflexsuperset",        0o312)-    , ("registersans",          0o342)-    , ("registerserif",         0o322)-    , ("rho",                   0o162)-    , ("second",                0o262)-    , ("semicolon",             0o073)-    , ("seven",                 0o067)-    , ("sigma",                 0o163)-    , ("sigma1",                0o126)-    , ("similar",               0o176)-    , ("six",                   0o066)-    , ("slash",                 0o057)-    , ("space",                 0o040)-    , ("spade",                 0o252)-    , ("suchthat",              0o047)-    , ("summation",             0o345)-    , ("tau",                   0o164)-    , ("therefore",             0o134)-    , ("theta",                 0o161)-    , ("theta1",                0o112)-    , ("three",                 0o063)-    , ("trademarksans",         0o344)-    , ("trademarkserif",        0o324)-    , ("two",                   0o062)-    , ("underscore",            0o137)-    , ("union",                 0o310)-    , ("universal",             0o042)-    , ("upsilon",               0o165)-    , ("weierstrass",           0o303)-    , ("xi",                    0o170)-    , ("zero",                  0o060)-    , ("zeta",                  0o172)-    ]
− src/Wumpus/Core/Text/TextInternal.hs
@@ -1,173 +0,0 @@-{-# OPTIONS -Wall #-}------------------------------------------------------------------------------------- |--- Module      :  Wumpus.Core.Text.TextInternal--- Copyright   :  (c) Stephen Tetley 2009-2010--- License     :  BSD3------ Maintainer  :  stephen.tetley@gmail.com--- Stability   :  unstable--- Portability :  GHC------ Extended character handling.--- -----------------------------------------------------------------------------------module Wumpus.Core.Text.TextInternal-  ( --    EncodedText(..)    -  , TextChunk(..)-  , EncodedChar(..)--  , textLength-  , lookupByCharCode  -  , lookupByGlyphName-  , getSvgFallback-  , getPsFallback-  -  , lexLabel--  ) where--import Wumpus.Core.Text.Encoder-import Wumpus.Core.Utils.FormatCombinators--import Data.Char-import qualified Data.Map as Map--newtype EncodedText = EncodedText { getEncodedText :: [TextChunk] }-  deriving (Eq,Show)---- | Wumpus supports both escaped names e.g. @egrave@ and escaped--- (numeric decimal) character codes in the input string for a --- TextLabel.--- -data TextChunk = TextSpan    String-               | TextEscInt  Int-               | TextEscName GlyphName-  deriving (Eq,Show)---- | For KernLabels Wumpus needs a Char version of TextChunk.----data EncodedChar = CharLiteral Char-                 | CharEscInt  Int-                 | CharEscName GlyphName-  deriving (Eq,Show)-------------------------------------------------------------------------------------instance Format EncodedText where-  format = hcat . map format . getEncodedText--instance Format TextChunk where-  format (TextSpan s)    = text s-  format (TextEscInt i)  = text "&#" <> int i  <> semicolon-  format (TextEscName s) = text "&#" <> text s <> semicolon--instance Format EncodedChar where-  format (CharLiteral c) = char c-  format (CharEscInt i)  = text "&#" <> int i  <> semicolon-  format (CharEscName s) = text "&#" <> text s <> semicolon--------------------------------------------------------------------------------------textLength :: EncodedText -> Int-textLength = foldr add 0 . getEncodedText where -    add (TextSpan s) n = n + length s-    add _            n = n + 1---lookupByCharCode :: FontEncoderName -> CharCode -> TextEncoder -> Maybe GlyphName-lookupByCharCode name i enc = -    Map.lookup name (font_encoder_map enc) >>= \a -> (ps_lookup a) i--lookupByGlyphName :: FontEncoderName -> GlyphName -> TextEncoder -> Maybe CharCode-lookupByGlyphName name i enc = -    Map.lookup name (font_encoder_map enc) >>= \a -> (svg_lookup a) i---getSvgFallback :: FontEncoderName -> TextEncoder -> CharCode-getSvgFallback name enc = case Map.lookup name (font_encoder_map enc) of-   Just fe -> svg_fallback fe -   Nothing -> 0o040                     -- wild guess--getPsFallback :: FontEncoderName -> TextEncoder -> GlyphName-getPsFallback name enc = case Map.lookup name (font_encoder_map enc) of-   Just fe -> ps_fallback fe -   Nothing -> "space"                    -- wild guess----- | 'lexLabel' input is regular text and escaped glyph names or--- decimal character codes. Escaping follows the SVG convention,--- start with @&#@ (ampersand hash) end with @;@ (semicolon).------ Special chars are output to PostScript as:------ > /egrave glyphshow------ Special chars are output to SVG as an escaped decimal, e.g.:------ > &#232;------ Note, HTML entity names do not seem to be supported in SVG,--- @ &egrave; @ does not work in FireFox or Chrome.----lexLabel :: String -> EncodedText-lexLabel = EncodedText . lexer---- Note - the lexer reads number spans with isDigit, so reads --- decimals only.--- -lexer :: String -> [TextChunk]-lexer []            = []-lexer ('&':'#':cs)  = escStart cs-lexer (c:cs)        = let (ss,rest) = span (/= '&') cs -                      in TextSpan (c:ss) : lexer rest--escStart :: String -> [TextChunk]-escStart ('0':'o':cs)           = escOct cs-escStart ('0':'O':cs)           = escOct cs-escStart ('0':'x':cs)           = escHex cs-escStart ('0':'X':cs)           = escHex cs-escStart (c:cs) | isDigit c     = escDec (digitToInt c) cs-escStart (c:cs)                 = let (ss,rest) = span isAlphaNum cs -                                  in TextEscName (c:ss) : chompToSemi rest-escStart []                     = [] ---- | One digit consumed already...----escDec :: Int -> String -> [TextChunk]-escDec n (c:cs) | isDigit c = escDec (n*10 + digitToInt c) cs-escDec n cs     | n > 0     = TextEscInt n : chompToSemi cs-                | otherwise = chompToSemi cs--escHex :: String -> [TextChunk]-escHex = step 0-  where-    step n (c:cs) | isHexDigit c = step (n*16 + digitToInt c) cs-    step n cs     | n > 0        = TextEscInt n : chompToSemi cs-                  | otherwise    = chompToSemi cs ---escOct :: String -> [TextChunk]-escOct = step 0-  where-    step n (c:cs) | isHexDigit c = step (n*8 + digitToInt c) cs-    step n cs     | n > 0        = TextEscInt n : chompToSemi cs-                  | otherwise    = chompToSemi cs ------ The last two conditions both indicate ill-formed input, but it--- is /best/ if the lexer does not throw errors.--- -chompToSemi :: String -> [TextChunk]-chompToSemi (';':cs) = lexer cs-chompToSemi (_:cs)   = chompToSemi cs           -chompToSemi []       = []-
src/Wumpus/Core/TrafoInternal.hs view
@@ -31,12 +31,15 @@    -- * CTM operations   , identityCTM-  , thetaCTM+  , makeThetaCTM+  , makeTranslCTM +  , translateCTM   , scaleCTM   , rotateCTM+  , rotateAboutCTM   , matrixRepCTM-  , translMatrixRepCTM+  , unCTM    -- * AffineTrafo operations   , concatTrafos@@ -45,6 +48,7 @@   ) where  +import Wumpus.Core.AffineTrans import Wumpus.Core.Geometry import Wumpus.Core.Utils.Common import Wumpus.Core.Utils.FormatCombinators@@ -59,9 +63,11 @@ -- Note - line thickness of a stroked path will not be scaled. -- data PrimCTM u = PrimCTM -      { ctm_scale_x     :: u-      , ctm_scale_y     :: u-      , ctm_rotation    :: Radian +      { ctm_transl_x    :: !u+      , ctm_transl_y    :: !u+      , ctm_scale_x     :: !u+      , ctm_scale_y     :: !u+      , ctm_rotation    :: !Radian        }   deriving (Eq,Show) @@ -82,10 +88,12 @@   instance PSUnit u => Format (PrimCTM u) where-  format (PrimCTM x y ang) = -      parens (text "CTM" <+> text "sx="   <> dtruncFmt x -                         <+> text "sy="   <> dtruncFmt y -                         <+> text "ang="  <> format ang  )+  format (PrimCTM dx dy sx sy ang) = +      parens (text "CTM" <+> text "dx =" <> dtruncFmt dx+                         <+> text "dy =" <> dtruncFmt dy+                         <+> text "sx =" <> dtruncFmt sx +                         <+> text "sy =" <> dtruncFmt sy +                         <+> text "ang=" <> format ang  )   @@ -94,20 +102,49 @@ -- Manipulating the PrimCTM  identityCTM :: Num u => PrimCTM u-identityCTM = PrimCTM { ctm_scale_x = 1, ctm_scale_y = 1, ctm_rotation = 0 }+identityCTM = PrimCTM { ctm_transl_x = 0, ctm_transl_y = 0+                      , ctm_scale_x = 1,  ctm_scale_y = 1+                      , ctm_rotation = 0 } -thetaCTM :: Num u => Radian -> PrimCTM u-thetaCTM ang = PrimCTM { ctm_scale_x = 1, ctm_scale_y = 1, ctm_rotation = ang }+makeThetaCTM :: Num u => u -> u -> Radian -> PrimCTM u+makeThetaCTM dx dy ang = PrimCTM { ctm_transl_x = dx, ctm_transl_y = dy+                                 , ctm_scale_x = 1, ctm_scale_y = 1+                                 , ctm_rotation = ang } ++makeTranslCTM :: Num u => u -> u -> PrimCTM u+makeTranslCTM dx dy = PrimCTM { ctm_transl_x = dx, ctm_transl_y = dy+                              , ctm_scale_x = 1, ctm_scale_y = 1+                              , ctm_rotation = 0 }+++++translateCTM :: Num u => u -> u -> PrimCTM u -> PrimCTM u+translateCTM x1 y1 (PrimCTM dx dy sx sy ang) = +    PrimCTM (x1+dx) (y1+dy) sx sy ang++-- Note - the matrix is not used entirely conventionally.+--+-- It is expected that the point is extracted from the matrix, so+-- scales and rotations operate on the point coordinates as well+-- as the scale and rotation components. + scaleCTM :: Num u => u -> u -> PrimCTM u -> PrimCTM u-scaleCTM x1 y1 (PrimCTM sx sy ang) = PrimCTM (x1*sx) (y1*sy) ang+scaleCTM x1 y1 (PrimCTM dx dy sx sy ang) = +    let P2 x y = scale x1 y1 (P2 dx dy) +    in PrimCTM x y (x1*sx) (y1*sy) ang -rotateCTM :: Radian -> PrimCTM u -> PrimCTM u-rotateCTM ang1 (PrimCTM sx sy ang) = PrimCTM sx sy (circularModulo $ ang1+ang)+rotateCTM :: (Real u, Floating u) => Radian -> PrimCTM u -> PrimCTM u+rotateCTM theta (PrimCTM dx dy sx sy ang) = +    let P2 x y = rotate theta (P2 dx dy) +    in PrimCTM x y sx sy (circularModulo $ theta+ang) -matrixRepCTM :: (Floating u, Real u) => PrimCTM u -> Matrix3'3 u-matrixRepCTM (PrimCTM sx sy ang) = -    rotationMatrix (circularModulo ang) * scalingMatrix sx sy+rotateAboutCTM :: (Real u, Floating u) +               => Radian -> Point2 u -> PrimCTM u -> PrimCTM u+rotateAboutCTM theta pt (PrimCTM dx dy sx sy ang) = +    let P2 x y = rotateAbout theta pt (P2 dx dy)+    in PrimCTM x y sx sy (circularModulo $ theta+ang)   -- Note - the order of combining a translation (i.e. the location @@ -116,9 +153,20 @@ -- -- This function encapsulates the correct order. ---translMatrixRepCTM :: (Floating u, Real u) -                   => u -> u -> PrimCTM u -> Matrix3'3 u-translMatrixRepCTM x y ctm = translationMatrix x y * matrixRepCTM ctm+matrixRepCTM :: (Real u, Floating u) => PrimCTM u -> Matrix3'3 u+matrixRepCTM (PrimCTM dx dy sx sy ang) = +    translationMatrix dx dy * rotationMatrix (circularModulo ang) +                            * scalingMatrix sx sy+++-- | Destructor for the CTM extracts the /start point/ and a+-- /residual/ CTM. +-- +-- If the residual CTM is the identity CTM, the SVG or PostScript+-- output can be optimized.+-- +unCTM :: Num u => PrimCTM  u -> (Point2 u, PrimCTM u)+unCTM (PrimCTM dx dy sx sy ang) = (P2 dx dy, PrimCTM 0 0 sx sy ang)   --------------------------------------------------------------------------------
src/Wumpus/Core/Utils/FormatCombinators.hs view
@@ -106,6 +106,15 @@ instance Show Doc where   show = runDoc +-- Eq is horrible but it is required for Primitive++instance Eq Doc where+  (==) (Doc1 f)     (Doc1 g)      = (f []) == (g [])    -- horribly expensive!+  (==) (Join a b)   (Join x y)    = a == x && b == y+  (==) Line         Line          = True+  (==) (Indent i a) (Indent j x)  = i == j && a == x+  (==) _            _             = False+ instance Monoid Doc where   mempty = empty   mappend = (<>)
src/Wumpus/Core/VersionNumber.hs view
@@ -22,7 +22,7 @@  -- | Version number. ----- > (0,37,0)+-- > (0,40,0) -- wumpus_core_version :: (Int,Int,Int)-wumpus_core_version = (0,37,0)+wumpus_core_version = (0,40,0)
src/Wumpus/Core/WumpusTypes.hs view
@@ -13,6 +13,12 @@ -- This module re-exports types and functions from  -- "Wumpus.Core.PictureInternal" but makes them opaque.  -- Contructors are provided by "Wumpus.Core.Picture".+--+-- Note - whilst the Picture types support the Eq class the +-- implementations are not efficient, e.g. In the case of +-- Primitive, one of the constructors has to unwind a functional +-- \Hughes list\. The Eq instance is considered a legacy +-- /feature/ (or burden) as the types have expanded. --  -------------------------------------------------------------------------------- 
wumpus-core.cabal view
@@ -1,5 +1,5 @@ name:             wumpus-core-version:          0.37.0+version:          0.40.0 license:          BSD3 license-file:     LICENSE copyright:        Stephen Tetley <stephen.tetley@gmail.com>@@ -9,80 +9,129 @@ synopsis:         Pure Haskell PostScript and SVG generation.  description:   .-  Wumpus is a low-level library for generating static 2D vector -  pictures, its salient feature is portability due to no FFI -  dependencies. It can generate PostScript (EPS) files and SVG -  files. The generated PostScript code is plain [1] and reasonably +  Wumpus-Core is a low-level library for generating static 2D +  vector pictures, its salient feature is portability due to no +  FFI dependencies. It can generate PostScript (EPS) files and SVG +  files. The generated PostScript code is plain and reasonably    efficient as the use of stack operations, i.e @gsave@ and -  @grestore@, is minimized.+  @grestore@, is minimized.    .-  Wumpus makes pictures from /paths/ and text /labels/. Paths +  Although Wumpus-Core only generates vector output, the generated +  PostScript can be interpreted by GraphicsMagick or a similar +  tool to convert EPS files into bitmap image files (e.g JPEGs).+  .+  Wumpus-Core makes pictures from /paths/ and text /labels/. Paths    themselves are made from points. The usual affine    transformations (rotations, scaling, translations) can be-  applied to Pictures. Unlike PostScript there is no -  notion of a current point, Wumpus builds pictures in a-  coordinate-free style. +  applied to Pictures. Unlike PostScript there is no notion of a +  current point, Wumpus-Core builds pictures in a coordinate-free +  style.    .   GENERAL DRAWBACKS...   .-  For actually drawing pictures, diagrams, etc. Wumpus is very -  low-level. There is a supplemantary package @wumpus-basic@ +  For actually building pictures, diagrams, etc. Wumpus-Core is +  very low-level. There is a supplementary package @Wumpus-Basic@    available that helps create certain types of diagram, but it is   experimental - functionality is added and dropped between    releases, it has no stable API.   .-  Some of the design decisions made for @wumpus-core@ are not -  sophisticated (e.g. how attributes like colour are handled, -  and how the bounding boxes of text labels are calculated), so -  Wumpus might be limited compared to other systems. However, -  the design permits a fairly simple implementation, which is a -  priority. +  Some of the design decisions made for Wumpus-Core are not +  sophisticated (e.g. how path and text attributes like colour are +  handled, and how the bounding boxes of text labels are +  calculated), so Wumpus might be limited compared to other +  systems. However, the design permits a fairly simple +  implementation, which is a priority.    .  -  NOTE version 0.37.0 - there will be no release of Wumpus-Basic-  to match this release of Wumpus-Core. Wumpus-Basic is -  undergoing substantial change to accommodate glyph metrics and-  thus enable proper text bounding boxes and right and center-  aligned text. The improvements to Wumpus-Core merit a release-  so that there is not a large hiatus between the APIs of the -  Hackage published latest version and the SVN repository.+  UPDATING to 0.40.0   .+  @Core.Picture@ API change - the path construction function has +  changed from @path@ to @primPath@. The type of the path segments+  has changed, the functions @lineTo@ and @curveTo@ now build+  @AbsPathSegments@ and @primPath@ consumes @AbsPathSegments@.   .-  \[1\] Because the output is simple, straight-line PostScript -  code, it is possible to use GraphicsMagick or a similar tool -  to convert EPS files generated by Wumpus to many other formats -  (bitmaps). +  The Text API has changed substantially, however most user code+  should only need minor changes. The functions @writePS_latin1@, +  @writeEPS_latin1@ and @writeSVG_latin1@ have been removed, code +  should be changed to use @writePS@, @writeEPS@ and and +  @writeSVG@ respectively. These three functions no longer take a +  @TextEncoder@ argument as TextEncoders no longer exist.   .+  The Font Size API has also changed substantially. It now +  exports a more consistent set of metrics (consistent with what +  is present in font files - the previous version was derived +  from hand measurements). It also adds a margin to bounding box+  calculations, again this is more consistent with how font files +  actually work.   .+  The handling of escaped special characters is now more +  consistent and the escaping mecahnism has been clarified +  (previously the documentation and the implementation were at +  odds): PostScript glyph names are delimited between @&@ +  (ampersand) and @;@ (semi), Unicode code points are delimited +  by @&\#@ (ampersand-hash) and @;@ (semi). Note Wumpus silently +  drops mal-formed escape charcters, for robustness this is +  preferable to throwing a runtime error, but it does mean the+  output needs visually checking.+  .   Changelog:   . -  0.36.0 to 0.37.0:+  0.37.0 to 0.40.0:    .-  * The bounding box constructors have been renamed - @bbox@ is -    now @boundingBox@ and @obbox@ becomes @oboundingBox@. The -    rationale for this change is that the names very cryptic in -    the first place and the constructors are used infrequently -    when @bbox@ in particular makes a descriptive variable name.+  * Text handling substantially revised. SVG text output is now +    better aligned to Unicode. The encoding tables for PostScript+    have been re-thought, the previous implementation had some +    serious design flaws that should now be rectified.   .-  * Changes to the Picture and Primitive types to enable better-    concatenation which is used heavily by Wumpus-Basic. The -    Picture API exposes a new function @primCat@.+  * The rules for escaping special characters has been clarified.+    Previously the documentation suggested +    @ampersand-name-semicolon@ could be used to escape glyph names+    however only @ampersand-hash-name-semicolon@ worked.+    @ampersand-name-semicolon@ is now the correct way. The +    ampersand-hash prefix is for numeric literals - +    @ampersand-hash-num_literal-semicolon@.   .-  * SVG /font delta context/ change - font deltas are now -    annotated on Primitives not Pictures. The type of the -    function @fontDeltaContext@ in @Core.Picture@ has changed -    accordingly.+  * Versions of the textlabel functions have been added to +    @Core.Picture@ for escape-parsed text. It is useful for +    higher-level software to escape the text, do some calculations +    then render it - going back to un-escaped text for the +    rendering would be inefficient.   .-  * SVG hyperlink change - hyperlinks no longer group primitives-    (although a group of primitives can be hyperlinked). The -    function @xlinkGroup@ has been removed from @Core.Picture@, -    it is replaced by @xlink@. Primitives are now grouped with the-    function @primGroup@.+  * The internal representation of paths has changed. They are now +    represented as start-point plus list of /relative/ path +    segments rather than start-point plus list of absolute path +    segments. Using relative path segments makes it cheaper to+    move paths with @translate@, although calculating the bounding+    box and rendering to PostScript is more expensive. The +    rationale for the change is that to make complex pictures, +    paths are potentially moved many times but the other +    operations are only performed once.   .-  * @Core.Picture@ - the argument order for the function -    @rtextlabel@ has been changed, the positions of the angle and -    bottom-left corner have been swapped.+  * Internal change to Primitives and the PrimCTM - ellipses and+    labels no longer have a point (center or baseline left)+    as an element in the datatype, the point is now represented +    within the PrimCTM.   .+  * Name change to @Core.Picture@ API - the path construction +    function @path@ has been renamed to @primPath@.   .+  * Name change in @Core.FontSize@, the function @textBoundsEnc@+    has been renamed to @textBoundsEsc@. Wumpus-Core now calls +    strings that have been parsed for escape characters +    /Escaped Text/ rather than /Encoded Text/.+  .+  * Fixed bug where ellipse rotation and scaling calculated the +    wrong bounding box.+  . +  * Fixed bug in @illustrateControlPoints@ where the control points+    were drawn but the original primitive was lost. +  .+  * Added initial support for arbitrary SVG attributes (e.g. +    onmouseover handlers) via @annotateGroup@ in @Core.Picture@. +    Arbitrary SVG \"defs\" can be written into the defs prologue +    by using @writeSVG_defs@ instead of @writeSVG@. This +    functionality is mostly untested!+  .+  . build-type:         Simple stability:          unstable cabal-version:      >= 1.2@@ -96,10 +145,12 @@   demo/AffineTestBase.hs,   demo/DeltaPic.hs,   demo/FontMetrics.hs,+  demo/Hyperlink.hs,   demo/KernPic.hs,   demo/LabelPic.hs,   demo/Latin1Pic.hs,   demo/MultiPic.hs,+  demo/TextBBox.hs,   demo/TransformEllipse.hs,   demo/TransformPath.hs,   demo/TransformTextlabel.hs,@@ -130,10 +181,12 @@     Wumpus.Core.OutputSVG,     Wumpus.Core.Picture,     Wumpus.Core.PtSize,-    Wumpus.Core.Text.DefaultEncoder,-    Wumpus.Core.Text.Encoder,-    Wumpus.Core.Text.Latin1,-    Wumpus.Core.Text.SymbolFont,+    Wumpus.Core.Text.Base,+    Wumpus.Core.Text.GlyphIndices,+    Wumpus.Core.Text.GlyphNames,+    Wumpus.Core.Text.Latin1Encoding,+    Wumpus.Core.Text.StandardEncoding,+    Wumpus.Core.Text.Symbol,     Wumpus.Core.VersionNumber,     Wumpus.Core.WumpusTypes @@ -142,7 +195,6 @@     Wumpus.Core.PictureInternal,     Wumpus.Core.PostScriptDoc,     Wumpus.Core.SVGDoc,-    Wumpus.Core.Text.TextInternal,     Wumpus.Core.TrafoInternal,     Wumpus.Core.Utils.Common,     Wumpus.Core.Utils.JoinList,