.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / entities / lib / decode.js
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).sort(sorter);
24
25     var keys = Object.keys(entityMap).sort(sorter);
26
27     for (var i = 0, j = 0; i < keys.length; i++) {
28         if (legacy[j] === keys[i]) {
29             keys[i] += ";?";
30             j++;
31         } else {
32             keys[i] += ";";
33         }
34     }
35
36     var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g"),
37         replace = getReplacer(entityMap);
38
39     function replacer(str) {
40         if (str.substr(-1) !== ";") str += ";";
41         return replace(str);
42     }
43
44     //TODO consider creating a merged map
45     return function(str) {
46         return String(str).replace(re, replacer);
47     };
48 })();
49
50 function sorter(a, b) {
51     return a < b ? 1 : -1;
52 }
53
54 function getReplacer(map) {
55     return function replace(str) {
56         if (str.charAt(1) === "#") {
57             if (str.charAt(2) === "X" || str.charAt(2) === "x") {
58                 return decodeCodePoint(parseInt(str.substr(3), 16));
59             }
60             return decodeCodePoint(parseInt(str.substr(2), 10));
61         }
62         return map[str.slice(1, -1)];
63     };
64 }
65
66 module.exports = {
67     XML: decodeXMLStrict,
68     HTML: decodeHTML,
69     HTMLStrict: decodeHTMLStrict
70 };