import toString from 'mdast-util-to-string' import visit from 'unist-util-visit' export default function attacher () { return transformer function transformer (tree, vfile) { const headings = [] visit(tree, 'heading', onHeading) vfile.data.toc = createTree(headings) function onHeading (node) { const heading = { depth: node.depth, label: toString(node) } if (node.data !== undefined && node.data.id != null) { heading.value = `#${node.data.id}` } headings.push(heading) } function createTree (headings) { const root = { depth: 0 } const parents = [] let previous = root headings.forEach((heading) => { if (heading.depth > previous.depth) { if (previous.children === undefined) { previous.children = [] } parents.push(previous) } else if (heading.depth < previous.depth) { while (parents[parents.length - 1].depth >= heading.depth) { parents.pop() } } parents[parents.length - 1].children.push(heading) previous = heading }) return root.children } } }