[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