From 583536a138bd43f40a2633ac4781af672acb22ac Mon Sep 17 00:00:00 2001 From: fiddlosopher Date: Tue, 28 Aug 2007 02:30:38 +0000 Subject: Refactored Text.Pandoc.CharacterReferences. Removed unnecessary 'try's for a speed improvement. Removed unnecessary '&' and ';' from the entity table. git-svn-id: https://pandoc.googlecode.com/svn/trunk@922 788f1e2b-df1e-0410-8736-df70ead52e1b --- src/Text/Pandoc/CharacterReferences.hs | 550 ++++++++++++++++----------------- 1 file changed, 271 insertions(+), 279 deletions(-) diff --git a/src/Text/Pandoc/CharacterReferences.hs b/src/Text/Pandoc/CharacterReferences.hs index deb2c3f1a..466f5d8f4 100644 --- a/src/Text/Pandoc/CharacterReferences.hs +++ b/src/Text/Pandoc/CharacterReferences.hs @@ -37,36 +37,28 @@ import qualified Data.Map as Map -- | Parse character entity. characterReference :: GenParser Char st Char -characterReference = characterEntity <|> - hexadecimalCharacterReference <|> - decimalCharacterReference - "character entity" - --- | Parse character entity. -characterEntity :: GenParser Char st Char -characterEntity = try $ do +characterReference = try $ do st <- char '&' - body <- many1 alphaNum + character <- numRef <|> entity end <- char ';' - let entity = "&" ++ body ++ ";" - return $ Map.findWithDefault '?' entity entityTable - --- | Parse hexadecimal entity. -hexadecimalCharacterReference :: GenParser Char st Char -hexadecimalCharacterReference = try $ do - st <- string "&#" - hex <- oneOf "Xx" - body <- many1 (oneOf "0123456789ABCDEFabcdef") - end <- char ';' - return $ chr $ read ('0':'x':body) + return character --- | Parse decimal entity. -decimalCharacterReference :: GenParser Char st Char -decimalCharacterReference = try $ do - st <- string "&#" - body <- many1 digit - end <- char ';' - return $ chr $ read body +numRef :: GenParser Char st Char +numRef = do + char '#' + num <- hexNum <|> decNum + return $ chr $ num + +hexNum :: GenParser Char st Int +hexNum = oneOf "Xx" >> many1 hexDigit >>= return . read . ("0x" ++) + +decNum :: GenParser Char st Int +decNum = many1 digit >>= return . read + +entity :: GenParser Char st Char +entity = do + body <- many1 alphaNum + return $ Map.findWithDefault '?' body entityTable -- | Convert entities in a string to characters. decodeCharacterReferences :: String -> String @@ -80,256 +72,256 @@ entityTable = Map.fromList entityTableList entityTableList :: [(String, Char)] entityTableList = [ - (""", chr 34), - ("&", chr 38), - ("<", chr 60), - (">", chr 62), - (" ", chr 160), - ("¡", chr 161), - ("¢", chr 162), - ("£", chr 163), - ("¤", chr 164), - ("¥", chr 165), - ("¦", chr 166), - ("§", chr 167), - ("¨", chr 168), - ("©", chr 169), - ("ª", chr 170), - ("«", chr 171), - ("¬", chr 172), - ("­", chr 173), - ("®", chr 174), - ("¯", chr 175), - ("°", chr 176), - ("±", chr 177), - ("²", chr 178), - ("³", chr 179), - ("´", chr 180), - ("µ", chr 181), - ("¶", chr 182), - ("·", chr 183), - ("¸", chr 184), - ("¹", chr 185), - ("º", chr 186), - ("»", chr 187), - ("¼", chr 188), - ("½", chr 189), - ("¾", chr 190), - ("¿", chr 191), - ("À", chr 192), - ("Á", chr 193), - ("Â", chr 194), - ("Ã", chr 195), - ("Ä", chr 196), - ("Å", chr 197), - ("Æ", chr 198), - ("Ç", chr 199), - ("È", chr 200), - ("É", chr 201), - ("Ê", chr 202), - ("Ë", chr 203), - ("Ì", chr 204), - ("Í", chr 205), - ("Î", chr 206), - ("Ï", chr 207), - ("Ð", chr 208), - ("Ñ", chr 209), - ("Ò", chr 210), - ("Ó", chr 211), - ("Ô", chr 212), - ("Õ", chr 213), - ("Ö", chr 214), - ("×", chr 215), - ("Ø", chr 216), - ("Ù", chr 217), - ("Ú", chr 218), - ("Û", chr 219), - ("Ü", chr 220), - ("Ý", chr 221), - ("Þ", chr 222), - ("ß", chr 223), - ("à", chr 224), - ("á", chr 225), - ("â", chr 226), - ("ã", chr 227), - ("ä", chr 228), - ("å", chr 229), - ("æ", chr 230), - ("ç", chr 231), - ("è", chr 232), - ("é", chr 233), - ("ê", chr 234), - ("ë", chr 235), - ("ì", chr 236), - ("í", chr 237), - ("î", chr 238), - ("ï", chr 239), - ("ð", chr 240), - ("ñ", chr 241), - ("ò", chr 242), - ("ó", chr 243), - ("ô", chr 244), - ("õ", chr 245), - ("ö", chr 246), - ("÷", chr 247), - ("ø", chr 248), - ("ù", chr 249), - ("ú", chr 250), - ("û", chr 251), - ("ü", chr 252), - ("ý", chr 253), - ("þ", chr 254), - ("ÿ", chr 255), - ("Œ", chr 338), - ("œ", chr 339), - ("Š", chr 352), - ("š", chr 353), - ("Ÿ", chr 376), - ("ƒ", chr 402), - ("ˆ", chr 710), - ("˜", chr 732), - ("Α", chr 913), - ("Β", chr 914), - ("Γ", chr 915), - ("Δ", chr 916), - ("Ε", chr 917), - ("Ζ", chr 918), - ("Η", chr 919), - ("Θ", chr 920), - ("Ι", chr 921), - ("Κ", chr 922), - ("Λ", chr 923), - ("Μ", chr 924), - ("Ν", chr 925), - ("Ξ", chr 926), - ("Ο", chr 927), - ("Π", chr 928), - ("Ρ", chr 929), - ("Σ", chr 931), - ("Τ", chr 932), - ("Υ", chr 933), - ("Φ", chr 934), - ("Χ", chr 935), - ("Ψ", chr 936), - ("Ω", chr 937), - ("α", chr 945), - ("β", chr 946), - ("γ", chr 947), - ("δ", chr 948), - ("ε", chr 949), - ("ζ", chr 950), - ("η", chr 951), - ("θ", chr 952), - ("ι", chr 953), - ("κ", chr 954), - ("λ", chr 955), - ("μ", chr 956), - ("ν", chr 957), - ("ξ", chr 958), - ("ο", chr 959), - ("π", chr 960), - ("ρ", chr 961), - ("ς", chr 962), - ("σ", chr 963), - ("τ", chr 964), - ("υ", chr 965), - ("φ", chr 966), - ("χ", chr 967), - ("ψ", chr 968), - ("ω", chr 969), - ("ϑ", chr 977), - ("ϒ", chr 978), - ("ϖ", chr 982), - (" ", chr 8194), - (" ", chr 8195), - (" ", chr 8201), - ("‌", chr 8204), - ("‍", chr 8205), - ("‎", chr 8206), - ("‏", chr 8207), - ("–", chr 8211), - ("—", chr 8212), - ("‘", chr 8216), - ("’", chr 8217), - ("‚", chr 8218), - ("“", chr 8220), - ("”", chr 8221), - ("„", chr 8222), - ("†", chr 8224), - ("‡", chr 8225), - ("•", chr 8226), - ("…", chr 8230), - ("‰", chr 8240), - ("′", chr 8242), - ("″", chr 8243), - ("‹", chr 8249), - ("›", chr 8250), - ("‾", chr 8254), - ("⁄", chr 8260), - ("€", chr 8364), - ("ℑ", chr 8465), - ("℘", chr 8472), - ("ℜ", chr 8476), - ("™", chr 8482), - ("ℵ", chr 8501), - ("←", chr 8592), - ("↑", chr 8593), - ("→", chr 8594), - ("↓", chr 8595), - ("↔", chr 8596), - ("↵", chr 8629), - ("⇐", chr 8656), - ("⇑", chr 8657), - ("⇒", chr 8658), - ("⇓", chr 8659), - ("⇔", chr 8660), - ("∀", chr 8704), - ("∂", chr 8706), - ("∃", chr 8707), - ("∅", chr 8709), - ("∇", chr 8711), - ("∈", chr 8712), - ("∉", chr 8713), - ("∋", chr 8715), - ("∏", chr 8719), - ("∑", chr 8721), - ("−", chr 8722), - ("∗", chr 8727), - ("√", chr 8730), - ("∝", chr 8733), - ("∞", chr 8734), - ("∠", chr 8736), - ("∧", chr 8743), - ("∨", chr 8744), - ("∩", chr 8745), - ("∪", chr 8746), - ("∫", chr 8747), - ("∴", chr 8756), - ("∼", chr 8764), - ("≅", chr 8773), - ("≈", chr 8776), - ("≠", chr 8800), - ("≡", chr 8801), - ("≤", chr 8804), - ("≥", chr 8805), - ("⊂", chr 8834), - ("⊃", chr 8835), - ("⊄", chr 8836), - ("⊆", chr 8838), - ("⊇", chr 8839), - ("⊕", chr 8853), - ("⊗", chr 8855), - ("⊥", chr 8869), - ("⋅", chr 8901), - ("⌈", chr 8968), - ("⌉", chr 8969), - ("⌊", chr 8970), - ("⌋", chr 8971), - ("⟨", chr 9001), - ("⟩", chr 9002), - ("◊", chr 9674), - ("♠", chr 9824), - ("♣", chr 9827), - ("♥", chr 9829), - ("♦", chr 9830) + ("quot", chr 34), + ("amp", chr 38), + ("lt", chr 60), + ("gt", chr 62), + ("nbsp", chr 160), + ("iexcl", chr 161), + ("cent", chr 162), + ("pound", chr 163), + ("curren", chr 164), + ("yen", chr 165), + ("brvbar", chr 166), + ("sect", chr 167), + ("uml", chr 168), + ("copy", chr 169), + ("ordf", chr 170), + ("laquo", chr 171), + ("not", chr 172), + ("shy", chr 173), + ("reg", chr 174), + ("macr", chr 175), + ("deg", chr 176), + ("plusmn", chr 177), + ("sup2", chr 178), + ("sup3", chr 179), + ("acute", chr 180), + ("micro", chr 181), + ("para", chr 182), + ("middot", chr 183), + ("cedil", chr 184), + ("sup1", chr 185), + ("ordm", chr 186), + ("raquo", chr 187), + ("frac14", chr 188), + ("frac12", chr 189), + ("frac34", chr 190), + ("iquest", chr 191), + ("Agrave", chr 192), + ("Aacute", chr 193), + ("Acirc", chr 194), + ("Atilde", chr 195), + ("Auml", chr 196), + ("Aring", chr 197), + ("AElig", chr 198), + ("Ccedil", chr 199), + ("Egrave", chr 200), + ("Eacute", chr 201), + ("Ecirc", chr 202), + ("Euml", chr 203), + ("Igrave", chr 204), + ("Iacute", chr 205), + ("Icirc", chr 206), + ("Iuml", chr 207), + ("ETH", chr 208), + ("Ntilde", chr 209), + ("Ograve", chr 210), + ("Oacute", chr 211), + ("Ocirc", chr 212), + ("Otilde", chr 213), + ("Ouml", chr 214), + ("times", chr 215), + ("Oslash", chr 216), + ("Ugrave", chr 217), + ("Uacute", chr 218), + ("Ucirc", chr 219), + ("Uuml", chr 220), + ("Yacute", chr 221), + ("THORN", chr 222), + ("szlig", chr 223), + ("agrave", chr 224), + ("aacute", chr 225), + ("acirc", chr 226), + ("atilde", chr 227), + ("auml", chr 228), + ("aring", chr 229), + ("aelig", chr 230), + ("ccedil", chr 231), + ("egrave", chr 232), + ("eacute", chr 233), + ("ecirc", chr 234), + ("euml", chr 235), + ("igrave", chr 236), + ("iacute", chr 237), + ("icirc", chr 238), + ("iuml", chr 239), + ("eth", chr 240), + ("ntilde", chr 241), + ("ograve", chr 242), + ("oacute", chr 243), + ("ocirc", chr 244), + ("otilde", chr 245), + ("ouml", chr 246), + ("divide", chr 247), + ("oslash", chr 248), + ("ugrave", chr 249), + ("uacute", chr 250), + ("ucirc", chr 251), + ("uuml", chr 252), + ("yacute", chr 253), + ("thorn", chr 254), + ("yuml", chr 255), + ("OElig", chr 338), + ("oelig", chr 339), + ("Scaron", chr 352), + ("scaron", chr 353), + ("Yuml", chr 376), + ("fnof", chr 402), + ("circ", chr 710), + ("tilde", chr 732), + ("Alpha", chr 913), + ("Beta", chr 914), + ("Gamma", chr 915), + ("Delta", chr 916), + ("Epsilon", chr 917), + ("Zeta", chr 918), + ("Eta", chr 919), + ("Theta", chr 920), + ("Iota", chr 921), + ("Kappa", chr 922), + ("Lambda", chr 923), + ("Mu", chr 924), + ("Nu", chr 925), + ("Xi", chr 926), + ("Omicron", chr 927), + ("Pi", chr 928), + ("Rho", chr 929), + ("Sigma", chr 931), + ("Tau", chr 932), + ("Upsilon", chr 933), + ("Phi", chr 934), + ("Chi", chr 935), + ("Psi", chr 936), + ("Omega", chr 937), + ("alpha", chr 945), + ("beta", chr 946), + ("gamma", chr 947), + ("delta", chr 948), + ("epsilon", chr 949), + ("zeta", chr 950), + ("eta", chr 951), + ("theta", chr 952), + ("iota", chr 953), + ("kappa", chr 954), + ("lambda", chr 955), + ("mu", chr 956), + ("nu", chr 957), + ("xi", chr 958), + ("omicron", chr 959), + ("pi", chr 960), + ("rho", chr 961), + ("sigmaf", chr 962), + ("sigma", chr 963), + ("tau", chr 964), + ("upsilon", chr 965), + ("phi", chr 966), + ("chi", chr 967), + ("psi", chr 968), + ("omega", chr 969), + ("thetasym", chr 977), + ("upsih", chr 978), + ("piv", chr 982), + ("ensp", chr 8194), + ("emsp", chr 8195), + ("thinsp", chr 8201), + ("zwnj", chr 8204), + ("zwj", chr 8205), + ("lrm", chr 8206), + ("rlm", chr 8207), + ("ndash", chr 8211), + ("mdash", chr 8212), + ("lsquo", chr 8216), + ("rsquo", chr 8217), + ("sbquo", chr 8218), + ("ldquo", chr 8220), + ("rdquo", chr 8221), + ("bdquo", chr 8222), + ("dagger", chr 8224), + ("Dagger", chr 8225), + ("bull", chr 8226), + ("hellip", chr 8230), + ("permil", chr 8240), + ("prime", chr 8242), + ("Prime", chr 8243), + ("lsaquo", chr 8249), + ("rsaquo", chr 8250), + ("oline", chr 8254), + ("frasl", chr 8260), + ("euro", chr 8364), + ("image", chr 8465), + ("weierp", chr 8472), + ("real", chr 8476), + ("trade", chr 8482), + ("alefsym", chr 8501), + ("larr", chr 8592), + ("uarr", chr 8593), + ("rarr", chr 8594), + ("darr", chr 8595), + ("harr", chr 8596), + ("crarr", chr 8629), + ("lArr", chr 8656), + ("uArr", chr 8657), + ("rArr", chr 8658), + ("dArr", chr 8659), + ("hArr", chr 8660), + ("forall", chr 8704), + ("part", chr 8706), + ("exist", chr 8707), + ("empty", chr 8709), + ("nabla", chr 8711), + ("isin", chr 8712), + ("notin", chr 8713), + ("ni", chr 8715), + ("prod", chr 8719), + ("sum", chr 8721), + ("minus", chr 8722), + ("lowast", chr 8727), + ("radic", chr 8730), + ("prop", chr 8733), + ("infin", chr 8734), + ("ang", chr 8736), + ("and", chr 8743), + ("or", chr 8744), + ("cap", chr 8745), + ("cup", chr 8746), + ("int", chr 8747), + ("there4", chr 8756), + ("sim", chr 8764), + ("cong", chr 8773), + ("asymp", chr 8776), + ("ne", chr 8800), + ("equiv", chr 8801), + ("le", chr 8804), + ("ge", chr 8805), + ("sub", chr 8834), + ("sup", chr 8835), + ("nsub", chr 8836), + ("sube", chr 8838), + ("supe", chr 8839), + ("oplus", chr 8853), + ("otimes", chr 8855), + ("perp", chr 8869), + ("sdot", chr 8901), + ("lceil", chr 8968), + ("rceil", chr 8969), + ("lfloor", chr 8970), + ("rfloor", chr 8971), + ("lang", chr 9001), + ("rang", chr 9002), + ("loz", chr 9674), + ("spades", chr 9824), + ("clubs", chr 9827), + ("hearts", chr 9829), + ("diams", chr 9830) ] -- cgit v1.2.3