| 'use strict'; |
| |
| exports.type = 'perItemReverse'; |
| |
| exports.active = true; |
| |
| exports.description = 'collapses useless groups'; |
| |
| var collections = require('./_collections'), |
| attrsInheritable = collections.inheritableAttrs, |
| animationElems = collections.elemsGroups.animation; |
| |
| function hasAnimatedAttr(item) { |
| /* jshint validthis:true */ |
| return item.isElem(animationElems) && item.hasAttr('attributeName', this) || |
| !item.isEmpty() && item.content.some(hasAnimatedAttr, this); |
| } |
| |
| /* |
| * Collapse useless groups. |
| * |
| * @example |
| * <g> |
| * <g attr1="val1"> |
| * <path d="..."/> |
| * </g> |
| * </g> |
| * ⬇ |
| * <g> |
| * <g> |
| * <path attr1="val1" d="..."/> |
| * </g> |
| * </g> |
| * ⬇ |
| * <path attr1="val1" d="..."/> |
| * |
| * @param {Object} item current iteration item |
| * @return {Boolean} if false, item will be filtered out |
| * |
| * @author Kir Belevich |
| */ |
| exports.fn = function(item) { |
| |
| // non-empty elements |
| if (item.isElem() && !item.isElem('switch') && !item.isEmpty()) { |
| item.content.forEach(function(g, i) { |
| // non-empty groups |
| if (g.isElem('g') && !g.isEmpty()) { |
| // move group attibutes to the single content element |
| if (g.hasAttr() && g.content.length === 1) { |
| var inner = g.content[0]; |
| |
| if (inner.isElem() && !inner.hasAttr('id') && !g.hasAttr('filter') && |
| !(g.hasAttr('class') && inner.hasAttr('class')) && ( |
| !g.hasAttr('clip-path') && !g.hasAttr('mask') || |
| inner.isElem('g') && !g.hasAttr('transform') && !inner.hasAttr('transform') |
| ) |
| ) { |
| g.eachAttr(function(attr) { |
| if (g.content.some(hasAnimatedAttr, attr.name)) return; |
| |
| if (!inner.hasAttr(attr.name)) { |
| inner.addAttr(attr); |
| } else if (attr.name == 'transform') { |
| inner.attr(attr.name).value = attr.value + ' ' + inner.attr(attr.name).value; |
| } else if (inner.hasAttr(attr.name, 'inherit')) { |
| inner.attr(attr.name).value = attr.value; |
| } else if ( |
| attrsInheritable.indexOf(attr.name) < 0 && |
| !inner.hasAttr(attr.name, attr.value) |
| ) { |
| return; |
| } |
| |
| g.removeAttr(attr.name); |
| }); |
| } |
| } |
| |
| // collapse groups without attributes |
| if (!g.hasAttr() && !g.content.some(function(item) { return item.isElem(animationElems) })) { |
| item.spliceContent(i, 1, g.content); |
| } |
| } |
| }); |
| } |
| }; |