summaryrefslogtreecommitdiff
path: root/packages/astro-prism/src/highlighter.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/astro-prism/src/highlighter.ts')
-rw-r--r--packages/astro-prism/src/highlighter.ts42
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 };
+}