mirror of https://gitee.com/antv-l7/antv-l7
62 lines
1.2 KiB
JavaScript
62 lines
1.2 KiB
JavaScript
'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'
|
|
}
|