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.
225 lines
6.5 KiB
225 lines
6.5 KiB
'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; |
|
|
|
} |
|
|
|
};
|
|
|