'use strict'; function SVGMeasure() { } SVGMeasure.prototype.getSVGNode = function (svgString) { // remove newlines svgString = svgString.replace(/\r?\n|\r/g, ""); var svgNodeMatches = svgString.match(//); if (svgNodeMatches) { // extract svg node return svgNodeMatches[0]; } return ""; }; SVGMeasure.prototype.getHeightAndWidth = function (svgString) { var svgNode = this.getSVGNode(svgString); var widthMatches = svgNode.match(/width="([0-9]+(\.[0-9]+)?)(em|ex|px|in|cm|mm|pt|pc|%)?"/); var heightMatches = svgNode.match(/height="([0-9]+(\.[0-9]+)?)(em|ex|px|in|cm|mm|pt|pc|%)?"/); if (widthMatches || heightMatches) { return { width: widthMatches ? +widthMatches[1] : undefined, height: heightMatches ? +heightMatches[1] : undefined }; } }; SVGMeasure.prototype.getViewboxHeightAndWidth = function (svgString) { var svgNode = this.getSVGNode(svgString); var viewboxMatches = svgNode.match(/viewBox="([+-]?(\d*\.)?\d+(,|\s+|,\s+)[+-]?(\d*\.)?\d+(,|\s+|,\s+)[+-]?(\d*\.)?\d+(,|\s+|,\s+)[+-]?(\d*\.)?\d+)"/); if (viewboxMatches) { var viewboxStr = viewboxMatches[1]; var allVieboxEntries = viewboxStr.split(" "); var viewboxEntries = []; // weeding out empty strings for (var i = 0; i < allVieboxEntries.length; i++) { if (allVieboxEntries[i]) { viewboxEntries.push(allVieboxEntries[i]); } } if (viewboxEntries.length === 4) { return { width: +viewboxEntries[2], height: +viewboxEntries[3] }; } throw new Error("Unexpected svg viewbox format, should have 4 entries but found: '" + viewboxStr + "'"); } }; SVGMeasure.prototype.measureSVG = function (svgString) { var heightAndWidth = this.getHeightAndWidth(svgString); var viewboxHeightAndWidth = this.getViewboxHeightAndWidth(svgString); return heightAndWidth || viewboxHeightAndWidth || {}; }; SVGMeasure.prototype.writeDimensions = function (svgString, dimensions) { var svgNode = this.getSVGNode(svgString); if (svgNode) { var nodeDimensions = this.getHeightAndWidth(svgString); if (dimensions.width) { var newWidth = 'width="' + dimensions.width + '"'; if (nodeDimensions && nodeDimensions.width) { // replace existing width svgNode = svgNode.replace(/width="[0-9]+(\.[0-9]+)?(em|ex|px|in|cm|mm|pt|pc|%)?"/, newWidth); } else { // insert new width svgNode = svgNode.replace(">", " " + newWidth + ">"); } } if (dimensions.height) { var newHeight = 'height="' + dimensions.height + '"'; if (nodeDimensions && nodeDimensions.height) { // replace existing height svgNode = svgNode.replace(/height="[0-9]+(\.[0-9]+)?(em|ex|px|in|cm|mm|pt|pc|%)?"/, newHeight); } else { // insert new height svgNode = svgNode.replace(">", " " + newHeight + ">"); } } // insert updated svg node return svgString.replace(//, svgNode); } return svgString; }; module.exports = SVGMeasure;