// Init highlight JS hljs.initHighlightingOnLoad(); function splitInput(str) { if (str.slice(0, 3) !== '---') return; var matcher = /\n(\.{3}|\-{3})/g; var metaEnd = matcher.exec(str); return metaEnd && [str.slice(0, metaEnd.index), str.slice(matcher.lastIndex)]; } /* © 2013 j201 * https://github.com/j201/meta-marked */ // Splits the given string into a meta section and a markdown section if a meta section is present, else returns null var metaMarked = function(src, opt, callback) { if (Object.prototype.toString.call(src) !== '[object String]') throw new TypeError('First parameter must be a string.'); var mySplitInput = splitInput(src); if (mySplitInput) { var meta; try { meta = jsyaml.safeLoad(mySplitInput[0]); } catch(e) { meta = null; } return { meta: meta, md: mySplitInput[1] }; } else { return { meta: null, md: src } } }; marked.setOptions({ renderer: new marked.Renderer(), gfm: true, tables: true, breaks: false, pedantic: false, sanitize: false, smartLists: true, smartypants: false }); // Markdown Renderer var MDR = { meta: null, md: null, sanitize: true, // Override parse: function(md){ return marked(md); }, convert: function(md, sanitize) { if (this.sanitize !== null) { sanitize = this.sanitize; } this.md = md; this.processMeta(); try { var html = this.parse(this.md); } catch(e) { return this.md; } if (sanitize) { // Causes some problems with inline styles html = html_sanitize(html, function(url) { try { var prot = decodeURIComponent(url.toString()); } catch (e) { return ''; } if (prot.indexOf('javascript:') === 0) { return ''; } return prot; }, function(id){ return id; }); } this.hook(); return html; }, processMeta: function() { var doc = metaMarked(this.md); this.md = doc.md; this.meta = doc.meta; if (this.meta) { try { var template = Handlebars.compile(this.md); this.md = template(this.meta); } catch(e) { console.log(e); } } }, hook: function() { } };