@@ -37,36 +37,28 @@ import qualified Data.Map as Map
3737
3838-- | Parse character entity.
3939characterReference :: GenParser Char st Char
40−characterReference = characterEntity <|>
41− hexadecimalCharacterReference <|>
42− decimalCharacterReference <?>
43− "character entity"
44−
45−-- | Parse character entity.
46−characterEntity :: GenParser Char st Char
47−characterEntity = try $ do
40+characterReference = try $ do
4841 st <- char '&'
49− body <- many1 alphaNum
42+ character <- numRef <|> entity
5043 end <- char ';'
51− let entity = "&" ++ body ++ ";"
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)
44+ return character
6245
63−-- | Parse decimal entity.
64−decimalCharacterReference :: GenParser Char st Char
65−decimalCharacterReference = try $ do
66− st <- string "&#"
67− body <- many1 digit
68− end <- char ';'
69− return $ chr $ read body
46+numRef :: GenParser Char st Char
47+numRef = do
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
56+decNum = many1 digit >>= return . read
57+
58+entity :: GenParser Char st Char
59+entity = do
60+ body <- many1 alphaNum
61+ return $ Map.findWithDefault '?' body entityTable
7062
7163-- | Convert entities in a string to characters.
7264decodeCharacterReferences :: String -> String
@@ -80,256 +72,256 @@ entityTable = Map.fromList entityTableList
8072
8173entityTableList :: [(String, Char)]
8274entityTableList = [
83− (""", chr 34),
84− ("&", chr 38),
85− ("<", chr 60),
86− (">", chr 62),
87− (" ", chr 160),
88− ("¡", chr 161),
89− ("¢", chr 162),
90− ("£", chr 163),
91− ("¤", chr 164),
92− ("¥", chr 165),
93− ("¦", chr 166),
94− ("§", chr 167),
95− ("¨", chr 168),
96− ("©", chr 169),
97− ("ª", chr 170),
98− ("«", chr 171),
99− ("¬", chr 172),
100− ("­", chr 173),
101− ("®", chr 174),
102− ("¯", chr 175),
103− ("°", chr 176),
104− ("±", chr 177),
105− ("²", chr 178),
106− ("³", chr 179),
107− ("´", chr 180),
108− ("µ", chr 181),
109− ("¶", chr 182),
110− ("·", chr 183),
111− ("¸", chr 184),
112− ("¹", chr 185),
113− ("º", chr 186),
114− ("»", chr 187),
115− ("¼", chr 188),
116− ("½", chr 189),
117− ("¾", chr 190),
118− ("¿", chr 191),
119− ("À", chr 192),
120− ("Á", chr 193),
121− ("Â", chr 194),
122− ("Ã", chr 195),
123− ("Ä", chr 196),
124− ("Å", chr 197),
125− ("Æ", chr 198),
126− ("Ç", chr 199),
127− ("È", chr 200),
128− ("É", chr 201),
129− ("Ê", chr 202),
130− ("Ë", chr 203),
131− ("Ì", chr 204),
132− ("Í", chr 205),
133− ("Î", chr 206),
134− ("Ï", chr 207),
135− ("Ð", chr 208),
136− ("Ñ", chr 209),
137− ("Ò", chr 210),
138− ("Ó", chr 211),
139− ("Ô", chr 212),
140− ("Õ", chr 213),
141− ("Ö", chr 214),
142− ("×", chr 215),
143− ("Ø", chr 216),
144− ("Ù", chr 217),
145− ("Ú", chr 218),
146− ("Û", chr 219),
147− ("Ü", chr 220),
148− ("Ý", chr 221),
149− ("Þ", chr 222),
150− ("ß", chr 223),
151− ("à", chr 224),
152− ("á", chr 225),
153− ("â", chr 226),
154− ("ã", chr 227),
155− ("ä", chr 228),
156− ("å", chr 229),
157− ("æ", chr 230),
158− ("ç", chr 231),
159− ("è", chr 232),
160− ("é", chr 233),
161− ("ê", chr 234),
162− ("ë", chr 235),
163− ("ì", chr 236),
164− ("í", chr 237),
165− ("î", chr 238),
166− ("ï", chr 239),
167− ("ð", chr 240),
168− ("ñ", chr 241),
169− ("ò", chr 242),
170− ("ó", chr 243),
171− ("ô", chr 244),
172− ("õ", chr 245),
173− ("ö", chr 246),
174− ("÷", chr 247),
175− ("ø", chr 248),
176− ("ù", chr 249),
177− ("ú", chr 250),
178− ("û", chr 251),
179− ("ü", chr 252),
180− ("ý", chr 253),
181− ("þ", chr 254),
182− ("ÿ", chr 255),
183− ("Œ", chr 338),
184− ("œ", chr 339),
185− ("Š", chr 352),
186− ("š", chr 353),
187− ("Ÿ", chr 376),
188− ("ƒ", chr 402),
189− ("ˆ", chr 710),
190− ("˜", chr 732),
191− ("Α", chr 913),
192− ("Β", chr 914),
193− ("Γ", chr 915),
194− ("Δ", chr 916),
195− ("Ε", chr 917),
196− ("Ζ", chr 918),
197− ("Η", chr 919),
198− ("Θ", chr 920),
199− ("Ι", chr 921),
200− ("Κ", chr 922),
201− ("Λ", chr 923),
202− ("Μ", chr 924),
203− ("Ν", chr 925),
204− ("Ξ", chr 926),
205− ("Ο", chr 927),
206− ("Π", chr 928),
207− ("Ρ", chr 929),
208− ("Σ", chr 931),
209− ("Τ", chr 932),
210− ("Υ", chr 933),
211− ("Φ", chr 934),
212− ("Χ", chr 935),
213− ("Ψ", chr 936),
214− ("Ω", chr 937),
215− ("α", chr 945),
216− ("β", chr 946),
217− ("γ", chr 947),
218− ("δ", chr 948),
219− ("ε", chr 949),
220− ("ζ", chr 950),
221− ("η", chr 951),
222− ("θ", chr 952),
223− ("ι", chr 953),
224− ("κ", chr 954),
225− ("λ", chr 955),
226− ("μ", chr 956),
227− ("ν", chr 957),
228− ("ξ", chr 958),
229− ("ο", chr 959),
230− ("π", chr 960),
231− ("ρ", chr 961),
232− ("ς", chr 962),
233− ("σ", chr 963),
234− ("τ", chr 964),
235− ("υ", chr 965),
236− ("φ", chr 966),
237− ("χ", chr 967),
238− ("ψ", chr 968),
239− ("ω", chr 969),
240− ("ϑ", chr 977),
241− ("ϒ", chr 978),
242− ("ϖ", chr 982),
243− (" ", chr 8194),
244− (" ", chr 8195),
245− (" ", chr 8201),
246− ("‌", chr 8204),
247− ("‍", chr 8205),
248− ("‎", chr 8206),
249− ("‏", chr 8207),
250− ("–", chr 8211),
251− ("—", chr 8212),
252− ("‘", chr 8216),
253− ("’", chr 8217),
254− ("‚", chr 8218),
255− ("“", chr 8220),
256− ("”", chr 8221),
257− ("„", chr 8222),
258− ("†", chr 8224),
259− ("‡", chr 8225),
260− ("•", chr 8226),
261− ("…", chr 8230),
262− ("‰", chr 8240),
263− ("′", chr 8242),
264− ("″", chr 8243),
265− ("‹", chr 8249),
266− ("›", chr 8250),
267− ("‾", chr 8254),
268− ("⁄", chr 8260),
269− ("€", chr 8364),
270− ("ℑ", chr 8465),
271− ("℘", chr 8472),
272− ("ℜ", chr 8476),
273− ("™", chr 8482),
274− ("ℵ", chr 8501),
275− ("←", chr 8592),
276− ("↑", chr 8593),
277− ("→", chr 8594),
278− ("↓", chr 8595),
279− ("↔", chr 8596),
280− ("↵", chr 8629),
281− ("⇐", chr 8656),
282− ("⇑", chr 8657),
283− ("⇒", chr 8658),
284− ("⇓", chr 8659),
285− ("⇔", chr 8660),
286− ("∀", chr 8704),
287− ("∂", chr 8706),
288− ("∃", chr 8707),
289− ("∅", chr 8709),
290− ("∇", chr 8711),
291− ("∈", chr 8712),
292− ("∉", chr 8713),
293− ("∋", chr 8715),
294− ("∏", chr 8719),
295− ("∑", chr 8721),
296− ("−", chr 8722),
297− ("∗", chr 8727),
298− ("√", chr 8730),
299− ("∝", chr 8733),
300− ("∞", chr 8734),
301− ("∠", chr 8736),
302− ("∧", chr 8743),
303− ("∨", chr 8744),
304− ("∩", chr 8745),
305− ("∪", chr 8746),
306− ("∫", chr 8747),
307− ("∴", chr 8756),
308− ("∼", chr 8764),
309− ("≅", chr 8773),
310− ("≈", chr 8776),
311− ("≠", chr 8800),
312− ("≡", chr 8801),
313− ("≤", chr 8804),
314− ("≥", chr 8805),
315− ("⊂", chr 8834),
316− ("⊃", chr 8835),
317− ("⊄", chr 8836),
318− ("⊆", chr 8838),
319− ("⊇", chr 8839),
320− ("⊕", chr 8853),
321− ("⊗", chr 8855),
322− ("⊥", chr 8869),
323− ("⋅", chr 8901),
324− ("⌈", chr 8968),
325− ("⌉", chr 8969),
326− ("⌊", chr 8970),
327− ("⌋", chr 8971),
328− ("⟨", chr 9001),
329− ("⟩", chr 9002),
330− ("◊", chr 9674),
331− ("♠", chr 9824),
332− ("♣", chr 9827),
333− ("♥", chr 9829),
334− ("♦", chr 9830)
75+ ("quot", chr 34),
76+ ("amp", chr 38),
77+ ("lt", chr 60),
78+ ("gt", chr 62),
79+ ("nbsp", chr 160),
80+ ("iexcl", chr 161),
81+ ("cent", chr 162),
82+ ("pound", chr 163),
83+ ("curren", chr 164),
84+ ("yen", chr 165),
85+ ("brvbar", chr 166),
86+ ("sect", chr 167),
87+ ("uml", chr 168),
88+ ("copy", chr 169),
89+ ("ordf", chr 170),
90+ ("laquo", chr 171),
91+ ("not", chr 172),
92+ ("shy", chr 173),
93+ ("reg", chr 174),
94+ ("macr", chr 175),
95+ ("deg", chr 176),
96+ ("plusmn", chr 177),
97+ ("sup2", chr 178),
98+ ("sup3", chr 179),
99+ ("acute", chr 180),
100+ ("micro", chr 181),
101+ ("para", chr 182),
102+ ("middot", chr 183),
103+ ("cedil", chr 184),
104+ ("sup1", chr 185),
105+ ("ordm", chr 186),
106+ ("raquo", chr 187),
107+ ("frac14", chr 188),
108+ ("frac12", chr 189),
109+ ("frac34", chr 190),
110+ ("iquest", chr 191),
111+ ("Agrave", chr 192),
112+ ("Aacute", chr 193),
113+ ("Acirc", chr 194),
114+ ("Atilde", chr 195),
115+ ("Auml", chr 196),
116+ ("Aring", chr 197),
117+ ("AElig", chr 198),
118+ ("Ccedil", chr 199),
119+ ("Egrave", chr 200),
120+ ("Eacute", chr 201),
121+ ("Ecirc", chr 202),
122+ ("Euml", chr 203),
123+ ("Igrave", chr 204),
124+ ("Iacute", chr 205),
125+ ("Icirc", chr 206),
126+ ("Iuml", chr 207),
127+ ("ETH", chr 208),
128+ ("Ntilde", chr 209),
129+ ("Ograve", chr 210),
130+ ("Oacute", chr 211),
131+ ("Ocirc", chr 212),
132+ ("Otilde", chr 213),
133+ ("Ouml", chr 214),
134+ ("times", chr 215),
135+ ("Oslash", chr 216),
136+ ("Ugrave", chr 217),
137+ ("Uacute", chr 218),
138+ ("Ucirc", chr 219),
139+ ("Uuml", chr 220),
140+ ("Yacute", chr 221),
141+ ("THORN", chr 222),
142+ ("szlig", chr 223),
143+ ("agrave", chr 224),
144+ ("aacute", chr 225),
145+ ("acirc", chr 226),
146+ ("atilde", chr 227),
147+ ("auml", chr 228),
148+ ("aring", chr 229),
149+ ("aelig", chr 230),
150+ ("ccedil", chr 231),
151+ ("egrave", chr 232),
152+ ("eacute", chr 233),
153+ ("ecirc", chr 234),
154+ ("euml", chr 235),
155+ ("igrave", chr 236),
156+ ("iacute", chr 237),
157+ ("icirc", chr 238),
158+ ("iuml", chr 239),
159+ ("eth", chr 240),
160+ ("ntilde", chr 241),
161+ ("ograve", chr 242),
162+ ("oacute", chr 243),
163+ ("ocirc", chr 244),
164+ ("otilde", chr 245),
165+ ("ouml", chr 246),
166+ ("divide", chr 247),
167+ ("oslash", chr 248),
168+ ("ugrave", chr 249),
169+ ("uacute", chr 250),
170+ ("ucirc", chr 251),
171+ ("uuml", chr 252),
172+ ("yacute", chr 253),
173+ ("thorn", chr 254),
174+ ("yuml", chr 255),
175+ ("OElig", chr 338),
176+ ("oelig", chr 339),
177+ ("Scaron", chr 352),
178+ ("scaron", chr 353),
179+ ("Yuml", chr 376),
180+ ("fnof", chr 402),
181+ ("circ", chr 710),
182+ ("tilde", chr 732),
183+ ("Alpha", chr 913),
184+ ("Beta", chr 914),
185+ ("Gamma", chr 915),
186+ ("Delta", chr 916),
187+ ("Epsilon", chr 917),
188+ ("Zeta", chr 918),
189+ ("Eta", chr 919),
190+ ("Theta", chr 920),
191+ ("Iota", chr 921),
192+ ("Kappa", chr 922),
193+ ("Lambda", chr 923),
194+ ("Mu", chr 924),
195+ ("Nu", chr 925),
196+ ("Xi", chr 926),
197+ ("Omicron", chr 927),
198+ ("Pi", chr 928),
199+ ("Rho", chr 929),
200+ ("Sigma", chr 931),
201+ ("Tau", chr 932),
202+ ("Upsilon", chr 933),
203+ ("Phi", chr 934),
204+ ("Chi", chr 935),
205+ ("Psi", chr 936),
206+ ("Omega", chr 937),
207+ ("alpha", chr 945),
208+ ("beta", chr 946),
209+ ("gamma", chr 947),
210+ ("delta", chr 948),
211+ ("epsilon", chr 949),
212+ ("zeta", chr 950),
213+ ("eta", chr 951),
214+ ("theta", chr 952),
215+ ("iota", chr 953),
216+ ("kappa", chr 954),
217+ ("lambda", chr 955),
218+ ("mu", chr 956),
219+ ("nu", chr 957),
220+ ("xi", chr 958),
221+ ("omicron", chr 959),
222+ ("pi", chr 960),
223+ ("rho", chr 961),
224+ ("sigmaf", chr 962),
225+ ("sigma", chr 963),
226+ ("tau", chr 964),
227+ ("upsilon", chr 965),
228+ ("phi", chr 966),
229+ ("chi", chr 967),
230+ ("psi", chr 968),
231+ ("omega", chr 969),
232+ ("thetasym", chr 977),
233+ ("upsih", chr 978),
234+ ("piv", chr 982),
235+ ("ensp", chr 8194),
236+ ("emsp", chr 8195),
237+ ("thinsp", chr 8201),
238+ ("zwnj", chr 8204),
239+ ("zwj", chr 8205),
240+ ("lrm", chr 8206),
241+ ("rlm", chr 8207),
242+ ("ndash", chr 8211),
243+ ("mdash", chr 8212),
244+ ("lsquo", chr 8216),
245+ ("rsquo", chr 8217),
246+ ("sbquo", chr 8218),
247+ ("ldquo", chr 8220),
248+ ("rdquo", chr 8221),
249+ ("bdquo", chr 8222),
250+ ("dagger", chr 8224),
251+ ("Dagger", chr 8225),
252+ ("bull", chr 8226),
253+ ("hellip", chr 8230),
254+ ("permil", chr 8240),
255+ ("prime", chr 8242),
256+ ("Prime", chr 8243),
257+ ("lsaquo", chr 8249),
258+ ("rsaquo", chr 8250),
259+ ("oline", chr 8254),
260+ ("frasl", chr 8260),
261+ ("euro", chr 8364),
262+ ("image", chr 8465),
263+ ("weierp", chr 8472),
264+ ("real", chr 8476),
265+ ("trade", chr 8482),
266+ ("alefsym", chr 8501),
267+ ("larr", chr 8592),
268+ ("uarr", chr 8593),
269+ ("rarr", chr 8594),
270+ ("darr", chr 8595),
271+ ("harr", chr 8596),
272+ ("crarr", chr 8629),
273+ ("lArr", chr 8656),
274+ ("uArr", chr 8657),
275+ ("rArr", chr 8658),
276+ ("dArr", chr 8659),
277+ ("hArr", chr 8660),
278+ ("forall", chr 8704),
279+ ("part", chr 8706),
280+ ("exist", chr 8707),
281+ ("empty", chr 8709),
282+ ("nabla", chr 8711),
283+ ("isin", chr 8712),
284+ ("notin", chr 8713),
285+ ("ni", chr 8715),
286+ ("prod", chr 8719),
287+ ("sum", chr 8721),
288+ ("minus", chr 8722),
289+ ("lowast", chr 8727),
290+ ("radic", chr 8730),
291+ ("prop", chr 8733),
292+ ("infin", chr 8734),
293+ ("ang", chr 8736),
294+ ("and", chr 8743),
295+ ("or", chr 8744),
296+ ("cap", chr 8745),
297+ ("cup", chr 8746),
298+ ("int", chr 8747),
299+ ("there4", chr 8756),
300+ ("sim", chr 8764),
301+ ("cong", chr 8773),
302+ ("asymp", chr 8776),
303+ ("ne", chr 8800),
304+ ("equiv", chr 8801),
305+ ("le", chr 8804),
306+ ("ge", chr 8805),
307+ ("sub", chr 8834),
308+ ("sup", chr 8835),
309+ ("nsub", chr 8836),
310+ ("sube", chr 8838),
311+ ("supe", chr 8839),
312+ ("oplus", chr 8853),
313+ ("otimes", chr 8855),
314+ ("perp", chr 8869),
315+ ("sdot", chr 8901),
316+ ("lceil", chr 8968),
317+ ("rceil", chr 8969),
318+ ("lfloor", chr 8970),
319+ ("rfloor", chr 8971),
320+ ("lang", chr 9001),
321+ ("rang", chr 9002),
322+ ("loz", chr 9674),
323+ ("spades", chr 9824),
324+ ("clubs", chr 9827),
325+ ("hearts", chr 9829),
326+ ("diams", chr 9830)
335327 ]