var entityMap = require(“../maps/entities.json”),
legacyMap = require("../maps/legacy.json"), xmlMap = require("../maps/xml.json"), decodeCodePoint = require("./decode_codepoint.js");
var decodeXMLStrict = getStrictDecoder(xmlMap),
decodeHTMLStrict = getStrictDecoder(entityMap);
function getStrictDecoder(map){
var keys = Object.keys(map).join("|"), replace = getReplacer(map); keys += "|#[xX][\\da-fA-F]+|#\\d+"; var re = new RegExp("&(?:" + keys + ");", "g"); return function(str){ return String(str).replace(re, replace); };
}
var decodeHTML = (function(){
var legacy = Object.keys(legacyMap) .sort(sorter); var keys = Object.keys(entityMap) .sort(sorter); for(var i = 0, j = 0; i < keys.length; i++){ if(legacy[j] === keys[i]){ keys[i] += ";?"; j++; } else { keys[i] += ";"; } } var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g"), replace = getReplacer(entityMap); function replacer(str){ if(str.substr(-1) !== ";") str += ";"; return replace(str); } //TODO consider creating a merged map return function(str){ return String(str).replace(re, replacer); };
}());
function sorter(a, b){
return a < b ? 1 : -1;
}
function getReplacer(map){
return function replace(str){ if(str.charAt(1) === "#"){ if(str.charAt(2) === "X" || str.charAt(2) === "x"){ return decodeCodePoint(parseInt(str.substr(3), 16)); } return decodeCodePoint(parseInt(str.substr(2), 10)); } return map[str.slice(1, -1)]; };
}
module.exports = {
XML: decodeXMLStrict, HTML: decodeHTML, HTMLStrict: decodeHTMLStrict
};