git.iko.soy/typeable/pandoc
on master help sign in
Refactored Text.Pandoc.CharacterReferences.
583536afiddlosopher
src/Text/Pandoc/CharacterReferences.hs+271−279
@@ -37,36 +37,28 @@ import qualified Data.Map as Map
37
37
38-- | Parse character entity.
38-- | Parse character entity.
39characterReference :: GenParser Char st Char
39characterReference :: GenParser Char st Char
40−characterReference = characterEntity <|>
40+characterReference = try $ do
41− hexadecimalCharacterReference <|>
42− decimalCharacterReference <?>
43− "character entity"
44−
45−-- | Parse character entity.
46−characterEntity :: GenParser Char st Char
47−characterEntity = try $ do
48 st <- char '&'
41 st <- char '&'
49− body <- many1 alphaNum
42+ character <- numRef <|> entity
50 end <- char ';'
43 end <- char ';'
51− let entity = "&" ++ body ++ ";"
44+ return character
52− return $ Map.findWithDefault '?' entity entityTable
53−
54−-- | Parse hexadecimal entity.
55−hexadecimalCharacterReference :: GenParser Char st Char
56−hexadecimalCharacterReference = try $ do
57− st <- string "&#"
58− hex <- oneOf "Xx"
59− body <- many1 (oneOf "0123456789ABCDEFabcdef")
60− end <- char ';'
61− return $ chr $ read ('0':'x':body)
62
45
63−-- | Parse decimal entity.
64−decimalCharacterReference :: GenParser Char st Char
46+numRef :: GenParser Char st Char
65−decimalCharacterReference = try $ do
47+numRef = do
66− st <- string "&#"
48+ char '#'
49+ num <- hexNum <|> decNum
50+ return $ chr $ num
51+
52+hexNum :: GenParser Char st Int
53+hexNum = oneOf "Xx" >> many1 hexDigit >>= return . read . ("0x" ++)
54+
55+decNum :: GenParser Char st Int
67− body <- many1 digit
56+decNum = many1 digit >>= return . read
68− end <- char ';'
57+
69− return $ chr $ read body
58+entity :: GenParser Char st Char
59+entity = do
60+ body <- many1 alphaNum
61+ return $ Map.findWithDefault '?' body entityTable
70
62
71-- | Convert entities in a string to characters.
63-- | Convert entities in a string to characters.
72decodeCharacterReferences :: String -> String
64decodeCharacterReferences :: String -> String
@@ -80,256 +72,256 @@ entityTable = Map.fromList entityTableList
80
72
81entityTableList :: [(String, Char)]
73entityTableList :: [(String, Char)]
82entityTableList = [
74entityTableList = [
83− ("&quot;", chr 34),
75+ ("quot", chr 34),
84− ("&amp;", chr 38),
76+ ("amp", chr 38),
85− ("&lt;", chr 60),
77+ ("lt", chr 60),
86− ("&gt;", chr 62),
78+ ("gt", chr 62),
87− ("&nbsp;", chr 160),
79+ ("nbsp", chr 160),
88− ("&iexcl;", chr 161),
80+ ("iexcl", chr 161),
89− ("&cent;", chr 162),
81+ ("cent", chr 162),
90− ("&pound;", chr 163),
82+ ("pound", chr 163),
91− ("&curren;", chr 164),
83+ ("curren", chr 164),
92− ("&yen;", chr 165),
84+ ("yen", chr 165),
93− ("&brvbar;", chr 166),
85+ ("brvbar", chr 166),
94− ("&sect;", chr 167),
86+ ("sect", chr 167),
95− ("&uml;", chr 168),
87+ ("uml", chr 168),
96− ("&copy;", chr 169),
88+ ("copy", chr 169),
97− ("&ordf;", chr 170),
89+ ("ordf", chr 170),
98− ("&laquo;", chr 171),
90+ ("laquo", chr 171),
99− ("&not;", chr 172),
91+ ("not", chr 172),
100− ("&shy;", chr 173),
92+ ("shy", chr 173),
101− ("&reg;", chr 174),
93+ ("reg", chr 174),
102− ("&macr;", chr 175),
94+ ("macr", chr 175),
103− ("&deg;", chr 176),
95+ ("deg", chr 176),
104− ("&plusmn;", chr 177),
96+ ("plusmn", chr 177),
105− ("&sup2;", chr 178),
97+ ("sup2", chr 178),
106− ("&sup3;", chr 179),
98+ ("sup3", chr 179),
107− ("&acute;", chr 180),
99+ ("acute", chr 180),
108− ("&micro;", chr 181),
100+ ("micro", chr 181),
109− ("&para;", chr 182),
101+ ("para", chr 182),
110− ("&middot;", chr 183),
102+ ("middot", chr 183),
111− ("&cedil;", chr 184),
103+ ("cedil", chr 184),
112− ("&sup1;", chr 185),
104+ ("sup1", chr 185),
113− ("&ordm;", chr 186),
105+ ("ordm", chr 186),
114− ("&raquo;", chr 187),
106+ ("raquo", chr 187),
115− ("&frac14;", chr 188),
107+ ("frac14", chr 188),
116− ("&frac12;", chr 189),
108+ ("frac12", chr 189),
117− ("&frac34;", chr 190),
109+ ("frac34", chr 190),
118− ("&iquest;", chr 191),
110+ ("iquest", chr 191),
119− ("&Agrave;", chr 192),
111+ ("Agrave", chr 192),
120− ("&Aacute;", chr 193),
112+ ("Aacute", chr 193),
121− ("&Acirc;", chr 194),
113+ ("Acirc", chr 194),
122− ("&Atilde;", chr 195),
114+ ("Atilde", chr 195),
123− ("&Auml;", chr 196),
115+ ("Auml", chr 196),
124− ("&Aring;", chr 197),
116+ ("Aring", chr 197),
125− ("&AElig;", chr 198),
117+ ("AElig", chr 198),
126− ("&Ccedil;", chr 199),
118+ ("Ccedil", chr 199),
127− ("&Egrave;", chr 200),
119+ ("Egrave", chr 200),
128− ("&Eacute;", chr 201),
120+ ("Eacute", chr 201),
129− ("&Ecirc;", chr 202),
121+ ("Ecirc", chr 202),
130− ("&Euml;", chr 203),
122+ ("Euml", chr 203),
131− ("&Igrave;", chr 204),
123+ ("Igrave", chr 204),
132− ("&Iacute;", chr 205),
124+ ("Iacute", chr 205),
133− ("&Icirc;", chr 206),
125+ ("Icirc", chr 206),
134− ("&Iuml;", chr 207),
126+ ("Iuml", chr 207),
135− ("&ETH;", chr 208),
127+ ("ETH", chr 208),
136− ("&Ntilde;", chr 209),
128+ ("Ntilde", chr 209),
137− ("&Ograve;", chr 210),
129+ ("Ograve", chr 210),
138− ("&Oacute;", chr 211),
130+ ("Oacute", chr 211),
139− ("&Ocirc;", chr 212),
131+ ("Ocirc", chr 212),
140− ("&Otilde;", chr 213),
132+ ("Otilde", chr 213),
141− ("&Ouml;", chr 214),
133+ ("Ouml", chr 214),
142− ("&times;", chr 215),
134+ ("times", chr 215),
143− ("&Oslash;", chr 216),
135+ ("Oslash", chr 216),
144− ("&Ugrave;", chr 217),
136+ ("Ugrave", chr 217),
145− ("&Uacute;", chr 218),
137+ ("Uacute", chr 218),
146− ("&Ucirc;", chr 219),
138+ ("Ucirc", chr 219),
147− ("&Uuml;", chr 220),
139+ ("Uuml", chr 220),
148− ("&Yacute;", chr 221),
140+ ("Yacute", chr 221),
149− ("&THORN;", chr 222),
141+ ("THORN", chr 222),
150− ("&szlig;", chr 223),
142+ ("szlig", chr 223),
151− ("&agrave;", chr 224),
143+ ("agrave", chr 224),
152− ("&aacute;", chr 225),
144+ ("aacute", chr 225),
153− ("&acirc;", chr 226),
145+ ("acirc", chr 226),
154− ("&atilde;", chr 227),
146+ ("atilde", chr 227),
155− ("&auml;", chr 228),
147+ ("auml", chr 228),
156− ("&aring;", chr 229),
148+ ("aring", chr 229),
157− ("&aelig;", chr 230),
149+ ("aelig", chr 230),
158− ("&ccedil;", chr 231),
150+ ("ccedil", chr 231),
159− ("&egrave;", chr 232),
151+ ("egrave", chr 232),
160− ("&eacute;", chr 233),
152+ ("eacute", chr 233),
161− ("&ecirc;", chr 234),
153+ ("ecirc", chr 234),
162− ("&euml;", chr 235),
154+ ("euml", chr 235),
163− ("&igrave;", chr 236),
155+ ("igrave", chr 236),
164− ("&iacute;", chr 237),
156+ ("iacute", chr 237),
165− ("&icirc;", chr 238),
157+ ("icirc", chr 238),
166− ("&iuml;", chr 239),
158+ ("iuml", chr 239),
167− ("&eth;", chr 240),
159+ ("eth", chr 240),
168− ("&ntilde;", chr 241),
160+ ("ntilde", chr 241),
169− ("&ograve;", chr 242),
161+ ("ograve", chr 242),
170− ("&oacute;", chr 243),
162+ ("oacute", chr 243),
171− ("&ocirc;", chr 244),
163+ ("ocirc", chr 244),
172− ("&otilde;", chr 245),
164+ ("otilde", chr 245),
173− ("&ouml;", chr 246),
165+ ("ouml", chr 246),
174− ("&divide;", chr 247),
166+ ("divide", chr 247),
175− ("&oslash;", chr 248),
167+ ("oslash", chr 248),
176− ("&ugrave;", chr 249),
168+ ("ugrave", chr 249),
177− ("&uacute;", chr 250),
169+ ("uacute", chr 250),
178− ("&ucirc;", chr 251),
170+ ("ucirc", chr 251),
179− ("&uuml;", chr 252),
171+ ("uuml", chr 252),
180− ("&yacute;", chr 253),
172+ ("yacute", chr 253),
181− ("&thorn;", chr 254),
173+ ("thorn", chr 254),
182− ("&yuml;", chr 255),
174+ ("yuml", chr 255),
183− ("&OElig;", chr 338),
175+ ("OElig", chr 338),
184− ("&oelig;", chr 339),
176+ ("oelig", chr 339),
185− ("&Scaron;", chr 352),
177+ ("Scaron", chr 352),
186− ("&scaron;", chr 353),
178+ ("scaron", chr 353),
187− ("&Yuml;", chr 376),
179+ ("Yuml", chr 376),
188− ("&fnof;", chr 402),
180+ ("fnof", chr 402),
189− ("&circ;", chr 710),
181+ ("circ", chr 710),
190− ("&tilde;", chr 732),
182+ ("tilde", chr 732),
191− ("&Alpha;", chr 913),
183+ ("Alpha", chr 913),
192− ("&Beta;", chr 914),
184+ ("Beta", chr 914),
193− ("&Gamma;", chr 915),
185+ ("Gamma", chr 915),
194− ("&Delta;", chr 916),
186+ ("Delta", chr 916),
195− ("&Epsilon;", chr 917),
187+ ("Epsilon", chr 917),
196− ("&Zeta;", chr 918),
188+ ("Zeta", chr 918),
197− ("&Eta;", chr 919),
189+ ("Eta", chr 919),
198− ("&Theta;", chr 920),
190+ ("Theta", chr 920),
199− ("&Iota;", chr 921),
191+ ("Iota", chr 921),
200− ("&Kappa;", chr 922),
192+ ("Kappa", chr 922),
201− ("&Lambda;", chr 923),
193+ ("Lambda", chr 923),
202− ("&Mu;", chr 924),
194+ ("Mu", chr 924),
203− ("&Nu;", chr 925),
195+ ("Nu", chr 925),
204− ("&Xi;", chr 926),
196+ ("Xi", chr 926),
205− ("&Omicron;", chr 927),
197+ ("Omicron", chr 927),
206− ("&Pi;", chr 928),
198+ ("Pi", chr 928),
207− ("&Rho;", chr 929),
199+ ("Rho", chr 929),
208− ("&Sigma;", chr 931),
200+ ("Sigma", chr 931),
209− ("&Tau;", chr 932),
201+ ("Tau", chr 932),
210− ("&Upsilon;", chr 933),
202+ ("Upsilon", chr 933),
211− ("&Phi;", chr 934),
203+ ("Phi", chr 934),
212− ("&Chi;", chr 935),
204+ ("Chi", chr 935),
213− ("&Psi;", chr 936),
205+ ("Psi", chr 936),
214− ("&Omega;", chr 937),
206+ ("Omega", chr 937),
215− ("&alpha;", chr 945),
207+ ("alpha", chr 945),
216− ("&beta;", chr 946),
208+ ("beta", chr 946),
217− ("&gamma;", chr 947),
209+ ("gamma", chr 947),
218− ("&delta;", chr 948),
210+ ("delta", chr 948),
219− ("&epsilon;", chr 949),
211+ ("epsilon", chr 949),
220− ("&zeta;", chr 950),
212+ ("zeta", chr 950),
221− ("&eta;", chr 951),
213+ ("eta", chr 951),
222− ("&theta;", chr 952),
214+ ("theta", chr 952),
223− ("&iota;", chr 953),
215+ ("iota", chr 953),
224− ("&kappa;", chr 954),
216+ ("kappa", chr 954),
225− ("&lambda;", chr 955),
217+ ("lambda", chr 955),
226− ("&mu;", chr 956),
218+ ("mu", chr 956),
227− ("&nu;", chr 957),
219+ ("nu", chr 957),
228− ("&xi;", chr 958),
220+ ("xi", chr 958),
229− ("&omicron;", chr 959),
221+ ("omicron", chr 959),
230− ("&pi;", chr 960),
222+ ("pi", chr 960),
231− ("&rho;", chr 961),
223+ ("rho", chr 961),
232− ("&sigmaf;", chr 962),
224+ ("sigmaf", chr 962),
233− ("&sigma;", chr 963),
225+ ("sigma", chr 963),
234− ("&tau;", chr 964),
226+ ("tau", chr 964),
235− ("&upsilon;", chr 965),
227+ ("upsilon", chr 965),
236− ("&phi;", chr 966),
228+ ("phi", chr 966),
237− ("&chi;", chr 967),
229+ ("chi", chr 967),
238− ("&psi;", chr 968),
230+ ("psi", chr 968),
239− ("&omega;", chr 969),
231+ ("omega", chr 969),
240− ("&thetasym;", chr 977),
232+ ("thetasym", chr 977),
241− ("&upsih;", chr 978),
233+ ("upsih", chr 978),
242− ("&piv;", chr 982),
234+ ("piv", chr 982),
243− ("&ensp;", chr 8194),
235+ ("ensp", chr 8194),
244− ("&emsp;", chr 8195),
236+ ("emsp", chr 8195),
245− ("&thinsp;", chr 8201),
237+ ("thinsp", chr 8201),
246− ("&zwnj;", chr 8204),
238+ ("zwnj", chr 8204),
247− ("&zwj;", chr 8205),
239+ ("zwj", chr 8205),
248− ("&lrm;", chr 8206),
240+ ("lrm", chr 8206),
249− ("&rlm;", chr 8207),
241+ ("rlm", chr 8207),
250− ("&ndash;", chr 8211),
242+ ("ndash", chr 8211),
251− ("&mdash;", chr 8212),
243+ ("mdash", chr 8212),
252− ("&lsquo;", chr 8216),
244+ ("lsquo", chr 8216),
253− ("&rsquo;", chr 8217),
245+ ("rsquo", chr 8217),
254− ("&sbquo;", chr 8218),
246+ ("sbquo", chr 8218),
255− ("&ldquo;", chr 8220),
247+ ("ldquo", chr 8220),
256− ("&rdquo;", chr 8221),
248+ ("rdquo", chr 8221),
257− ("&bdquo;", chr 8222),
249+ ("bdquo", chr 8222),
258− ("&dagger;", chr 8224),
250+ ("dagger", chr 8224),
259− ("&Dagger;", chr 8225),
251+ ("Dagger", chr 8225),
260− ("&bull;", chr 8226),
252+ ("bull", chr 8226),
261− ("&hellip;", chr 8230),
253+ ("hellip", chr 8230),
262− ("&permil;", chr 8240),
254+ ("permil", chr 8240),
263− ("&prime;", chr 8242),
255+ ("prime", chr 8242),
264− ("&Prime;", chr 8243),
256+ ("Prime", chr 8243),
265− ("&lsaquo;", chr 8249),
257+ ("lsaquo", chr 8249),
266− ("&rsaquo;", chr 8250),
258+ ("rsaquo", chr 8250),
267− ("&oline;", chr 8254),
259+ ("oline", chr 8254),
268− ("&frasl;", chr 8260),
260+ ("frasl", chr 8260),
269− ("&euro;", chr 8364),
261+ ("euro", chr 8364),
270− ("&image;", chr 8465),
262+ ("image", chr 8465),
271− ("&weierp;", chr 8472),
263+ ("weierp", chr 8472),
272− ("&real;", chr 8476),
264+ ("real", chr 8476),
273− ("&trade;", chr 8482),
265+ ("trade", chr 8482),
274− ("&alefsym;", chr 8501),
266+ ("alefsym", chr 8501),
275− ("&larr;", chr 8592),
267+ ("larr", chr 8592),
276− ("&uarr;", chr 8593),
268+ ("uarr", chr 8593),
277− ("&rarr;", chr 8594),
269+ ("rarr", chr 8594),
278− ("&darr;", chr 8595),
270+ ("darr", chr 8595),
279− ("&harr;", chr 8596),
271+ ("harr", chr 8596),
280− ("&crarr;", chr 8629),
272+ ("crarr", chr 8629),
281− ("&lArr;", chr 8656),
273+ ("lArr", chr 8656),
282− ("&uArr;", chr 8657),
274+ ("uArr", chr 8657),
283− ("&rArr;", chr 8658),
275+ ("rArr", chr 8658),
284− ("&dArr;", chr 8659),
276+ ("dArr", chr 8659),
285− ("&hArr;", chr 8660),
277+ ("hArr", chr 8660),
286− ("&forall;", chr 8704),
278+ ("forall", chr 8704),
287− ("&part;", chr 8706),
279+ ("part", chr 8706),
288− ("&exist;", chr 8707),
280+ ("exist", chr 8707),
289− ("&empty;", chr 8709),
281+ ("empty", chr 8709),
290− ("&nabla;", chr 8711),
282+ ("nabla", chr 8711),
291− ("&isin;", chr 8712),
283+ ("isin", chr 8712),
292− ("&notin;", chr 8713),
284+ ("notin", chr 8713),
293− ("&ni;", chr 8715),
285+ ("ni", chr 8715),
294− ("&prod;", chr 8719),
286+ ("prod", chr 8719),
295− ("&sum;", chr 8721),
287+ ("sum", chr 8721),
296− ("&minus;", chr 8722),
288+ ("minus", chr 8722),
297− ("&lowast;", chr 8727),
289+ ("lowast", chr 8727),
298− ("&radic;", chr 8730),
290+ ("radic", chr 8730),
299− ("&prop;", chr 8733),
291+ ("prop", chr 8733),
300− ("&infin;", chr 8734),
292+ ("infin", chr 8734),
301− ("&ang;", chr 8736),
293+ ("ang", chr 8736),
302− ("&and;", chr 8743),
294+ ("and", chr 8743),
303− ("&or;", chr 8744),
295+ ("or", chr 8744),
304− ("&cap;", chr 8745),
296+ ("cap", chr 8745),
305− ("&cup;", chr 8746),
297+ ("cup", chr 8746),
306− ("&int;", chr 8747),
298+ ("int", chr 8747),
307− ("&there4;", chr 8756),
299+ ("there4", chr 8756),
308− ("&sim;", chr 8764),
300+ ("sim", chr 8764),
309− ("&cong;", chr 8773),
301+ ("cong", chr 8773),
310− ("&asymp;", chr 8776),
302+ ("asymp", chr 8776),
311− ("&ne;", chr 8800),
303+ ("ne", chr 8800),
312− ("&equiv;", chr 8801),
304+ ("equiv", chr 8801),
313− ("&le;", chr 8804),
305+ ("le", chr 8804),
314− ("&ge;", chr 8805),
306+ ("ge", chr 8805),
315− ("&sub;", chr 8834),
307+ ("sub", chr 8834),
316− ("&sup;", chr 8835),
308+ ("sup", chr 8835),
317− ("&nsub;", chr 8836),
309+ ("nsub", chr 8836),
318− ("&sube;", chr 8838),
310+ ("sube", chr 8838),
319− ("&supe;", chr 8839),
311+ ("supe", chr 8839),
320− ("&oplus;", chr 8853),
312+ ("oplus", chr 8853),
321− ("&otimes;", chr 8855),
313+ ("otimes", chr 8855),
322− ("&perp;", chr 8869),
314+ ("perp", chr 8869),
323− ("&sdot;", chr 8901),
315+ ("sdot", chr 8901),
324− ("&lceil;", chr 8968),
316+ ("lceil", chr 8968),
325− ("&rceil;", chr 8969),
317+ ("rceil", chr 8969),
326− ("&lfloor;", chr 8970),
318+ ("lfloor", chr 8970),
327− ("&rfloor;", chr 8971),
319+ ("rfloor", chr 8971),
328− ("&lang;", chr 9001),
320+ ("lang", chr 9001),
329− ("&rang;", chr 9002),
321+ ("rang", chr 9002),
330− ("&loz;", chr 9674),
322+ ("loz", chr 9674),
331− ("&spades;", chr 9824),
323+ ("spades", chr 9824),
332− ("&clubs;", chr 9827),
324+ ("clubs", chr 9827),
333− ("&hearts;", chr 9829),
325+ ("hearts", chr 9829),
334− ("&diams;", chr 9830)
326+ ("diams", chr 9830)
335 ]
327 ]