books-cli
Version:
由于本人经常性的写一些文档,然后现有的很多插件版本各方面存在问题,甚至还有一些作者已经放弃维护了,所以决定自己写一个综合性的插件用来满足个人需求。
62 lines (59 loc) • 2.27 kB
JavaScript
/**
* mermaid 绘图处理
*/
const childProcess = require('child_process');
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const url = require('url');
var os = require('os');
var mmdcPath = "";
var isWin = /^win/.test(process.platform);
if (isWin) {
var mmdcPath = path.join(__dirname, '../node_modules/.bin/mmdc.cmd');
} else {
var mmdcPath = path.join(__dirname, '../node_modules/.bin/mmdc');
}
function string2svgAsync(body) {
const filename = 'foo' + crypto.randomBytes(4).readUInt32LE(0) + 'bar';
const tmpFile = path.join(os.tmpdir(), filename);
return new Promise((resolve, reject) => {
fs.writeFile(tmpFile, body, function (err) {
if (err) {
return console.error(err);
}
childProcess.execFile(mmdcPath, ['-t', 'forest', '-i', tmpFile], function (err, stdout, stderr) {
if (err || stderr) {
console.error("err=");
console.error(err || stderr);
fs.unlinkSync(tmpFile);
reject(err || stderr);
} else {
const text = fs.readFileSync(tmpFile + '.svg', 'utf8');
fs.unlinkSync(tmpFile);
fs.unlinkSync(tmpFile + '.svg');
var trim = text.trim();
resolve("\n<!--mermaid-->\n<div style='text-align: center;'>\n" + trim + "\n</div>\n<!--endmermaid-->\n\n");
}
console.debug(stdout);
});
});
});
}
function processMermaidBlockList(page) {
var mermaidRegex = /^(\s*)```mermaid((.*[\r\n]+)+?)?(\s*)```$/im;
var match;
while ((match = mermaidRegex.exec(page.content))) {
var rawBlock = match[0];
var mermaidContent_1 = match[1];
var mermaidContent_2 = match[2];
var mermaidContent_4 = match[4];
const processed = mermaidContent_1 + "{% mermaid %}\n" + mermaidContent_2 + mermaidContent_4 + "{% endmermaid %}";
page.content = page.content.replace(rawBlock, processed);
}
return page;
}
module.exports = {
string2svgAsync,
processMermaidBlockList
};