33 lines
867 B
JavaScript
33 lines
867 B
JavaScript
|
import { visit } from 'unist-util-visit'
|
||
|
|
||
|
export default function remarkCodeTitles() {
|
||
|
return (tree) =>
|
||
|
visit(tree, 'code', (node, index, parent) => {
|
||
|
const nodeLang = node.lang || ''
|
||
|
let language = ''
|
||
|
let title = ''
|
||
|
|
||
|
if (nodeLang.includes(':')) {
|
||
|
language = nodeLang.slice(0, nodeLang.search(':'))
|
||
|
title = nodeLang.slice(nodeLang.search(':') + 1, nodeLang.length)
|
||
|
}
|
||
|
|
||
|
if (!title) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
const className = 'remark-code-title'
|
||
|
|
||
|
const titleNode = {
|
||
|
type: 'mdxJsxFlowElement',
|
||
|
name: 'div',
|
||
|
attributes: [{ type: 'mdxJsxAttribute', name: 'className', value: className }],
|
||
|
children: [{ type: 'text', value: title }],
|
||
|
data: { _xdmExplicitJsx: true },
|
||
|
}
|
||
|
|
||
|
parent.children.splice(index, 0, titleNode)
|
||
|
node.lang = language
|
||
|
})
|
||
|
}
|