diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2023-10-14 15:05:55 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2023-10-14 15:05:55 +0800 |
| commit | c06f7ee0a40255214c477e13d9b956a7e07c2900 (patch) | |
| tree | f5982a568ef8fab865d0142e71c7494fea3e4c1b /node_modules/svgo/plugins/removeUselessDefs.js | |
| parent | 3fd9400d4dccc25aa29b5702216732e0b7542073 (diff) | |
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/svgo/plugins/removeUselessDefs.js')
| -rw-r--r-- | node_modules/svgo/plugins/removeUselessDefs.js | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/node_modules/svgo/plugins/removeUselessDefs.js b/node_modules/svgo/plugins/removeUselessDefs.js new file mode 100644 index 00000000..46461a98 --- /dev/null +++ b/node_modules/svgo/plugins/removeUselessDefs.js @@ -0,0 +1,65 @@ +'use strict'; + +/** + * @typedef {import('../lib/types').XastElement} XastElement + */ + +const { detachNodeFromParent } = require('../lib/xast.js'); +const { elemsGroups } = require('./_collections.js'); + +exports.name = 'removeUselessDefs'; +exports.description = 'removes elements in <defs> without id'; + +/** + * Removes content of defs and properties that aren't rendered directly without ids. + * + * @author Lev Solntsev + * + * @type {import('./plugins-types').Plugin<'removeUselessDefs'>} + */ +exports.fn = () => { + return { + element: { + enter: (node, parentNode) => { + if (node.name === 'defs') { + /** + * @type {Array<XastElement>} + */ + const usefulNodes = []; + collectUsefulNodes(node, usefulNodes); + if (usefulNodes.length === 0) { + detachNodeFromParent(node, parentNode); + } + // TODO remove legacy parentNode in v4 + for (const usefulNode of usefulNodes) { + Object.defineProperty(usefulNode, 'parentNode', { + writable: true, + value: node, + }); + } + node.children = usefulNodes; + } else if ( + elemsGroups.nonRendering.includes(node.name) && + node.attributes.id == null + ) { + detachNodeFromParent(node, parentNode); + } + }, + }, + }; +}; + +/** + * @type {(node: XastElement, usefulNodes: Array<XastElement>) => void} + */ +const collectUsefulNodes = (node, usefulNodes) => { + for (const child of node.children) { + if (child.type === 'element') { + if (child.attributes.id != null || child.name === 'style') { + usefulNodes.push(child); + } else { + collectUsefulNodes(child, usefulNodes); + } + } + } +}; |
