aboutsummaryrefslogtreecommitdiff
path: root/node_modules/html-minifier/src/tokenchain.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
commitde98e0b232509d5f40c135d540a70e415272ff85 (patch)
treea79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/html-minifier/src/tokenchain.js
parente0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff)
node_modules
Diffstat (limited to 'node_modules/html-minifier/src/tokenchain.js')
-rw-r--r--node_modules/html-minifier/src/tokenchain.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/node_modules/html-minifier/src/tokenchain.js b/node_modules/html-minifier/src/tokenchain.js
new file mode 100644
index 000000000..f8892d017
--- /dev/null
+++ b/node_modules/html-minifier/src/tokenchain.js
@@ -0,0 +1,71 @@
+'use strict';
+
+function Sorter() {
+}
+
+Sorter.prototype.sort = function(tokens, fromIndex) {
+ fromIndex = fromIndex || 0;
+ for (var i = 0, len = this.keys.length; i < len; i++) {
+ var key = this.keys[i];
+ var token = key.slice(1);
+ var index = tokens.indexOf(token, fromIndex);
+ if (index !== -1) {
+ do {
+ if (index !== fromIndex) {
+ tokens.splice(index, 1);
+ tokens.splice(fromIndex, 0, token);
+ }
+ fromIndex++;
+ } while ((index = tokens.indexOf(token, fromIndex)) !== -1);
+ return this[key].sort(tokens, fromIndex);
+ }
+ }
+ return tokens;
+};
+
+function TokenChain() {
+}
+
+TokenChain.prototype = {
+ add: function(tokens) {
+ var self = this;
+ tokens.forEach(function(token) {
+ var key = '$' + token;
+ if (!self[key]) {
+ self[key] = [];
+ self[key].processed = 0;
+ }
+ self[key].push(tokens);
+ });
+ },
+ createSorter: function() {
+ var self = this;
+ var sorter = new Sorter();
+ sorter.keys = Object.keys(self).sort(function(j, k) {
+ var m = self[j].length;
+ var n = self[k].length;
+ return m < n ? 1 : m > n ? -1 : j < k ? -1 : j > k ? 1 : 0;
+ }).filter(function(key) {
+ if (self[key].processed < self[key].length) {
+ var token = key.slice(1);
+ var chain = new TokenChain();
+ self[key].forEach(function(tokens) {
+ var index;
+ while ((index = tokens.indexOf(token)) !== -1) {
+ tokens.splice(index, 1);
+ }
+ tokens.forEach(function(token) {
+ self['$' + token].processed++;
+ });
+ chain.add(tokens.slice(0));
+ });
+ sorter[key] = chain.createSorter();
+ return true;
+ }
+ return false;
+ });
+ return sorter;
+ }
+};
+
+module.exports = TokenChain;