.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / entities / lib / encode.js
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)
13         .sort()
14         .reduce(function(inverse, name) {
15             inverse[obj[name]] = "&" + name + ";";
16             return inverse;
17         }, {});
18 }
19
20 function getInverseReplacer(inverse) {
21     var single = [],
22         multiple = [];
23
24     Object.keys(inverse).forEach(function(k) {
25         if (k.length === 1) {
26             single.push("\\" + k);
27         } else {
28             multiple.push(k);
29         }
30     });
31
32     //TODO add ranges
33     multiple.unshift("[" + single.join("") + "]");
34
35     return new RegExp(multiple.join("|"), "g");
36 }
37
38 var re_nonASCII = /[^\0-\x7F]/g,
39     re_astralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
40
41 function singleCharReplacer(c) {
42     return (
43         "&#x" +
44         c
45             .charCodeAt(0)
46             .toString(16)
47             .toUpperCase() +
48         ";"
49     );
50 }
51
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() + ";";
58 }
59
60 function getInverse(inverse, re) {
61     function func(name) {
62         return inverse[name];
63     }
64
65     return function(data) {
66         return data
67             .replace(re, func)
68             .replace(re_astralSymbols, astralReplacer)
69             .replace(re_nonASCII, singleCharReplacer);
70     };
71 }
72
73 var re_xmlChars = getInverseReplacer(inverseXML);
74
75 function escapeXML(data) {
76     return data
77         .replace(re_xmlChars, singleCharReplacer)
78         .replace(re_astralSymbols, astralReplacer)
79         .replace(re_nonASCII, singleCharReplacer);
80 }
81
82 exports.escape = escapeXML;