switch from showdown to marked

add better yaml support for metadata
This commit is contained in:
Matthew Scragg 2014-09-05 22:41:22 -05:00
parent e4afc0fb0d
commit 036434dd7a
5 changed files with 97 additions and 24 deletions

View file

@ -1,17 +1,71 @@
/* © 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
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)];
}
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
});
// Init highlight JS
hljs.initHighlightingOnLoad();
// Markdown Renderer
MDR = {
doc: null,
callback: WMD.convert,
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.doc = this.callback(md);
var html = this.doc.html;
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) {
@ -22,16 +76,29 @@ MDR = {
return id;
});
}
html = this.hook(html);
//html = this.hook(html);
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) {}
}
},
hook: function(html) {
if (!this.doc.metadata) {
if (!this.doc.meta) {
return html;
}
try {
var template = Handlebars.compile(html);
return template(this.doc.metadata);
return template(this.doc.meta);
} catch(e) {
return html;
}