| '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' |
| } |