Tim van der Lippe | 706ec96 | 2021-06-04 13:24:42 +0100 | [diff] [blame^] | 1 | var walk = require('css-tree').walk; |
| 2 | var utils = require('./utils'); |
| 3 | |
| 4 | function processRule(node, item, list) { |
| 5 | var selectors = node.prelude.children; |
| 6 | var declarations = node.block.children; |
| 7 | |
| 8 | list.prevUntil(item.prev, function(prev) { |
| 9 | // skip non-ruleset node if safe |
| 10 | if (prev.type !== 'Rule') { |
| 11 | return utils.unsafeToSkipNode.call(selectors, prev); |
| 12 | } |
| 13 | |
| 14 | var prevSelectors = prev.prelude.children; |
| 15 | var prevDeclarations = prev.block.children; |
| 16 | |
| 17 | // try to join rulesets with equal pseudo signature |
| 18 | if (node.pseudoSignature === prev.pseudoSignature) { |
| 19 | // try to join by selectors |
| 20 | if (utils.isEqualSelectors(prevSelectors, selectors)) { |
| 21 | prevDeclarations.appendList(declarations); |
| 22 | list.remove(item); |
| 23 | return true; |
| 24 | } |
| 25 | |
| 26 | // try to join by declarations |
| 27 | if (utils.isEqualDeclarations(declarations, prevDeclarations)) { |
| 28 | utils.addSelectors(prevSelectors, selectors); |
| 29 | list.remove(item); |
| 30 | return true; |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | // go to prev ruleset if has no selector similarities |
| 35 | return utils.hasSimilarSelectors(selectors, prevSelectors); |
| 36 | }); |
| 37 | } |
| 38 | |
| 39 | // NOTE: direction should be left to right, since rulesets merge to left |
| 40 | // ruleset. When direction right to left unmerged rulesets may prevent lookup |
| 41 | // TODO: remove initial merge |
| 42 | module.exports = function initialMergeRule(ast) { |
| 43 | walk(ast, { |
| 44 | visit: 'Rule', |
| 45 | enter: processRule |
| 46 | }); |
| 47 | }; |