You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.1 KiB
150 lines
4.1 KiB
'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); |
|
} |
|
} |
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
};
|
|
|