AdvancedOptimizer.prototype.removeDuplicates = function (tokens) {
var matched = {};
- var forRemoval = [];
+ var moreThanOnce = [];
+ var id, token;
+ var body, bodies;
for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
+ token = tokens[i];
if (token[0] != 'selector')
continue;
- var id = stringifyBody(token[2]) + '@' + stringifySelector(token[1]);
- var alreadyMatched = matched[id];
+ id = stringifySelector(token[1]);
- if (alreadyMatched) {
- forRemoval.push(alreadyMatched[0]);
- alreadyMatched.unshift(i);
- } else {
- matched[id] = [i];
- }
+ if (matched[id] && matched[id].length == 1)
+ moreThanOnce.push(id);
+ else
+ matched[id] = matched[id] || [];
+
+ matched[id].push(i);
}
- forRemoval = forRemoval.sort(function(a, b) {
- return a > b ? 1 : -1;
- });
+ for (i = 0, l = moreThanOnce.length; i < l; i++) {
+ id = moreThanOnce[i];
+ bodies = [];
- for (var j = 0, n = forRemoval.length; j < n; j++) {
- tokens.splice(forRemoval[j] - j, 1);
+ for (var j = matched[id].length - 1; j >= 0; j--) {
+ token = tokens[matched[id][j]];
+ body = stringifyBody(token[2]);
+
+ if (bodies.indexOf(body) > -1)
+ token[2] = [];
+ else
+ bodies.push(body);
+ }
}
};