| 'use strict'; |
| |
| exports.type = 'full'; |
| |
| exports.active = true; |
| |
| exports.description = 'remove or cleanup enable-background attribute when possible'; |
| |
| /** |
| * Remove or cleanup enable-background attr which coincides with a width/height box. |
| * |
| * @see http://www.w3.org/TR/SVG/filters.html#EnableBackgroundProperty |
| * |
| * @example |
| * <svg width="100" height="50" enable-background="new 0 0 100 50"> |
| * ⬇ |
| * <svg width="100" height="50"> |
| * |
| * @param {Object} item current iteration item |
| * @return {Boolean} if false, item will be filtered out |
| * |
| * @author Kir Belevich |
| */ |
| exports.fn = function(data) { |
| |
| var regEnableBackground = /^new\s0\s0\s([\-+]?\d*\.?\d+([eE][\-+]?\d+)?)\s([\-+]?\d*\.?\d+([eE][\-+]?\d+)?)$/, |
| hasFilter = false, |
| elems = ['svg', 'mask', 'pattern']; |
| |
| function checkEnableBackground(item) { |
| if ( |
| item.isElem(elems) && |
| item.hasAttr('enable-background') && |
| item.hasAttr('width') && |
| item.hasAttr('height') |
| ) { |
| |
| var match = item.attr('enable-background').value.match(regEnableBackground); |
| |
| if (match) { |
| if ( |
| item.attr('width').value === match[1] && |
| item.attr('height').value === match[3] |
| ) { |
| if (item.isElem('svg')) { |
| item.removeAttr('enable-background'); |
| } else { |
| item.attr('enable-background').value = 'new'; |
| } |
| } |
| } |
| |
| } |
| } |
| |
| function checkForFilter(item) { |
| if (item.isElem('filter')) { |
| hasFilter = true; |
| } |
| } |
| |
| function monkeys(items, fn) { |
| items.content.forEach(function(item) { |
| fn(item); |
| |
| if (item.content) { |
| monkeys(item, fn); |
| } |
| }); |
| return items; |
| } |
| |
| var firstStep = monkeys(data, function(item) { |
| checkEnableBackground(item); |
| if (!hasFilter) { |
| checkForFilter(item); |
| } |
| }); |
| |
| return hasFilter ? firstStep : monkeys(firstStep, function(item) { |
| //we don't need 'enable-background' if we have no filters |
| item.removeAttr('enable-background'); |
| }); |
| }; |