[Pkg-javascript-commits] [node-entities] 28/63: moved regexp compilation to compile.js
Wolfgang Borgert
debacle at moszumanska.debian.org
Mon Sep 22 08:15:46 UTC 2014
This is an automated email from the git hooks/post-receive script.
debacle pushed a commit to branch master
in repository node-entities.
commit 41ee7d29751856928e52417cfbd594658c5cb7f8
Author: fb55 <feedic at me.com>
Date: Sun Feb 16 11:53:02 2014 +0100
moved regexp compilation to compile.js
---
compile.js | 60 ++++++++++++++++++++++++++
index.js | 141 +++++++++++++++++++++++--------------------------------------
2 files changed, 114 insertions(+), 87 deletions(-)
diff --git a/compile.js b/compile.js
new file mode 100644
index 0000000..910741b
--- /dev/null
+++ b/compile.js
@@ -0,0 +1,60 @@
+var modes = ["XML", "HTML4", "HTML5"];
+
+modes.reduce(function(prev, name, i){
+ var obj = require("./entities/" + name.toLowerCase() + ".json");
+
+ if(prev){
+ Object.keys(prev).forEach(function(name){
+ obj[name] = prev[name];
+ });
+ }
+
+ var inverse = getInverse(obj);
+
+ module.exports[name] = {
+ strict: getStrictReplacer(obj),
+ //there is no non-strict mode for XML
+ normal: i === 0 ? null : getReplacer(obj),
+ inverse: getInverseReplacer(inverse),
+ inverseObj: inverse,
+ obj: obj
+ };
+
+ return obj;
+}, null);
+
+function getReplacer(obj){
+ var keys = Object.keys(obj).sort();
+ var re = keys.join("|").replace(/(\w+)\|\1;/g, "$1;?");
+
+ // also match hex and char codes
+ re += "|#[xX][\\da-fA-F]+;?|#\\d+;?";
+
+ return new RegExp("&(?:" + re + ")", "g");
+}
+
+function getStrictReplacer(obj){
+ var keys = Object.keys(obj).sort().filter(RegExp.prototype.test, /;$/);
+ var re = keys.map(function(name){
+ return name.slice(0, -1); //remove trailing semicolon
+ }).join("|");
+
+ // also match hex and char codes
+ re += "|#[xX][\\da-fA-F]+|#\\d+";
+
+ return new RegExp("&(?:" + re + ");", "g");
+}
+
+function getInverse(obj){
+ return Object.keys(obj).filter(function(name){
+ //prefer identifiers with a semicolon
+ return name.substr(-1) === ";" || obj[name + ";"] !== obj[name];
+ }).reduce(function(inverse, name){
+ inverse[obj[name]] = name;
+ return inverse;
+ }, {});
+}
+
+function getInverseReplacer(inverse){
+ return new RegExp("\\" + Object.keys(inverse).sort().join("|\\"), "g");
+}
diff --git a/index.js b/index.js
index a50d980..8948597 100644
--- a/index.js
+++ b/index.js
@@ -1,86 +1,63 @@
-var modes = ["XML", "HTML4", "HTML5"];
-
-module.exports = {
- decode: function(data, level){
- if(!modes[level]) level = 0;
- return module.exports["decode" + modes[level]](data);
- },
- decodeStrict: function(data, level){
- if(!modes[level]) level = 0;
- return module.exports["decode" + modes[level] + "Strict"](data);
- },
- encode: function(data, level){
- if(!modes[level]) level = 0;
- return module.exports["encode" + modes[level]](data);
- }
-};
-
-modes.reduce(function(prev, name){
- var obj = require("./entities/" + name.toLowerCase() + ".json");
-
- if(prev){
- Object.keys(prev).forEach(function(name){
- obj[name] = prev[name];
- });
- }
-
- module.exports["decode" + name + "Strict"] = getStrictReplacer(obj);
-
- if(name === "XML"){
- //there is no non-strict mode for XML
- module.exports.decodeXML = module.exports.decodeXMLStrict;
- } else {
- module.exports["decode" + name] = getReplacer(obj);
- }
+var compiled = require("./compile.js"),
+ modes = ["XML", "HTML4", "HTML5"];
+
+var levels = modes.map(function(name, i){
+ var obj = compiled[name],
+ strict = genReplaceFunc(obj.strict, getStrictReplacer(obj.obj)),
+ //there is no non-strict mode for XML
+ normal = i === 0 ? strict : genReplaceFunc(obj.normal, getReplacer(obj.obj)),
+ inverse = getInverse(obj.inverseObj, obj.inverse);
+
+ exports["decode" + name + "Strict"] = strict;
+ exports["decode" + name] = normal;
+ exports["encode" + name] = inverse;
+
+ return {
+ strict: strict,
+ normal: normal,
+ inverse: inverse
+ };
+});
- module.exports["encode" + name] = getReverse(obj);
+var decode = levels.map(function(l){ return l.normal; }),
+ decodeStrict = levels.map(function(l){ return l.strict; }),
+ inverse = levels.map(function(l){ return l.inverse; });
- return obj;
-}, null);
+exports.decode = function(data, level){
+ if(!(level >= 0 && level < 3)) level = 0;
+ return decode[level](data);
+};
+exports.decodeStrict = function(data, level){
+ if(!(level >= 0 && level < 3)) level = 0;
+ return decodeStrict[level](data);
+};
+exports.encode = function(data, level){
+ if(!(level >= 0 && level < 3)) level = 0;
+ return encode[level](data);
+};
function getReplacer(obj){
- var keys = Object.keys(obj).sort();
- var re = keys.join("|").replace(/(\w+)\|\1;/g, "$1;?");
-
- // also match hex and char codes
- re += "|#[xX][\\da-fA-F]+;?|#\\d+;?";
-
- return genReplaceFunc(
- new RegExp("&(?:" + re + ")", "g"),
- function func(name){
- if(name.charAt(1) === "#"){
- if(name.charAt(2).toLowerCase() === "x"){
- return String.fromCharCode(parseInt(name.substr(3), 16));
- }
- return String.fromCharCode(parseInt(name.substr(2), 10));
+ return function normalReplacer(name){
+ if(name.charAt(1) === "#"){
+ if(name.charAt(2).toLowerCase() === "x"){
+ return String.fromCharCode(parseInt(name.substr(3), 16));
}
- return obj[name.substr(1)];
+ return String.fromCharCode(parseInt(name.substr(2), 10));
}
- );
+ return obj[name.substr(1)];
+ };
}
function getStrictReplacer(obj){
- var keys = Object.keys(obj).sort().filter(RegExp.prototype.test, /;$/);
- var re = keys.map(function(name){
- return name.slice(0, -1); //remove trailing semicolon
- }).join("|");
-
- // also match hex and char codes
- re += "|#[xX][\\da-fA-F]+|#\\d+";
-
- var expr = new RegExp("&(?:" + re + ");", "g");
-
- return genReplaceFunc(expr, func);
-
- function func(name){
- if(name.charAt(1) === "#"){
- if(name.charAt(2).toLowerCase() === "x"){
- return String.fromCharCode(parseInt(name.substr(3), 16));
- }
- return String.fromCharCode(parseInt(name.substr(2), 10));
+ return function strictReplacer(name){
+ if(name.charAt(1) === "#"){
+ if(name.charAt(2).toLowerCase() === "x"){
+ return String.fromCharCode(parseInt(name.substr(3), 16));
}
- return obj[name.substr(1)];
+ return String.fromCharCode(parseInt(name.substr(2), 10));
}
+ return obj[name.substr(1)];
+ };
}
var re_nonASCII = /[^\0-\x7F]/g,
@@ -98,23 +75,14 @@ function astralReplacer(c){
return "&#x" + codePoint.toString(16).toUpperCase() + ";";
}
-function getReverse(obj){
- var reverse = Object.keys(obj).filter(function(name){
- //prefer identifiers with a semicolon
- return name.substr(-1) === ";" || obj[name + ";"] !== obj[name];
- }).reduce(function(reverse, name){
- reverse[obj[name]] = name;
- return reverse;
- }, {});
-
- var regex = new RegExp("\\" + Object.keys(reverse).sort().join("|\\"), "g");
+function getInverse(inverse, re){
function func(name){
- return "&" + reverse[name];
+ return "&" + inverse[name];
}
return function(data){
- return (data + "")
- .replace(regex, func)
+ return data
+ .replace(re, func)
.replace(re_astralSymbols, astralReplacer)
.replace(re_nonASCII, nonUTF8Replacer);
};
@@ -122,7 +90,6 @@ function getReverse(obj){
function genReplaceFunc(regex, func){
return function(data){
- return (data + "")
- .replace(regex, func);
+ return data.replace(regex, func);
};
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-entities.git
More information about the Pkg-javascript-commits
mailing list