Skip to content

Commit

Permalink
fix: loose list items are loose
Browse files Browse the repository at this point in the history
  • Loading branch information
UziTech committed Dec 1, 2022
1 parent bb3ad60 commit 5618e6c
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 18 deletions.
39 changes: 23 additions & 16 deletions src/Tokenizer.js
Expand Up @@ -315,25 +315,32 @@ 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;

if (!list.loose) {
// Check if list should be loose
const spacers = list.items[i].tokens.filter(t => t.type === 'space');
const hasMultipleLineBreaks = spacers.length && 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;
});
return false;
});

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;
}
}
Expand Down
44 changes: 42 additions & 2 deletions test/unit/Lexer-spec.js
Expand Up @@ -605,10 +605,49 @@ paragraph
loose: true,
items: [
jasmine.objectContaining({
raw: '- item 1\n\n'
raw: '- item 1\n\n',
loose: true
}),
jasmine.objectContaining({
raw: '- item 2'
raw: '- item 2',
loose: true
})
]
})
])
});
});

it('end loose', () => {
expectTokens({
md: `
- item 1
- item 2
item 2a
- item 3
`,
tokens: jasmine.arrayContaining([
jasmine.objectContaining({
type: 'space',
raw: '\n'
}),
jasmine.objectContaining({
type: 'list',
raw: '- item 1\n- item 2\n\n item 2a\n- item 3\n',
loose: true,
items: [
jasmine.objectContaining({
raw: '- item 1\n',
loose: true
}),
jasmine.objectContaining({
raw: '- item 2\n\n item 2a\n',
loose: true
}),
jasmine.objectContaining({
raw: '- item 3',
loose: true
})
]
})
Expand All @@ -634,6 +673,7 @@ paragraph
items: [
jasmine.objectContaining({
raw: '- item 1\n - item 2',
loose: false,
tokens: jasmine.arrayContaining([
jasmine.objectContaining({
raw: 'item 1\n'
Expand Down

0 comments on commit 5618e6c

Please sign in to comment.