UNPKG

mbed-creole-to-md

Version:

Transforms mbed-flavoured Creole (from stdin) into Markdown

67 lines (49 loc) 1.46 kB
#!/usr/bin/env node 'use strict'; 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)); });