diff --git a/lib/index.js b/lib/index.js index 6b301e8..0766e4d 100644 --- a/lib/index.js +++ b/lib/index.js @@ -57,7 +57,7 @@ function normalizeLink(url) { if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) { try { parsed.hostname = punycode.toASCII(parsed.hostname); - } catch (er) { /**/ } + } catch(er) {} } } @@ -77,7 +77,7 @@ function normalizeLinkText(url) { if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) { try { parsed.hostname = punycode.toUnicode(parsed.hostname); - } catch (er) { /**/ } + } catch(er) {} } } @@ -483,7 +483,7 @@ MarkdownIt.prototype.use = function (plugin /*, params, ... */) { * AST). * * `env` is used to pass data between "distributed" rules and return additional - * metadata like reference info, needed for the renderer. It also can be used to + * metadata like reference info, needed for for renderer. It also can be used to * inject data in specific cases. Usually, you will be ok to pass `{}`, * and then pass updated object to renderer. **/ @@ -513,6 +513,12 @@ MarkdownIt.prototype.render = function (src, env) { return this.renderer.render(this.parse(src, env), this.options, env); }; +MarkdownIt.prototype.renderTokens = function (src, env) { + env = env || {}; + + return this.renderer.renderTokens(this.parse(src, env), this.options, env); +}; + /** internal * MarkdownIt.parseInline(src, env) -> Array diff --git a/lib/renderer.js b/lib/renderer.js index b1000d5..a9ac904 100644 --- a/lib/renderer.js +++ b/lib/renderer.js @@ -28,7 +28,7 @@ default_rules.code_block = function (tokens, idx /*, options, env */) { }; -default_rules.fence = function (tokens, idx, options, env, slf) { +default_rules.fence = function (tokens, idx, options, env, self) { var token = tokens[idx], info = token.info ? unescapeAll(token.info).trim() : '', langName = '', @@ -45,13 +45,13 @@ default_rules.fence = function (tokens, idx, options, env, slf) { highlighted = escapeHtml(token.content); } - return '
'
+ return ''
+ highlighted
+ '
\n';
};
-default_rules.image = function (tokens, idx, options, env, slf) {
+default_rules.image = function (tokens, idx, options, env, self) {
var token = tokens[idx];
// "alt" attr MUST be set, even if empty. Because it's mandatory and
@@ -60,9 +60,9 @@ default_rules.image = function (tokens, idx, options, env, slf) {
// Replace content with actual value
token.attrs[token.attrIndex('alt')][1] =
- slf.renderInlineAsText(token.children, options, env);
+ self.renderInlineAsText(token.children, options, env);
- return slf.renderToken(tokens, idx, options);
+ return self.renderToken(tokens, idx, options);
};
@@ -228,6 +228,16 @@ Renderer.prototype.renderInline = function (tokens, options, env) {
var type,
result = '',
rules = this.rules;
+
+ return tokens.map(function(token, i) {
+ type = token.type;
+
+ if (typeof rules[type] !== 'undefined') {
+ return rules[type](tokens, i, options, env, this);
+ } else {
+ return this.renderToken(tokens, i, options);
+ }
+ }, this);
for (var i = 0, len = tokens.length; i < len; i++) {
type = tokens[i].type;
@@ -279,23 +289,30 @@ Renderer.prototype.renderInlineAsText = function (tokens, options, env) {
* this method directly.
**/
Renderer.prototype.render = function (tokens, options, env) {
+ return this.renderTokens(tokens, options, env).reduce(function(collector, token) {
+ return collector + token;
+ }, '');
+};
+
+Renderer.prototype.renderTokens = function (tokens, options, env) {
var i, len, type,
result = '',
rules = this.rules;
- for (i = 0, len = tokens.length; i < len; i++) {
- type = tokens[i].type;
+ return tokens.reduce(function(collector, token, i) {
+ type = token.type;
if (type === 'inline') {
- result += this.renderInline(tokens[i].children, options, env);
+ console.log('inline: ', this.renderInline(token.children, options, env));
+ return collector.concat(this.renderInline(token.children, options, env));
} else if (typeof rules[type] !== 'undefined') {
- result += rules[tokens[i].type](tokens, i, options, env, this);
+ collector.push(rules[type](tokens, i, options, env, this));
+ return collector;
} else {
- result += this.renderToken(tokens, i, options, env);
+ collector.push(this.renderToken(tokens, i, options, env));
+ return collector;
}
- }
-
- return result;
+ }.bind(this), []);
};
module.exports = Renderer;