#!/usr/bin/env node
var fs = require('fs');
var marked = require('marked');
var renderer = new marked.Renderer();
var matchHtmlRegExp = /["'&<>]/;
function escapeHtml(string) {
var str = '' + string;
var match = matchHtmlRegExp.exec(str);
if (!match) {
return str;
}
var escape;
var html = '';
var index = 0;
var lastIndex = 0;
for (index = match.index; index < str.length; index++) {
switch (str.charCodeAt(index)) {
case 34: // "
escape = '"';
break;
case 38: // &
escape = '&';
break;
case 39: // '
escape = ''';
break;
case 60: // <
escape = '<';
break;
case 62: // >
escape = '>';
break;
default:
continue;
}
if (lastIndex !== index) {
html += str.substring(lastIndex, index);
}
lastIndex = index + 1;
html += escape;
}
return lastIndex !== index ?
html + str.substring(lastIndex, index) :
html;
}
marked.setOptions({
gfm: true,
});
// create internal links for ()[#]
renderer.link = function (href, title, text) {
title = title || text;
if (href === '#') {
var slugger = new marked.Slugger();
href = '#' + slugger.slug(text);
}
title = escapeHtml(title);
return '' + text + '';
}
// add link icon for each heading, just like github
renderer.heading = function (text, level, raw, slugger) {
var anchorId = renderer.options.headerPrefix + slugger.slug(raw);
return ''
+ '' + text
+ '\n';
};
var args = process.argv.slice(2);
if (args.length === 0) {
console.log('please provide input file');
process.exit(0);
}
var infile = args[0];
fs.open(infile, 'r', function (err, fd) {
if (err) {
if (err.code === 'ENOENT') {
console.error(infile + ' does not exist');
return;
}
throw err;
}
fs.readFile(infile, 'utf8', function (err, data) {
if (err) throw err;
console.log(marked(data, {
renderer: renderer
}));
});
});