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

@ -2,16 +2,18 @@
"name": "realms",
"version": "0.1.1",
"dependencies": {
"components-bootstrap": "3.0.0",
"jquery": "1.9.1",
"components-underscore": "~1.5.1",
"requirejs": "~2.1.8",
"highlightjs": "~7.3.0",
"handlebars": "~1.0.0",
"components-font-awesome": "~3.2.1",
"components-bootstrap": "~3.2.0",
"jquery": "~1.11.1",
"components-underscore": "~1.5.2",
"requirejs": "~2.1.14",
"highlightjs": "~8.0.0",
"handlebars": "~2.0.0",
"components-font-awesome": "~4.1.0",
"showdown": "~0.3.1",
"keymaster": "madrobby/keymaster",
"ace": "~1.1.0",
"parsleyjs": "~2.0.3"
"ace": "~1.1.6",
"parsleyjs": "~2.0.3",
"marked": "~0.3.2",
"js-yaml": "~3.2.1"
}
}

View file

@ -184,13 +184,13 @@ cache = Cache(app)
assets = Assets(app)
assets.register('main.js',
'vendor/jquery/jquery.js',
'vendor/components-underscore/underscore.js',
#'vendor/requirejs/require.js',
'vendor/jquery/dist/jquery.js',
'vendor/components-bootstrap/js/bootstrap.js',
'vendor/handlebars/handlebars.js',
'vendor/showdown/src/showdown.js',
'vendor/showdown/src/extensions/table.js',
'js/wmd.js',
'vendor/js-yaml/dist/js-yaml.js',
'vendor/marked/lib/marked.js',
#'js/wmd.js',
'js/html-sanitizer-minified.js', # don't minify?
'vendor/highlightjs/highlight.pack.js',
'vendor/parsleyjs/dist/parsley.js',

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;
}

View file

@ -90,7 +90,11 @@
</div>
{% for bundle in g.assets['js'] %}
{% assets bundle %}
<script type="text/javascript" src="{{ ASSET_URL }}"></script>
{% if bundle == 'editor.js' %}
<script type="text/javascript" data-ace-base="src" charset="utf-8" src="{{ ASSET_URL }}"></script>
{% else %}
<script type="text/javascript" src="{{ ASSET_URL }}"></script>
{% endif %}
{% endassets %}
{% endfor %}
{% block js %}{% endblock %}

View file

@ -51,7 +51,7 @@
});
revs.reverse();
revs = revs.join("..");
location.href = "{{ config.BASE_URL }}/_compare/{{ name }}/" + revs;
location.href = "{{ config.RELATIVE_PATH }}/_compare/{{ name }}/" + revs;
});
});
</script>