myst-cli
Version:
Command line tools for MyST
71 lines (70 loc) • 2.88 kB
JavaScript
import fs from 'node:fs';
import path from 'node:path';
import which from 'which';
import { makeExecutable } from 'myst-cli-utils';
import { RuleId } from 'myst-common';
import { addWarningForFile } from './addWarningForFile.js';
function createInkscpapeLogger(session) {
const logger = {
debug(data) {
const line = data.trim();
session.log.debug(line);
},
error(data) {
const line = data.trim();
if (!line)
return;
// These are non-critical errors that don't need to be in the CLI log
if (line.includes('unsupported target') || line.includes('writable cache directories')) {
session.log.debug(line);
return;
}
session.log.error(data);
},
};
return logger;
}
export function isInkscapeAvailable() {
return !!which.sync('inkscape', { nothrow: true });
}
export async function convert(inputExtension, outputExtension, session, input, writeFolder) {
if (!fs.existsSync(input))
return null;
const { name, ext } = path.parse(input);
if (ext !== inputExtension)
return null;
const filename = `${name}${outputExtension}`;
const output = path.join(writeFolder, filename);
const inputFormatUpper = inputExtension.slice(1).toUpperCase();
const outputFormat = outputExtension.slice(1);
if (fs.existsSync(output)) {
session.log.debug(`Cached file found for converted ${inputFormatUpper}: ${input}`);
}
else {
const inkscapeCommand = `inkscape ${input} --export-area-drawing --export-type=${outputFormat} --export-filename=${output}`;
session.log.debug(`Executing: ${inkscapeCommand}`);
const exec = makeExecutable(inkscapeCommand, createInkscpapeLogger(session));
try {
await exec();
}
catch (err) {
addWarningForFile(session, input, `Could not convert from ${inputFormatUpper} to ${outputFormat.toUpperCase()} - ${err}`, 'error', { ruleId: RuleId.imageFormatConverts });
return null;
}
}
return filename;
}
// EPS conversion functions do not work from the inkscape cli:
// See: https://gitlab.com/inkscape/inkscape/-/issues/3524
// export async function convertEpsToPdf(session: ISession, input: string, writeFolder: string) {
// const output = await convert('.eps', '.pdf', session, input, writeFolder);
// return output;
// }
// export async function convertEpsToSvg(session: ISession, input: string, writeFolder: string) {
// const output = await convert('.eps', '.svg', session, input, writeFolder);
// return output;
// }
// export async function convertEpsToPng(session: ISession, input: string, writeFolder: string) {
// const output = await convert('.eps', '.png', session, input, writeFolder);
// return output;
// }