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.
|
|
'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); } } }); } };
|