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