mbed-creole-to-md
Version:
Transforms mbed-flavoured Creole (from stdin) into Markdown
67 lines (49 loc) • 1.46 kB
JavaScript
;
const toMarkdown = require('to-markdown');
const childProcess = require('child_process');
const fs = require('fs');
const Path = require('path');
const promisify = require('es6-promisify');
const co = require('co');
process.stdin.resume();
process.stdin.setEncoding('utf8');
let article = '';
let stdinTimeout = setTimeout(() => {
console.warn('No data received on stdin... Shutting down.');
process.exit(1);
}, 2000);
function asyncExec() {
let args = [].slice.call(arguments);
return new Promise((res, rej) => {
args.push((err, stdout, stderr) => {
if (err) return rej(err);
return res({
stdout: stdout,
stderr: stderr
});
});
childProcess.exec.apply(childProcess, args);
});
}
var go = co.wrap(function*() {
clearTimeout(stdinTimeout);
let file = Path.join(__dirname, (+new Date()) + '.tmp.creole');
yield promisify(fs.writeFile.bind(fs))(file, article, 'utf-8');
let pyOutput = yield asyncExec(`python creole2html.py "${file}"`, {
cwd: __dirname
});
if (pyOutput.stderr) {
throw 'creole2html failed: ' + pyOutput.stderr;
}
yield promisify(fs.unlink.bind(fs))(file);
return toMarkdown(pyOutput.stdout);
});
process.stdin.on('data', chunk => {
article += chunk;
});
process.stdin.on('end', function() {
go()
.then(output => console.log(output))
.catch(err => console.error('Creole2md.js failed: ' + err));
});