spaCy/website/plugins/remarkWrapSections.mjs
Marcus Blättermann 343c0054f2
Simplify unnessary adding of id to sections
The slugified section ids are useless, because they can not be referenced anywhere anyway. The navigation only works if the section has the same id as the heading.
2022-12-20 17:51:56 +01:00

67 lines
2.3 KiB
JavaScript

/**
* Check the tree for headlines of a certain depth and wrap the headline and
* all content up to the next headline in a section.
* Based on: https://github.com/luhmann/tufte-markdown
*/
import { visit } from 'unist-util-visit'
const defaultOptions = {
element: 'section',
prefix: 'section-',
depth: 2,
slugify: true,
}
function remarkWrapSection(userOptions = {}) {
const options = Object.assign({}, defaultOptions, userOptions)
function transformer(tree) {
const headingsMap = []
const newTree = []
visit(tree, 'import', (node) => {
// For compatibility with MDX / gatsby-mdx, make sure import nodes
// are not moved further down into children (which means they're not
// recognized and interpreted anymore). Add them to the very start
// of the tree.
newTree.push(node)
})
visit(tree, 'heading', (node, index) => {
if (node.depth === options.depth) {
const data = node.data || (node.data = {})
const hProps = data.hProperties || (data.hProperties = {})
headingsMap.push({ index, id: hProps.id })
}
})
if (headingsMap.length) {
for (let index = 0; index <= headingsMap.length; index++) {
const sectionStartIndex = index === 0 ? 0 : headingsMap[index - 1].index
const sectionEndIndex =
index === headingsMap.length ? tree.children.length : headingsMap[index].index
const children = tree.children
.slice(sectionStartIndex, sectionEndIndex)
.filter((node) => node.type !== 'import')
if (children.length) {
const headingId = index === 0 ? 0 : headingsMap[index - 1].id
const sectionId = headingId ? options.prefix + headingId : undefined
const wrapperNode = {
type: 'section',
children,
data: { hName: options.element, hProperties: { id: sectionId } },
}
newTree.push(wrapperNode)
}
}
tree.children = newTree
}
return tree
}
return transformer
}
export default remarkWrapSection