markdown-to-html
Version:
Converts markdown text to HTML. A readable stream plus utilities and web demo.
66 lines (56 loc) • 1.92 kB
JavaScript
;
/*
* GET /markdown/:filename.
*/
var jade = require('jade');
var path = require('path');
var Markdown = require('markdown-to-html').Markdown;
var mdOpts = {
// flavor: 'gfm',
highlight: true,
context: 'cwjohan/markdown-to-html'
};
// var viewsDir = path.join(path.dirname(__dirname), 'views');
var viewsDir = path.join(__dirname, 'views');
console.log('>>>dirname="' + __dirname + '"');
console.log('>>>viewsdir="' + viewsDir + '"');
// Class RenderMarkdown.
function RenderMarkdown() {
this.options = {}; // Default value only.
this.routeMe = function(req, res) {
var md = new Markdown();
var debug = req.param('debug', false);
md.debug = debug;
md.bufmax = 2048;
var fileName = path.join(viewsDir, req.params.filename);
if (debug) console.error('>>>renderMarkdown: fileName="' + fileName + '"');
res.write(jade.renderFile(
path.join(viewsDir, 'mdheader.jade'),
{title: this.options.title, subtitle: 'Markdown', pretty: true}));
md.once('end', function() {
res.write(jade.renderFile(path.join(viewsDir, 'mdtrailer.jade'), {pretty: true}));
res.end();
});
md.render(fileName, mdOpts, function(err) {
if (debug) console.error('>>>renderMarkdown: err=' + err);
if (err) { res.write('>>>' + err); res.end(); return; }
else md.pipe(res);
});
};
}
var singleton = new RenderMarkdown();
singleton.routeMe = singleton.routeMe.bind(singleton);
// Simulated http request.
var req = {
params: {
filename: 'test.md',
debug: true
},
param: function(key, dflt) { return this.params[key] || dflt; }
};
// Simulated http response stream.
var fs = require('fs');
var res = fs.createWriteStream('test.html');
// Invoke routeMe.
singleton.options = { title: 'Markdown-to-HTML Demo App' };
singleton.routeMe(req, res);