// markdown-it plugin for generating line numbers. // It depends on preWrapper plugin. import type MarkdownIt from 'markdown-it' export const lineNumberPlugin = (md: MarkdownIt, enable = false) => { const fence = md.renderer.rules.fence! md.renderer.rules.fence = (...args) => { const rawCode = fence(...args) const [tokens, idx] = args const info = tokens[idx].info if ( (!enable && !/:line-numbers($| )/.test(info)) || (enable && /:no-line-numbers($| )/.test(info)) ) { return rawCode } const code = rawCode.slice( rawCode.indexOf(''), rawCode.indexOf('') ) const lines = code.split('\n') const lineNumbersCode = [ ...Array( lines.length - (lines[lines.length - 1] === `` ? 1 : 0) ) ] .map((_, index) => `${index + 1}
`) .join('') const lineNumbersWrapperCode = `` const finalCode = rawCode .replace(/<\/div>$/, `${lineNumbersWrapperCode}`) .replace(/"(language-[^"]*?)"/, '"$1 line-numbers-mode"') return finalCode } }