Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81147 views
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");
5
6
var decodeXMLStrict = getStrictDecoder(xmlMap),
7
decodeHTMLStrict = getStrictDecoder(entityMap);
8
9
function getStrictDecoder(map){
10
var keys = Object.keys(map).join("|"),
11
replace = getReplacer(map);
12
13
keys += "|#[xX][\\da-fA-F]+|#\\d+";
14
15
var re = new RegExp("&(?:" + keys + ");", "g");
16
17
return function(str){
18
return String(str).replace(re, replace);
19
};
20
}
21
22
var decodeHTML = (function(){
23
var legacy = Object.keys(legacyMap)
24
.sort(sorter);
25
26
var keys = Object.keys(entityMap)
27
.sort(sorter);
28
29
for(var i = 0, j = 0; i < keys.length; i++){
30
if(legacy[j] === keys[i]){
31
keys[i] += ";?";
32
j++;
33
} else {
34
keys[i] += ";";
35
}
36
}
37
38
var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g"),
39
replace = getReplacer(entityMap);
40
41
function replacer(str){
42
if(str.substr(-1) !== ";") str += ";";
43
return replace(str);
44
}
45
46
//TODO consider creating a merged map
47
return function(str){
48
return String(str).replace(re, replacer);
49
};
50
}());
51
52
function sorter(a, b){
53
return a < b ? 1 : -1;
54
}
55
56
function getReplacer(map){
57
return function replace(str){
58
if(str.charAt(1) === "#"){
59
if(str.charAt(2) === "X" || str.charAt(2) === "x"){
60
return decodeCodePoint(parseInt(str.substr(3), 16));
61
}
62
return decodeCodePoint(parseInt(str.substr(2), 10));
63
}
64
return map[str.slice(1, -1)];
65
};
66
}
67
68
module.exports = {
69
XML: decodeXMLStrict,
70
HTML: decodeHTML,
71
HTMLStrict: decodeHTMLStrict
72
};
73