119 lines
3.3 KiB
JavaScript
119 lines
3.3 KiB
JavaScript
"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;
|
|
});
|
|
}
|