Skip to content

Commit 4e60c38

Browse files
committed
Add support for <dl>, <dt>, <dd>
Closes GH-32.
1 parent 84693b9 commit 4e60c38

File tree

5 files changed

+252
-1
lines changed

5 files changed

+252
-1
lines changed

lib/handlers/data-list.js

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
'use strict'
2+
3+
module.exports = dataList
4+
5+
var is = require('hast-util-is-element')
6+
var wrapListItems = require('../util/wrap-list-items')
7+
var loose = require('../util/list-loose')
8+
9+
function dataList(h, node) {
10+
var children = node.children
11+
var length = children.length
12+
var index = -1
13+
var clean = []
14+
var groups = []
15+
var content
16+
var breakpoint
17+
var title
18+
var child
19+
var group = {titles: [], definitions: []}
20+
21+
// Unwrap `<div>`s
22+
while (++index < length) {
23+
child = children[index]
24+
clean = clean.concat(is(child, 'div') ? child.children : child)
25+
}
26+
27+
length = clean.length
28+
index = -1
29+
30+
// Group titles and definitions.
31+
while (++index < length) {
32+
child = clean[index]
33+
title = is(child, 'dt')
34+
35+
if (title && breakpoint) {
36+
groups.push(group)
37+
group = {titles: [], definitions: []}
38+
}
39+
40+
group[title ? 'titles' : 'definitions'].push(child)
41+
breakpoint = is(child, 'dd')
42+
}
43+
44+
groups.push(group)
45+
46+
// Group titles and definitions.
47+
length = groups.length
48+
index = -1
49+
content = []
50+
51+
while (++index < length) {
52+
group = groups[index]
53+
group = handle(h, group.titles).concat(handle(h, group.definitions))
54+
55+
if (group.length !== 0) {
56+
content.push({
57+
type: 'listItem',
58+
loose: group.length > 1,
59+
checked: null,
60+
children: group
61+
})
62+
}
63+
}
64+
65+
// Create a list if there are items.
66+
if (content.length !== 0) {
67+
return h(
68+
node,
69+
'list',
70+
{ordered: false, start: null, loose: loose(content)},
71+
content
72+
)
73+
}
74+
}
75+
76+
function handle(h, category) {
77+
var nodes = wrapListItems(h, {children: category})
78+
79+
if (nodes.length === 0) {
80+
return []
81+
}
82+
83+
if (nodes.length === 1) {
84+
return nodes[0].children
85+
}
86+
87+
return [
88+
{
89+
type: 'list',
90+
ordered: false,
91+
start: null,
92+
loose: loose(nodes),
93+
children: nodes
94+
}
95+
]
96+
}

lib/handlers/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,11 @@ exports.section = wrapped
8181

8282
exports.base = require('./base')
8383
exports.ol = exports.ul = exports.dir = require('./list')
84+
exports.dl = require('./data-list')
8485
exports.table = require('./table')
8586
exports.tr = require('./table-row')
8687
exports.th = exports.td = require('./table-cell')
87-
exports.li = require('./list-item')
88+
exports.dt = exports.dd = exports.li = require('./list-item')
8889
exports.strong = exports.b = require('./strong')
8990
exports.em = exports.i = exports.u = exports.mark = require('./emphasis')
9091
exports.del = exports.s = exports.strike = require('./delete')

test/fixtures/dl/index.html

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<dl>
2+
<dt>Firefox</dt>
3+
<dd>A web browser.</dd>
4+
</dl>
5+
6+
<p>Alpha.</p>
7+
8+
<dl>
9+
<dt>Firefox</dt>
10+
<dt>Mozilla Firefox</dt>
11+
<dt>Fx</dt>
12+
<dd>A web browser.</dd>
13+
</dl>
14+
15+
<p>Bravo.</p>
16+
17+
<dl>
18+
<dt>Firefox</dt>
19+
<dd>A web browser.</dd>
20+
<dd>A Red Panda.</dd>
21+
</dl>
22+
23+
<p>Charlie.</p>
24+
25+
<dl>
26+
<dt>Firefox</dt>
27+
<dd>A web browser.</dd>
28+
<dd><p>A Red Panda.</p></dd>
29+
<dd><pre><code class="language-js">charlie();</code></pre></dd>
30+
</dl>
31+
32+
<p>Delta.</p>
33+
34+
<dl>
35+
<div>
36+
<dt>Firefox</dt>
37+
<dd>A web browser.</dd>
38+
<dd>A Red Panda.</dd>
39+
</div>
40+
<div>
41+
<dt>Chrome</dt>
42+
<dd>A web browser.</dd>
43+
<dd>A chemical element.</dd>
44+
</div>
45+
</dl>
46+
47+
<p>Echo.</p>
48+
49+
<dl></dl>
50+
51+
<p>Foxtrot.</p>
52+
53+
<dl>
54+
<dt>Chrome</dt>
55+
<dd><div><p>A web browser.</p></div></dd>
56+
<dt></dt>
57+
<dd></dd>
58+
</dl>
59+
60+
<p>Golf.</p>
61+
62+
<dl>
63+
<dt>Chrome</dt>
64+
<script>foo();</script>
65+
<dd>A web browser.</dd>
66+
</dl>
67+
68+
<p>Hotel.</p>
69+
70+
<dl>
71+
<dt><div><p>Firefox</p></div></dt>
72+
<dd><p><input type="text"></p></dd>
73+
</dl>
74+
75+
<p>India.</p>
76+
77+
<dl>
78+
<dt>Firefox.</dt>
79+
</dl>
80+
81+
<p>Juliett.</p>
82+
83+
<dl>
84+
<dd>A web browser.</dd>
85+
</dl>

test/fixtures/dl/index.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"fragment": true
3+
}

test/fixtures/dl/index.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
- Firefox
2+
3+
A web browser.
4+
5+
Alpha.
6+
7+
- - Firefox
8+
- Mozilla Firefox
9+
- Fx
10+
11+
A web browser.
12+
13+
Bravo.
14+
15+
- Firefox
16+
17+
- A web browser.
18+
- A Red Panda.
19+
20+
Charlie.
21+
22+
- Firefox
23+
24+
- A web browser.
25+
- A Red Panda.
26+
- ```js
27+
charlie();
28+
```
29+
30+
Delta.
31+
32+
- Firefox
33+
34+
- A web browser.
35+
- A Red Panda.
36+
37+
- Chrome
38+
39+
- A web browser.
40+
- A chemical element.
41+
42+
Echo.
43+
44+
Foxtrot.
45+
46+
- Chrome
47+
48+
A web browser.
49+
50+
Golf.
51+
52+
- Chrome
53+
54+
A web browser.
55+
56+
Hotel.
57+
58+
- Firefox
59+
60+
India.
61+
62+
- Firefox.
63+
64+
Juliett.
65+
66+
- A web browser.

0 commit comments

Comments
 (0)