feat: auto load MkCode syntax highlight

This commit is contained in:
sup39 2024-01-23 07:18:42 +09:00
parent 1fca25a8b2
commit 7d48607d74
Signed by: sup39
GPG key ID: 111C00916C1641E5
2 changed files with 45 additions and 4 deletions

View file

@ -7,8 +7,8 @@
</template>
<script lang="ts" setup>
import { computed } from "vue";
import Prism from "prismjs";
import { computed, ref } from "vue";
import Prism, { loadLanguage } from "@/scripts/prism";
import "prismjs/themes/prism-okaidia.css";
const props = defineProps<{
@ -17,9 +17,24 @@ const props = defineProps<{
inline?: boolean;
}>();
const prismLang = computed(() =>
Prism.languages[props.lang] ? props.lang : "plaintext",
// fallback to "plaintext" if language not loaded
const prismLang = ref(
props.lang != null && props.lang in Prism.languages
? props.lang
: "plaintext",
);
// try to load language asynchronously
if (props.lang != null && !(props.lang in Prism.languages)) {
const { lang } = props;
loadLanguage(props.lang).then(
// onLoaded
() => (prismLang.value = lang),
// onError
() => {},
);
}
const html = computed(() =>
Prism.highlight(
props.code,

View file

@ -0,0 +1,26 @@
import Prism from "prismjs";
import "prismjs/plugins/autoloader/prism-autoloader.js";
// TODO
Prism.plugins.autoloader.languages_path =
"https://cdn.jsdelivr.net/npm/prismjs@1.29.0/components/";
const nonExistingLanguagesCache = new Set<string>();
export const loadLanguage = (lang: string) =>
new Promise<void>((resolve, reject) => {
// cached non-existing language
if (nonExistingLanguagesCache.has(lang)) return reject();
// load language with autoloader
Prism.plugins.autoloader.loadLanguages(
lang,
// loaded
() => resolve(),
// failed
() => {
nonExistingLanguagesCache.add(lang);
reject();
},
);
});
export default Prism;