From acc787feb247e639b9ae0a4a01efad0628583a9c Mon Sep 17 00:00:00 2001 From: Tony Brix Date: Fri, 16 Dec 2022 22:05:07 -0600 Subject: [PATCH] fix: fix paragraph continuation after block element --- src/Tokenizer.js | 42 +++++++++++++------ test/specs/new/paragraph-after-list-item.html | 24 +++++++++++ test/specs/new/paragraph-after-list-item.md | 10 +++++ 3 files changed, 64 insertions(+), 12 deletions(-) create mode 100644 test/specs/new/paragraph-after-list-item.html create mode 100644 test/specs/new/paragraph-after-list-item.md diff --git a/src/Tokenizer.js b/src/Tokenizer.js index d08d53ddc6..6889d7b145 100644 --- a/src/Tokenizer.js +++ b/src/Tokenizer.js @@ -233,25 +233,25 @@ export class Tokenizer { // Check if following lines should be included in List Item while (src) { rawLine = src.split('\n', 1)[0]; - line = rawLine; + nextLine = rawLine; // Re-align to follow commonmark nesting rules if (this.options.pedantic) { - line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' '); + nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' '); } // End list item if found code fences - if (fencesBeginRegex.test(line)) { + if (fencesBeginRegex.test(nextLine)) { break; } // End list item if found start of new heading - if (headingBeginRegex.test(line)) { + if (headingBeginRegex.test(nextLine)) { break; } // End list item if found start of new bullet - if (nextBulletRegex.test(line)) { + if (nextBulletRegex.test(nextLine)) { break; } @@ -260,20 +260,38 @@ export class Tokenizer { break; } - if (line.search(/[^ ]/) >= indent || !line.trim()) { // Dedent if possible - itemContents += '\n' + line.slice(indent); - } else if (!blankLine) { // Until blank line, item doesn't need indentation - itemContents += '\n' + line; - } else { // Otherwise, improper indentation ends this item - break; + if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible + itemContents += '\n' + nextLine.slice(indent); + } else { + // not enough indentation + if (blankLine) { + break; + } + + // paragraph continuation unless last line was a different block level element + if (line.search(/[^ ]/) >= 4) { // indented code block + break; + } + if (fencesBeginRegex.test(line)) { + break; + } + if (headingBeginRegex.test(line)) { + break; + } + if (hrRegex.test(line)) { + break; + } + + itemContents += '\n' + nextLine; } - if (!blankLine && !line.trim()) { // Check if current line is blank + if (!blankLine && !nextLine.trim()) { // Check if current line is blank blankLine = true; } raw += rawLine + '\n'; src = src.substring(rawLine.length + 1); + line = nextLine.slice(indent); } } diff --git a/test/specs/new/paragraph-after-list-item.html b/test/specs/new/paragraph-after-list-item.html new file mode 100644 index 0000000000..4a366dce30 --- /dev/null +++ b/test/specs/new/paragraph-after-list-item.html @@ -0,0 +1,24 @@ + +

paragraph

+ +

paragraph

+ +

paragraph

+ +

paragraph

diff --git a/test/specs/new/paragraph-after-list-item.md b/test/specs/new/paragraph-after-list-item.md new file mode 100644 index 0000000000..b962458b59 --- /dev/null +++ b/test/specs/new/paragraph-after-list-item.md @@ -0,0 +1,10 @@ +- *** +paragraph +- # heading +paragraph +- indented code +paragraph +- ``` + fenced code + ``` +paragraph