@@ -31,9 +31,9 @@ module Text.Pandoc.CharacterReferences (
31 characterReference,
31 characterReference,
32 decodeCharacterReferences,
32 decodeCharacterReferences,
34−import Data.Char ( chr )
35import Text.ParserCombinators.Parsec
34import Text.ParserCombinators.Parsec
36−import qualified Data.Map as Map
35+import Text.HTML.TagSoup.Entity ( lookupNamedEntity, lookupNumericEntity )
36+import Data.Maybe ( fromMaybe )
38-- | Parse character entity.
38-- | Parse character entity.
39characterReference :: GenParser Char st Char
39characterReference :: GenParser Char st Char
@@ -47,18 +47,21 @@ numRef :: GenParser Char st Char
47numRef = do
47numRef = do
49 num <- hexNum <|> decNum
49 num <- hexNum <|> decNum
50− return $ chr $ num
50+ return $ fromMaybe '?' $ lookupNumericEntity num
52−hexNum :: GenParser Char st Int
52+hexNum :: GenParser Char st [Char]
53−hexNum = oneOf "Xx" >> many1 hexDigit >>= return . read . (\xs -> '0':'x':xs)
55+ num <- many1 hexDigit
55−decNum :: GenParser Char st Int
58+decNum :: GenParser Char st [Char]
56−decNum = many1 digit >>= return . read
59+decNum = many1 digit
58entity :: GenParser Char st Char
61entity :: GenParser Char st Char
59entity = do
62entity = do
60 body <- many1 alphaNum
63 body <- many1 alphaNum
61− return $ Map.findWithDefault '?' body entityTable
64+ return $ fromMaybe '?' $ lookupNamedEntity body
63-- | Convert entities in a string to characters.
66-- | Convert entities in a string to characters.
64decodeCharacterReferences :: String -> String
67decodeCharacterReferences :: String -> String
@@ -67,261 +70,3 @@ decodeCharacterReferences str =
67 Left err -> error $ "\nError: " ++ show err
70 Left err -> error $ "\nError: " ++ show err
68 Right result -> result
71 Right result -> result
70−entityTable :: Map.Map String Char
71−entityTable = Map.fromList entityTableList
73−entityTableList :: [(String, Char)]
102− ("middot", chr 183),
107− ("frac14", chr 188),
108− ("frac12", chr 189),
109− ("frac34", chr 190),
110− ("iquest", chr 191),
111− ("Agrave", chr 192),
112− ("Aacute", chr 193),
114− ("Atilde", chr 195),
118− ("Ccedil", chr 199),
119− ("Egrave", chr 200),
120− ("Eacute", chr 201),
123− ("Igrave", chr 204),
124− ("Iacute", chr 205),
128− ("Ntilde", chr 209),
129− ("Ograve", chr 210),
130− ("Oacute", chr 211),
132− ("Otilde", chr 213),
135− ("Oslash", chr 216),
136− ("Ugrave", chr 217),
137− ("Uacute", chr 218),
140− ("Yacute", chr 221),
143− ("agrave", chr 224),
144− ("aacute", chr 225),
146− ("atilde", chr 227),
150− ("ccedil", chr 231),
151− ("egrave", chr 232),
152− ("eacute", chr 233),
155− ("igrave", chr 236),
156− ("iacute", chr 237),
160− ("ntilde", chr 241),
161− ("ograve", chr 242),
162− ("oacute", chr 243),
164− ("otilde", chr 245),
166− ("divide", chr 247),
167− ("oslash", chr 248),
168− ("ugrave", chr 249),
169− ("uacute", chr 250),
172− ("yacute", chr 253),
177− ("Scaron", chr 352),
178− ("scaron", chr 353),
187− ("Epsilon", chr 917),
193− ("Lambda", chr 923),
197− ("Omicron", chr 927),
202− ("Upsilon", chr 933),
211− ("epsilon", chr 949),
217− ("lambda", chr 955),
221− ("omicron", chr 959),
224− ("sigmaf", chr 962),
227− ("upsilon", chr 965),
232− ("thetasym", chr 977),
237− ("thinsp", chr 8201),
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),
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),
262− ("image", chr 8465),
263− ("weierp", chr 8472),
265− ("trade", chr 8482),
266− ("alefsym", chr 8501),
272− ("crarr", chr 8629),
278− ("forall", chr 8704),
280− ("exist", chr 8707),
281− ("empty", chr 8709),
282− ("nabla", chr 8711),
284− ("notin", chr 8713),
288− ("minus", chr 8722),
289− ("lowast", chr 8727),
290− ("radic", chr 8730),
292− ("infin", chr 8734),
299− ("there4", chr 8756),
302− ("asymp", chr 8776),
304− ("equiv", chr 8801),
312− ("oplus", chr 8853),
313− ("otimes", chr 8855),
316− ("lceil", chr 8968),
317− ("rceil", chr 8969),
318− ("lfloor", chr 8970),
319− ("rfloor", chr 8971),
323− ("spades", chr 9824),
324− ("clubs", chr 9827),
325− ("hearts", chr 9829),