'use strict'; exports.type = 'perItem'; exports.active = true; exports.description = 'removes hidden elements (zero sized, with absent attributes)'; exports.params = { displayNone: true, opacity0: true, circleR0: true, ellipseRX0: true, ellipseRY0: true, rectWidth0: true, rectHeight0: true, patternWidth0: true, patternHeight0: true, imageWidth0: true, imageHeight0: true, pathEmptyD: true, polylineEmptyPoints: true, polygonEmptyPoints: true }; var regValidPath = /M\s*(?:[+-]?(?:\d*\.\d+|\d+(?!\.\d)\.?)(?!\d)\s*,?\s*){2}\D*\d/i; /** * Remove hidden elements with disabled rendering: * - display="none" * - opacity="0" * - circle with zero radius * - ellipse with zero x-axis or y-axis radius * - rectangle with zero width or height * - pattern with zero width or height * - image with zero width or height * - path with empty data * - polyline with empty points * - polygon with empty points * * @param {Object} item current iteration item * @param {Object} params plugin params * @return {Boolean} if false, item will be filtered out * * @author Kir Belevich */ exports.fn = function(item, params) { if (item.elem) { // display="none" // // http://www.w3.org/TR/SVG/painting.html#DisplayProperty // "A value of display: none indicates that the given element // and its children shall not be rendered directly" if ( params.displayNone && item.hasAttr('display', 'none') ) return false; // opacity="0" // // http://www.w3.org/TR/SVG/masking.html#ObjectAndGroupOpacityProperties if ( params.opacity0 && item.hasAttr('opacity', '0') ) return false; // Circles with zero radius // // http://www.w3.org/TR/SVG/shapes.html#CircleElementRAttribute // "A value of zero disables rendering of the element" // // if ( params.circleR0 && item.isElem('circle') && item.isEmpty() && item.hasAttr('r', '0') ) return false; // Ellipse with zero x-axis radius // // http://www.w3.org/TR/SVG/shapes.html#EllipseElementRXAttribute // "A value of zero disables rendering of the element" // // if ( params.ellipseRX0 && item.isElem('ellipse') && item.isEmpty() && item.hasAttr('rx', '0') ) return false; // Ellipse with zero y-axis radius // // http://www.w3.org/TR/SVG/shapes.html#EllipseElementRYAttribute // "A value of zero disables rendering of the element" // // if ( params.ellipseRY0 && item.isElem('ellipse') && item.isEmpty() && item.hasAttr('ry', '0') ) return false; // Rectangle with zero width // // http://www.w3.org/TR/SVG/shapes.html#RectElementWidthAttribute // "A value of zero disables rendering of the element" // // if ( params.rectWidth0 && item.isElem('rect') && item.isEmpty() && item.hasAttr('width', '0') ) return false; // Rectangle with zero height // // http://www.w3.org/TR/SVG/shapes.html#RectElementHeightAttribute // "A value of zero disables rendering of the element" // // if ( params.rectHeight0 && params.rectWidth0 && item.isElem('rect') && item.isEmpty() && item.hasAttr('height', '0') ) return false; // Pattern with zero width // // http://www.w3.org/TR/SVG/pservers.html#PatternElementWidthAttribute // "A value of zero disables rendering of the element (i.e., no paint is applied)" // // if ( params.patternWidth0 && item.isElem('pattern') && item.hasAttr('width', '0') ) return false; // Pattern with zero height // // http://www.w3.org/TR/SVG/pservers.html#PatternElementHeightAttribute // "A value of zero disables rendering of the element (i.e., no paint is applied)" // // if ( params.patternHeight0 && item.isElem('pattern') && item.hasAttr('height', '0') ) return false; // Image with zero width // // http://www.w3.org/TR/SVG/struct.html#ImageElementWidthAttribute // "A value of zero disables rendering of the element" // // if ( params.imageWidth0 && item.isElem('image') && item.hasAttr('width', '0') ) return false; // Image with zero height // // http://www.w3.org/TR/SVG/struct.html#ImageElementHeightAttribute // "A value of zero disables rendering of the element" // // if ( params.imageHeight0 && item.isElem('image') && item.hasAttr('height', '0') ) return false; // Path with empty data // // http://www.w3.org/TR/SVG/paths.html#DAttribute // // if ( params.pathEmptyD && item.isElem('path') && (!item.hasAttr('d') || !regValidPath.test(item.attr('d').value)) ) return false; // Polyline with empty points // // http://www.w3.org/TR/SVG/shapes.html#PolylineElementPointsAttribute // // if ( params.polylineEmptyPoints && item.isElem('polyline') && !item.hasAttr('points') ) return false; // Polygon with empty points // // http://www.w3.org/TR/SVG/shapes.html#PolygonElementPointsAttribute // // if ( params.polygonEmptyPoints && item.isElem('polygon') && !item.hasAttr('points') ) return false; } };