Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81147 views
1
var inverseXML = getInverseObj(require("../maps/xml.json")),
2
xmlReplacer = getInverseReplacer(inverseXML);
3
4
exports.XML = getInverse(inverseXML, xmlReplacer);
5
6
var inverseHTML = getInverseObj(require("../maps/entities.json")),
7
htmlReplacer = getInverseReplacer(inverseHTML);
8
9
exports.HTML = getInverse(inverseHTML, htmlReplacer);
10
11
function getInverseObj(obj){
12
return Object.keys(obj).sort().reduce(function(inverse, name){
13
inverse[obj[name]] = "&" + name + ";";
14
return inverse;
15
}, {});
16
}
17
18
function getInverseReplacer(inverse){
19
return new RegExp("\\" + Object.keys(inverse).sort().join("|\\"), "g");
20
}
21
22
var re_nonASCII = /[^\0-\x7F]/g,
23
re_astralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
24
25
function nonUTF8Replacer(c){
26
return "&#x" + c.charCodeAt(0).toString(16).toUpperCase() + ";";
27
}
28
29
function astralReplacer(c){
30
// http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
31
var high = c.charCodeAt(0);
32
var low = c.charCodeAt(1);
33
var codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000;
34
return "&#x" + codePoint.toString(16).toUpperCase() + ";";
35
}
36
37
function getInverse(inverse, re){
38
function func(name){
39
return inverse[name];
40
}
41
42
return function(data){
43
return data
44
.replace(re, func)
45
.replace(re_astralSymbols, astralReplacer)
46
.replace(re_nonASCII, nonUTF8Replacer);
47
};
48
}
49