为 PostCSS 中的所有直接后代生成规则
Generate rule for all direct descendants in PostCSS
我想创建一个 PostCSS 插件,我可以在其中为所有直接后代生成新规则。
例如我想生成规则:
div > * {
color: black;
}
对于所有divs
,即display: block
。
我没有找到如何执行此操作的好示例。
module.exports = () => {
let skipped = Symbol("isSkipped"); // skipped flag
let counter = Symbol("skippedCounter"); // counter for test "isSkipped" optimization
function generateRule(decl) {
let rules = decl.parent;
rules[counter] = Number.isInteger(rules[counter]) ? rules[counter] : 0;
if (!rules[skipped]) {
if (decl.value === "block") {
// generate a new rule here
rules[skipped] = true;
rules[counter]++;
}
}
}
return {
postcssPlugin: "postcss-example-plugin",
Declaration: {
display: (decl) => generateRule(decl),
},
};
};
module.exports.postcss = true;
我不能 100% 确定您要查找的部分,所以如果这不能回答您的问题,请随时澄清,我会更新回复。
这是一些我认为可以满足您要求的代码 - 尽管它主要是您已经编写的代码,但没有进行优化:
module.exports = {
postcssPlugin: "add-rule-to-descendants",
Declaration: {
// https://postcss.org/api/#declarationprocessor
display(displayDecl, { Rule, Declaration }) {
if (displayDecl.value === 'block') {
// Add the new rule after the parent https://postcss.org/api/#rule-after
displayDecl.parent.after(
new Rule({
selector: `${displayDecl.parent.selector} > *`,
nodes: [
new Declaration({ prop: 'color', value: 'black' })
]
})
);
}
}
}
}
我还在 Repl.it https://repl.it/@dcwither/postcss-all-decendants-rule#plugin.js.
上准备了一些快速测试示例
我想创建一个 PostCSS 插件,我可以在其中为所有直接后代生成新规则。
例如我想生成规则:
div > * {
color: black;
}
对于所有divs
,即display: block
。
我没有找到如何执行此操作的好示例。
module.exports = () => {
let skipped = Symbol("isSkipped"); // skipped flag
let counter = Symbol("skippedCounter"); // counter for test "isSkipped" optimization
function generateRule(decl) {
let rules = decl.parent;
rules[counter] = Number.isInteger(rules[counter]) ? rules[counter] : 0;
if (!rules[skipped]) {
if (decl.value === "block") {
// generate a new rule here
rules[skipped] = true;
rules[counter]++;
}
}
}
return {
postcssPlugin: "postcss-example-plugin",
Declaration: {
display: (decl) => generateRule(decl),
},
};
};
module.exports.postcss = true;
我不能 100% 确定您要查找的部分,所以如果这不能回答您的问题,请随时澄清,我会更新回复。
这是一些我认为可以满足您要求的代码 - 尽管它主要是您已经编写的代码,但没有进行优化:
module.exports = {
postcssPlugin: "add-rule-to-descendants",
Declaration: {
// https://postcss.org/api/#declarationprocessor
display(displayDecl, { Rule, Declaration }) {
if (displayDecl.value === 'block') {
// Add the new rule after the parent https://postcss.org/api/#rule-after
displayDecl.parent.after(
new Rule({
selector: `${displayDecl.parent.selector} > *`,
nodes: [
new Declaration({ prop: 'color', value: 'black' })
]
})
);
}
}
}
}
我还在 Repl.it https://repl.it/@dcwither/postcss-all-decendants-rule#plugin.js.
上准备了一些快速测试示例