2014-10-03 21:49:18 +03:00
|
|
|
// Init highlight JS
|
|
|
|
hljs.initHighlightingOnLoad();
|
2014-09-06 06:41:22 +03:00
|
|
|
|
|
|
|
function splitInput(str) {
|
2014-10-02 01:14:54 +03:00
|
|
|
if (str.slice(0, 3) !== '---') return;
|
2014-09-06 06:41:22 +03:00
|
|
|
|
2014-10-02 01:14:54 +03:00
|
|
|
var matcher = /\n(\.{3}|\-{3})/g;
|
|
|
|
var metaEnd = matcher.exec(str);
|
2014-09-06 06:41:22 +03:00
|
|
|
|
2014-10-02 01:14:54 +03:00
|
|
|
return metaEnd && [str.slice(0, metaEnd.index), str.slice(matcher.lastIndex)];
|
2014-09-06 06:41:22 +03:00
|
|
|
}
|
|
|
|
|
2014-10-03 21:49:18 +03:00
|
|
|
/* © 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
|
2014-09-06 06:41:22 +03:00
|
|
|
var metaMarked = function(src, opt, callback) {
|
2014-10-02 01:14:54 +03:00
|
|
|
if (Object.prototype.toString.call(src) !== '[object String]')
|
|
|
|
throw new TypeError('First parameter must be a string.');
|
2014-09-06 06:41:22 +03:00
|
|
|
|
2014-10-02 01:14:54 +03:00
|
|
|
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
|
2014-09-06 06:41:22 +03:00
|
|
|
}
|
2014-10-02 01:14:54 +03:00
|
|
|
}
|
2014-09-06 06:41:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
marked.setOptions({
|
2014-10-02 01:14:54 +03:00
|
|
|
renderer: new marked.Renderer(),
|
|
|
|
gfm: true,
|
|
|
|
tables: true,
|
|
|
|
breaks: false,
|
|
|
|
pedantic: false,
|
|
|
|
sanitize: false,
|
|
|
|
smartLists: true,
|
|
|
|
smartypants: false
|
2014-09-06 06:41:22 +03:00
|
|
|
});
|
|
|
|
|
2013-10-10 18:38:30 +03:00
|
|
|
// Markdown Renderer
|
2014-09-06 06:41:22 +03:00
|
|
|
var MDR = {
|
2014-10-02 01:14:54 +03:00
|
|
|
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;
|
|
|
|
}
|
2014-09-10 18:53:22 +03:00
|
|
|
|
2014-10-02 01:14:54 +03:00
|
|
|
if (sanitize) {
|
|
|
|
// Causes some problems with inline styles
|
|
|
|
html = html_sanitize(html, function(url) {
|
|
|
|
try {
|
|
|
|
var prot = decodeURIComponent(url.toString());
|
|
|
|
} catch (e) {
|
|
|
|
return '';
|
2013-10-10 18:38:30 +03:00
|
|
|
}
|
2014-10-02 01:14:54 +03:00
|
|
|
if (prot.indexOf('javascript:') === 0) {
|
|
|
|
return '';
|
2014-09-06 06:41:22 +03:00
|
|
|
}
|
2014-10-02 01:14:54 +03:00
|
|
|
return prot;
|
|
|
|
}, function(id){
|
|
|
|
return id;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
this.hook();
|
|
|
|
return html;
|
|
|
|
},
|
2014-09-06 06:41:22 +03:00
|
|
|
|
2014-10-02 01:14:54 +03:00
|
|
|
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);
|
2014-10-03 21:49:18 +03:00
|
|
|
} catch(e) {
|
|
|
|
console.log(e);
|
|
|
|
}
|
2013-10-10 18:38:30 +03:00
|
|
|
}
|
2014-10-02 01:14:54 +03:00
|
|
|
},
|
|
|
|
|
|
|
|
hook: function() {
|
|
|
|
}
|
2014-10-03 21:49:18 +03:00
|
|
|
};
|