diff --git a/lib/jsdom/browser/htmlencoding.js b/lib/jsdom/browser/htmlencoding.js index 529e567b0c..b701b94c06 100644 --- a/lib/jsdom/browser/htmlencoding.js +++ b/lib/jsdom/browser/htmlencoding.js @@ -1,105 +1,1467 @@ -var entityCharCodes = { - 'quot': 34, - 'amp': 38, - 'apos': 39, - 'lt': 60, - 'gt': 62, - 'nbsp': 160, - 'iexcl': 161, - 'cent': 162, - 'pound': 163, - 'curren': 164, - 'yen': 165, - 'brvbar': 166, - 'sect': 167, - 'uml': 168, - 'copy': 169, - 'ordf': 170, - 'laquo': 171, - 'not': 172, - 'shy': 173, - 'reg': 174, - 'macr': 175, - 'deg': 176, - 'plusmn': 177, - 'sup2': 178, - 'sup3': 179, - 'acute': 180, - 'micro': 181, - 'para': 182, - 'middot': 183, - 'cedil': 184, - 'sup1': 185, - 'ordm': 186, - 'raquo': 187, - 'frac14': 188, - 'frac12': 189, - 'frac34': 190, - 'iquest': 191, - 'Agrave': 192, - 'Aacute': 193, - 'Acirc': 194, - 'Atilde': 195, - 'Auml': 196, - 'Aring': 197, - 'AElig': 198, - 'Ccedil': 199, - 'Egrave': 200, - 'Eacute': 201, - 'Ecirc': 202, - 'Euml': 203, - 'Igrave': 204, - 'Iacute': 205, - 'Icirc': 206, - 'Iuml': 207, - 'ETH': 208, - 'Ntilde': 209, - 'Ograve': 210, - 'Oacute': 211, - 'Ocirc': 212, - 'Otilde': 213, - 'Ouml': 214, - 'times': 215, - 'Oslash': 216, - 'Ugrave': 217, - 'Uacute': 218, - 'Ucirc': 219, - 'Uuml': 220, - 'Yacute': 221, - 'THORN': 222, - 'szlig': 223, - 'agrave': 224, - 'aacute': 225, - 'acirc': 226, - 'atilde': 227, - 'auml': 228, - 'aring': 229, - 'aelig': 230, - 'ccedil': 231, - 'egrave': 232, - 'eacute': 233, - 'ecirc': 234, - 'euml': 235, - 'igrave': 236, - 'iacute': 237, - 'icirc': 238, - 'iuml': 239, - 'eth': 240, - 'ntilde': 241, - 'ograve': 242, - 'oacute': 243, - 'ocirc': 244, - 'otilde': 245, - 'ouml': 246, - 'divide': 247, - 'oslash': 248, - 'ugrave': 249, - 'uacute': 250, - 'ucirc': 251, - 'uuml': 252, - 'yacute': 253, - 'thorn': 254, - 'yuml': 255 +var charByEntityName = { + 'quot': '"', + 'amp': '&', + 'apos': '\'', + 'lt': '<', + 'gt': '>', + 'nbsp': ' ', + 'iexcl': '¡', + 'cent': '¢', + 'pound': '£', + 'curren': '¤', + 'yen': '¥', + 'brvbar': '¦', + 'sect': '§', + 'uml': '¨', + 'copy': '©', + 'ordf': 'ª', + 'laquo': '«', + 'not': '¬', + 'shy': '­', + 'reg': '®', + 'macr': '¯', // http://www.w3.org/TR/html4/sgml/entities.html + 'strns': '¯', // http://www.w3.org/TR/html5/named-character-references.html + 'deg': '°', + 'plusmn': '±', // http://www.w3.org/TR/html4/sgml/entities.html + 'pm': '±', // http://www.w3.org/TR/html5/named-character-references.html + 'sup2': '²', + 'sup3': '³', + 'acute': '´', + 'micro': 'µ', + 'para': '¶', + 'middot': '·', + 'cedil': '¸', + 'sup1': '¹', + 'ordm': 'º', + 'raquo': '»', + 'frac14': '¼', + 'half': '½', // http://www.w3.org/TR/html4/sgml/entities.html + 'frac12': '½', // http://www.w3.org/TR/html5/named-character-references.html + 'frac34': '¾', + 'iquest': '¿', + 'Agrave': 'À', + 'Aacute': 'Á', + 'Acirc': 'Â', + 'Atilde': 'Ã', + 'Auml': 'Ä', + 'Aring': 'Å', // http://www.w3.org/TR/html4/sgml/entities.html + 'angst': 'Å', // http://www.w3.org/TR/html5/named-character-references.html + 'AElig': 'Æ', + 'Ccedil': 'Ç', + 'Egrave': 'È', + 'Eacute': 'É', + 'Ecirc': 'Ê', + 'Euml': 'Ë', + 'Igrave': 'Ì', + 'Iacute': 'Í', + 'Icirc': 'Î', + 'Iuml': 'Ï', + 'ETH': 'Ð', + 'Ntilde': 'Ñ', + 'Ograve': 'Ò', + 'Oacute': 'Ó', + 'Ocirc': 'Ô', + 'Otilde': 'Õ', + 'Ouml': 'Ö', + 'times': '×', + 'Oslash': 'Ø', + 'Ugrave': 'Ù', + 'Uacute': 'Ú', + 'Ucirc': 'Û', + 'Uuml': 'Ü', + 'Yacute': 'Ý', + 'THORN': 'Þ', + 'szlig': 'ß', + 'agrave': 'à', + 'aacute': 'á', + 'acirc': 'â', + 'atilde': 'ã', + 'auml': 'ä', + 'aring': 'å', + 'aelig': 'æ', + 'ccedil': 'ç', + 'egrave': 'è', + 'eacute': 'é', + 'ecirc': 'ê', + 'euml': 'ë', + 'igrave': 'ì', + 'iacute': 'í', + 'icirc': 'î', + 'iuml': 'ï', + 'eth': 'ð', + 'ntilde': 'ñ', + 'ograve': 'ò', + 'oacute': 'ó', + 'ocirc': 'ô', + 'otilde': 'õ', + 'ouml': 'ö', + 'divide': '÷', + 'oslash': 'ø', + 'ugrave': 'ù', + 'uacute': 'ú', + 'ucirc': 'û', + 'uuml': 'ü', + 'yacute': 'ý', + 'thorn': 'þ', + 'yuml': 'ÿ', + 'Amacr': 'Ā', + 'amacr': 'ā', + 'Abreve': 'Ă', + 'abreve': 'ă', + 'Aogon': 'Ą', + 'aogon': 'ą', + 'Cacute': 'Ć', + 'cacute': 'ć', + 'Ccirc': 'Ĉ', + 'ccirc': 'ĉ', + 'Cdot': 'Ċ', + 'cdot': 'ċ', + 'Ccaron': 'Č', + 'ccaron': 'č', + 'Dcaron': 'Ď', + 'dcaron': 'ď', + 'Dstrok': 'Đ', + 'dstrok': 'đ', + 'Emacr': 'Ē', + 'emacr': 'ē', + 'Edot': 'Ė', + 'edot': 'ė', + 'Eogon': 'Ę', + 'eogon': 'ę', + 'Ecaron': 'Ě', + 'ecaron': 'ě', + 'Gcirc': 'Ĝ', + 'gcirc': 'ĝ', + 'Gbreve': 'Ğ', + 'gbreve': 'ğ', + 'Gdot': 'Ġ', + 'gdot': 'ġ', + 'Gcedil': 'Ģ', + 'Hcirc': 'Ĥ', + 'hcirc': 'ĥ', + 'Hstrok': 'Ħ', + 'hstrok': 'ħ', + 'Itilde': 'Ĩ', + 'itilde': 'ĩ', + 'Imacr': 'Ī', + 'imacr': 'ī', + 'Iogon': 'Į', + 'iogon': 'į', + 'Idot': 'İ', + 'inodot': 'ı', + 'IJlig': 'IJ', + 'ijlig': 'ij', + 'Jcirc': 'Ĵ', + 'jcirc': 'ĵ', + 'Kcedil': 'Ķ', + 'kcedil': 'ķ', + 'kgreen': 'ĸ', + 'Lacute': 'Ĺ', + 'lacute': 'ĺ', + 'Lcedil': 'Ļ', + 'lcedil': 'ļ', + 'Lcaron': 'Ľ', + 'lcaron': 'ľ', + 'Lmidot': 'Ŀ', + 'lmidot': 'ŀ', + 'Lstrok': 'Ł', + 'lstrok': 'ł', + 'Nacute': 'Ń', + 'nacute': 'ń', + 'Ncedil': 'Ņ', + 'ncedil': 'ņ', + 'Ncaron': 'Ň', + 'ncaron': 'ň', + 'napos': 'ʼn', + 'ENG': 'Ŋ', + 'eng': 'ŋ', + 'Omacr': 'Ō', + 'omacr': 'ō', + 'Odblac': 'Ő', + 'odblac': 'ő', + 'OElig': 'Œ', + 'oelig': 'œ', + 'Racute': 'Ŕ', + 'racute': 'ŕ', + 'Rcedil': 'Ŗ', + 'rcedil': 'ŗ', + 'Rcaron': 'Ř', + 'rcaron': 'ř', + 'Sacute': 'Ś', + 'sacute': 'ś', + 'Scirc': 'Ŝ', + 'scirc': 'ŝ', + 'Scedil': 'Ş', + 'scedil': 'ş', + 'Scaron': 'Š', + 'scaron': 'š', + 'Tcedil': 'Ţ', + 'tcedil': 'ţ', + 'Tcaron': 'Ť', + 'tcaron': 'ť', + 'Tstrok': 'Ŧ', + 'tstrok': 'ŧ', + 'Utilde': 'Ũ', + 'utilde': 'ũ', + 'Umacr': 'Ū', + 'umacr': 'ū', + 'Ubreve': 'Ŭ', + 'ubreve': 'ŭ', + 'Uring': 'Ů', + 'uring': 'ů', + 'Udblac': 'Ű', + 'udblac': 'ű', + 'Uogon': 'Ų', + 'uogon': 'ų', + 'Wcirc': 'Ŵ', + 'wcirc': 'ŵ', + 'Ycirc': 'Ŷ', + 'ycirc': 'ŷ', + 'Yuml': 'Ÿ', + 'Zacute': 'Ź', + 'zacute': 'ź', + 'Zdot': 'Ż', + 'zdot': 'ż', + 'Zcaron': 'Ž', + 'zcaron': 'ž', + 'fnof': 'ƒ', + 'imped': 'Ƶ', + 'gacute': 'ǵ', + 'jmath': 'ȷ', + 'circ': 'ˆ', + 'caron': 'ˇ', + 'breve': '˘', + 'dot': '˙', + 'ring': '˚', + 'ogon': '˛', + 'tilde': '˜', + 'dblac': '˝', + 'Alpha': 'Α', + 'Beta': 'Β', + 'Gamma': 'Γ', + 'Delta': 'Δ', + 'Epsilon': 'Ε', + 'Zeta': 'Ζ', + 'Eta': 'Η', + 'Theta': 'Θ', + 'Iota': 'Ι', + 'Kappa': 'Κ', + 'Lambda': 'Λ', + 'Mu': 'Μ', + 'Nu': 'Ν', + 'Xi': 'Ξ', + 'Omicron': 'Ο', + 'Pi': 'Π', + 'Rho': 'Ρ', + 'Sigma': 'Σ', + 'Tau': 'Τ', + 'Upsilon': 'Υ', + 'Phi': 'Φ', + 'Chi': 'Χ', + 'Psi': 'Ψ', + 'Omega': 'Ω', // http://www.w3.org/TR/html4/sgml/entities.html + 'ohm': 'Ω', // http://www.w3.org/TR/html5/named-character-references.html + 'alpha': 'α', + 'beta': 'β', + 'gamma': 'γ', + 'delta': 'δ', + 'epsilon': 'ε', + 'zeta': 'ζ', + 'eta': 'η', + 'theta': 'θ', + 'iota': 'ι', + 'kappa': 'κ', + 'lambda': 'λ', + 'mu': 'μ', + 'nu': 'ν', + 'xi': 'ξ', + 'omicron': 'ο', + 'pi': 'π', + 'rho': 'ρ', + 'sigmaf': 'ς', // http://www.w3.org/TR/html4/sgml/entities.html + 'varsigma': 'ς', // http://www.w3.org/TR/html5/named-character-references.html + 'sigma': 'σ', + 'tau': 'τ', + 'upsilon': 'υ', + 'phi': 'φ', + 'chi': 'χ', + 'psi': 'ψ', + 'omega': 'ω', + 'thetasym': 'ϑ', // http://www.w3.org/TR/html4/sgml/entities.html + 'vartheta': 'ϑ', // http://www.w3.org/TR/html5/named-character-references.html + 'upsih': 'ϒ', + 'varphi': 'ϕ', + 'piv': 'ϖ', // http://www.w3.org/TR/html4/sgml/entities.html + 'varpi': 'ϖ', // http://www.w3.org/TR/html5/named-character-references.html + 'Gammad': 'Ϝ', + 'gammad': 'ϝ', + 'varkappa': 'ϰ', + 'varrho': 'ϱ', + 'varepsilon': 'ϵ', + 'bepsi': '϶', + 'IOcy': 'Ё', + 'DJcy': 'Ђ', + 'GJcy': 'Ѓ', + 'Jukcy': 'Є', + 'DScy': 'Ѕ', + 'Iukcy': 'І', + 'YIcy': 'Ї', + 'Jsercy': 'Ј', + 'LJcy': 'Љ', + 'NJcy': 'Њ', + 'TSHcy': 'Ћ', + 'KJcy': 'Ќ', + 'Ubrcy': 'Ў', + 'DZcy': 'Џ', + 'Acy': 'А', + 'Bcy': 'Б', + 'Vcy': 'В', + 'Gcy': 'Г', + 'Dcy': 'Д', + 'IEcy': 'Е', + 'ZHcy': 'Ж', + 'Zcy': 'З', + 'Icy': 'И', + 'Jcy': 'Й', + 'Kcy': 'К', + 'Lcy': 'Л', + 'Mcy': 'М', + 'Ncy': 'Н', + 'Ocy': 'О', + 'Pcy': 'П', + 'Rcy': 'Р', + 'Scy': 'С', + 'Tcy': 'Т', + 'Ucy': 'У', + 'Fcy': 'Ф', + 'KHcy': 'Х', + 'TScy': 'Ц', + 'CHcy': 'Ч', + 'SHcy': 'Ш', + 'SHCHcy': 'Щ', + 'HARDcy': 'Ъ', + 'Ycy': 'Ы', + 'SOFTcy': 'Ь', + 'Ecy': 'Э', + 'YUcy': 'Ю', + 'YAcy': 'Я', + 'acy': 'а', + 'bcy': 'б', + 'vcy': 'в', + 'gcy': 'г', + 'dcy': 'д', + 'iecy': 'е', + 'zhcy': 'ж', + 'zcy': 'з', + 'icy': 'и', + 'jcy': 'й', + 'kcy': 'к', + 'lcy': 'л', + 'mcy': 'м', + 'ncy': 'н', + 'ocy': 'о', + 'pcy': 'п', + 'rcy': 'р', + 'scy': 'с', + 'tcy': 'т', + 'ucy': 'у', + 'fcy': 'ф', + 'khcy': 'х', + 'tscy': 'ц', + 'chcy': 'ч', + 'shcy': 'ш', + 'shchcy': 'щ', + 'hardcy': 'ъ', + 'ycy': 'ы', + 'softcy': 'ь', + 'ecy': 'э', + 'yucy': 'ю', + 'yacy': 'я', + 'iocy': 'ё', + 'djcy': 'ђ', + 'gjcy': 'ѓ', + 'jukcy': 'є', + 'dscy': 'ѕ', + 'iukcy': 'і', + 'yicy': 'ї', + 'jsercy': 'ј', + 'ljcy': 'љ', + 'njcy': 'њ', + 'tshcy': 'ћ', + 'kjcy': 'ќ', + 'ubrcy': 'ў', + 'dzcy': 'џ', + 'ensp': ' ', + 'emsp': ' ', + 'emsp13': ' ', + 'emsp14': ' ', + 'numsp': ' ', + 'puncsp': ' ', + 'thinsp': ' ', + 'hairsp': ' ', + 'ZeroWidthSpace': '​', + 'zwnj': '‌', + 'zwj': '‍', + 'lrm': '‎', + 'rlm': '‏', + 'hyphen': '‐', + 'ndash': '–', + 'mdash': '—', + 'horbar': '―', + 'Vert': '‖', + 'lsquo': '‘', + 'rsquo': '’', // http://www.w3.org/TR/html4/sgml/entities.html + 'rsquor': '’', // http://www.w3.org/TR/html5/named-character-references.html + 'sbquo': '‚', + 'ldquo': '“', + 'rdquo': '”', // http://www.w3.org/TR/html4/sgml/entities.html + 'rdquor': '”', // http://www.w3.org/TR/html5/named-character-references.html + 'ldquo': '„', // http://www.w3.org/TR/html4/sgml/entities.html + 'ldquor': '„', // http://www.w3.org/TR/html5/named-character-references.html + 'dagger': '†', + 'Dagger': '‡', // http://www.w3.org/TR/html4/sgml/entities.html + 'ddagger': '‡', // http://www.w3.org/TR/html5/named-character-references.html + 'bull': '•', // http://www.w3.org/TR/html4/sgml/entities.html + 'bullet': '•', // http://www.w3.org/TR/html5/named-character-references.html + 'nldr': '‥', + 'hellip': '…', // http://www.w3.org/TR/html4/sgml/entities.html + 'mldr': '…', // http://www.w3.org/TR/html5/named-character-references.html + 'permil': '‰', + 'pertenk': '‱', + 'prime': '′', + 'Prime': '″', + 'tprime': '‴', + 'bprime': '‵', + 'lsaquo': '‹', + 'rsaquo': '›', + 'oline': '‾', + 'caret': '⁁', + 'hybull': '⁃', + 'frasl': '⁄', + 'bsemi': '⁏', + 'qprime': '⁗', + 'MediumSpace': ' ', + 'NoBreak': '⁠', + 'af': '⁡', + 'it': '⁢', + 'ic': '⁣', + 'euro': '€', + 'complexes': 'ℂ', + 'incare': '℅', + 'gscr': 'ℊ', + 'hamilt': 'ℋ', + 'Poincareplane': 'ℌ', + 'quaternions': 'ℍ', + 'planckh': 'ℎ', + 'plankv': 'ℏ', + 'imagline': 'ℐ', + 'image': 'ℑ', // http://www.w3.org/TR/html4/sgml/entities.html + 'imagpart': 'ℑ', // http://www.w3.org/TR/html5/named-character-references.html + 'lagran': 'ℒ', + 'ell': 'ℓ', + 'naturals': 'ℕ', + 'numero': '№', + 'copysr': '℗', + 'weierp': '℘', // http://www.w3.org/TR/html4/sgml/entities.html + 'wp': '℘', // http://www.w3.org/TR/html5/named-character-references.html + 'primes': 'ℙ', + 'rationals': 'ℚ', + 'realine': 'ℛ', + 'real': 'ℜ', // http://www.w3.org/TR/html4/sgml/entities.html + 'realpart': 'ℜ', // http://www.w3.org/TR/html5/named-character-references.html + 'reals': 'ℝ', + 'rx': '℞', + 'trade': '™', + 'integers': 'ℤ', + 'mho': '℧', + 'zeetrf': 'ℨ', + 'iiota': '℩', + 'bernou': 'ℬ', + 'Cfr': 'ℭ', + 'escr': 'ℯ', + 'expectation': 'ℰ', + 'Fscr': 'ℱ', + 'phmmat': 'ℳ', + 'oscr': 'ℴ', + 'alefsym': 'ℵ', // http://www.w3.org/TR/html4/sgml/entities.html + 'aleph': 'ℵ', // http://www.w3.org/TR/html5/named-character-references.html + 'beth': 'ℶ', + 'gimel': 'ℷ', + 'daleth': 'ℸ', + 'DD': 'ⅅ', + 'dd': 'ⅆ', + 'exponentiale': 'ⅇ', + 'ii': 'ⅈ', + 'frac13': '⅓', + 'frac23': '⅔', + 'frac15': '⅕', + 'frac25': '⅖', + 'frac35': '⅗', + 'frac45': '⅘', + 'frac16': '⅙', + 'frac56': '⅚', + 'frac18': '⅛', + 'frac38': '⅜', + 'frac58': '⅝', + 'frac78': '⅞', + 'larr': '←', // http://www.w3.org/TR/html4/sgml/entities.html + 'slarr': '←', // http://www.w3.org/TR/html5/named-character-references.html + 'uarr': '↑', // http://www.w3.org/TR/html4/sgml/entities.html + 'uparrow': '↑', // http://www.w3.org/TR/html5/named-character-references.html + 'rarr': '→', // http://www.w3.org/TR/html4/sgml/entities.html + 'srarr': '→', // http://www.w3.org/TR/html5/named-character-references.html + 'darr': '↓', // http://www.w3.org/TR/html4/sgml/entities.html + 'downarrow': '↓', // http://www.w3.org/TR/html5/named-character-references.html + 'harr': '↔', // http://www.w3.org/TR/html4/sgml/entities.html + 'leftrightarrow': '↔', // http://www.w3.org/TR/html5/named-character-references.html + 'varr': '↕', + 'nwarrow': '↖', + 'nearrow': '↗', + 'searrow': '↘', + 'swarrow': '↙', + 'nleftarrow': '↚', + 'nrightarrow': '↛', + 'rightsquigarrow': '↝', + 'twoheadleftarrow': '↞', + 'Uarr': '↟', + 'twoheadrightarrow': '↠', + 'Darr': '↡', + 'leftarrowtail': '↢', + 'rightarrowtail': '↣', + 'mapstoleft': '↤', + 'mapstoup': '↥', + 'mapsto': '↦', + 'mapstodown': '↧', + 'larrhk': '↩', + 'rarrhk': '↪', + 'looparrowleft': '↫', + 'rarrlp': '↬', + 'leftrightsquigarrow': '↭', + 'nleftrightarrow': '↮', + 'lsh': '↰', + 'rsh': '↱', + 'ldsh': '↲', + 'rdsh': '↳', + 'crarr': '↵', + 'curvearrowleft': '↶', + 'curvearrowright': '↷', + 'olarr': '↺', + 'orarr': '↻', + 'lharu': '↼', + 'lhard': '↽', + 'upharpoonright': '↾', + 'upharpoonleft': '↿', + 'rightharpoonup': '⇀', + 'rightharpoondown': '⇁', + 'downharpoonright': '⇂', + 'downharpoonleft': '⇃', + 'rlarr': '⇄', + 'udarr': '⇅', + 'lrarr': '⇆', + 'llarr': '⇇', + 'uuarr': '⇈', + 'rrarr': '⇉', + 'downdownarrows': '⇊', + 'lrhar': '⇋', + 'rlhar': '⇌', + 'nlArr': '⇍', + 'nhArr': '⇎', + 'nrArr': '⇏', + 'lArr': '⇐', + 'uArr': '⇑', + 'rArr': '⇒', + 'dArr': '⇓', + 'hArr': '⇔', // http://www.w3.org/TR/html4/sgml/entities.html + 'iff': '⇔', // http://www.w3.org/TR/html5/named-character-references.html + 'vArr': '⇕', + 'nwArr': '⇖', + 'neArr': '⇗', + 'seArr': '⇘', + 'swArr': '⇙', + 'lAarr': '⇚', + 'rAarr': '⇛', + 'zigrarr': '⇝', + 'larrb': '⇤', + 'rarrb': '⇥', + 'duarr': '⇵', + 'loarr': '⇽', + 'roarr': '⇾', + 'hoarr': '⇿', + 'forall': '∀', + 'complement': '∁', + 'part': '∂', + 'exist': '∃', + 'nexists': '∄', + 'empty': '∅', // http://www.w3.org/TR/html4/sgml/entities.html + 'varnothing': '∅', // http://www.w3.org/TR/html5/named-character-references.html + 'nabla': '∇', + 'isin': '∈', // http://www.w3.org/TR/html4/sgml/entities.html + 'isinv': '∈', // http://www.w3.org/TR/html5/named-character-references.html + 'notin': '∉', // http://www.w3.org/TR/html4/sgml/entities.html + 'notinva': '∉', // http://www.w3.org/TR/html5/named-character-references.html + 'ni': '∋', // http://www.w3.org/TR/html4/sgml/entities.html + 'niv': '∋', // http://www.w3.org/TR/html5/named-character-references.html + 'notniva': '∌', + 'prod': '∏', + 'coprod': '∐', + 'sum': '∑', + 'minus': '−', + 'mp': '∓', + 'plusdo': '∔', + 'ssetmn': '∖', + 'lowast': '∗', + 'compfn': '∘', + 'radic': '√', + 'prop': '∝', // http://www.w3.org/TR/html4/sgml/entities.html + 'vprop': '∝', // http://www.w3.org/TR/html5/named-character-references.html + 'infin': '∞', + 'angrt': '∟', + 'ang': '∠', // http://www.w3.org/TR/html4/sgml/entities.html + 'angle': '∠', // http://www.w3.org/TR/html5/named-character-references.html + 'measuredangle': '∡', + 'angsph': '∢', + 'smid': '∣', + 'nsmid': '∤', + 'spar': '∥', + 'nspar': '∦', + 'and': '∧', // http://www.w3.org/TR/html4/sgml/entities.html + 'wedge': '∧', // http://www.w3.org/TR/html5/named-character-references.html + 'or': '∨', // http://www.w3.org/TR/html4/sgml/entities.html + 'vee': '∨', // http://www.w3.org/TR/html5/named-character-references.html + 'cap': '∩', + 'cup': '∪', + 'int': '∫', + 'Int': '∬', + 'tint': '∭', + 'oint': '∮', + 'DoubleContourIntegral': '∯', + 'Cconint': '∰', + 'cwint': '∱', + 'cwconint': '∲', + 'awconint': '∳', + 'there4': '∴', // http://www.w3.org/TR/html4/sgml/entities.html + 'therefore': '∴', // http://www.w3.org/TR/html5/named-character-references.html + 'because': '∵', + 'ratio': '∶', + 'Proportion': '∷', + 'minusd': '∸', + 'mDDot': '∺', + 'homtht': '∻', + 'sim': '∼', // http://www.w3.org/TR/html4/sgml/entities.html + 'thksim': '∼', // http://www.w3.org/TR/html5/named-character-references.html + 'bsim': '∽', + 'mstpos': '∾', + 'acd': '∿', + 'wreath': '≀', + 'nsim': '≁', + 'esim': '≂', + 'simeq': '≃', + 'nsimeq': '≄', + 'cong': '≅', + 'simne': '≆', + 'ncong': '≇', + 'asymp': '≈', // http://www.w3.org/TR/html4/sgml/entities.html + 'thkap': '≈', // http://www.w3.org/TR/html5/named-character-references.html + 'napprox': '≉', + 'approxeq': '≊', + 'apid': '≋', + 'bcong': '≌', + 'asympeq': '≍', + 'bump': '≎', + 'bumpeq': '≏', + 'esdot': '≐', + 'eDot': '≑', + 'fallingdotseq': '≒', + 'risingdotseq': '≓', + 'coloneq': '≔', + 'eqcolon': '≕', + 'eqcirc': '≖', + 'cire': '≗', + 'wedgeq': '≙', + 'veeeq': '≚', + 'trie': '≜', + 'questeq': '≟', + 'ne': '≠', + 'equiv': '≡', + 'nequiv': '≢', + 'le': '≤', // http://www.w3.org/TR/html4/sgml/entities.html + 'leq': '≤', // http://www.w3.org/TR/html5/named-character-references.html + 'ge': '≥', // http://www.w3.org/TR/html4/sgml/entities.html + 'geq': '≥', // http://www.w3.org/TR/html5/named-character-references.html + 'leqq': '≦', + 'geqq': '≧', + 'lneqq': '≨', + 'gneqq': '≩', + 'll': '≪', + 'gg': '≫', + 'twixt': '≬', + 'NotCupCap': '≭', + 'nlt': '≮', + 'ngtr': '≯', + 'nleq': '≰', + 'ngeq': '≱', + 'lsim': '≲', + 'gtrsim': '≳', + 'nlsim': '≴', + 'ngsim': '≵', + 'lg': '≶', + 'gtrless': '≷', + 'ntlg': '≸', + 'ntgl': '≹', + 'prec': '≺', + 'succ': '≻', + 'preccurlyeq': '≼', + 'succcurlyeq': '≽', + 'prsim': '≾', + 'succsim': '≿', + 'nprec': '⊀', + 'nsucc': '⊁', + 'sub': '⊂', // http://www.w3.org/TR/html4/sgml/entities.html + 'subset': '⊂', // http://www.w3.org/TR/html5/named-character-references.html + 'sup': '⊃', // http://www.w3.org/TR/html4/sgml/entities.html + 'supset': '⊃', // http://www.w3.org/TR/html5/named-character-references.html + 'nsub': '⊄', + 'nsup': '⊅', + 'sube': '⊆', // http://www.w3.org/TR/html4/sgml/entities.html + 'subseteq': '⊆', // http://www.w3.org/TR/html5/named-character-references.html + 'supe': '⊇', // http://www.w3.org/TR/html4/sgml/entities.html + 'supseteq': '⊇', // http://www.w3.org/TR/html5/named-character-references.html + 'nsubseteq': '⊈', + 'nsupseteq': '⊉', + 'subsetneq': '⊊', + 'supsetneq': '⊋', + 'cupdot': '⊍', + 'uplus': '⊎', + 'sqsubset': '⊏', + 'sqsupset': '⊐', + 'sqsubseteq': '⊑', + 'sqsupseteq': '⊒', + 'sqcap': '⊓', + 'sqcup': '⊔', + 'oplus': '⊕', + 'ominus': '⊖', + 'otimes': '⊗', + 'osol': '⊘', + 'odot': '⊙', + 'ocir': '⊚', + 'oast': '⊛', + 'odash': '⊝', + 'plusb': '⊞', + 'minusb': '⊟', + 'timesb': '⊠', + 'sdotb': '⊡', + 'vdash': '⊢', + 'dashv': '⊣', + 'top': '⊤', + 'perp': '⊥', + 'models': '⊧', + 'vDash': '⊨', + 'Vdash': '⊩', + 'Vvdash': '⊪', + 'VDash': '⊫', + 'nvdash': '⊬', + 'nvDash': '⊭', + 'nVdash': '⊮', + 'nVDash': '⊯', + 'prurel': '⊰', + 'vltri': '⊲', + 'vrtri': '⊳', + 'trianglelefteq': '⊴', + 'trianglerighteq': '⊵', + 'origof': '⊶', + 'imof': '⊷', + 'mumap': '⊸', + 'hercon': '⊹', + 'intercal': '⊺', + 'veebar': '⊻', + 'barvee': '⊽', + 'angrtvb': '⊾', + 'lrtri': '⊿', + 'xwedge': '⋀', + 'xvee': '⋁', + 'xcap': '⋂', + 'xcup': '⋃', + 'diamond': '⋄', + 'sdot': '⋅', + 'sstarf': '⋆', + 'divonx': '⋇', + 'bowtie': '⋈', + 'ltimes': '⋉', + 'rtimes': '⋊', + 'lthree': '⋋', + 'rthree': '⋌', + 'bsime': '⋍', + 'cuvee': '⋎', + 'cuwed': '⋏', + 'Subset': '⋐', + 'Supset': '⋑', + 'Cap': '⋒', + 'Cup': '⋓', + 'pitchfork': '⋔', + 'epar': '⋕', + 'ltdot': '⋖', + 'gtrdot': '⋗', + 'Ll': '⋘', + 'ggg': '⋙', + 'lesseqgtr': '⋚', + 'gtreqless': '⋛', + 'curlyeqprec': '⋞', + 'curlyeqsucc': '⋟', + 'nprcue': '⋠', + 'nsccue': '⋡', + 'nsqsube': '⋢', + 'nsqsupe': '⋣', + 'lnsim': '⋦', + 'gnsim': '⋧', + 'prnsim': '⋨', + 'succnsim': '⋩', + 'ntriangleleft': '⋪', + 'ntriangleright': '⋫', + 'ntrianglelefteq': '⋬', + 'ntrianglerighteq': '⋭', + 'vellip': '⋮', + 'ctdot': '⋯', + 'utdot': '⋰', + 'dtdot': '⋱', + 'disin': '⋲', + 'isinsv': '⋳', + 'isins': '⋴', + 'isindot': '⋵', + 'notinvc': '⋶', + 'notinvb': '⋷', + 'isinE': '⋹', + 'nisd': '⋺', + 'xnis': '⋻', + 'nis': '⋼', + 'notnivc': '⋽', + 'notnivb': '⋾', + 'barwedge': '⌅', + 'doublebarwedge': '⌆', + 'lceil': '⌈', + 'rceil': '⌉', + 'lfloor': '⌊', + 'rfloor': '⌋', + 'drcrop': '⌌', + 'dlcrop': '⌍', + 'urcrop': '⌎', + 'ulcrop': '⌏', + 'bnot': '⌐', + 'profline': '⌒', + 'profsurf': '⌓', + 'telrec': '⌕', + 'target': '⌖', + 'ulcorner': '⌜', + 'urcorner': '⌝', + 'llcorner': '⌞', + 'lrcorner': '⌟', + 'sfrown': '⌢', + 'ssmile': '⌣', + 'lang': '〈', // http://www.w3.org/TR/html4/sgml/entities.html + 'rang': '〉', // http://www.w3.org/TR/html4/sgml/entities.html + 'cylcty': '⌭', + 'profalar': '⌮', + 'topbot': '⌶', + 'ovbar': '⌽', + 'solbar': '⌿', + 'angzarr': '⍼', + 'lmoustache': '⎰', + 'rmoustache': '⎱', + 'tbrk': '⎴', + 'bbrk': '⎵', + 'bbrktbrk': '⎶', + 'OverParenthesis': '⏜', + 'UnderParenthesis': '⏝', + 'OverBrace': '⏞', + 'UnderBrace': '⏟', + 'trpezium': '⏢', + 'elinters': '⏧', + 'blank': '␣', + 'oS': 'Ⓢ', + 'boxh': '─', + 'boxv': '│', + 'boxdr': '┌', + 'boxdl': '┐', + 'boxur': '└', + 'boxul': '┘', + 'boxvr': '├', + 'boxvl': '┤', + 'boxhd': '┬', + 'boxhu': '┴', + 'boxvh': '┼', + 'boxH': '═', + 'boxV': '║', + 'boxdR': '╒', + 'boxDr': '╓', + 'boxDR': '╔', + 'boxdL': '╕', + 'boxDl': '╖', + 'boxDL': '╗', + 'boxuR': '╘', + 'boxUr': '╙', + 'boxUR': '╚', + 'boxuL': '╛', + 'boxUl': '╜', + 'boxUL': '╝', + 'boxvR': '╞', + 'boxVr': '╟', + 'boxVR': '╠', + 'boxvL': '╡', + 'boxVl': '╢', + 'boxVL': '╣', + 'boxHd': '╤', + 'boxhD': '╥', + 'boxHD': '╦', + 'boxHu': '╧', + 'boxhU': '╨', + 'boxHU': '╩', + 'boxvH': '╪', + 'boxVh': '╫', + 'boxVH': '╬', + 'uhblk': '▀', + 'lhblk': '▄', + 'block': '█', + 'blk14': '░', + 'blk12': '▒', + 'blk34': '▓', + 'square': '□', + 'squf': '▪', + 'EmptyVerySmallSquare': '▫', + 'rect': '▭', + 'marker': '▮', + 'fltns': '▱', + 'xutri': '△', + 'utrif': '▴', + 'utri': '▵', + 'rtrif': '▸', + 'triangleright': '▹', + 'xdtri': '▽', + 'dtrif': '▾', + 'triangledown': '▿', + 'ltrif': '◂', + 'triangleleft': '◃', + 'loz': '◊', // http://www.w3.org/TR/html4/sgml/entities.html + 'lozenge': '◊', // http://www.w3.org/TR/html5/named-character-references.html + 'cir': '○', + 'tridot': '◬', + 'xcirc': '◯', + 'ultri': '◸', + 'urtri': '◹', + 'lltri': '◺', + 'EmptySmallSquare': '◻', + 'FilledSmallSquare': '◼', + 'starf': '★', + 'star': '☆', + 'phone': '☎', + 'female': '♀', + 'male': '♂', + 'spades': '♠', // http://www.w3.org/TR/html4/sgml/entities.html + 'spadesuit': '♠', // http://www.w3.org/TR/html5/named-character-references.html + 'clubs': '♣', // http://www.w3.org/TR/html4/sgml/entities.html + 'clubsuit': '♣', // http://www.w3.org/TR/html5/named-character-references.html + 'hearts': '♥', // http://www.w3.org/TR/html4/sgml/entities.html + 'heartsuit': '♥', // http://www.w3.org/TR/html5/named-character-references.html + 'diams': '♦', + 'sung': '♪', + 'flat': '♭', + 'natural': '♮', + 'sharp': '♯', + 'checkmark': '✓', + 'cross': '✗', + 'maltese': '✠', + 'sext': '✶', + 'VerticalSeparator': '❘', + 'lbbrk': '❲', + 'rbbrk': '❳', + 'bsolhsub': '⟈', + 'suphsol': '⟉', + 'lobrk': '⟦', + 'robrk': '⟧', + 'langle': '⟨', + 'rangle': '⟩', + 'Lang': '⟪', + 'Rang': '⟫', + 'loang': '⟬', + 'roang': '⟭', + 'xlarr': '⟵', + 'xrarr': '⟶', + 'xharr': '⟷', + 'xlArr': '⟸', + 'xrArr': '⟹', + 'xhArr': '⟺', + 'xmap': '⟼', + 'dzigrarr': '⟿', + 'nvlArr': '⤂', + 'nvrArr': '⤃', + 'nvHarr': '⤄', + 'Map': '⤅', + 'lbarr': '⤌', + 'rbarr': '⤍', + 'lBarr': '⤎', + 'rBarr': '⤏', + 'drbkarow': '⤐', + 'DDotrahd': '⤑', + 'UpArrowBar': '⤒', + 'DownArrowBar': '⤓', + 'Rarrtl': '⤖', + 'latail': '⤙', + 'ratail': '⤚', + 'lAtail': '⤛', + 'rAtail': '⤜', + 'larrfs': '⤝', + 'rarrfs': '⤞', + 'larrbfs': '⤟', + 'rarrbfs': '⤠', + 'nwarhk': '⤣', + 'nearhk': '⤤', + 'searhk': '⤥', + 'swarhk': '⤦', + 'nwnear': '⤧', + 'toea': '⤨', + 'tosa': '⤩', + 'swnwar': '⤪', + 'rarrc': '⤳', + 'cudarrr': '⤵', + 'ldca': '⤶', + 'rdca': '⤷', + 'cudarrl': '⤸', + 'larrpl': '⤹', + 'curarrm': '⤼', + 'cularrp': '⤽', + 'rarrpl': '⥅', + 'harrcir': '⥈', + 'Uarrocir': '⥉', + 'lurdshar': '⥊', + 'ldrushar': '⥋', + 'LeftRightVector': '⥎', + 'RightUpDownVector': '⥏', + 'DownLeftRightVector': '⥐', + 'LeftUpDownVector': '⥑', + 'LeftVectorBar': '⥒', + 'RightVectorBar': '⥓', + 'RightUpVectorBar': '⥔', + 'RightDownVectorBar': '⥕', + 'DownLeftVectorBar': '⥖', + 'DownRightVectorBar': '⥗', + 'LeftUpVectorBar': '⥘', + 'LeftDownVectorBar': '⥙', + 'LeftTeeVector': '⥚', + 'RightTeeVector': '⥛', + 'RightUpTeeVector': '⥜', + 'RightDownTeeVector': '⥝', + 'DownLeftTeeVector': '⥞', + 'DownRightTeeVector': '⥟', + 'LeftUpTeeVector': '⥠', + 'LeftDownTeeVector': '⥡', + 'lHar': '⥢', + 'uHar': '⥣', + 'rHar': '⥤', + 'dHar': '⥥', + 'luruhar': '⥦', + 'ldrdhar': '⥧', + 'ruluhar': '⥨', + 'rdldhar': '⥩', + 'lharul': '⥪', + 'llhard': '⥫', + 'rharul': '⥬', + 'lrhard': '⥭', + 'udhar': '⥮', + 'duhar': '⥯', + 'RoundImplies': '⥰', + 'erarr': '⥱', + 'simrarr': '⥲', + 'larrsim': '⥳', + 'rarrsim': '⥴', + 'rarrap': '⥵', + 'ltlarr': '⥶', + 'gtrarr': '⥸', + 'subrarr': '⥹', + 'suplarr': '⥻', + 'lfisht': '⥼', + 'rfisht': '⥽', + 'ufisht': '⥾', + 'dfisht': '⥿', + 'lopar': '⦅', + 'ropar': '⦆', + 'lbrke': '⦋', + 'rbrke': '⦌', + 'lbrkslu': '⦍', + 'rbrksld': '⦎', + 'lbrksld': '⦏', + 'rbrkslu': '⦐', + 'langd': '⦑', + 'rangd': '⦒', + 'lparlt': '⦓', + 'rpargt': '⦔', + 'gtlPar': '⦕', + 'ltrPar': '⦖', + 'vzigzag': '⦚', + 'vangrt': '⦜', + 'angrtvbd': '⦝', + 'ange': '⦤', + 'range': '⦥', + 'dwangle': '⦦', + 'uwangle': '⦧', + 'angmsdaa': '⦨', + 'angmsdab': '⦩', + 'angmsdac': '⦪', + 'angmsdad': '⦫', + 'angmsdae': '⦬', + 'angmsdaf': '⦭', + 'angmsdag': '⦮', + 'angmsdah': '⦯', + 'bemptyv': '⦰', + 'demptyv': '⦱', + 'cemptyv': '⦲', + 'raemptyv': '⦳', + 'laemptyv': '⦴', + 'ohbar': '⦵', + 'omid': '⦶', + 'opar': '⦷', + 'operp': '⦹', + 'olcross': '⦻', + 'odsold': '⦼', + 'olcir': '⦾', + 'ofcir': '⦿', + 'olt': '⧀', + 'ogt': '⧁', + 'cirscir': '⧂', + 'cirE': '⧃', + 'solb': '⧄', + 'bsolb': '⧅', + 'boxbox': '⧉', + 'trisb': '⧍', + 'rtriltri': '⧎', + 'LeftTriangleBar': '⧏', + 'RightTriangleBar': '⧐', + 'iinfin': '⧜', + 'infintie': '⧝', + 'nvinfin': '⧞', + 'eparsl': '⧣', + 'smeparsl': '⧤', + 'eqvparsl': '⧥', + 'lozf': '⧫', + 'RuleDelayed': '⧴', + 'dsol': '⧶', + 'xodot': '⨀', + 'xoplus': '⨁', + 'xotime': '⨂', + 'xuplus': '⨄', + 'xsqcup': '⨆', + 'qint': '⨌', + 'fpartint': '⨍', + 'cirfnint': '⨐', + 'awint': '⨑', + 'rppolint': '⨒', + 'scpolint': '⨓', + 'npolint': '⨔', + 'pointint': '⨕', + 'quatint': '⨖', + 'intlarhk': '⨗', + 'pluscir': '⨢', + 'plusacir': '⨣', + 'simplus': '⨤', + 'plusdu': '⨥', + 'plussim': '⨦', + 'plustwo': '⨧', + 'mcomma': '⨩', + 'minusdu': '⨪', + 'loplus': '⨭', + 'roplus': '⨮', + 'Cross': '⨯', + 'timesd': '⨰', + 'timesbar': '⨱', + 'smashp': '⨳', + 'lotimes': '⨴', + 'rotimes': '⨵', + 'otimesas': '⨶', + 'Otimes': '⨷', + 'odiv': '⨸', + 'triplus': '⨹', + 'triminus': '⨺', + 'tritime': '⨻', + 'iprod': '⨼', + 'amalg': '⨿', + 'capdot': '⩀', + 'ncup': '⩂', + 'ncap': '⩃', + 'capand': '⩄', + 'cupor': '⩅', + 'cupcap': '⩆', + 'capcup': '⩇', + 'cupbrcap': '⩈', + 'capbrcup': '⩉', + 'cupcup': '⩊', + 'capcap': '⩋', + 'ccups': '⩌', + 'ccaps': '⩍', + 'ccupssm': '⩐', + 'And': '⩓', + 'Or': '⩔', + 'andand': '⩕', + 'oror': '⩖', + 'orslope': '⩗', + 'andslope': '⩘', + 'andv': '⩚', + 'orv': '⩛', + 'andd': '⩜', + 'ord': '⩝', + 'wedbar': '⩟', + 'sdote': '⩦', + 'simdot': '⩪', + 'congdot': '⩭', + 'easter': '⩮', + 'apacir': '⩯', + 'apE': '⩰', + 'eplus': '⩱', + 'pluse': '⩲', + 'Esim': '⩳', + 'Colone': '⩴', + 'Equal': '⩵', + 'eDDot': '⩷', + 'equivDD': '⩸', + 'ltcir': '⩹', + 'gtcir': '⩺', + 'ltquest': '⩻', + 'gtquest': '⩼', + 'les': '⩽', + 'ges': '⩾', + 'lesdot': '⩿', + 'gesdot': '⪀', + 'lesdoto': '⪁', + 'gesdoto': '⪂', + 'lesdotor': '⪃', + 'gesdotol': '⪄', + 'lessapprox': '⪅', + 'gtrapprox': '⪆', + 'lneq': '⪇', + 'gneq': '⪈', + 'lnapprox': '⪉', + 'gnapprox': '⪊', + 'lesseqqgtr': '⪋', + 'gtreqqless': '⪌', + 'lsime': '⪍', + 'gsime': '⪎', + 'lsimg': '⪏', + 'gsiml': '⪐', + 'lgE': '⪑', + 'glE': '⪒', + 'lesges': '⪓', + 'gesles': '⪔', + 'eqslantless': '⪕', + 'eqslantgtr': '⪖', + 'elsdot': '⪗', + 'egsdot': '⪘', + 'el': '⪙', + 'eg': '⪚', + 'siml': '⪝', + 'simg': '⪞', + 'simlE': '⪟', + 'simgE': '⪠', + 'LessLess': '⪡', + 'GreaterGreater': '⪢', + 'glj': '⪤', + 'gla': '⪥', + 'ltcc': '⪦', + 'gtcc': '⪧', + 'lescc': '⪨', + 'gescc': '⪩', + 'smt': '⪪', + 'lat': '⪫', + 'smte': '⪬', + 'late': '⪭', + 'bumpE': '⪮', + 'preceq': '⪯', + 'succeq': '⪰', + 'prE': '⪳', + 'scE': '⪴', + 'prnE': '⪵', + 'succneqq': '⪶', + 'precapprox': '⪷', + 'succapprox': '⪸', + 'prnap': '⪹', + 'succnapprox': '⪺', + 'Pr': '⪻', + 'Sc': '⪼', + 'subdot': '⪽', + 'supdot': '⪾', + 'subplus': '⪿', + 'supplus': '⫀', + 'submult': '⫁', + 'supmult': '⫂', + 'subedot': '⫃', + 'supedot': '⫄', + 'subseteqq': '⫅', + 'supseteqq': '⫆', + 'subsim': '⫇', + 'supsim': '⫈', + 'subsetneqq': '⫋', + 'supsetneqq': '⫌', + 'csub': '⫏', + 'csup': '⫐', + 'csube': '⫑', + 'csupe': '⫒', + 'subsup': '⫓', + 'supsub': '⫔', + 'subsub': '⫕', + 'supsup': '⫖', + 'suphsub': '⫗', + 'supdsub': '⫘', + 'forkv': '⫙', + 'topfork': '⫚', + 'mlcp': '⫛', + 'DoubleLeftTee': '⫤', + 'Vdashl': '⫦', + 'Barv': '⫧', + 'vBar': '⫨', + 'vBarv': '⫩', + 'Vbar': '⫫', + 'Not': '⫬', + 'bNot': '⫭', + 'rnmid': '⫮', + 'cirmid': '⫯', + 'midcir': '⫰', + 'topcir': '⫱', + 'nhpar': '⫲', + 'parsim': '⫳', + 'parsl': '⫽', + 'fflig': 'ff', + 'filig': 'fi', + 'fllig': 'fl', + 'ffilig': 'ffi', + 'ffllig': 'ffl', + 'Ascr': '풜', + 'Cscr': '풞', + 'Dscr': '풟', + 'Gscr': '풢', + 'Jscr': '풥', + 'Kscr': '풦', + 'Nscr': '풩', + 'Oscr': '풪', + 'Pscr': '풫', + 'Qscr': '풬', + 'Sscr': '풮', + 'Tscr': '풯', + 'Uscr': '풰', + 'Vscr': '풱', + 'Wscr': '풲', + 'Xscr': '풳', + 'Yscr': '풴', + 'Zscr': '풵', + 'ascr': '풶', + 'bscr': '풷', + 'cscr': '풸', + 'dscr': '풹', + 'fscr': '풻', + 'hscr': '풽', + 'iscr': '풾', + 'jscr': '풿', + 'kscr': '퓀', + 'lscr': '퓁', + 'mscr': '퓂', + 'nscr': '퓃', + 'pscr': '퓅', + 'qscr': '퓆', + 'rscr': '퓇', + 'sscr': '퓈', + 'tscr': '퓉', + 'uscr': '퓊', + 'vscr': '퓋', + 'wscr': '퓌', + 'xscr': '퓍', + 'yscr': '퓎', + 'zscr': '퓏', + 'Afr': '프', + 'Bfr': '픅', + 'Dfr': '픇', + 'Efr': '픈', + 'Ffr': '픉', + 'Gfr': '픊', + 'Jfr': '픍', + 'Kfr': '픎', + 'Lfr': '픏', + 'Mfr': '픐', + 'Nfr': '픑', + 'Ofr': '픒', + 'Pfr': '픓', + 'Qfr': '픔', + 'Sfr': '픖', + 'Tfr': '픗', + 'Ufr': '픘', + 'Vfr': '픙', + 'Wfr': '픚', + 'Xfr': '픛', + 'Yfr': '픜', + 'afr': '픞', + 'bfr': '픟', + 'cfr': '픠', + 'dfr': '픡', + 'efr': '픢', + 'ffr': '픣', + 'gfr': '픤', + 'hfr': '픥', + 'ifr': '픦', + 'jfr': '픧', + 'kfr': '픨', + 'lfr': '픩', + 'mfr': '픪', + 'nfr': '픫', + 'ofr': '픬', + 'pfr': '픭', + 'qfr': '픮', + 'rfr': '픯', + 'sfr': '픰', + 'tfr': '픱', + 'ufr': '픲', + 'vfr': '픳', + 'wfr': '픴', + 'xfr': '픵', + 'yfr': '픶', + 'zfr': '픷', + 'Aopf': '픸', + 'Bopf': '픹', + 'Dopf': '픻', + 'Eopf': '피', + 'Fopf': '픽', + 'Gopf': '픾', + 'Iopf': '핀', + 'Jopf': '핁', + 'Kopf': '핂', + 'Lopf': '핃', + 'Mopf': '필', + 'Oopf': '핆', + 'Sopf': '핊', + 'Topf': '핋', + 'Uopf': '핌', + 'Vopf': '핍', + 'Wopf': '핎', + 'Xopf': '핏', + 'Yopf': '핐', + 'aopf': '핒', + 'bopf': '핓', + 'copf': '핔', + 'dopf': '핕', + 'eopf': '핖', + 'fopf': '핗', + 'gopf': '하', + 'hopf': '학', + 'iopf': '핚', + 'jopf': '핛', + 'kopf': '한', + 'lopf': '핝', + 'mopf': '핞', + 'nopf': '핟', + 'oopf': '할', + 'popf': '핡', + 'qopf': '핢', + 'ropf': '핣', + 'sopf': '핤', + 'topf': '핥', + 'uopf': '핦', + 'vopf': '핧', + 'wopf': '함', + 'xopf': '합', + 'yopf': '핪', + 'zopf': '핫' }; var specialCharEntities = { @@ -110,29 +1472,22 @@ var specialCharEntities = { '\xA0': ' ' }; -var entityRegExp = /&([#a-z0-9]+);/gi; +var entityRegExp = /&(?:#([0-9]+)|#x([0-9a-f]+)|([a-z0-9]+));/gi; var attributeModeSpecialCharRegExp = /["&<>\xA0]/g; var nonAttributeModeSpecialCharRegExp = /[&<>\xA0]/g; -function entityToChar(s, name) { - var code = entityCharCodes[name]; - if (!code && name[0] === '#') { - if (name[1] === 'x' || name[1] === 'X') { - code = parseInt(name.substring(2), 16); - } - else { - code = parseInt(name.substring(1), 10); - } - if (isNaN(code)) { - code = undefined; - } - } - return code ? String.fromCharCode(code) : s; -} - exports.HTMLDecode = function decode(s) { - if (!s) return ''; - return s.replace(entityRegExp, entityToChar); + if (!s) return ''; + return s.replace(entityRegExp, function ($0, decimalStr, hexStr, entityName) { + if (decimalStr) { + return String.fromCharCode(parseInt(decimalStr, 10)); + } else if (hexStr) { + return String.fromCharCode(parseInt(hexStr, 16)); + } else { + // Fall back to the original string if we don't know the entity, as per browser behavior: + return charByEntityName[entityName] || $0; + } + }); }; function specialCharToEntity(s) { diff --git a/test/jsdom/index.js b/test/jsdom/index.js index 5ddfe77735..d438376301 100644 --- a/test/jsdom/index.js +++ b/test/jsdom/index.js @@ -78,7 +78,7 @@ exports.tests = { test.notEqual(window.location, null, 'window.location should not be null'); test.done(); } - }) + }); }, env_with_overridden_url : function(test) { @@ -95,7 +95,7 @@ exports.tests = { "hash should be empty string by default"); test.done(); } - }) + }); }, env_with_overridden_hash: function(test) { @@ -109,7 +109,7 @@ exports.tests = { "hash should pull from URL"); test.done(); } - }) + }); }, env_with_non_existant_script : function(test) { @@ -119,7 +119,7 @@ exports.tests = { scripts: ['path/to/invalid.js', 'another/invalid.js'], done: function(errors, window) { test.notEqual(errors, null, 'errors should not be null'); - test.equal(errors.length, 2, 'errors is an array') + test.equal(errors.length, 2, 'errors is an array'); test.notEqual(window.location, null, 'window.location should not be null'); test.done(); } @@ -145,7 +145,7 @@ exports.tests = { done: function(errors, window) { server.close(); if (errors) { - test.ok(false, errors.message) + test.ok(false, errors.message); } else { test.notEqual(window.location, null, 'window.location should not be null'); test.equal(window.attachedHere, 123, 'script should execute on our window'); @@ -196,7 +196,7 @@ exports.tests = { scripts: 'https://doesntmatter.com/script.js', done: function(errors, window) { if (errors) { - test.ok(false, errors.message) + test.ok(false, errors.message); } else { test.notEqual(window.location, null, 'window.location should not be null'); test.equal(window.attachedHere, 123, 'script should execute on our window'); @@ -219,7 +219,7 @@ exports.tests = { done : function(errors, window) { test.ok(null === errors, "error should not be null"); test.ok(null !== window.location, "window should be valid"); - test.equal(window.attachedHere, 123, "script should execute on our window") + test.equal(window.attachedHere, 123, "script should execute on our window"); test.equal(window.document.getElementsByTagName("p").item(0).innerHTML, 'hello world!', "anchor text"); test.done(); } @@ -312,7 +312,7 @@ exports.tests = { var doc = jsdom.jsdom(); doc.appendChild(doc.createElement('html')); } catch (e) { - test.equal(e.code, 3, 'Should throw HIERARCHY_ERR') + test.equal(e.code, 3, 'Should throw HIERARCHY_ERR'); code = e.code; throw(e); } @@ -351,7 +351,7 @@ exports.tests = { doc2.onload = function() { test.equal(doc2.getElementById("test").innerHTML, 'hello from html', 'js should not be executed (doc2)'); test.done(); - } + }; }, load_multiple_resources_with_defer_close: function(test) { @@ -511,10 +511,10 @@ exports.tests = { link5\ protocol\ \ - ' + '; function testLocal() { - var url = '/path/to/docroot/index.html' + var url = '/path/to/docroot/index.html'; var doc = jsdom.jsdom(html, null, {url: url}); test.equal(doc.getElementById("link1").href, 'http://example.com', 'Absolute URL should be left alone'); test.equal(doc.getElementById("link2").href, '/local.html', 'Relative URL should be resolved'); @@ -525,7 +525,7 @@ exports.tests = { } function testRemote() { - var url = 'http://example.com/path/to/docroot/index.html' + var url = 'http://example.com/path/to/docroot/index.html'; var doc = jsdom.jsdom(html, null, {url: url}); test.equal(doc.getElementById("link1").href, 'http://example.com', 'Absolute URL should be left alone'); test.equal(doc.getElementById("link2").href, 'http://example.com/local.html', 'Relative URL should be resolved'); @@ -573,7 +573,7 @@ exports.tests = { var buffer = require("fs").readFileSync(__dirname + "/files/env.html"), dom; test.doesNotThrow(function(){ dom = jsdom.jsdom(buffer); }, 'buffers should automatically be stringified'); - test.equal(dom.documentElement.getElementsByTagName("*").length, 3, 'should parse as per usual') + test.equal(dom.documentElement.getElementsByTagName("*").length, 3, 'should parse as per usual'); test.done(); }, @@ -670,13 +670,13 @@ exports.tests = { childNodes_updates_on_insertChild : function(test) { var window = jsdom.jsdom("").createWindow(); - var div = window.document.createElement("div") - var text = window.document.createTextNode("bar") + var div = window.document.createElement("div"); + var text = window.document.createTextNode("bar"); div.appendChild(text); test.strictEqual(text, div.childNodes[0], "childNodes NodeList should update after appendChild"); - text = window.document.createTextNode("bar") + text = window.document.createTextNode("bar"); div.insertBefore(text, null); test.strictEqual(text, div.childNodes[1], "childNodes NodeList should update after insertBefore"); @@ -685,7 +685,7 @@ exports.tests = { option_set_selected : function(test) { var window = jsdom.jsdom("").createWindow(); - var select = window.document.createElement("select") + var select = window.document.createElement("select"); var option0 = window.document.createElement('option'); select.appendChild(option0); @@ -716,16 +716,16 @@ exports.tests = { }, case_sensitivity_of_markup_missing_html_and_body : function(test){ - var spaces = /[ \n]*/g, - doc1 = jsdom.html("").outerHTML.replace(spaces, ''), - doc2 = jsdom.html("").outerHTML.replace(spaces, ''), - doc3 = jsdom.html("").outerHTML.replace(spaces, ''), - doc4 = jsdom.html("").outerHTML.replace(spaces, ''), - doc5 = jsdom.html("").outerHTML.replace(spaces, ''); - - test.ok(doc1 === doc2 && doc2 == doc3 && doc3 === doc4 && doc4 == doc5, - 'they should all serialize the same'); - test.done(); + var spaces = /[ \n]*/g, + doc1 = jsdom.html("").outerHTML.replace(spaces, ''), + doc2 = jsdom.html("").outerHTML.replace(spaces, ''), + doc3 = jsdom.html("").outerHTML.replace(spaces, ''), + doc4 = jsdom.html("").outerHTML.replace(spaces, ''), + doc5 = jsdom.html("").outerHTML.replace(spaces, ''); + + test.ok(doc1 === doc2 && doc2 == doc3 && doc3 === doc4 && doc4 == doc5, + 'they should all serialize the same'); + test.done(); }, children_should_be_available_right_after_document_creation : function(test) { @@ -753,7 +753,7 @@ exports.tests = { 'jquery.js' ], function () { // ensure the callback gets called! - test.done() + test.done(); }); }, @@ -769,22 +769,32 @@ exports.tests = { }, parsing_and_serializing_entities: function(test) { - var html = '<æ☺foo'; - var document = jsdom.jsdom(html); - var anchor = document.getElementsByTagName('a')[0]; + var html = '<æ☺foo'; + var document = jsdom.jsdom(html); + var anchor = document.getElementsByTagName('a')[0]; - test.strictEqual(anchor.getAttribute('href'), 'http://example.com/?a=b&c=d', - "href attribute value should be deentitified"); + test.strictEqual(anchor.getAttribute('href'), 'http://example.com/?a=b&c=d', + "href attribute value should be deentitified"); - test.strictEqual(anchor.firstChild.nodeValue, '<æ☺foo', - "nodeValue of text node should be deentitified"); + test.strictEqual(anchor.firstChild.nodeValue, '<æ☺foo', + "nodeValue of text node should be deentitified"); - test.ok(anchor.outerHTML.indexOf('http://example.com/?a=b&c=d') !== -1, - "outerHTML of anchor href should be entitified"); + test.ok(anchor.outerHTML.indexOf('http://example.com/?a=b&c=d') !== -1, + "outerHTML of anchor href should be entitified"); - test.ok(anchor.innerHTML.indexOf("<") === 0, - "innerHTML of anchor should begin with <"); - test.done(); + test.ok(anchor.innerHTML.indexOf("<") === 0, + "innerHTML of anchor should begin with <"); + test.done(); + }, + + parsing_and_serializing_unknown_entities: function (test) { + var html = '&nowayjose;☺ lah; q;'; + var document = jsdom.jsdom(html); + test.strictEqual(document.body.firstChild.nodeValue, "&nowayjose;☺ lah; q;", + "Unknown and unparsable entities should be left in the decoded text"); + test.strictEqual(document.body.innerHTML, "&nowayjose;☺&#xblah;&#9q;", + "Unknown and unparsable entities should be reserialized as literal text"); + test.done(); }, document_title_and_entities: function (test) { @@ -865,10 +875,10 @@ exports.tests = { allow_ender_to_run : function(test) { jsdom.env('', [__dirname + '/files/ender-qwery.js'], function(e, w) { test.ok(!e, 'no errors'); - test.ok(w.ender, 'ender exists') + test.ok(w.ender, 'ender exists'); test.ok(w.$, 'window contains $'); test.done(); - }) + }); }, // see: https://github.com/tmpvar/jsdom/issues/259 @@ -912,7 +922,7 @@ exports.tests = { var thrown = false; var doc; try { - doc = jsdom.jsdom('
') + doc = jsdom.jsdom('
'); } catch (e) { thrown = true; }