diff options
Diffstat (limited to 'packages/astro-prism/src/highlighter.ts')
-rw-r--r-- | packages/astro-prism/src/highlighter.ts | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/packages/astro-prism/src/highlighter.ts b/packages/astro-prism/src/highlighter.ts new file mode 100644 index 000000000..3dffefae9 --- /dev/null +++ b/packages/astro-prism/src/highlighter.ts @@ -0,0 +1,42 @@ +import Prism from 'prismjs'; +import loadLanguages from 'prismjs/components/index.js'; +import { addAstro } from './plugin.js'; + +const languageMap = new Map([['ts', 'typescript']]); + +export function runHighlighterWithAstro(lang: string | undefined, code: string) { + let classLanguage = `language-${lang}`; + + if (!lang) { + lang = 'plaintext'; + } + + const ensureLoaded = (language: string) => { + if (language && !Prism.languages[language]) { + loadLanguages([language]); + } + }; + + if (languageMap.has(lang)) { + ensureLoaded(languageMap.get(lang)!); + } else if (lang === 'astro') { + ensureLoaded('typescript'); + addAstro(Prism); + } else { + ensureLoaded('markup-templating'); // Prism expects this to exist for a number of other langs + ensureLoaded(lang); + } + + if (lang && !Prism.languages[lang]) { + // eslint-disable-next-line no-console + console.warn(`Unable to load the language: ${lang}`); + } + + const grammar = Prism.languages[lang]; + let html = code; + if (grammar) { + html = Prism.highlight(code, grammar, lang); + } + + return { classLanguage, html }; +} |