Skip to content

Commit df4eb0e

Browse files
authored
fix: loose list items are loose (#2672)
1 parent bd9a114 commit df4eb0e

File tree

4 files changed

+67
-19
lines changed

4 files changed

+67
-19
lines changed

src/Tokenizer.js

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -315,25 +315,19 @@ export class Tokenizer {
315315
for (i = 0; i < l; i++) {
316316
this.lexer.state.top = false;
317317
list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);
318-
const spacers = list.items[i].tokens.filter(t => t.type === 'space');
319-
const hasMultipleLineBreaks = spacers.every(t => {
320-
const chars = t.raw.split('');
321-
let lineBreaks = 0;
322-
for (const char of chars) {
323-
if (char === '\n') {
324-
lineBreaks += 1;
325-
}
326-
if (lineBreaks > 1) {
327-
return true;
328-
}
329-
}
330318

331-
return false;
332-
});
319+
if (!list.loose) {
320+
// Check if list should be loose
321+
const spacers = list.items[i].tokens.filter(t => t.type === 'space');
322+
const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\n.*\n/.test(t.raw));
333323

334-
if (!list.loose && spacers.length && hasMultipleLineBreaks) {
335-
// Having a single line break doesn't mean a list is loose. A single line break is terminating the last list item
336-
list.loose = true;
324+
list.loose = hasMultipleLineBreaks;
325+
}
326+
}
327+
328+
// Set all items to loose if list is loose
329+
if (list.loose) {
330+
for (i = 0; i < l; i++) {
337331
list.items[i].loose = true;
338332
}
339333
}

test/specs/new/list_loose.html

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<ul>
2+
<li>
3+
<p>item 1</p>
4+
</li>
5+
<li>
6+
<p>item 2</p>
7+
<p>still item 2</p>
8+
</li>
9+
</ul>

test/specs/new/list_loose.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
- item 1
2+
-
3+
item 2
4+
5+
still item 2

test/unit/Lexer-spec.js

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -605,10 +605,49 @@ paragraph
605605
loose: true,
606606
items: [
607607
jasmine.objectContaining({
608-
raw: '- item 1\n\n'
608+
raw: '- item 1\n\n',
609+
loose: true
609610
}),
610611
jasmine.objectContaining({
611-
raw: '- item 2'
612+
raw: '- item 2',
613+
loose: true
614+
})
615+
]
616+
})
617+
])
618+
});
619+
});
620+
621+
it('end loose', () => {
622+
expectTokens({
623+
md: `
624+
- item 1
625+
- item 2
626+
627+
item 2a
628+
- item 3
629+
`,
630+
tokens: jasmine.arrayContaining([
631+
jasmine.objectContaining({
632+
type: 'space',
633+
raw: '\n'
634+
}),
635+
jasmine.objectContaining({
636+
type: 'list',
637+
raw: '- item 1\n- item 2\n\n item 2a\n- item 3\n',
638+
loose: true,
639+
items: [
640+
jasmine.objectContaining({
641+
raw: '- item 1\n',
642+
loose: true
643+
}),
644+
jasmine.objectContaining({
645+
raw: '- item 2\n\n item 2a\n',
646+
loose: true
647+
}),
648+
jasmine.objectContaining({
649+
raw: '- item 3',
650+
loose: true
612651
})
613652
]
614653
})
@@ -634,6 +673,7 @@ paragraph
634673
items: [
635674
jasmine.objectContaining({
636675
raw: '- item 1\n - item 2',
676+
loose: false,
637677
tokens: jasmine.arrayContaining([
638678
jasmine.objectContaining({
639679
raw: 'item 1\n'

0 commit comments

Comments
 (0)