From d7221761fb52459a7feaeaec77d1e09890ac6b95 Mon Sep 17 00:00:00 2001 From: Alex Kocharin Date: Sat, 27 Dec 2014 09:12:00 +0300 Subject: [PATCH] Render image labels as text --- lib/renderer.js | 20 +++++- lib/rules_inline/links.js | 23 +++++-- test/fixtures/commonmark/bad.txt | 108 ------------------------------ test/fixtures/commonmark/good.txt | 73 ++++++++++++++++++++ 4 files changed, 108 insertions(+), 116 deletions(-) diff --git a/lib/renderer.js b/lib/renderer.js index 33d689f..1db5e66 100644 --- a/lib/renderer.js +++ b/lib/renderer.js @@ -143,10 +143,10 @@ rules.link_close = function (/* tokens, idx, options, env */) { }; -rules.image = function (tokens, idx, options /*, env */) { +rules.image = function (tokens, idx, options, env, self) { var src = ' src="' + escapeHtml(tokens[idx].src) + '"'; var title = tokens[idx].title ? (' title="' + escapeHtml(replaceEntities(tokens[idx].title)) + '"') : ''; - var alt = ' alt="' + (tokens[idx].alt ? escapeHtml(replaceEntities(tokens[idx].alt)) : '') + '"'; + var alt = ' alt="' + self.renderInlineAsText(tokens[idx].tokens, options, env) + '"'; var suffix = options.xhtmlOut ? ' /' : ''; return ''; }; @@ -343,6 +343,22 @@ Renderer.prototype.renderInline = function (tokens, options, env) { }; +Renderer.prototype.renderInlineAsText = function (tokens, options, env) { + var result = '', + _rules = this.rules; + + for (var i = 0, len = tokens.length; i < len; i++) { + if (tokens[i].type === 'text') { + result += _rules.text(tokens, i, options, env, this); + } else if (tokens[i].type === 'image') { + result += this.renderInlineAsText(tokens[i].tokens, options, env); + } + } + + return result; +}; + + Renderer.prototype.render = function (tokens, options, env) { var i, len, result = '', diff --git a/lib/rules_inline/links.js b/lib/rules_inline/links.js index eef45b9..8823139 100644 --- a/lib/rules_inline/links.js +++ b/lib/rules_inline/links.js @@ -6,17 +6,19 @@ var parseLinkLabel = require('../helpers/parse_link_label'); var parseLinkDestination = require('../helpers/parse_link_destination'); var parseLinkTitle = require('../helpers/parse_link_title'); var normalizeReference = require('../helpers/normalize_reference'); +var StateInline = require('../rules_inline/state_inline'); module.exports = function links(state, silent) { - var labelStart, - labelEnd, - label, + var code, href, - title, + label, + labelEnd, + labelStart, pos, ref, - code, + title, + tokens, isImage = false, oldPos = state.pos, max = state.posMax, @@ -138,11 +140,20 @@ module.exports = function links(state, silent) { state.posMax = labelEnd; if (isImage) { + var newState = new StateInline( + state.src.slice(labelStart, labelEnd), + state.parser, + state.options, + state.env, + tokens = [] + ); + newState.parser.tokenize(newState); + state.push({ type: 'image', src: href, title: title, - alt: state.src.substr(labelStart, labelEnd - labelStart), + tokens: tokens, level: state.level }); } else { diff --git a/test/fixtures/commonmark/bad.txt b/test/fixtures/commonmark/bad.txt index 7497282..99fae07 100644 --- a/test/fixtures/commonmark/bad.txt +++ b/test/fixtures/commonmark/bad.txt @@ -74,111 +74,3 @@ error:

foobar

-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -src line: 6020 - -. -![foo *bar*] - -[foo *bar*]: train.jpg "train & tracks" -. -

foo bar

-. - -error: - -

foo *bar*

- - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -src line: 6028 - -. -![foo ![bar](/url)](/url2) -. -

foo bar

-. - -error: - -

foo ![bar](/url)

- - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -src line: 6034 - -. -![foo [bar](/url)](/url2) -. -

foo bar

-. - -error: - -

foo [bar](/url)

- - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -src line: 6047 - -. -![foo *bar*][] - -[foo *bar*]: train.jpg "train & tracks" -. -

foo bar

-. - -error: - -

foo *bar*

- - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -src line: 6055 - -. -![foo *bar*][foobar] - -[FOOBAR]: train.jpg "train & tracks" -. -

foo bar

-. - -error: - -

foo *bar*

- - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -src line: 6115 - -. -![*foo* bar][] - -[*foo* bar]: /url "title" -. -

foo bar

-. - -error: - -

*foo* bar

- - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -src line: 6155 - -. -![*foo* bar] - -[*foo* bar]: /url "title" -. -

foo bar

-. - -error: - -

*foo* bar

- - diff --git a/test/fixtures/commonmark/good.txt b/test/fixtures/commonmark/good.txt index a08a8fe..cff2f5c 100644 --- a/test/fixtures/commonmark/good.txt +++ b/test/fixtures/commonmark/good.txt @@ -5293,6 +5293,57 @@ src line: 6014

foo

. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +src line: 6020 + +. +![foo *bar*] + +[foo *bar*]: train.jpg "train & tracks" +. +

foo bar

+. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +src line: 6028 + +. +![foo ![bar](/url)](/url2) +. +

foo bar

+. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +src line: 6034 + +. +![foo [bar](/url)](/url2) +. +

foo bar

+. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +src line: 6047 + +. +![foo *bar*][] + +[foo *bar*]: train.jpg "train & tracks" +. +

foo bar

+. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +src line: 6055 + +. +![foo *bar*][foobar] + +[FOOBAR]: train.jpg "train & tracks" +. +

foo bar

+. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ src line: 6063 @@ -5362,6 +5413,17 @@ src line: 6107

foo

. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +src line: 6115 + +. +![*foo* bar][] + +[*foo* bar]: /url "title" +. +

foo bar

+. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ src line: 6125 @@ -5396,6 +5458,17 @@ src line: 6147

foo

. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +src line: 6155 + +. +![*foo* bar] + +[*foo* bar]: /url "title" +. +

foo bar

+. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ src line: 6165