summaryrefslogtreecommitdiff
path: root/packages/astro-prism/Prism.astro
diff options
context:
space:
mode:
Diffstat (limited to 'packages/astro-prism/Prism.astro')
-rw-r--r--packages/astro-prism/Prism.astro49
1 files changed, 49 insertions, 0 deletions
diff --git a/packages/astro-prism/Prism.astro b/packages/astro-prism/Prism.astro
new file mode 100644
index 000000000..2af5f64ab
--- /dev/null
+++ b/packages/astro-prism/Prism.astro
@@ -0,0 +1,49 @@
+---
+import Prism from 'prismjs';
+import { addAstro } from './internal.mjs';
+import loadLanguages from 'prismjs/components/index.js';
+
+export interface Props {
+ class?: string;
+ lang?: string;
+ code: string;
+}
+
+const { class: className, lang, code } = Astro.props as Props;
+
+let classLanguage = `language-${lang}`;
+
+const languageMap = new Map([['ts', 'typescript']]);
+
+if (lang == null) {
+ console.warn('Prism.astro: No language provided.');
+}
+
+const ensureLoaded = (lang) => {
+ if (lang && !Prism.languages[lang]) {
+ loadLanguages([lang]);
+ }
+};
+
+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]) {
+ console.warn(`Unable to load the language: ${lang}`);
+}
+
+const grammar = Prism.languages[lang];
+let html = code;
+if (grammar) {
+ html = Prism.highlight(code, grammar, lang);
+}
+---
+
+<pre class={[className, classLanguage].join(' ')}><code class={classLanguage}><Fragment set:html={html} /></code></pre>