| 'use strict'; |
| |
| exports.type = 'perItem'; |
| |
| exports.active = true; |
| |
| exports.description = 'removes hidden elements (zero sized, with absent attributes)'; |
| |
| exports.params = { |
| isHidden: true, |
| 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+(?:\.|(?!\.)))([eE][-+]?\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) { |
| // Removes hidden elements |
| // https://www.w3schools.com/cssref/pr_class_visibility.asp |
| if ( |
| params.isHidden && |
| item.hasAttr('visibility', 'hidden') |
| ) return false; |
| |
| // 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" |
| // |
| // <circle r="0"> |
| 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" |
| // |
| // <ellipse rx="0"> |
| 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" |
| // |
| // <ellipse ry="0"> |
| 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" |
| // |
| // <rect width="0"> |
| 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" |
| // |
| // <rect height="0"> |
| 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)" |
| // |
| // <pattern width="0"> |
| 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)" |
| // |
| // <pattern height="0"> |
| 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" |
| // |
| // <image width="0"> |
| 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" |
| // |
| // <image height="0"> |
| 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 |
| // |
| // <path d=""/> |
| 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 |
| // |
| // <polyline points=""> |
| if ( |
| params.polylineEmptyPoints && |
| item.isElem('polyline') && |
| !item.hasAttr('points') |
| ) return false; |
| |
| // Polygon with empty points |
| // |
| // http://www.w3.org/TR/SVG/shapes.html#PolygonElementPointsAttribute |
| // |
| // <polygon points=""> |
| if ( |
| params.polygonEmptyPoints && |
| item.isElem('polygon') && |
| !item.hasAttr('points') |
| ) return false; |
| |
| } |
| |
| }; |