Files
2023-08-01 13:49:46 +02:00

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;
});
}