-- this should be in Text.HTML but then we provoke name clashes
module Text.HTML.Basic.Entity (
   Name,
   list, listInternetExploder,
   mapNameToChar,
   mapCharToName, mapCharToNameInternetExploder,
   mapNameToUpper, mapNameToLower,
   XMLEnt.numberToChar,
   ) where

import qualified Text.XML.Basic.Entity as XMLEnt
import Data.Maybe (mapMaybe, )
import Data.Maybe.HT (toMaybe, )
import Data.Tuple.HT (swap, mapSnd, )

import qualified Data.Map as Map
import Data.Char (chr, toLower, )


type Name = String

mapNameToChar :: Map.Map Name Char
mapNameToChar :: Map Name Char
mapNameToChar =
   forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Name, Char)]
list

mapCharToName :: Map.Map Char Name
mapCharToName :: Map Char Name
mapCharToName =
   forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> (b, a)
swap [(Name, Char)]
list

mapCharToNameInternetExploder :: Map.Map Char Name
mapCharToNameInternetExploder :: Map Char Name
mapCharToNameInternetExploder =
   forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> (b, a)
swap [(Name, Char)]
listInternetExploder


mapNameToUpper :: Map.Map String String
mapNameToUpper :: Map Name Name
mapNameToUpper =
   forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> (b, a)
swap [(Name, Name)]
upperLowerPairs

mapNameToLower :: Map.Map String String
mapNameToLower :: Map Name Name
mapNameToLower =
   forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Name, Name)]
upperLowerPairs

{-
Maybe it would be cleaner to convert a name to a character
and then use 'Char.toLower' or 'Char.toUpper'.
-}
upperLowerPairs :: [(String, String)]
upperLowerPairs :: [(Name, Name)]
upperLowerPairs =
   forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe
      (\(Name
name,Char
_) ->
         let lname :: Name
lname = forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower Name
name
         in  forall a. Bool -> a -> Maybe a
toMaybe
                 (Name
lname forall a. Eq a => a -> a -> Bool
/= Name
name Bool -> Bool -> Bool
&& forall k a. Ord k => k -> Map k a -> Bool
Map.member Name
lname Map Name Char
mapNameToChar)
                 (Name
name,Name
lname))
      [(Name, Char)]
listAdditional



{- |
A table mapping HTML entity names to code points.
Although entity references can in principle represent more than one character,
the standard entities only contain one character.
-}
list :: [(Name, Char)]
list :: [(Name, Char)]
list =
   [(Name, Char)]
XMLEnt.list forall a. [a] -> [a] -> [a]
++ [(Name, Char)]
listAdditional

listInternetExploder :: [(Name, Char)]
listInternetExploder :: [(Name, Char)]
listInternetExploder =
   [(Name, Char)]
XMLEnt.listInternetExploder forall a. [a] -> [a] -> [a]
++ [(Name, Char)]
listAdditional

listAdditional :: [(Name, Char)]
listAdditional :: [(Name, Char)]
listAdditional =
   forall a b. (a -> b) -> [a] -> [b]
map (forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd Int -> Char
chr) forall a b. (a -> b) -> a -> b
$
   (Name
"nbsp",     Int
160) forall a. a -> [a] -> [a]
:
   (Name
"iexcl",    Int
161) forall a. a -> [a] -> [a]
:
   (Name
"cent",     Int
162) forall a. a -> [a] -> [a]
:
   (Name
"pound",    Int
163) forall a. a -> [a] -> [a]
:
   (Name
"curren",   Int
164) forall a. a -> [a] -> [a]
:
   (Name
"yen",      Int
165) forall a. a -> [a] -> [a]
:
   (Name
"brvbar",   Int
166) forall a. a -> [a] -> [a]
:
   (Name
"sect",     Int
167) forall a. a -> [a] -> [a]
:
   (Name
"uml",      Int
168) forall a. a -> [a] -> [a]
:
   (Name
"copy",     Int
169) forall a. a -> [a] -> [a]
:
   (Name
"ordf",     Int
170) forall a. a -> [a] -> [a]
:
   (Name
"laquo",    Int
171) forall a. a -> [a] -> [a]
:
   (Name
"not",      Int
172) forall a. a -> [a] -> [a]
:
   (Name
"shy",      Int
173) forall a. a -> [a] -> [a]
:
   (Name
"reg",      Int
174) forall a. a -> [a] -> [a]
:
   (Name
"macr",     Int
175) forall a. a -> [a] -> [a]
:
   (Name
"deg",      Int
176) forall a. a -> [a] -> [a]
:
   (Name
"plusmn",   Int
177) forall a. a -> [a] -> [a]
:
   (Name
"sup2",     Int
178) forall a. a -> [a] -> [a]
:
   (Name
"sup3",     Int
179) forall a. a -> [a] -> [a]
:
   (Name
"acute",    Int
180) forall a. a -> [a] -> [a]
:
   (Name
"micro",    Int
181) forall a. a -> [a] -> [a]
:
   (Name
"para",     Int
182) forall a. a -> [a] -> [a]
:
   (Name
"middot",   Int
183) forall a. a -> [a] -> [a]
:
   (Name
"cedil",    Int
184) forall a. a -> [a] -> [a]
:
   (Name
"sup1",     Int
185) forall a. a -> [a] -> [a]
:
   (Name
"ordm",     Int
186) forall a. a -> [a] -> [a]
:
   (Name
"raquo",    Int
187) forall a. a -> [a] -> [a]
:
   (Name
"frac14",   Int
188) forall a. a -> [a] -> [a]
:
   (Name
"frac12",   Int
189) forall a. a -> [a] -> [a]
:
   (Name
"frac34",   Int
190) forall a. a -> [a] -> [a]
:
   (Name
"iquest",   Int
191) forall a. a -> [a] -> [a]
:
   (Name
"Agrave",   Int
192) forall a. a -> [a] -> [a]
:
   (Name
"Aacute",   Int
193) forall a. a -> [a] -> [a]
:
   (Name
"Acirc",    Int
194) forall a. a -> [a] -> [a]
:
   (Name
"Atilde",   Int
195) forall a. a -> [a] -> [a]
:
   (Name
"Auml",     Int
196) forall a. a -> [a] -> [a]
:
   (Name
"Aring",    Int
197) forall a. a -> [a] -> [a]
:
   (Name
"AElig",    Int
198) forall a. a -> [a] -> [a]
:
   (Name
"Ccedil",   Int
199) forall a. a -> [a] -> [a]
:
   (Name
"Egrave",   Int
200) forall a. a -> [a] -> [a]
:
   (Name
"Eacute",   Int
201) forall a. a -> [a] -> [a]
:
   (Name
"Ecirc",    Int
202) forall a. a -> [a] -> [a]
:
   (Name
"Euml",     Int
203) forall a. a -> [a] -> [a]
:
   (Name
"Igrave",   Int
204) forall a. a -> [a] -> [a]
:
   (Name
"Iacute",   Int
205) forall a. a -> [a] -> [a]
:
   (Name
"Icirc",    Int
206) forall a. a -> [a] -> [a]
:
   (Name
"Iuml",     Int
207) forall a. a -> [a] -> [a]
:
   (Name
"ETH",      Int
208) forall a. a -> [a] -> [a]
:
   (Name
"Ntilde",   Int
209) forall a. a -> [a] -> [a]
:
   (Name
"Ograve",   Int
210) forall a. a -> [a] -> [a]
:
   (Name
"Oacute",   Int
211) forall a. a -> [a] -> [a]
:
   (Name
"Ocirc",    Int
212) forall a. a -> [a] -> [a]
:
   (Name
"Otilde",   Int
213) forall a. a -> [a] -> [a]
:
   (Name
"Ouml",     Int
214) forall a. a -> [a] -> [a]
:
   (Name
"times",    Int
215) forall a. a -> [a] -> [a]
:
   (Name
"Oslash",   Int
216) forall a. a -> [a] -> [a]
:
   (Name
"Ugrave",   Int
217) forall a. a -> [a] -> [a]
:
   (Name
"Uacute",   Int
218) forall a. a -> [a] -> [a]
:
   (Name
"Ucirc",    Int
219) forall a. a -> [a] -> [a]
:
   (Name
"Uuml",     Int
220) forall a. a -> [a] -> [a]
:
   (Name
"Yacute",   Int
221) forall a. a -> [a] -> [a]
:
   (Name
"THORN",    Int
222) forall a. a -> [a] -> [a]
:
   (Name
"szlig",    Int
223) forall a. a -> [a] -> [a]
:
   (Name
"agrave",   Int
224) forall a. a -> [a] -> [a]
:
   (Name
"aacute",   Int
225) forall a. a -> [a] -> [a]
:
   (Name
"acirc",    Int
226) forall a. a -> [a] -> [a]
:
   (Name
"atilde",   Int
227) forall a. a -> [a] -> [a]
:
   (Name
"auml",     Int
228) forall a. a -> [a] -> [a]
:
   (Name
"aring",    Int
229) forall a. a -> [a] -> [a]
:
   (Name
"aelig",    Int
230) forall a. a -> [a] -> [a]
:
   (Name
"ccedil",   Int
231) forall a. a -> [a] -> [a]
:
   (Name
"egrave",   Int
232) forall a. a -> [a] -> [a]
:
   (Name
"eacute",   Int
233) forall a. a -> [a] -> [a]
:
   (Name
"ecirc",    Int
234) forall a. a -> [a] -> [a]
:
   (Name
"euml",     Int
235) forall a. a -> [a] -> [a]
:
   (Name
"igrave",   Int
236) forall a. a -> [a] -> [a]
:
   (Name
"iacute",   Int
237) forall a. a -> [a] -> [a]
:
   (Name
"icirc",    Int
238) forall a. a -> [a] -> [a]
:
   (Name
"iuml",     Int
239) forall a. a -> [a] -> [a]
:
   (Name
"eth",      Int
240) forall a. a -> [a] -> [a]
:
   (Name
"ntilde",   Int
241) forall a. a -> [a] -> [a]
:
   (Name
"ograve",   Int
242) forall a. a -> [a] -> [a]
:
   (Name
"oacute",   Int
243) forall a. a -> [a] -> [a]
:
   (Name
"ocirc",    Int
244) forall a. a -> [a] -> [a]
:
   (Name
"otilde",   Int
245) forall a. a -> [a] -> [a]
:
   (Name
"ouml",     Int
246) forall a. a -> [a] -> [a]
:
   (Name
"divide",   Int
247) forall a. a -> [a] -> [a]
:
   (Name
"oslash",   Int
248) forall a. a -> [a] -> [a]
:
   (Name
"ugrave",   Int
249) forall a. a -> [a] -> [a]
:
   (Name
"uacute",   Int
250) forall a. a -> [a] -> [a]
:
   (Name
"ucirc",    Int
251) forall a. a -> [a] -> [a]
:
   (Name
"uuml",     Int
252) forall a. a -> [a] -> [a]
:
   (Name
"yacute",   Int
253) forall a. a -> [a] -> [a]
:
   (Name
"thorn",    Int
254) forall a. a -> [a] -> [a]
:
   (Name
"yuml",     Int
255) forall a. a -> [a] -> [a]
:

   (Name
"OElig",    Int
338) forall a. a -> [a] -> [a]
:
   (Name
"oelig",    Int
339) forall a. a -> [a] -> [a]
:
   (Name
"Scaron",   Int
352) forall a. a -> [a] -> [a]
:
   (Name
"scaron",   Int
353) forall a. a -> [a] -> [a]
:
   (Name
"Yuml",     Int
376) forall a. a -> [a] -> [a]
:
   (Name
"circ",     Int
710) forall a. a -> [a] -> [a]
:
   (Name
"tilde",    Int
732) forall a. a -> [a] -> [a]
:

   (Name
"ensp",     Int
8194) forall a. a -> [a] -> [a]
:
   (Name
"emsp",     Int
8195) forall a. a -> [a] -> [a]
:
   (Name
"thinsp",   Int
8201) forall a. a -> [a] -> [a]
:
   (Name
"zwnj",     Int
8204) forall a. a -> [a] -> [a]
:
   (Name
"zwj",      Int
8205) forall a. a -> [a] -> [a]
:
   (Name
"lrm",      Int
8206) forall a. a -> [a] -> [a]
:
   (Name
"rlm",      Int
8207) forall a. a -> [a] -> [a]
:
   (Name
"ndash",    Int
8211) forall a. a -> [a] -> [a]
:
   (Name
"mdash",    Int
8212) forall a. a -> [a] -> [a]
:
   (Name
"lsquo",    Int
8216) forall a. a -> [a] -> [a]
:
   (Name
"rsquo",    Int
8217) forall a. a -> [a] -> [a]
:
   (Name
"sbquo",    Int
8218) forall a. a -> [a] -> [a]
:
   (Name
"ldquo",    Int
8220) forall a. a -> [a] -> [a]
:
   (Name
"rdquo",    Int
8221) forall a. a -> [a] -> [a]
:
   (Name
"bdquo",    Int
8222) forall a. a -> [a] -> [a]
:
   (Name
"dagger",   Int
8224) forall a. a -> [a] -> [a]
:
   (Name
"Dagger",   Int
8225) forall a. a -> [a] -> [a]
:
   (Name
"permil",   Int
8240) forall a. a -> [a] -> [a]
:
   (Name
"lsaquo",   Int
8249) forall a. a -> [a] -> [a]
:
   (Name
"rsaquo",   Int
8250) forall a. a -> [a] -> [a]
:
   (Name
"euro",     Int
8364) forall a. a -> [a] -> [a]
:

   (Name
"fnof",     Int
402) forall a. a -> [a] -> [a]
:
   (Name
"Alpha",    Int
913) forall a. a -> [a] -> [a]
:
   (Name
"Beta",     Int
914) forall a. a -> [a] -> [a]
:
   (Name
"Gamma",    Int
915) forall a. a -> [a] -> [a]
:
   (Name
"Delta",    Int
916) forall a. a -> [a] -> [a]
:
   (Name
"Epsilon",  Int
917) forall a. a -> [a] -> [a]
:
   (Name
"Zeta",     Int
918) forall a. a -> [a] -> [a]
:
   (Name
"Eta",      Int
919) forall a. a -> [a] -> [a]
:
   (Name
"Theta",    Int
920) forall a. a -> [a] -> [a]
:
   (Name
"Iota",     Int
921) forall a. a -> [a] -> [a]
:
   (Name
"Kappa",    Int
922) forall a. a -> [a] -> [a]
:
   (Name
"Lambda",   Int
923) forall a. a -> [a] -> [a]
:
   (Name
"Mu",       Int
924) forall a. a -> [a] -> [a]
:
   (Name
"Nu",       Int
925) forall a. a -> [a] -> [a]
:
   (Name
"Xi",       Int
926) forall a. a -> [a] -> [a]
:
   (Name
"Omicron",  Int
927) forall a. a -> [a] -> [a]
:
   (Name
"Pi",       Int
928) forall a. a -> [a] -> [a]
:
   (Name
"Rho",      Int
929) forall a. a -> [a] -> [a]
:
   (Name
"Sigma",    Int
931) forall a. a -> [a] -> [a]
:
   (Name
"Tau",      Int
932) forall a. a -> [a] -> [a]
:
   (Name
"Upsilon",  Int
933) forall a. a -> [a] -> [a]
:
   (Name
"Phi",      Int
934) forall a. a -> [a] -> [a]
:
   (Name
"Chi",      Int
935) forall a. a -> [a] -> [a]
:
   (Name
"Psi",      Int
936) forall a. a -> [a] -> [a]
:
   (Name
"Omega",    Int
937) forall a. a -> [a] -> [a]
:
   (Name
"alpha",    Int
945) forall a. a -> [a] -> [a]
:
   (Name
"beta",     Int
946) forall a. a -> [a] -> [a]
:
   (Name
"gamma",    Int
947) forall a. a -> [a] -> [a]
:
   (Name
"delta",    Int
948) forall a. a -> [a] -> [a]
:
   (Name
"epsilon",  Int
949) forall a. a -> [a] -> [a]
:
   (Name
"zeta",     Int
950) forall a. a -> [a] -> [a]
:
   (Name
"eta",      Int
951) forall a. a -> [a] -> [a]
:
   (Name
"theta",    Int
952) forall a. a -> [a] -> [a]
:
   (Name
"iota",     Int
953) forall a. a -> [a] -> [a]
:
   (Name
"kappa",    Int
954) forall a. a -> [a] -> [a]
:
   (Name
"lambda",   Int
955) forall a. a -> [a] -> [a]
:
   (Name
"mu",       Int
956) forall a. a -> [a] -> [a]
:
   (Name
"nu",       Int
957) forall a. a -> [a] -> [a]
:
   (Name
"xi",       Int
958) forall a. a -> [a] -> [a]
:
   (Name
"omicron",  Int
959) forall a. a -> [a] -> [a]
:
   (Name
"pi",       Int
960) forall a. a -> [a] -> [a]
:
   (Name
"rho",      Int
961) forall a. a -> [a] -> [a]
:
   (Name
"sigmaf",   Int
962) forall a. a -> [a] -> [a]
:
   (Name
"sigma",    Int
963) forall a. a -> [a] -> [a]
:
   (Name
"tau",      Int
964) forall a. a -> [a] -> [a]
:
   (Name
"upsilon",  Int
965) forall a. a -> [a] -> [a]
:
   (Name
"phi",      Int
966) forall a. a -> [a] -> [a]
:
   (Name
"chi",      Int
967) forall a. a -> [a] -> [a]
:
   (Name
"psi",      Int
968) forall a. a -> [a] -> [a]
:
   (Name
"omega",    Int
969) forall a. a -> [a] -> [a]
:
   (Name
"thetasym", Int
977) forall a. a -> [a] -> [a]
:
   (Name
"upsih",    Int
978) forall a. a -> [a] -> [a]
:
   (Name
"piv",      Int
982) forall a. a -> [a] -> [a]
:
   (Name
"bull",     Int
8226) forall a. a -> [a] -> [a]
:
   (Name
"hellip",   Int
8230) forall a. a -> [a] -> [a]
:
   (Name
"prime",    Int
8242) forall a. a -> [a] -> [a]
:
   (Name
"Prime",    Int
8243) forall a. a -> [a] -> [a]
:
   (Name
"oline",    Int
8254) forall a. a -> [a] -> [a]
:
   (Name
"frasl",    Int
8260) forall a. a -> [a] -> [a]
:
   (Name
"weierp",   Int
8472) forall a. a -> [a] -> [a]
:
   (Name
"image",    Int
8465) forall a. a -> [a] -> [a]
:
   (Name
"real",     Int
8476) forall a. a -> [a] -> [a]
:
   (Name
"trade",    Int
8482) forall a. a -> [a] -> [a]
:
   (Name
"alefsym",  Int
8501) forall a. a -> [a] -> [a]
:
   (Name
"larr",     Int
8592) forall a. a -> [a] -> [a]
:
   (Name
"uarr",     Int
8593) forall a. a -> [a] -> [a]
:
   (Name
"rarr",     Int
8594) forall a. a -> [a] -> [a]
:
   (Name
"darr",     Int
8595) forall a. a -> [a] -> [a]
:
   (Name
"harr",     Int
8596) forall a. a -> [a] -> [a]
:
   (Name
"crarr",    Int
8629) forall a. a -> [a] -> [a]
:
   (Name
"lArr",     Int
8656) forall a. a -> [a] -> [a]
:
   (Name
"uArr",     Int
8657) forall a. a -> [a] -> [a]
:
   (Name
"rArr",     Int
8658) forall a. a -> [a] -> [a]
:
   (Name
"dArr",     Int
8659) forall a. a -> [a] -> [a]
:
   (Name
"hArr",     Int
8660) forall a. a -> [a] -> [a]
:
   (Name
"forall",   Int
8704) forall a. a -> [a] -> [a]
:
   (Name
"part",     Int
8706) forall a. a -> [a] -> [a]
:
   (Name
"exist",    Int
8707) forall a. a -> [a] -> [a]
:
   (Name
"empty",    Int
8709) forall a. a -> [a] -> [a]
:
   (Name
"nabla",    Int
8711) forall a. a -> [a] -> [a]
:
   (Name
"isin",     Int
8712) forall a. a -> [a] -> [a]
:
   (Name
"notin",    Int
8713) forall a. a -> [a] -> [a]
:
   (Name
"ni",       Int
8715) forall a. a -> [a] -> [a]
:
   (Name
"prod",     Int
8719) forall a. a -> [a] -> [a]
:
   (Name
"sum",      Int
8721) forall a. a -> [a] -> [a]
:
   (Name
"minus",    Int
8722) forall a. a -> [a] -> [a]
:
   (Name
"lowast",   Int
8727) forall a. a -> [a] -> [a]
:
   (Name
"radic",    Int
8730) forall a. a -> [a] -> [a]
:
   (Name
"prop",     Int
8733) forall a. a -> [a] -> [a]
:
   (Name
"infin",    Int
8734) forall a. a -> [a] -> [a]
:
   (Name
"ang",      Int
8736) forall a. a -> [a] -> [a]
:
   (Name
"and",      Int
8743) forall a. a -> [a] -> [a]
:
   (Name
"or",       Int
8744) forall a. a -> [a] -> [a]
:
   (Name
"cap",      Int
8745) forall a. a -> [a] -> [a]
:
   (Name
"cup",      Int
8746) forall a. a -> [a] -> [a]
:
   (Name
"int",      Int
8747) forall a. a -> [a] -> [a]
:
   (Name
"there4",   Int
8756) forall a. a -> [a] -> [a]
:
   (Name
"sim",      Int
8764) forall a. a -> [a] -> [a]
:
   (Name
"cong",     Int
8773) forall a. a -> [a] -> [a]
:
   (Name
"asymp",    Int
8776) forall a. a -> [a] -> [a]
:
   (Name
"ne",       Int
8800) forall a. a -> [a] -> [a]
:
   (Name
"equiv",    Int
8801) forall a. a -> [a] -> [a]
:
   (Name
"le",       Int
8804) forall a. a -> [a] -> [a]
:
   (Name
"ge",       Int
8805) forall a. a -> [a] -> [a]
:
   (Name
"sub",      Int
8834) forall a. a -> [a] -> [a]
:
   (Name
"sup",      Int
8835) forall a. a -> [a] -> [a]
:
   (Name
"nsub",     Int
8836) forall a. a -> [a] -> [a]
:
   (Name
"sube",     Int
8838) forall a. a -> [a] -> [a]
:
   (Name
"supe",     Int
8839) forall a. a -> [a] -> [a]
:
   (Name
"oplus",    Int
8853) forall a. a -> [a] -> [a]
:
   (Name
"otimes",   Int
8855) forall a. a -> [a] -> [a]
:
   (Name
"perp",     Int
8869) forall a. a -> [a] -> [a]
:
   (Name
"sdot",     Int
8901) forall a. a -> [a] -> [a]
:
   (Name
"lceil",    Int
8968) forall a. a -> [a] -> [a]
:
   (Name
"rceil",    Int
8969) forall a. a -> [a] -> [a]
:
   (Name
"lfloor",   Int
8970) forall a. a -> [a] -> [a]
:
   (Name
"rfloor",   Int
8971) forall a. a -> [a] -> [a]
:
   (Name
"lang",     Int
9001) forall a. a -> [a] -> [a]
:
   (Name
"rang",     Int
9002) forall a. a -> [a] -> [a]
:
   (Name
"loz",      Int
9674) forall a. a -> [a] -> [a]
:
   (Name
"spades",   Int
9824) forall a. a -> [a] -> [a]
:
   (Name
"clubs",    Int
9827) forall a. a -> [a] -> [a]
:
   (Name
"hearts",   Int
9829) forall a. a -> [a] -> [a]
:
   (Name
"diams",    Int
9830) forall a. a -> [a] -> [a]
:
   []