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 |
|
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 | }; |
\ | No newline at end of file |