From a1c93811f8d2ef891540474be0fd198aaa4b0082 Mon Sep 17 00:00:00 2001 From: Alex Kocharin Date: Fri, 12 Jul 2019 17:25:57 +0300 Subject: [PATCH] Fix incorrect level recalculation in text_collapse close #466 --- lib/rules_block/state_block.js | 4 ++-- lib/rules_inline/state_inline.js | 4 ++-- lib/rules_inline/text_collapse.js | 14 +++++++++++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/rules_block/state_block.js b/lib/rules_block/state_block.js index 1b21483..e42cb4b 100644 --- a/lib/rules_block/state_block.js +++ b/lib/rules_block/state_block.js @@ -111,9 +111,9 @@ StateBlock.prototype.push = function (type, tag, nesting) { var token = new Token(type, tag, nesting); token.block = true; - if (nesting < 0) { this.level--; } + if (nesting < 0) this.level--; // closing tag token.level = this.level; - if (nesting > 0) { this.level++; } + if (nesting > 0) this.level++; // opening tag this.tokens.push(token); return token; diff --git a/lib/rules_inline/state_inline.js b/lib/rules_inline/state_inline.js index 2847496..acf0ddc 100644 --- a/lib/rules_inline/state_inline.js +++ b/lib/rules_inline/state_inline.js @@ -50,9 +50,9 @@ StateInline.prototype.push = function (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; - if (nesting > 0) { this.level++; } + if (nesting > 0) this.level++; // opening tag this.pendingLevel = this.level; this.tokens.push(token); diff --git a/lib/rules_inline/text_collapse.js b/lib/rules_inline/text_collapse.js index 3104c0c..390b0fe 100644 --- a/lib/rules_inline/text_collapse.js +++ b/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'; @@ -10,9 +16,11 @@ module.exports = function text_collapse(state) { max = state.tokens.length; for (curr = last = 0; curr < max; curr++) { - // re-calculate levels - level += tokens[curr].nesting; + // re-calculate levels after emphasis/strikethrough turns some text nodes + // into opening/closing tags + if (tokens[curr].nesting < 0) level--; // closing tag tokens[curr].level = level; + if (tokens[curr].nesting > 0) level++; // opening tag if (tokens[curr].type === 'text' && curr + 1 < max &&