module Opentype.Fileformat.Unicode.PostNames
(CodePoint, codepointName, hasDescriptiveName, nameToCodepoint,
postscriptIndex, postscriptName, postscriptNames)
where
import qualified Data.Map.Strict as M
import qualified Data.HashMap.Strict as HM
import Text.Printf
import qualified Data.Set as S
import Opentype.Fileformat
import Data.Tuple (swap)
import Data.Word
import qualified Data.Vector as V
import Data.Char
import Data.Maybe (fromMaybe)
import Data.List (isPrefixOf)
type CodePoint = Int
codepointName :: CodePoint -> String
codepointName cp =
case M.lookup cp codeMap of
Just n -> n
Nothing
| cp > 0xffff -> printf "u%06x" cp
| otherwise -> printf "uni%04x" cp
hasDescriptiveName :: CodePoint -> Bool
hasDescriptiveName cp = M.member cp codeMap
nameToCodepoint :: String -> Maybe CodePoint
nameToCodepoint name
| prefix == "uni" &&
nDigits == 4 =
Just $ foldl (\t d -> t*16 + fromIntegral (digitToInt d))
0 hexNum
| prefix == "u" &&
nDigits >= 4 &&
nDigits <= 6 =
Just $ foldl (\t d -> t*16 + fromIntegral (digitToInt d))
0 hexNum
| otherwise = HM.lookup prefix nameMap
where
(prefix, r) = span isAlpha name
hexNum = takeWhile isHexDigit r
nDigits = length hexNum
nameMap :: HM.HashMap String CodePoint
nameMap = HM.fromList $ map swap aglfn
codeMap :: M.Map CodePoint String
codeMap = M.fromList aglfn
postscriptIndex :: String -> Maybe Int
postscriptIndex n = HM.lookup n postscriptIndexMap
postscriptName :: Int -> Maybe String
postscriptName i
| i < 0 || i >= V.length postscriptNames = Nothing
| otherwise = Just $ postscriptNames V.! i
postscriptIndexMap :: HM.HashMap String Int
postscriptIndexMap =
HM.fromList $
zip (V.toList postscriptNames) [1..]
aglfn :: [(CodePoint, String)]
aglfn = [(0x0041,"A"),
(0x00C6,"AE"),
(0x01FC,"AEacute"),
(0x00C1,"Aacute"),
(0x0102,"Abreve"),
(0x00C2,"Acircumflex"),
(0x00C4,"Adieresis"),
(0x00C0,"Agrave"),
(0x0391,"Alpha"),
(0x0386,"Alphatonos"),
(0x0100,"Amacron"),
(0x0104,"Aogonek"),
(0x00C5,"Aring"),
(0x01FA,"Aringacute"),
(0x00C3,"Atilde"),
(0x0042,"B"),
(0x0392,"Beta"),
(0x0043,"C"),
(0x0106,"Cacute"),
(0x010C,"Ccaron"),
(0x00C7,"Ccedilla"),
(0x0108,"Ccircumflex"),
(0x010A,"Cdotaccent"),
(0x03A7,"Chi"),
(0x0044,"D"),
(0x010E,"Dcaron"),
(0x0110,"Dcroat"),
(0x2206,"Delta"),
(0x0045,"E"),
(0x00C9,"Eacute"),
(0x0114,"Ebreve"),
(0x011A,"Ecaron"),
(0x00CA,"Ecircumflex"),
(0x00CB,"Edieresis"),
(0x0116,"Edotaccent"),
(0x00C8,"Egrave"),
(0x0112,"Emacron"),
(0x014A,"Eng"),
(0x0118,"Eogonek"),
(0x0395,"Epsilon"),
(0x0388,"Epsilontonos"),
(0x0397,"Eta"),
(0x0389,"Etatonos"),
(0x00D0,"Eth"),
(0x20AC,"Euro"),
(0x0046,"F"),
(0x0047,"G"),
(0x0393,"Gamma"),
(0x011E,"Gbreve"),
(0x01E6,"Gcaron"),
(0x011C,"Gcircumflex"),
(0x0120,"Gdotaccent"),
(0x0048,"H"),
(0x25CF,"H18533"),
(0x25AA,"H18543"),
(0x25AB,"H18551"),
(0x25A1,"H22073"),
(0x0126,"Hbar"),
(0x0124,"Hcircumflex"),
(0x0049,"I"),
(0x0132,"IJ"),
(0x00CD,"Iacute"),
(0x012C,"Ibreve"),
(0x00CE,"Icircumflex"),
(0x00CF,"Idieresis"),
(0x0130,"Idotaccent"),
(0x2111,"Ifraktur"),
(0x00CC,"Igrave"),
(0x012A,"Imacron"),
(0x012E,"Iogonek"),
(0x0399,"Iota"),
(0x03AA,"Iotadieresis"),
(0x038A,"Iotatonos"),
(0x0128,"Itilde"),
(0x004A,"J"),
(0x0134,"Jcircumflex"),
(0x004B,"K"),
(0x039A,"Kappa"),
(0x004C,"L"),
(0x0139,"Lacute"),
(0x039B,"Lambda"),
(0x013D,"Lcaron"),
(0x013F,"Ldot"),
(0x0141,"Lslash"),
(0x004D,"M"),
(0x039C,"Mu"),
(0x004E,"N"),
(0x0143,"Nacute"),
(0x0147,"Ncaron"),
(0x00D1,"Ntilde"),
(0x039D,"Nu"),
(0x004F,"O"),
(0x0152,"OE"),
(0x00D3,"Oacute"),
(0x014E,"Obreve"),
(0x00D4,"Ocircumflex"),
(0x00D6,"Odieresis"),
(0x00D2,"Ograve"),
(0x01A0,"Ohorn"),
(0x0150,"Ohungarumlaut"),
(0x014C,"Omacron"),
(0x2126,"Omega"),
(0x038F,"Omegatonos"),
(0x039F,"Omicron"),
(0x038C,"Omicrontonos"),
(0x00D8,"Oslash"),
(0x01FE,"Oslashacute"),
(0x00D5,"Otilde"),
(0x0050,"P"),
(0x03A6,"Phi"),
(0x03A0,"Pi"),
(0x03A8,"Psi"),
(0x0051,"Q"),
(0x0052,"R"),
(0x0154,"Racute"),
(0x0158,"Rcaron"),
(0x211C,"Rfraktur"),
(0x03A1,"Rho"),
(0x0053,"S"),
(0x250C,"SF010000"),
(0x2514,"SF020000"),
(0x2510,"SF030000"),
(0x2518,"SF040000"),
(0x253C,"SF050000"),
(0x252C,"SF060000"),
(0x2534,"SF070000"),
(0x251C,"SF080000"),
(0x2524,"SF090000"),
(0x2500,"SF100000"),
(0x2502,"SF110000"),
(0x2561,"SF190000"),
(0x2562,"SF200000"),
(0x2556,"SF210000"),
(0x2555,"SF220000"),
(0x2563,"SF230000"),
(0x2551,"SF240000"),
(0x2557,"SF250000"),
(0x255D,"SF260000"),
(0x255C,"SF270000"),
(0x255B,"SF280000"),
(0x255E,"SF360000"),
(0x255F,"SF370000"),
(0x255A,"SF380000"),
(0x2554,"SF390000"),
(0x2569,"SF400000"),
(0x2566,"SF410000"),
(0x2560,"SF420000"),
(0x2550,"SF430000"),
(0x256C,"SF440000"),
(0x2567,"SF450000"),
(0x2568,"SF460000"),
(0x2564,"SF470000"),
(0x2565,"SF480000"),
(0x2559,"SF490000"),
(0x2558,"SF500000"),
(0x2552,"SF510000"),
(0x2553,"SF520000"),
(0x256B,"SF530000"),
(0x256A,"SF540000"),
(0x015A,"Sacute"),
(0x0160,"Scaron"),
(0x015E,"Scedilla"),
(0x015C,"Scircumflex"),
(0x03A3,"Sigma"),
(0x0054,"T"),
(0x03A4,"Tau"),
(0x0166,"Tbar"),
(0x0164,"Tcaron"),
(0x0398,"Theta"),
(0x00DE,"Thorn"),
(0x0055,"U"),
(0x00DA,"Uacute"),
(0x016C,"Ubreve"),
(0x00DB,"Ucircumflex"),
(0x00DC,"Udieresis"),
(0x00D9,"Ugrave"),
(0x01AF,"Uhorn"),
(0x0170,"Uhungarumlaut"),
(0x016A,"Umacron"),
(0x0172,"Uogonek"),
(0x03A5,"Upsilon"),
(0x03D2,"Upsilon1"),
(0x03AB,"Upsilondieresis"),
(0x038E,"Upsilontonos"),
(0x016E,"Uring"),
(0x0168,"Utilde"),
(0x0056,"V"),
(0x0057,"W"),
(0x1E82,"Wacute"),
(0x0174,"Wcircumflex"),
(0x1E84,"Wdieresis"),
(0x1E80,"Wgrave"),
(0x0058,"X"),
(0x039E,"Xi"),
(0x0059,"Y"),
(0x00DD,"Yacute"),
(0x0176,"Ycircumflex"),
(0x0178,"Ydieresis"),
(0x1EF2,"Ygrave"),
(0x005A,"Z"),
(0x0179,"Zacute"),
(0x017D,"Zcaron"),
(0x017B,"Zdotaccent"),
(0x0396,"Zeta"),
(0x0061,"a"),
(0x00E1,"aacute"),
(0x0103,"abreve"),
(0x00E2,"acircumflex"),
(0x00B4,"acute"),
(0x0301,"acutecomb"),
(0x00E4,"adieresis"),
(0x00E6,"ae"),
(0x01FD,"aeacute"),
(0x00E0,"agrave"),
(0x2135,"aleph"),
(0x03B1,"alpha"),
(0x03AC,"alphatonos"),
(0x0101,"amacron"),
(0x0026,"ampersand"),
(0x2220,"angle"),
(0x2329,"angleleft"),
(0x232A,"angleright"),
(0x0387,"anoteleia"),
(0x0105,"aogonek"),
(0x2248,"approxequal"),
(0x00E5,"aring"),
(0x01FB,"aringacute"),
(0x2194,"arrowboth"),
(0x21D4,"arrowdblboth"),
(0x21D3,"arrowdbldown"),
(0x21D0,"arrowdblleft"),
(0x21D2,"arrowdblright"),
(0x21D1,"arrowdblup"),
(0x2193,"arrowdown"),
(0x2190,"arrowleft"),
(0x2192,"arrowright"),
(0x2191,"arrowup"),
(0x2195,"arrowupdn"),
(0x21A8,"arrowupdnbse"),
(0x005E,"asciicircum"),
(0x007E,"asciitilde"),
(0x002A,"asterisk"),
(0x2217,"asteriskmath"),
(0x0040,"at"),
(0x00E3,"atilde"),
(0x0062,"b"),
(0x005C,"backslash"),
(0x007C,"bar"),
(0x03B2,"beta"),
(0x2588,"block"),
(0x007B,"braceleft"),
(0x007D,"braceright"),
(0x005B,"bracketleft"),
(0x005D,"bracketright"),
(0x02D8,"breve"),
(0x00A6,"brokenbar"),
(0x2022,"bullet"),
(0x0063,"c"),
(0x0107,"cacute"),
(0x02C7,"caron"),
(0x21B5,"carriagereturn"),
(0x010D,"ccaron"),
(0x00E7,"ccedilla"),
(0x0109,"ccircumflex"),
(0x010B,"cdotaccent"),
(0x00B8,"cedilla"),
(0x00A2,"cent"),
(0x03C7,"chi"),
(0x25CB,"circle"),
(0x2297,"circlemultiply"),
(0x2295,"circleplus"),
(0x02C6,"circumflex"),
(0x2663,"club"),
(0x003A,"colon"),
(0x20A1,"colonmonetary"),
(0x002C,"comma"),
(0x2245,"congruent"),
(0x00A9,"copyright"),
(0x00A4,"currency"),
(0x0064,"d"),
(0x2020,"dagger"),
(0x2021,"daggerdbl"),
(0x010F,"dcaron"),
(0x0111,"dcroat"),
(0x00B0,"degree"),
(0x03B4,"delta"),
(0x2666,"diamond"),
(0x00A8,"dieresis"),
(0x0385,"dieresistonos"),
(0x00F7,"divide"),
(0x2593,"dkshade"),
(0x2584,"dnblock"),
(0x0024,"dollar"),
(0x20AB,"dong"),
(0x02D9,"dotaccent"),
(0x0323,"dotbelowcomb"),
(0x0131,"dotlessi"),
(0x22C5,"dotmath"),
(0x0065,"e"),
(0x00E9,"eacute"),
(0x0115,"ebreve"),
(0x011B,"ecaron"),
(0x00EA,"ecircumflex"),
(0x00EB,"edieresis"),
(0x0117,"edotaccent"),
(0x00E8,"egrave"),
(0x0038,"eight"),
(0x2208,"element"),
(0x2026,"ellipsis"),
(0x0113,"emacron"),
(0x2014,"emdash"),
(0x2205,"emptyset"),
(0x2013,"endash"),
(0x014B,"eng"),
(0x0119,"eogonek"),
(0x03B5,"epsilon"),
(0x03AD,"epsilontonos"),
(0x003D,"equal"),
(0x2261,"equivalence"),
(0x212E,"estimated"),
(0x03B7,"eta"),
(0x03AE,"etatonos"),
(0x00F0,"eth"),
(0x0021,"exclam"),
(0x203C,"exclamdbl"),
(0x00A1,"exclamdown"),
(0x2203,"existential"),
(0x0066,"f"),
(0x2640,"female"),
(0x2012,"figuredash"),
(0x25A0,"filledbox"),
(0x25AC,"filledrect"),
(0x0035,"five"),
(0x215D,"fiveeighths"),
(0x0192,"florin"),
(0x0034,"four"),
(0x2044,"fraction"),
(0x20A3,"franc"),
(0x0067,"g"),
(0x03B3,"gamma"),
(0x011F,"gbreve"),
(0x01E7,"gcaron"),
(0x011D,"gcircumflex"),
(0x0121,"gdotaccent"),
(0x00DF,"germandbls"),
(0x2207,"gradient"),
(0x0060,"grave"),
(0x0300,"gravecomb"),
(0x003E,"greater"),
(0x2265,"greaterequal"),
(0x00AB,"guillemotleft"),
(0x00BB,"guillemotright"),
(0x2039,"guilsinglleft"),
(0x203A,"guilsinglright"),
(0x0068,"h"),
(0x0127,"hbar"),
(0x0125,"hcircumflex"),
(0x2665,"heart"),
(0x0309,"hookabovecomb"),
(0x2302,"house"),
(0x02DD,"hungarumlaut"),
(0x002D,"hyphen"),
(0x0069,"i"),
(0x00ED,"iacute"),
(0x012D,"ibreve"),
(0x00EE,"icircumflex"),
(0x00EF,"idieresis"),
(0x00EC,"igrave"),
(0x0133,"ij"),
(0x012B,"imacron"),
(0x221E,"infinity"),
(0x222B,"integral"),
(0x2321,"integralbt"),
(0x2320,"integraltp"),
(0x2229,"intersection"),
(0x25D8,"invbullet"),
(0x25D9,"invcircle"),
(0x263B,"invsmileface"),
(0x012F,"iogonek"),
(0x03B9,"iota"),
(0x03CA,"iotadieresis"),
(0x0390,"iotadieresistonos"),
(0x03AF,"iotatonos"),
(0x0129,"itilde"),
(0x006A,"j"),
(0x0135,"jcircumflex"),
(0x006B,"k"),
(0x03BA,"kappa"),
(0x0138,"kgreenlandic"),
(0x006C,"l"),
(0x013A,"lacute"),
(0x03BB,"lambda"),
(0x013E,"lcaron"),
(0x0140,"ldot"),
(0x003C,"less"),
(0x2264,"lessequal"),
(0x258C,"lfblock"),
(0x20A4,"lira"),
(0x2227,"logicaland"),
(0x00AC,"logicalnot"),
(0x2228,"logicalor"),
(0x017F,"longs"),
(0x25CA,"lozenge"),
(0x0142,"lslash"),
(0x2591,"ltshade"),
(0x006D,"m"),
(0x00AF,"macron"),
(0x2642,"male"),
(0x2212,"minus"),
(0x2032,"minute"),
(0x00B5,"mu"),
(0x00D7,"multiply"),
(0x266A,"musicalnote"),
(0x266B,"musicalnotedbl"),
(0x006E,"n"),
(0x0144,"nacute"),
(0x0149,"napostrophe"),
(0x0148,"ncaron"),
(0x0039,"nine"),
(0x2209,"notelement"),
(0x2260,"notequal"),
(0x2284,"notsubset"),
(0x00F1,"ntilde"),
(0x03BD,"nu"),
(0x0023,"numbersign"),
(0x006F,"o"),
(0x00F3,"oacute"),
(0x014F,"obreve"),
(0x00F4,"ocircumflex"),
(0x00F6,"odieresis"),
(0x0153,"oe"),
(0x02DB,"ogonek"),
(0x00F2,"ograve"),
(0x01A1,"ohorn"),
(0x0151,"ohungarumlaut"),
(0x014D,"omacron"),
(0x03C9,"omega"),
(0x03D6,"omega1"),
(0x03CE,"omegatonos"),
(0x03BF,"omicron"),
(0x03CC,"omicrontonos"),
(0x0031,"one"),
(0x2024,"onedotenleader"),
(0x215B,"oneeighth"),
(0x00BD,"onehalf"),
(0x00BC,"onequarter"),
(0x2153,"onethird"),
(0x25E6,"openbullet"),
(0x00AA,"ordfeminine"),
(0x00BA,"ordmasculine"),
(0x221F,"orthogonal"),
(0x00F8,"oslash"),
(0x01FF,"oslashacute"),
(0x00F5,"otilde"),
(0x0070,"p"),
(0x00B6,"paragraph"),
(0x0028,"parenleft"),
(0x0029,"parenright"),
(0x2202,"partialdiff"),
(0x0025,"percent"),
(0x002E,"period"),
(0x00B7,"periodcentered"),
(0x22A5,"perpendicular"),
(0x2030,"perthousand"),
(0x20A7,"peseta"),
(0x03C6,"phi"),
(0x03D5,"phi1"),
(0x03C0,"pi"),
(0x002B,"plus"),
(0x00B1,"plusminus"),
(0x211E,"prescription"),
(0x220F,"product"),
(0x2282,"propersubset"),
(0x2283,"propersuperset"),
(0x221D,"proportional"),
(0x03C8,"psi"),
(0x0071,"q"),
(0x003F,"question"),
(0x00BF,"questiondown"),
(0x0022,"quotedbl"),
(0x201E,"quotedblbase"),
(0x201C,"quotedblleft"),
(0x201D,"quotedblright"),
(0x2018,"quoteleft"),
(0x201B,"quotereversed"),
(0x2019,"quoteright"),
(0x201A,"quotesinglbase"),
(0x0027,"quotesingle"),
(0x0072,"r"),
(0x0155,"racute"),
(0x221A,"radical"),
(0x0159,"rcaron"),
(0x2286,"reflexsubset"),
(0x2287,"reflexsuperset"),
(0x00AE,"registered"),
(0x2310,"revlogicalnot"),
(0x03C1,"rho"),
(0x02DA,"ring"),
(0x2590,"rtblock"),
(0x0073,"s"),
(0x015B,"sacute"),
(0x0161,"scaron"),
(0x015F,"scedilla"),
(0x015D,"scircumflex"),
(0x2033,"second"),
(0x00A7,"section"),
(0x003B,"semicolon"),
(0x0037,"seven"),
(0x215E,"seveneighths"),
(0x2592,"shade"),
(0x03C3,"sigma"),
(0x03C2,"sigma1"),
(0x223C,"similar"),
(0x0036,"six"),
(0x002F,"slash"),
(0x263A,"smileface"),
(0x0020,"space"),
(0x2660,"spade"),
(0x00A3,"sterling"),
(0x220B,"suchthat"),
(0x2211,"summation"),
(0x263C,"sun"),
(0x0074,"t"),
(0x03C4,"tau"),
(0x0167,"tbar"),
(0x0165,"tcaron"),
(0x2234,"therefore"),
(0x03B8,"theta"),
(0x03D1,"theta1"),
(0x00FE,"thorn"),
(0x0033,"three"),
(0x215C,"threeeighths"),
(0x00BE,"threequarters"),
(0x02DC,"tilde"),
(0x0303,"tildecomb"),
(0x0384,"tonos"),
(0x2122,"trademark"),
(0x25BC,"triagdn"),
(0x25C4,"triaglf"),
(0x25BA,"triagrt"),
(0x25B2,"triagup"),
(0x0032,"two"),
(0x2025,"twodotenleader"),
(0x2154,"twothirds"),
(0x0075,"u"),
(0x00FA,"uacute"),
(0x016D,"ubreve"),
(0x00FB,"ucircumflex"),
(0x00FC,"udieresis"),
(0x00F9,"ugrave"),
(0x01B0,"uhorn"),
(0x0171,"uhungarumlaut"),
(0x016B,"umacron"),
(0x005F,"underscore"),
(0x2017,"underscoredbl"),
(0x222A,"union"),
(0x2200,"universal"),
(0x0173,"uogonek"),
(0x2580,"upblock"),
(0x03C5,"upsilon"),
(0x03CB,"upsilondieresis"),
(0x03B0,"upsilondieresistonos"),
(0x03CD,"upsilontonos"),
(0x016F,"uring"),
(0x0169,"utilde"),
(0x0076,"v"),
(0x0077,"w"),
(0x1E83,"wacute"),
(0x0175,"wcircumflex"),
(0x1E85,"wdieresis"),
(0x2118,"weierstrass"),
(0x1E81,"wgrave"),
(0x0078,"x"),
(0x03BE,"xi"),
(0x0079,"y"),
(0x00FD,"yacute"),
(0x0177,"ycircumflex"),
(0x00FF,"ydieresis"),
(0x00A5,"yen"),
(0x1EF3,"ygrave"),
(0x007A,"z"),
(0x017A,"zacute"),
(0x017E,"zcaron"),
(0x017C,"zdotaccent"),
(0x0030,"zero"),
(0x03B6,"zeta")]
postscriptNames :: V.Vector String
postscriptNames =
V.fromList
[".notdef",
".null",
"nonmarkingreturn",
"space",
"exclam",
"quotedbl",
"numbersign",
"dollar",
"percent",
"ampersand",
"quotesingle",
"parenleft",
"parenright",
"asterisk",
"plus",
"comma",
"hyphen",
"period",
"slash",
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"colon",
"semicolon",
"less",
"equal",
"greater",
"question",
"at",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
"bracketleft",
"backslash",
"bracketright",
"asciicircum",
"underscore",
"grave",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
"x",
"y",
"z",
"braceleft",
"bar",
"braceright",
"asciitilde",
"Adieresis",
"Aring",
"Ccedilla",
"Eacute",
"Ntilde",
"Odieresis",
"Udieresis",
"aacute",
"agrave",
"acircumflex",
"adieresis",
"atilde",
"aring",
"ccedilla",
"eacute",
"egrave",
"ecircumflex",
"edieresis",
"iacute",
"igrave",
"icircumflex",
"idieresis",
"ntilde",
"oacute",
"ograve",
"ocircumflex",
"odieresis",
"otilde",
"uacute",
"ugrave",
"ucircumflex",
"udieresis",
"dagger",
"degree",
"cent",
"sterling",
"section",
"bullet",
"paragraph",
"germandbls",
"registered",
"copyright",
"trademark",
"acute",
"dieresis",
"notequal",
"AE",
"Oslash",
"infinity",
"plusminus",
"lessequal",
"greaterequal",
"yen",
"mu",
"partialdiff",
"summation",
"product",
"pi",
"integral",
"ordfeminine",
"ordmasculine",
"Omega",
"ae",
"oslash",
"questiondown",
"exclamdown",
"logicalnot",
"radical",
"florin",
"approxequal",
"Delta",
"guillemotleft",
"guillemotright",
"ellipsis",
"nonbreakingspace",
"Agrave",
"Atilde",
"Otilde",
"OE",
"oe",
"endash",
"emdash",
"quotedblleft",
"quotedblright",
"quoteleft",
"quoteright",
"divide",
"lozenge",
"ydieresis",
"Ydieresis",
"fraction",
"currency",
"guilsinglleft",
"guilsinglright",
"fi",
"fl",
"daggerdbl",
"periodcentered",
"quotesinglbase",
"quotedblbase",
"perthousand",
"Acircumflex",
"Ecircumflex",
"Aacute",
"Edieresis",
"Egrave",
"Iacute",
"Icircumflex",
"Idieresis",
"Igrave",
"Oacute",
"Ocircumflex",
"apple",
"Ograve",
"Uacute",
"Ucircumflex",
"Ugrave",
"dotlessi",
"circumflex",
"tilde",
"macron",
"breve",
"dotaccent",
"ring",
"cedilla",
"hungarumlaut",
"ogonek",
"caron",
"Lslash",
"lslash",
"Scaron",
"scaron",
"Zcaron",
"zcaron",
"brokenbar",
"Eth",
"eth",
"Yacute",
"yacute",
"Thorn",
"thorn",
"minus",
"multiply",
"onesuperior",
"twosuperior",
"threesuperior",
"onehalf",
"onequarter",
"threequarters",
"franc",
"Gbreve",
"gbreve",
"Idotaccent",
"Scedilla",
"scedilla",
"Cacute",
"cacute",
"Ccaron",
"ccaron",
"dcroat"]