Browse Source

Fix incorrect level recalculation in text_collapse

close #466
pull/575/head
Alex Kocharin 6 years ago
parent
commit
a1c93811f8
  1. 4
      lib/rules_block/state_block.js
  2. 4
      lib/rules_inline/state_inline.js
  3. 14
      lib/rules_inline/text_collapse.js

4
lib/rules_block/state_block.js

@ -111,9 +111,9 @@ StateBlock.prototype.push = function (type, tag, nesting) {
var token = new Token(type, tag, nesting); var token = new Token(type, tag, nesting);
token.block = true; token.block = true;
if (nesting < 0) { this.level--; } if (nesting < 0) this.level--; // closing tag
token.level = this.level; token.level = this.level;
if (nesting > 0) { this.level++; } if (nesting > 0) this.level++; // opening tag
this.tokens.push(token); this.tokens.push(token);
return token; return token;

4
lib/rules_inline/state_inline.js

@ -50,9 +50,9 @@ StateInline.prototype.push = function (type, tag, nesting) {
var token = new Token(type, tag, nesting); var token = new Token(type, tag, nesting);
if (nesting < 0) { this.level--; } if (nesting < 0) this.level--; // closing tag
token.level = this.level; token.level = this.level;
if (nesting > 0) { this.level++; } if (nesting > 0) this.level++; // opening tag
this.pendingLevel = this.level; this.pendingLevel = this.level;
this.tokens.push(token); this.tokens.push(token);

14
lib/rules_inline/text_collapse.js

@ -1,4 +1,10 @@
// Merge adjacent text nodes into one, and re-calculate all token levels // Clean up tokens after emphasis and strikethrough postprocessing:
// merge adjacent text nodes into one and re-calculate all token levels
//
// This is necessary because initially emphasis delimiter markers (*, _, ~)
// are treated as their own separate text tokens. Then emphasis rule either
// leaves them as text (needed to merge with adjacent text) or turns them
// into opening/closing tags (which messes up levels inside).
// //
'use strict'; 'use strict';
@ -10,9 +16,11 @@ module.exports = function text_collapse(state) {
max = state.tokens.length; max = state.tokens.length;
for (curr = last = 0; curr < max; curr++) { for (curr = last = 0; curr < max; curr++) {
// re-calculate levels // re-calculate levels after emphasis/strikethrough turns some text nodes
level += tokens[curr].nesting; // into opening/closing tags
if (tokens[curr].nesting < 0) level--; // closing tag
tokens[curr].level = level; tokens[curr].level = level;
if (tokens[curr].nesting > 0) level++; // opening tag
if (tokens[curr].type === 'text' && if (tokens[curr].type === 'text' &&
curr + 1 < max && curr + 1 < max &&

Loading…
Cancel
Save