git.iko.soy/typeable/pandoc
on master help sign in
Simplified Text.Pandoc.CharacterReferences by using TagSoup entity lookup
commit5131589be0de048c9c0b526da715c5430932bf43 authorJohn MacFarlane <jgm@berkeley.edu> dateFri 14 Jan 2011, 18:28 (16 years ago) parent81403b8
1 file changed+11−266
src/Text/Pandoc/CharacterReferences.hs+11−266
src/Text/Pandoc/CharacterReferences.hs+11−266
@@ -31,9 +31,9 @@ module Text.Pandoc.CharacterReferences (
3131 characterReference,
3232 decodeCharacterReferences,
3333 ) where
34−import Data.Char ( chr )
3534import Text.ParserCombinators.Parsec
36−import qualified Data.Map as Map
35+import Text.HTML.TagSoup.Entity ( lookupNamedEntity, lookupNumericEntity )
36+import Data.Maybe ( fromMaybe )
3737
3838-- | Parse character entity.
3939characterReference :: GenParser Char st Char
@@ -47,18 +47,21 @@ numRef :: GenParser Char st Char
4747numRef = do
4848 char '#'
4949 num <- hexNum <|> decNum
50− return $ chr $ num
50+ return $ fromMaybe '?' $ lookupNumericEntity num
5151
52−hexNum :: GenParser Char st Int
53−hexNum = oneOf "Xx" >> many1 hexDigit >>= return . read . (\xs -> '0':'x':xs)
52+hexNum :: GenParser Char st [Char]
53+hexNum = do
54+ x <- oneOf "Xx"
55+ num <- many1 hexDigit
56+ return (x:num)
5457
55−decNum :: GenParser Char st Int
56−decNum = many1 digit >>= return . read
58+decNum :: GenParser Char st [Char]
59+decNum = many1 digit
5760
5861entity :: GenParser Char st Char
5962entity = do
6063 body <- many1 alphaNum
61− return $ Map.findWithDefault '?' body entityTable
64+ return $ fromMaybe '?' $ lookupNamedEntity body
6265
6366-- | Convert entities in a string to characters.
6467decodeCharacterReferences :: String -> String
@@ -67,261 +70,3 @@ decodeCharacterReferences str =
6770 Left err -> error $ "\nError: " ++ show err
6871 Right result -> result
6972
70−entityTable :: Map.Map String Char
71−entityTable = Map.fromList entityTableList
72−
73−entityTableList :: [(String, Char)]
74−entityTableList = [
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)
327− ]