57 lines
1.4 KiB
JavaScript
57 lines
1.4 KiB
JavaScript
'use strict';
|
|
|
|
const { spawnSync } = require('node:child_process');
|
|
|
|
function mermaid(config) {
|
|
return function(args, content) {
|
|
let options = Object.assign({}, config);
|
|
let caption = '';
|
|
args.forEach(arg => {
|
|
const arr = arg.split(':');
|
|
if (arr.length == 1) {
|
|
caption = arr;
|
|
} else {
|
|
const [ key, val ] = arr;
|
|
options[key] = val;
|
|
}
|
|
});
|
|
|
|
const mmdcArgs = [
|
|
'-t', options.theme,
|
|
'-w', options.width,
|
|
'-H', options.height,
|
|
'-e', options.format,
|
|
'-b', options.background,
|
|
'-s', options.scale,
|
|
'-i', '-',
|
|
'-o', '-'
|
|
];
|
|
|
|
const result = spawnSync(options.mmdcPath, mmdcArgs, {
|
|
cwd: process.cwd(),
|
|
env: process.env,
|
|
input: content,
|
|
encoding: 'utf8',
|
|
timeout: options.timeout
|
|
});
|
|
|
|
if (result.status === 0) {
|
|
if (result.stderr) {
|
|
console.warn(result.stderr);
|
|
}
|
|
const path = 'data:image/svg+xml;base64,' + Buffer.from(result.stdout).toString('base64');
|
|
|
|
if (caption != '') {
|
|
return `<figure><img src="${ path }" alt="${ caption }"/><figcaption>${ caption }</figcaption></figure>`
|
|
} else {
|
|
return `<p><image src="${ path }"/></p>`;
|
|
}
|
|
}
|
|
if (result.error) {
|
|
throw result.error;
|
|
}
|
|
throw Error('mmdc exited with code ' + result.status + (result.stderr ? ': ' + result.stderr : '.'));
|
|
};
|
|
}
|
|
|
|
module.exports = mermaid; |