// 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 } } }; var markdownit = window.markdownit({ html: true, linkify: true, typographer: true, highlight: function (str, lang) { if (lang && hljs.getLanguage(lang)) { try { return hljs.highlight(lang, str).value; } catch (__) { } } return ''; // use external default escaping } }).use(markdownItAnchor, { level: 1, // slugify: string => string, permalink: false, // renderPermalink: (slug, opts, state, permalink) => {}, permalinkClass: 'header-anchor', permalinkSymbol: '¶', permalinkBefore: false }); // Markdown Renderer var MDR = { meta: null, md: null, sanitize: true, // Override parse: function(md){ return markdownit.render(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() { } }; // Add some custom classes to table tags markdownit.renderer.rules.table_open = function (tokens, idx, options, env, self) { tokens[idx].attrPush(['class', 'table table-bordered']); return self.renderToken(tokens, idx, options); };