aboutsummaryrefslogtreecommitdiff
path: root/node_modules/csso/lib/compressor/restructure/1-initialMergeRuleset.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/csso/lib/compressor/restructure/1-initialMergeRuleset.js')
-rw-r--r--node_modules/csso/lib/compressor/restructure/1-initialMergeRuleset.js48
1 files changed, 48 insertions, 0 deletions
diff --git a/node_modules/csso/lib/compressor/restructure/1-initialMergeRuleset.js b/node_modules/csso/lib/compressor/restructure/1-initialMergeRuleset.js
new file mode 100644
index 00000000..036a04b4
--- /dev/null
+++ b/node_modules/csso/lib/compressor/restructure/1-initialMergeRuleset.js
@@ -0,0 +1,48 @@
+var utils = require('./utils.js');
+var walkRules = require('../../utils/walk.js').rules;
+
+function processRuleset(node, item, list) {
+ var selectors = node.selector.selectors;
+ var declarations = node.block.declarations;
+
+ list.prevUntil(item.prev, function(prev) {
+ // skip non-ruleset node if safe
+ if (prev.type !== 'Ruleset') {
+ return utils.unsafeToSkipNode.call(selectors, prev);
+ }
+
+ var prevSelectors = prev.selector.selectors;
+ var prevDeclarations = prev.block.declarations;
+
+ // try to join rulesets with equal pseudo signature
+ if (node.pseudoSignature === prev.pseudoSignature) {
+ // try to join by selectors
+ if (utils.isEqualLists(prevSelectors, selectors)) {
+ prevDeclarations.appendList(declarations);
+ list.remove(item);
+ return true;
+ }
+
+ // try to join by declarations
+ if (utils.isEqualDeclarations(declarations, prevDeclarations)) {
+ utils.addSelectors(prevSelectors, selectors);
+ list.remove(item);
+ return true;
+ }
+ }
+
+ // go to prev ruleset if has no selector similarities
+ return utils.hasSimilarSelectors(selectors, prevSelectors);
+ });
+};
+
+// NOTE: direction should be left to right, since rulesets merge to left
+// ruleset. When direction right to left unmerged rulesets may prevent lookup
+// TODO: remove initial merge
+module.exports = function initialMergeRuleset(ast) {
+ walkRules(ast, function(node, item, list) {
+ if (node.type === 'Ruleset') {
+ processRuleset(node, item, list);
+ }
+ });
+};