You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.6 KiB
53 lines
1.6 KiB
import { walk } from 'css-tree'; |
|
import { |
|
unsafeToSkipNode, |
|
isEqualSelectors, |
|
isEqualDeclarations, |
|
addSelectors, |
|
hasSimilarSelectors |
|
} from './utils.js'; |
|
|
|
function processRule(node, item, list) { |
|
const selectors = node.prelude.children; |
|
const declarations = node.block.children; |
|
|
|
list.prevUntil(item.prev, function(prev) { |
|
// skip non-ruleset node if safe |
|
if (prev.type !== 'Rule') { |
|
return unsafeToSkipNode.call(selectors, prev); |
|
} |
|
|
|
const prevSelectors = prev.prelude.children; |
|
const prevDeclarations = prev.block.children; |
|
|
|
// try to join rulesets with equal pseudo signature |
|
if (node.pseudoSignature === prev.pseudoSignature) { |
|
// try to join by selectors |
|
if (isEqualSelectors(prevSelectors, selectors)) { |
|
prevDeclarations.appendList(declarations); |
|
list.remove(item); |
|
return true; |
|
} |
|
|
|
// try to join by declarations |
|
if (isEqualDeclarations(declarations, prevDeclarations)) { |
|
addSelectors(prevSelectors, selectors); |
|
list.remove(item); |
|
return true; |
|
} |
|
} |
|
|
|
// go to prev ruleset if has no selector similarities |
|
return 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 |
|
export default function initialMergeRule(ast) { |
|
walk(ast, { |
|
visit: 'Rule', |
|
enter: processRule |
|
}); |
|
};
|
|
|