UNPKG

1.63 kBJavaScriptView Raw
1var entityMap = require("../maps/entities.json"),
2 legacyMap = require("../maps/legacy.json"),
3 xmlMap = require("../maps/xml.json"),
4 decodeCodePoint = require("./decode_codepoint.js");
5
6var decodeXMLStrict = getStrictDecoder(xmlMap),
7 decodeHTMLStrict = getStrictDecoder(entityMap);
8
9function 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
22var 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
52function sorter(a, b){
53 return a < b ? 1 : -1;
54}
55
56function 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
68module.exports = {
69 XML: decodeXMLStrict,
70 HTML: decodeHTML,
71 HTMLStrict: decodeHTMLStrict
72};
\No newline at end of file