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/sortDefsChildren.js | |
| parent | 3fd9400d4dccc25aa29b5702216732e0b7542073 (diff) | |
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/svgo/plugins/sortDefsChildren.js')
| -rw-r--r-- | node_modules/svgo/plugins/sortDefsChildren.js | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/node_modules/svgo/plugins/sortDefsChildren.js b/node_modules/svgo/plugins/sortDefsChildren.js new file mode 100644 index 00000000..6ae5d421 --- /dev/null +++ b/node_modules/svgo/plugins/sortDefsChildren.js @@ -0,0 +1,58 @@ +'use strict'; + +exports.name = 'sortDefsChildren'; +exports.description = 'Sorts children of <defs> to improve compression'; + +/** + * Sorts children of defs in order to improve compression. + * Sorted first by frequency then by element name length then by element name (to ensure grouping). + * + * @author David Leston + * + * @type {import('./plugins-types').Plugin<'sortDefsChildren'>} + */ +exports.fn = () => { + return { + element: { + enter: (node) => { + if (node.name === 'defs') { + /** + * @type {Map<string, number>} + */ + const frequencies = new Map(); + for (const child of node.children) { + if (child.type === 'element') { + const frequency = frequencies.get(child.name); + if (frequency == null) { + frequencies.set(child.name, 1); + } else { + frequencies.set(child.name, frequency + 1); + } + } + } + node.children.sort((a, b) => { + if (a.type !== 'element' || b.type !== 'element') { + return 0; + } + const aFrequency = frequencies.get(a.name); + const bFrequency = frequencies.get(b.name); + if (aFrequency != null && bFrequency != null) { + const frequencyComparison = bFrequency - aFrequency; + if (frequencyComparison !== 0) { + return frequencyComparison; + } + } + const lengthComparison = b.name.length - a.name.length; + if (lengthComparison !== 0) { + return lengthComparison; + } + if (a.name !== b.name) { + return a.name > b.name ? -1 : 1; + } + return 0; + }); + } + }, + }, + }; +}; |
