summaryrefslogtreecommitdiff
path: root/node_modules/svgo/plugins/removeEmptyContainers.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/svgo/plugins/removeEmptyContainers.js')
-rw-r--r--node_modules/svgo/plugins/removeEmptyContainers.js56
1 files changed, 56 insertions, 0 deletions
diff --git a/node_modules/svgo/plugins/removeEmptyContainers.js b/node_modules/svgo/plugins/removeEmptyContainers.js
new file mode 100644
index 00000000..d803fc9c
--- /dev/null
+++ b/node_modules/svgo/plugins/removeEmptyContainers.js
@@ -0,0 +1,56 @@
+'use strict';
+
+const { detachNodeFromParent } = require('../lib/xast.js');
+const { elemsGroups } = require('./_collections.js');
+
+exports.name = 'removeEmptyContainers';
+exports.description = 'removes empty container elements';
+
+/**
+ * Remove empty containers.
+ *
+ * @see https://www.w3.org/TR/SVG11/intro.html#TermContainerElement
+ *
+ * @example
+ * <defs/>
+ *
+ * @example
+ * <g><marker><a/></marker></g>
+ *
+ * @author Kir Belevich
+ *
+ * @type {import('./plugins-types').Plugin<'removeEmptyContainers'>}
+ */
+exports.fn = () => {
+ return {
+ element: {
+ exit: (node, parentNode) => {
+ // remove only empty non-svg containers
+ if (
+ node.name === 'svg' ||
+ elemsGroups.container.includes(node.name) === false ||
+ node.children.length !== 0
+ ) {
+ return;
+ }
+ // empty patterns may contain reusable configuration
+ if (
+ node.name === 'pattern' &&
+ Object.keys(node.attributes).length !== 0
+ ) {
+ return;
+ }
+ // The <g> may not have content, but the filter may cause a rectangle
+ // to be created and filled with pattern.
+ if (node.name === 'g' && node.attributes.filter != null) {
+ return;
+ }
+ // empty <mask> hides masked element
+ if (node.name === 'mask' && node.attributes.id != null) {
+ return;
+ }
+ detachNodeFromParent(node, parentNode);
+ },
+ },
+ };
+};