summaryrefslogtreecommitdiff
path: root/node_modules/svgo/plugins/sortDefsChildren.js
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
commitc06f7ee0a40255214c477e13d9b956a7e07c2900 (patch)
treef5982a568ef8fab865d0142e71c7494fea3e4c1b /node_modules/svgo/plugins/sortDefsChildren.js
parent3fd9400d4dccc25aa29b5702216732e0b7542073 (diff)
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/svgo/plugins/sortDefsChildren.js')
-rw-r--r--node_modules/svgo/plugins/sortDefsChildren.js58
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;
+ });
+ }
+ },
+ },
+ };
+};