-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
code
<template>
<markdown-worker-poll :worker-count="1" :parser-options="parserOptions" @ready="onPoolReady">
<markdown-renderer :markdown="markdown" :dynamic="true" :style="rendererStyle" :code-renderer="codeRenderer" />
</markdown-worker-poll>
</template>
<script lang="ts" setup>
import 'highlight.js/styles/github-dark.css';
import type { MarkdownComponent, MarkdownWorkerPollProps } from '@markdown-next/vue';
import { MarkdownRenderer, MarkdownWorkerPoll } from '@markdown-next/vue';
import hljs from 'highlight.js';
import { h, onMounted, onUnmounted, ref, shallowRef, watch } from 'vue';
import { isDev } from '@/utils/systeminfo';
defineOptions({
name: 'RenderMarkdown',
});
const props = defineProps<{
text?: string;
}>();
const markdown = shallowRef('');
const pool = ref<typeof MarkdownWorkerPoll | null>(null);
const statsInterval = ref<NodeJS.Timeout | null>(null);
const parserOptions: MarkdownWorkerPollProps = {
extendedGrammar: ['gfm'],
};
const rendererStyle = {
background: 'transparent',
color: 'var(--td-text-color-secondary)',
fontFamily: 'var(--td-font-family-default)',
fontSize: '14px',
};
watch(
() => props.text,
(val) => {
markdown.value = val ?? '';
},
{ immediate: true },
);
onMounted(() => setup());
onUnmounted(() => dispose());
const setup = () => {
if (!isDev) return;
statsInterval.value = setInterval(() => {
if (pool.value) {
const stats = pool.value.getStats();
console.debug('Markdown Worker Pool Stats:', stats);
}
}, 100);
};
const dispose = () => {
if (isDev) clearInterval(statsInterval.value!);
if (pool.value) pool.value.terminate();
};
const onPoolReady = (p: typeof MarkdownWorkerPoll) => {
pool.value = p;
};
const codeRenderer: MarkdownComponent = (props) => {
const codeNode = props.children?.[0]?.children?.[0];
const code = codeNode?.value || '';
const className = props.children?.[0]?.properties?.className;
const lang = Array.isArray(className) ? className[0]?.replace('language-', '') : 'plaintext';
const highlighted =
lang && hljs.getLanguage(lang) ? hljs.highlight(code, { language: lang }).value : hljs.highlightAuto(code).value;
return h('pre', { class: 'code-block' }, [
h('div', { class: 'code-header' }, [h('span', { class: 'language-badge' }, lang)]),
h('code', {
class: `language-${lang} hljs`,
innerHTML: highlighted,
}),
]);
};
</script>
<style scoped></style>
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels

