Skip to content

Commit 3c18027

Browse files
committed
Fix to remove empty paragraphs, funky tables
* Refactor to improve bundle size * Fix to remove empty texts from tree * Fix to not add empty paragraphs * Fix content in tables but outside of rows, cells * Fix empty tables * Fix potential IDs leaking into prototypes
1 parent dce4ed0 commit 3c18027

37 files changed

+378
-367
lines changed

index.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
module.exports = toMdast
44

5+
var has = require('hast-util-has-property')
56
var minify = require('rehype-minify-whitespace')
67
var convert = require('unist-util-is/convert')
78
var visit = require('unist-util-visit')
89
var xtend = require('xtend')
910
var one = require('./lib/one')
1011
var handlers = require('./lib/handlers')
12+
var own = require('./lib/util/own')
1113

1214
var block = convert(['heading', 'paragraph', 'root'])
1315

@@ -22,7 +24,7 @@ function toMdast(tree, options) {
2224
h.wrapText = true
2325
h.qNesting = 0
2426

25-
h.handlers = xtend(handlers, settings.handlers || {})
27+
h.handlers = settings.handlers ? xtend(handlers, settings.handlers) : handlers
2628
h.augment = augment
2729

2830
h.document = settings.document
@@ -74,9 +76,9 @@ function toMdast(tree, options) {
7476
}
7577

7678
function onelement(node) {
77-
var id = node.properties.id
79+
var id = has(node, 'id') && String(node.properties.id).toUpperCase()
7880

79-
if (id && !(id in byId)) {
81+
if (id && !own.call(byId, id)) {
8082
byId[id] = node
8183
}
8284
}
@@ -115,5 +117,10 @@ function toMdast(tree, options) {
115117
node.value = node.value.replace(/[\t ]+$/, '')
116118
}
117119
}
120+
121+
if (!node.value) {
122+
parent.children.splice(index, 1)
123+
return index
124+
}
118125
}
119126
}

lib/all.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@ var one = require('./one')
66

77
function all(h, parent) {
88
var nodes = parent.children || []
9-
var length = nodes.length
109
var values = []
1110
var index = -1
1211
var result
1312

14-
while (++index < length) {
13+
while (++index < nodes.length) {
1514
result = one(h, nodes[index], parent)
1615

1716
if (result) {

lib/handlers/base.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module.exports = base
44

55
function base(h, node) {
66
if (!h.baseFound) {
7-
h.frozenBaseUrl = node.properties.href || null
7+
h.frozenBaseUrl = node.properties.href
88
h.baseFound = true
99
}
1010
}

lib/handlers/code.js

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,38 @@
22

33
module.exports = code
44

5-
var is = require('hast-util-is-element')
65
var has = require('hast-util-has-property')
6+
var convert = require('hast-util-is-element/convert')
77
var toText = require('hast-util-to-text')
88
var trim = require('trim-trailing-lines')
99
var wrapText = require('../util/wrap-text')
1010

1111
var prefix = 'language-'
1212

13+
var pre = convert('pre')
14+
var isCode = convert('code')
15+
1316
function code(h, node) {
1417
var children = node.children
15-
var length = children.length
1618
var index = -1
17-
var child
1819
var classList
19-
var className
2020
var lang
2121

22-
if (node.tagName === 'pre') {
23-
while (++index < length) {
24-
child = children[index]
25-
26-
if (is(child, 'code') && has(child, 'className')) {
27-
classList = child.properties.className
22+
if (pre(node)) {
23+
while (++index < children.length) {
24+
if (isCode(children[index]) && has(children[index], 'className')) {
25+
classList = children[index].properties.className
2826
break
2927
}
3028
}
3129
}
3230

3331
if (classList) {
34-
length = classList.length
3532
index = -1
3633

37-
while (++index < length) {
38-
className = classList[index]
39-
40-
if (className.slice(0, prefix.length) === prefix) {
41-
lang = className.slice(prefix.length)
34+
while (++index < classList.length) {
35+
if (classList[index].slice(0, prefix.length) === prefix) {
36+
lang = classList[index].slice(prefix.length)
4237
break
4338
}
4439
}

lib/handlers/delete.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
'use strict'
22

3-
module.exports = strikethrough
3+
module.exports = del
44

55
var all = require('../all')
66

7-
function strikethrough(h, node) {
7+
function del(h, node) {
88
return h(node, 'delete', all(h, node))
99
}

lib/handlers/dl.js

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,60 @@
11
'use strict'
22

3-
module.exports = dataList
3+
module.exports = dl
44

5-
var is = require('hast-util-is-element')
6-
var wrapListItems = require('../util/wrap-list-items')
5+
var convert = require('hast-util-is-element/convert')
76
var spread = require('../util/list-items-spread')
7+
var wrapListItems = require('../util/wrap-list-items')
88

9-
function dataList(h, node) {
9+
var div = convert('div')
10+
var dt = convert('dt')
11+
var dd = convert('dd')
12+
13+
function dl(h, node) {
1014
var children = node.children
11-
var length = children.length
1215
var index = -1
1316
var clean = []
1417
var groups = []
18+
var group = {titles: [], definitions: []}
1519
var content
16-
var breakpoint
17-
var title
1820
var child
19-
var group = {titles: [], definitions: []}
2021

2122
// Unwrap `<div>`s
22-
while (++index < length) {
23+
while (++index < children.length) {
2324
child = children[index]
24-
clean = clean.concat(is(child, 'div') ? child.children : child)
25+
clean = clean.concat(div(child) ? child.children : child)
2526
}
2627

27-
length = clean.length
2828
index = -1
2929

3030
// Group titles and definitions.
31-
while (++index < length) {
31+
while (++index < clean.length) {
3232
child = clean[index]
33-
title = is(child, 'dt')
3433

35-
if (title && breakpoint) {
36-
groups.push(group)
37-
group = {titles: [], definitions: []}
38-
}
34+
if (dt(child)) {
35+
if (dd(clean[index - 1])) {
36+
groups.push(group)
37+
group = {titles: [], definitions: []}
38+
}
3939

40-
group[title ? 'titles' : 'definitions'].push(child)
41-
breakpoint = is(child, 'dd')
40+
group.titles.push(child)
41+
} else {
42+
group.definitions.push(child)
43+
}
4244
}
4345

4446
groups.push(group)
4547

4648
// Create items.
47-
length = groups.length
4849
index = -1
4950
content = []
5051

51-
while (++index < length) {
52-
group = groups[index]
53-
group = handle(h, group.titles).concat(handle(h, group.definitions))
52+
while (++index < groups.length) {
53+
group = handle(h, groups[index].titles).concat(
54+
handle(h, groups[index].definitions)
55+
)
5456

55-
if (group.length > 0) {
57+
if (group.length) {
5658
content.push({
5759
type: 'listItem',
5860
spread: group.length > 1,
@@ -63,7 +65,7 @@ function dataList(h, node) {
6365
}
6466

6567
// Create a list if there are items.
66-
if (content.length > 0) {
68+
if (content.length) {
6769
return h(
6870
node,
6971
'list',
@@ -73,11 +75,11 @@ function dataList(h, node) {
7375
}
7476
}
7577

76-
function handle(h, category) {
77-
var nodes = wrapListItems(h, {children: category})
78+
function handle(h, children) {
79+
var nodes = wrapListItems(h, {children: children})
7880

79-
if (nodes.length === 0) {
80-
return []
81+
if (!nodes.length) {
82+
return nodes
8183
}
8284

8385
if (nodes.length === 1) {

lib/handlers/heading.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@ module.exports = heading
55
var all = require('../all')
66

77
function heading(h, node) {
8-
var rank = Number(node.tagName.charAt(1))
8+
/* istanbul ignore next - `else` shouldn’t happen, of course… */
9+
var depth = Number(node.tagName.charAt(1)) || 1
910
var wrap = h.wrapText
1011
var result
1112

12-
/* istanbul ignore next - `else` shouldn’t happen, of course… */
13-
rank = rank || 1
14-
1513
h.wrapText = false
16-
result = h(node, 'heading', {depth: rank}, all(h, node))
14+
result = h(node, 'heading', {depth: depth}, all(h, node))
1715
h.wrapText = wrap
1816

1917
return result

lib/handlers/image.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@ module.exports = image
55
var resolve = require('../util/resolve')
66

77
function image(h, node) {
8-
var props = {
8+
return h(node, 'image', {
99
url: resolve(h, node.properties.src),
1010
title: node.properties.title || null,
1111
alt: node.properties.alt || ''
12-
}
13-
14-
return h(node, 'image', props)
12+
})
1513
}

lib/handlers/index.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,27 @@ var wrapped = require('../util/wrap-children')
55
var base = require('./base')
66
var blockquote = require('./blockquote')
77
var br = require('./break')
8-
var cell = require('./table-cell')
98
var code = require('./code')
109
var comment = require('./comment')
11-
var dl = require('./dl')
1210
var del = require('./delete')
11+
var dl = require('./dl')
1312
var emphasis = require('./emphasis')
1413
var heading = require('./heading')
1514
var iframe = require('./iframe')
1615
var image = require('./image')
1716
var inlineCode = require('./inline-code')
1817
var input = require('./input')
1918
var link = require('./link')
20-
var list = require('./list')
2119
var listItem = require('./list-item')
20+
var list = require('./list')
2221
var media = require('./media')
2322
var paragraph = require('./paragraph')
2423
var quote = require('./q')
2524
var root = require('./root')
26-
var row = require('./table-row')
2725
var select = require('./select')
2826
var strong = require('./strong')
27+
var cell = require('./table-cell')
28+
var row = require('./table-row')
2929
var table = require('./table')
3030
var text = require('./text')
3131
var textarea = require('./textarea')

0 commit comments

Comments
 (0)