1 var entityMap = require("../maps/entities.json"),
2 legacyMap = require("../maps/legacy.json"),
3 xmlMap = require("../maps/xml.json"),
4 decodeCodePoint = require("./decode_codepoint.js");
6 var decodeXMLStrict = getStrictDecoder(xmlMap),
7 decodeHTMLStrict = getStrictDecoder(entityMap);
9 function getStrictDecoder(map) {
10 var keys = Object.keys(map).join("|"),
11 replace = getReplacer(map);
13 keys += "|#[xX][\\da-fA-F]+|#\\d+";
15 var re = new RegExp("&(?:" + keys + ");", "g");
17 return function(str) {
18 return String(str).replace(re, replace);
22 var decodeHTML = (function() {
23 var legacy = Object.keys(legacyMap).sort(sorter);
25 var keys = Object.keys(entityMap).sort(sorter);
27 for (var i = 0, j = 0; i < keys.length; i++) {
28 if (legacy[j] === keys[i]) {
36 var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g"),
37 replace = getReplacer(entityMap);
39 function replacer(str) {
40 if (str.substr(-1) !== ";") str += ";";
44 //TODO consider creating a merged map
45 return function(str) {
46 return String(str).replace(re, replacer);
50 function sorter(a, b) {
51 return a < b ? 1 : -1;
54 function getReplacer(map) {
55 return function replace(str) {
56 if (str.charAt(1) === "#") {
57 if (str.charAt(2) === "X" || str.charAt(2) === "x") {
58 return decodeCodePoint(parseInt(str.substr(3), 16));
60 return decodeCodePoint(parseInt(str.substr(2), 10));
62 return map[str.slice(1, -1)];
69 HTMLStrict: decodeHTMLStrict