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", "name": "realms",
"version": "0.1.1", "version": "0.1.1",
"dependencies": { "dependencies": {
"components-bootstrap": "3.0.0", "components-bootstrap": "~3.2.0",
"jquery": "1.9.1", "jquery": "~1.11.1",
"components-underscore": "~1.5.1", "components-underscore": "~1.5.2",
"requirejs": "~2.1.8", "requirejs": "~2.1.14",
"highlightjs": "~7.3.0", "highlightjs": "~8.0.0",
"handlebars": "~1.0.0", "handlebars": "~2.0.0",
"components-font-awesome": "~3.2.1", "components-font-awesome": "~4.1.0",
"showdown": "~0.3.1", "showdown": "~0.3.1",
"keymaster": "madrobby/keymaster", "keymaster": "madrobby/keymaster",
"ace": "~1.1.0", "ace": "~1.1.6",
"parsleyjs": "~2.0.3" "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 = Assets(app)
assets.register('main.js', assets.register('main.js',
'vendor/jquery/jquery.js', #'vendor/requirejs/require.js',
'vendor/components-underscore/underscore.js', 'vendor/jquery/dist/jquery.js',
'vendor/components-bootstrap/js/bootstrap.js', 'vendor/components-bootstrap/js/bootstrap.js',
'vendor/handlebars/handlebars.js', 'vendor/handlebars/handlebars.js',
'vendor/showdown/src/showdown.js', 'vendor/js-yaml/dist/js-yaml.js',
'vendor/showdown/src/extensions/table.js', 'vendor/marked/lib/marked.js',
'js/wmd.js', #'js/wmd.js',
'js/html-sanitizer-minified.js', # don't minify? 'js/html-sanitizer-minified.js', # don't minify?
'vendor/highlightjs/highlight.pack.js', 'vendor/highlightjs/highlight.pack.js',
'vendor/parsleyjs/dist/parsley.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 // Init highlight JS
hljs.initHighlightingOnLoad(); hljs.initHighlightingOnLoad();
// Markdown Renderer // Markdown Renderer
MDR = { var MDR = {
doc: null, meta: null,
callback: WMD.convert, md: null,
sanitize: true, // Override sanitize: true, // Override
parse: function(md){ return marked(md); },
convert: function(md, sanitize){ convert: function(md, sanitize){
if (this.sanitize !== null) { if (this.sanitize !== null) {
sanitize = this.sanitize; sanitize = this.sanitize;
} }
this.doc = this.callback(md); this.md = md;
var html = this.doc.html; this.processMeta();
try {
var html = this.parse(this.md);
} catch(e) {
return this.md;
}
if (sanitize) { if (sanitize) {
// Causes some problems with inline styles // Causes some problems with inline styles
html = html_sanitize(html, function(url) { html = html_sanitize(html, function(url) {
@ -22,16 +76,29 @@ MDR = {
return id; return id;
}); });
} }
html = this.hook(html); //html = this.hook(html);
return 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) { hook: function(html) {
if (!this.doc.metadata) { if (!this.doc.meta) {
return html; return html;
} }
try { try {
var template = Handlebars.compile(html); var template = Handlebars.compile(html);
return template(this.doc.metadata); return template(this.doc.meta);
} catch(e) { } catch(e) {
return html; return html;
} }

View file

@ -90,7 +90,11 @@
</div> </div>
{% for bundle in g.assets['js'] %} {% for bundle in g.assets['js'] %}
{% assets bundle %} {% assets bundle %}
{% 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> <script type="text/javascript" src="{{ ASSET_URL }}"></script>
{% endif %}
{% endassets %} {% endassets %}
{% endfor %} {% endfor %}
{% block js %}{% endblock %} {% block js %}{% endblock %}

View file

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