| 'use strict'; |
| |
| var DEFAULT_SEPARATOR = ':'; |
| |
| exports.type = 'perItem'; |
| |
| exports.active = false; |
| |
| exports.description = 'removes specified attributes'; |
| |
| exports.params = { |
| elemSeparator: DEFAULT_SEPARATOR, |
| preserveCurrentColor: false, |
| attrs: [] |
| }; |
| |
| /** |
| * Remove attributes |
| * |
| * @param elemSeparator |
| * format: string |
| * |
| * @param preserveCurrentColor |
| * format: boolean |
| * |
| * @param 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.*' |
| * |
| * |
| * @param {Object} item current iteration item |
| * @param {Object} params plugin params |
| * @return {Boolean} if false, item will be filtered out |
| * |
| * @author Benny Schudel |
| */ |
| exports.fn = function(item, params) { |
| // wrap into an array if params is not |
| if (!Array.isArray(params.attrs)) { |
| params.attrs = [params.attrs]; |
| } |
| |
| if (item.isElem()) { |
| var elemSeparator = typeof params.elemSeparator == 'string' ? params.elemSeparator : DEFAULT_SEPARATOR; |
| var preserveCurrentColor = typeof params.preserveCurrentColor == 'boolean' ? params.preserveCurrentColor : false; |
| |
| // prepare patterns |
| var patterns = params.attrs.map(function(pattern) { |
| |
| // if no element separators (:), assume it's attribute name, and apply to all elements *regardless of value* |
| if (pattern.indexOf(elemSeparator) === -1) { |
| 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 |
| return pattern.split(elemSeparator) |
| .map(function(value) { |
| |
| // adjust single * to match anything |
| if (value === '*') { value = '.*'; } |
| |
| return new RegExp(['^', value, '$'].join(''), 'i'); |
| }); |
| |
| }); |
| |
| // loop patterns |
| patterns.forEach(function(pattern) { |
| |
| // matches element |
| if (pattern[0].test(item.elem)) { |
| |
| // loop attributes |
| item.eachAttr(function(attr) { |
| var name = attr.name; |
| var value = attr.value; |
| var isFillCurrentColor = preserveCurrentColor && name == 'fill' && value == 'currentColor'; |
| var isStrokeCurrentColor = preserveCurrentColor && name == 'stroke' && value == 'currentColor'; |
| |
| if (!(isFillCurrentColor || isStrokeCurrentColor)) { |
| // matches attribute name |
| if (pattern[1].test(name)) { |
| |
| // matches attribute value |
| if (pattern[2].test(attr.value)) { |
| item.removeAttr(name); |
| } |
| } |
| } |
| |
| }); |
| |
| } |
| |
| }); |
| |
| } |
| |
| }; |