Skip to content

Commit 11dad16

Browse files
committed
Fix line endings in tight list items
1 parent 15a21f1 commit 11dad16

File tree

2 files changed

+35
-37
lines changed

2 files changed

+35
-37
lines changed

lib/handlers/list-item.js

+32-36
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,29 @@
33
module.exports = listItem
44

55
var u = require('unist-builder')
6-
var wrap = require('../wrap')
76
var all = require('../all')
87

98
function listItem(h, node, parent) {
10-
var children = node.children
11-
var head = children[0]
12-
var raw = all(h, node)
9+
var result = all(h, node)
10+
var head = result[0]
1311
var loose = parent ? listLoose(parent) : listItemLoose(node)
1412
var props = {}
15-
var result
16-
var container
17-
var index
13+
var wrapped = []
1814
var length
15+
var index
1916
var child
2017

21-
// Tight lists should not render `paragraph` nodes as `p` elements.
22-
if (loose) {
23-
result = raw
24-
} else {
25-
result = []
26-
length = raw.length
27-
index = -1
28-
29-
while (++index < length) {
30-
child = raw[index]
31-
32-
if (child.tagName === 'p') {
33-
result = result.concat(child.children)
34-
} else {
35-
result.push(child)
36-
}
37-
}
38-
}
39-
4018
if (typeof node.checked === 'boolean') {
41-
if (loose && (!head || head.type !== 'paragraph')) {
42-
result.unshift(h(null, 'p', []))
19+
if (!head || head.tagName !== 'p') {
20+
head = h(null, 'p', [])
21+
result.unshift(head)
4322
}
4423

45-
container = loose ? result[0].children : result
46-
47-
if (container.length !== 0) {
48-
container.unshift(u('text', ' '))
24+
if (head.children.length !== 0) {
25+
head.children.unshift(u('text', ' '))
4926
}
5027

51-
container.unshift(
28+
head.children.unshift(
5229
h(null, 'input', {
5330
type: 'checkbox',
5431
checked: node.checked,
@@ -61,11 +38,30 @@ function listItem(h, node, parent) {
6138
props.className = ['task-list-item']
6239
}
6340

64-
if (loose && result.length !== 0) {
65-
result = wrap(result, true)
41+
length = result.length
42+
index = -1
43+
44+
while (++index < length) {
45+
child = result[index]
46+
47+
// Add eols before nodes, except if this is a loose, first paragraph.
48+
if (loose || index !== 0 || child.tagName !== 'p') {
49+
wrapped.push(u('text', '\n'))
50+
}
51+
52+
if (child.tagName === 'p' && !loose) {
53+
wrapped = wrapped.concat(child.children)
54+
} else {
55+
wrapped.push(child)
56+
}
57+
}
58+
59+
// Add a final eol.
60+
if (length && (loose || child.tagName !== 'p')) {
61+
wrapped.push(u('text', '\n'))
6662
}
6763

68-
return h(node, 'li', props, result)
64+
return h(node, 'li', props, wrapped)
6965
}
7066

7167
function listLoose(node) {

test/list-item.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,13 @@ test('ListItem', function (t) {
162162
])
163163
),
164164
u('element', {tagName: 'li', properties: {}}, [
165+
u('text', '\n'),
165166
u('element', {tagName: 'ul', properties: {}}, [
166167
u('text', '\n'),
167168
u('element', {tagName: 'li', properties: {}}, [u('text', 'Alpha')]),
168169
u('text', '\n')
169-
])
170+
]),
171+
u('text', '\n')
170172
]),
171173
'should support lists in `listItem`s'
172174
)

0 commit comments

Comments
 (0)