1 var inverseXML = getInverseObj(require("../maps/xml.json")),
2 xmlReplacer = getInverseReplacer(inverseXML);
4 exports.XML = getInverse(inverseXML, xmlReplacer);
6 var inverseHTML = getInverseObj(require("../maps/entities.json")),
7 htmlReplacer = getInverseReplacer(inverseHTML);
9 exports.HTML = getInverse(inverseHTML, htmlReplacer);
11 function getInverseObj(obj) {
12 return Object.keys(obj)
14 .reduce(function(inverse, name) {
15 inverse[obj[name]] = "&" + name + ";";
20 function getInverseReplacer(inverse) {
24 Object.keys(inverse).forEach(function(k) {
26 single.push("\\" + k);
33 multiple.unshift("[" + single.join("") + "]");
35 return new RegExp(multiple.join("|"), "g");
38 var re_nonASCII = /[^\0-\x7F]/g,
39 re_astralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
41 function singleCharReplacer(c) {
52 function astralReplacer(c) {
53 // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
54 var high = c.charCodeAt(0);
55 var low = c.charCodeAt(1);
56 var codePoint = (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000;
57 return "&#x" + codePoint.toString(16).toUpperCase() + ";";
60 function getInverse(inverse, re) {
65 return function(data) {
68 .replace(re_astralSymbols, astralReplacer)
69 .replace(re_nonASCII, singleCharReplacer);
73 var re_xmlChars = getInverseReplacer(inverseXML);
75 function escapeXML(data) {
77 .replace(re_xmlChars, singleCharReplacer)
78 .replace(re_astralSymbols, astralReplacer)
79 .replace(re_nonASCII, singleCharReplacer);
82 exports.escape = escapeXML;