32 lines
817 B
JavaScript
32 lines
817 B
JavaScript
|
const visit = require('unist-util-visit');
|
||
|
|
||
|
function headingToLevel(heading) {
|
||
|
const match = /^h(\d+)/.exec(heading);
|
||
|
return match ? match[1] : '0';
|
||
|
}
|
||
|
|
||
|
function parseMappings(mappings) {
|
||
|
const mapping = {};
|
||
|
Object.keys(mappings).forEach(key => mapping[headingToLevel(key)] = headingToLevel(mappings[key]));
|
||
|
return mapping;
|
||
|
}
|
||
|
|
||
|
module.exports = function mapHeadings(mappings) {
|
||
|
const headings = parseMappings(mappings || {});
|
||
|
return () => ast => {
|
||
|
const nodesToFix = [];
|
||
|
Object.keys(headings).forEach(heading => {
|
||
|
visit(ast, 'heading', node => {
|
||
|
if (node.depth === Number(heading)) {
|
||
|
nodesToFix.push(node);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// Update the depth of the matched nodes
|
||
|
nodesToFix.forEach(node => node.depth = headings[node.depth]);
|
||
|
|
||
|
return ast;
|
||
|
};
|
||
|
};
|