diff --git a/src/Tokenizer.js b/src/Tokenizer.js index 42064621b4..ad7ac4010b 100644 --- a/src/Tokenizer.js +++ b/src/Tokenizer.js @@ -315,25 +315,19 @@ export class Tokenizer { for (i = 0; i < l; i++) { this.lexer.state.top = false; list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []); - const spacers = list.items[i].tokens.filter(t => t.type === 'space'); - const hasMultipleLineBreaks = spacers.every(t => { - const chars = t.raw.split(''); - let lineBreaks = 0; - for (const char of chars) { - if (char === '\n') { - lineBreaks += 1; - } - if (lineBreaks > 1) { - return true; - } - } - return false; - }); + if (!list.loose) { + // Check if list should be loose + const spacers = list.items[i].tokens.filter(t => t.type === 'space'); + const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\n.*\n/.test(t.raw)); - if (!list.loose && spacers.length && hasMultipleLineBreaks) { - // Having a single line break doesn't mean a list is loose. A single line break is terminating the last list item - list.loose = true; + list.loose = hasMultipleLineBreaks; + } + } + + // Set all items to loose if list is loose + if (list.loose) { + for (i = 0; i < l; i++) { list.items[i].loose = true; } } diff --git a/test/specs/new/list_loose.html b/test/specs/new/list_loose.html new file mode 100644 index 0000000000..2ae6aebe6c --- /dev/null +++ b/test/specs/new/list_loose.html @@ -0,0 +1,9 @@ +
item 1
+item 2
+still item 2
+