From 9bd4b3609495543a2d1f1fcbdc17e1ae5da09def Mon Sep 17 00:00:00 2001 From: Zoe <62722391+juls0730@users.noreply.github.com> Date: Mon, 27 Apr 2026 12:06:30 -0500 Subject: [PATCH] feat: enhance markdown rendering Adds remark-breaks for newline-to-br conversion and a custom remarkSplitBlocks plugin to split paragraphs at hard breaks. Code blocks over 15KB are truncated with a 'Show all' toggle for better performance. --- app/components/Markdown/ShikiHighlight.vue | 27 +++++++++++++- app/plugins/remark.ts | 43 ++++++++++++++++++++++ nuxt.config.ts | 10 ++++- 3 files changed, 77 insertions(+), 3 deletions(-) diff --git a/app/components/Markdown/ShikiHighlight.vue b/app/components/Markdown/ShikiHighlight.vue index e863a2b..0e80170 100644 --- a/app/components/Markdown/ShikiHighlight.vue +++ b/app/components/Markdown/ShikiHighlight.vue @@ -5,16 +5,31 @@ const props = defineProps<{ code: string; language: string }>(); const start = Date.now(); +const MAX_LENGTH = 15000; + const renderId = `${useId()}-${hashSync(props.code + props.language)}`; const copied = ref(false); const collapsed = ref(false); +const showFull = ref(false); + +const isTruncated = computed(() => props.code.length > MAX_LENGTH); +const displayCode = computed(() => isTruncated.value && !showFull.value ? props.code.slice(0, MAX_LENGTH) : props.code); + +function formatSize(bytes: number): string { + if (bytes < 1024) return `${bytes}B`; + if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}kB`; + if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)}MB`; + return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`; +} + +const fullSizeFormatted = computed(() => formatSize(props.code.length)); const { $shiki } = useNuxtApp(); const { data: parsed, clear } = await useAsyncData(`shiki-${renderId}`, - () => parseCode(props.code, props.language.toLowerCase()), + () => parseCode(displayCode.value, props.language.toLowerCase()), { - watch: [() => props.code], + watch: [displayCode], dedupe: 'defer' } ); @@ -72,6 +87,14 @@ console.log("shiki codeblock rendered in", Date.now() - start); {{ parsed?.displayLang }}
+ +