diff --git a/lib/marked.js b/lib/marked.js index 11b2e110f1..c607ca2ce1 100644 --- a/lib/marked.js +++ b/lib/marked.js @@ -1083,37 +1083,75 @@ function marked(src, opt, callback) { callback = opt; opt = null; } + opt = merge({}, marked.defaults, opt || {}); - } - try { - var renderer = null; - if (opt) { - opt = merge({}, marked.defaults, opt); - renderer = opt.renderer || null; + + var highlight = opt.highlight + , tokens + , pending + , i = 0; + + try { + tokens = Lexer.lex(src, opt) + } catch (e) { + return callback(e); } - var out = Parser.parse(Lexer.lex(src, opt), opt, renderer); - if (callback) { - return callback(null, out); - } else { - return out; + + pending = tokens.length; + + var done = function() { + var out, err; + + try { + out = Parser.parse(tokens, opt, opt.renderer); + } catch (e) { + err = e; + } + + opt.highlight = highlight; + + return err + ? callback(err) + : callback(null, out); + }; + + if (!highlight || highlight.length < 3) { + return done(); } + + delete opt.highlight; + + if (!pending) return done(); + + for (; i < tokens.length; i++) { + (function(token) { + if (token.type !== 'code') { + return --pending || done(); + } + return highlight(token.text, token.lang, function(err, code) { + if (code == null || code === token.text) { + return --pending || done(); + } + token.text = code; + token.escaped = true; + --pending || done(); + }); + })(tokens[i]); + } + + return; + } + try { + if (opt) opt = merge({}, marked.defaults, opt); + return Parser.parse(Lexer.lex(src, opt), opt, opt && opt.renderer); } catch (e) { e.message += '\nPlease report this to https://github.com/chjj/marked.'; if ((opt || marked.defaults).silent) { - var msg = '

An error occured:

'
+      return '

An error occured:

'
         + escape(e.message + '', true)
         + '
'; - if (callback) { - callback(msg); - } else { - return msg; - } - } - if (callback) { - callback(e); - } else { - throw e; } + throw e; } } @@ -1159,13 +1197,13 @@ marked.inlineLexer = InlineLexer.output; marked.parse = marked; if (typeof exports === 'object') { - module.exports = marked; + module.exports = marked; } else if (typeof define === 'function' && define.amd) { - define(function() { return marked; }); + define(function() { return marked; }); } else { - this.marked = marked; + this.marked = marked; } }).call(function() { - return this || (typeof window !== 'undefined' ? window : global); + return this || (typeof window !== 'undefined' ? window : global); }());