summaryrefslogtreecommitdiff
path: root/node_modules/svgo/plugins/removeAttrs.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/svgo/plugins/removeAttrs.js')
-rw-r--r--node_modules/svgo/plugins/removeAttrs.js153
1 files changed, 153 insertions, 0 deletions
diff --git a/node_modules/svgo/plugins/removeAttrs.js b/node_modules/svgo/plugins/removeAttrs.js
new file mode 100644
index 00000000..c289d8ca
--- /dev/null
+++ b/node_modules/svgo/plugins/removeAttrs.js
@@ -0,0 +1,153 @@
+'use strict';
+
+exports.name = 'removeAttrs';
+exports.description = 'removes specified attributes';
+
+const DEFAULT_SEPARATOR = ':';
+const ENOATTRS = `Warning: The plugin "removeAttrs" requires the "attrs" parameter.
+It should have a pattern to remove, otherwise the plugin is a noop.
+Config example:
+
+plugins: [
+ {
+ name: "removeAttrs",
+ params: {
+ attrs: "(fill|stroke)"
+ }
+ }
+]
+`;
+
+/**
+ * Remove attributes
+ *
+ * @example elemSeparator
+ * format: string
+ *
+ * @example preserveCurrentColor
+ * format: boolean
+ *
+ * @example attrs:
+ *
+ * format: [ element* : attribute* : value* ]
+ *
+ * element : regexp (wrapped into ^...$), single * or omitted > all elements (must be present when value is used)
+ * attribute : regexp (wrapped into ^...$)
+ * value : regexp (wrapped into ^...$), single * or omitted > all values
+ *
+ * examples:
+ *
+ * > basic: remove fill attribute
+ * ---
+ * removeAttrs:
+ * attrs: 'fill'
+ *
+ * > remove fill attribute on path element
+ * ---
+ * attrs: 'path:fill'
+ *
+ * > remove fill attribute on path element where value is none
+ * ---
+ * attrs: 'path:fill:none'
+ *
+ *
+ * > remove all fill and stroke attribute
+ * ---
+ * attrs:
+ * - 'fill'
+ * - 'stroke'
+ *
+ * [is same as]
+ *
+ * attrs: '(fill|stroke)'
+ *
+ * [is same as]
+ *
+ * attrs: '*:(fill|stroke)'
+ *
+ * [is same as]
+ *
+ * attrs: '.*:(fill|stroke)'
+ *
+ * [is same as]
+ *
+ * attrs: '.*:(fill|stroke):.*'
+ *
+ *
+ * > remove all stroke related attributes
+ * ----
+ * attrs: 'stroke.*'
+ *
+ *
+ * @author Benny Schudel
+ *
+ * @type {import('./plugins-types').Plugin<'removeAttrs'>}
+ */
+exports.fn = (root, params) => {
+ if (typeof params.attrs == 'undefined') {
+ console.warn(ENOATTRS);
+ return null;
+ }
+
+ const elemSeparator =
+ typeof params.elemSeparator == 'string'
+ ? params.elemSeparator
+ : DEFAULT_SEPARATOR;
+ const preserveCurrentColor =
+ typeof params.preserveCurrentColor == 'boolean'
+ ? params.preserveCurrentColor
+ : false;
+ const attrs = Array.isArray(params.attrs) ? params.attrs : [params.attrs];
+
+ return {
+ element: {
+ enter: (node) => {
+ for (let pattern of attrs) {
+ // if no element separators (:), assume it's attribute name, and apply to all elements *regardless of value*
+ if (pattern.includes(elemSeparator) === false) {
+ pattern = ['.*', elemSeparator, pattern, elemSeparator, '.*'].join(
+ ''
+ );
+ // if only 1 separator, assume it's element and attribute name, and apply regardless of attribute value
+ } else if (pattern.split(elemSeparator).length < 3) {
+ pattern = [pattern, elemSeparator, '.*'].join('');
+ }
+
+ // create regexps for element, attribute name, and attribute value
+ const list = pattern.split(elemSeparator).map((value) => {
+ // adjust single * to match anything
+ if (value === '*') {
+ value = '.*';
+ }
+ return new RegExp(['^', value, '$'].join(''), 'i');
+ });
+
+ // matches element
+ if (list[0].test(node.name)) {
+ // loop attributes
+ for (const [name, value] of Object.entries(node.attributes)) {
+ const isFillCurrentColor =
+ preserveCurrentColor &&
+ name == 'fill' &&
+ value == 'currentColor';
+ const isStrokeCurrentColor =
+ preserveCurrentColor &&
+ name == 'stroke' &&
+ value == 'currentColor';
+ if (
+ !isFillCurrentColor &&
+ !isStrokeCurrentColor &&
+ // matches attribute name
+ list[1].test(name) &&
+ // matches attribute value
+ list[2].test(value)
+ ) {
+ delete node.attributes[name];
+ }
+ }
+ }
+ }
+ },
+ },
+ };
+};