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