import { getCodeParser, getHighlightLinesRange, highlightCodeLines, metaWhitespace, metaWordHighlight, notationDiff, notationErrorLevel, notationFocus, notationHighlight, notationWordHighlight, } from '../parser/index.js'; import { resolveLanguage } from '../utils/index.js'; export const highlightPlugin = (md, { highlightLines = true, notationDiff: enabledDiff, notationErrorLevel: enabledErrorLevel, notationFocus: enabledFocus, notationHighlight: enabledHighlight, notationWordHighlight: enabledWordHighlight, whitespace: whitespacePosition = false, } = {}) => { const rawFence = md.renderer.rules.fence; md.renderer.rules.fence = (...args) => { const [tokens, idx, { langPrefix }] = args; const token = tokens[idx]; // get token info const info = token.info ? md.utils.unescapeAll(token.info).trim() : ''; // resolve language from token info const language = resolveLanguage(info); const languageClass = `${langPrefix}${language.name}`; const code = rawFence(...args) // remove the default `language-${ext}` class .replace(//, ''); const parser = getCodeParser(code); if (highlightLines) { highlightCodeLines(parser, getHighlightLinesRange(info)); } if (enabledDiff) { notationDiff(parser); } if (enabledErrorLevel) { notationErrorLevel(parser); } if (enabledFocus) { notationFocus(parser); } if (enabledHighlight) { notationHighlight(parser); } if (enabledWordHighlight) { notationWordHighlight(parser); metaWordHighlight(parser, info); } metaWhitespace(parser, info, whitespacePosition); parser.pre.classList.push(languageClass); return parser.stringify(); }; };