#!/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 })); }); });