blob: eee0fdfba02c0ad044249832424dd96129c94bd5 [file] [log] [blame]
'use strict'
var visit = require('unist-util-visit')
module.exports = compact
// Make an mdast tree compact by merging adjacent text nodes.
function compact(tree, commonmark) {
visit(tree, visitor)
return tree
function visitor(child, index, parent) {
var siblings = parent ? parent.children : []
var prev = index && siblings[index - 1]
if (
prev &&
child.type === prev.type &&
mergeable(prev, commonmark) &&
mergeable(child, commonmark)
) {
if (child.value) {
prev.value += child.value
}
if (child.children) {
prev.children = prev.children.concat(child.children)
}
siblings.splice(index, 1)
if (prev.position && child.position) {
prev.position.end = child.position.end
}
return index
}
}
}
function mergeable(node, commonmark) {
var start
var end
if (node.type === 'text') {
if (!node.position) {
return true
}
start = node.position.start
end = node.position.end
// Only merge nodes which occupy the same size as their `value`.
return (
start.line !== end.line || end.column - start.column === node.value.length
)
}
return commonmark && node.type === 'blockquote'
}