"use strict"; /* global phantom: true */ var webpage = require("webpage"); var system = require("system"); var PREFIX = "data:image/svg+xml;base64,"; if (system.args.length !== 2) { console.error("Usage: converter.js resize"); phantom.exit(); } else { convert(system.args[1]); } function convert(resize) { var page = webpage.create(); var sourceBase64 = system.stdin.readLine(); page.open(PREFIX + sourceBase64, function (status) { if (status !== "success") { console.error("Unable to load the source file."); phantom.exit(); return; } try { if (resize !== "undefined") { resize = JSON.parse(resize); setSVGDimensions(page, resize.width, resize.height); } var dimensions = getSVGDimensions(page); if (!dimensions) { console.error("Width or height could not be determined from either the source file or the supplied " + "dimensions"); phantom.exit(); return; } setSVGDimensions(page, dimensions.width, dimensions.height); page.viewportSize = { width: dimensions.width, height: dimensions.height }; page.clipRect = { top: 0, left: 0, width: dimensions.width, height: dimensions.height }; } catch (e) { console.error("Unable to calculate or set dimensions."); console.error(e); phantom.exit(); return; } var result = "data:image/png;base64," + page.renderBase64("PNG"); system.stdout.write(result); phantom.exit(); }); } function setSVGDimensions(page, width, height) { if (width === undefined && height === undefined) { return; } return page.evaluate(function (width, height) { /* global document: true */ var el = document.documentElement; if (width !== undefined) { el.setAttribute("width", width + "px"); } else { el.removeAttribute("width"); } if (height !== undefined) { el.setAttribute("height", height + "px"); } else { el.removeAttribute("height"); } }, width, height); } function getSVGDimensions(page) { return page.evaluate(function () { /* global document: true */ var el = document.documentElement; var widthIsPercent = /%\s*$/.test(el.getAttribute("width") || ""); // Phantom doesn't have endsWith var heightIsPercent = /%\s*$/.test(el.getAttribute("height") || ""); var width = !widthIsPercent && parseFloat(el.getAttribute("width")); var height = !heightIsPercent && parseFloat(el.getAttribute("height")); if (width && height) { return { width: width, height: height }; } var viewBoxWidth = el.viewBox.animVal.width; var viewBoxHeight = el.viewBox.animVal.height; if (width && viewBoxHeight) { return { width: width, height: width * viewBoxHeight / viewBoxWidth }; } if (height && viewBoxWidth) { return { width: height * viewBoxWidth / viewBoxHeight, height: height }; } return null; }); }