2424<script setup>
2525import { ref , computed , onMounted } from ' vue' ;
2626import { useModuleI18n } from ' @/i18n/composables' ;
27- import { createHighlighter } from ' shiki' ;
27+ import { ensureShikiLanguages , escapeHtml , renderShikiCode } from ' @/utils/ shiki' ;
2828
2929const props = defineProps ({
3030 toolCall: {
@@ -82,13 +82,15 @@ const highlightedCode = computed(() => {
8282 return ' ' ;
8383 }
8484 try {
85- return shikiHighlighter .value .codeToHtml (code .value , {
86- lang: ' python' ,
87- theme: props .isDark ? ' min-dark' : ' github-light'
88- });
85+ return renderShikiCode (
86+ shikiHighlighter .value ,
87+ code .value ,
88+ ' python' ,
89+ props .isDark ? ' dark' : ' light'
90+ );
8991 } catch (err) {
9092 console .error (' Failed to highlight code:' , err);
91- return ` <pre><code>${ code .value } </code></pre>` ;
93+ return ` <pre><code>${ escapeHtml ( code .value ) } </code></pre>` ;
9294 }
9395});
9496
@@ -101,10 +103,7 @@ const displayExpanded = computed(() => {
101103
102104onMounted (async () => {
103105 try {
104- shikiHighlighter .value = await createHighlighter ({
105- themes: [' min-dark' , ' github-light' ],
106- langs: [' python' ]
107- });
106+ shikiHighlighter .value = await ensureShikiLanguages ([' python' ]);
108107 shikiReady .value = true ;
109108 } catch (err) {
110109 console .error (' Failed to initialize Shiki:' , err);
@@ -139,6 +138,20 @@ onMounted(async () => {
139138 overflow-x : auto ;
140139}
141140
141+ :deep(.code-highlighted pre .shiki ) {
142+ margin : 0 ;
143+ padding : 16px ;
144+ border-radius : 6px ;
145+ overflow : auto ;
146+ }
147+
148+ :deep(.code-highlighted pre .shiki code ) {
149+ display : block ;
150+ padding : 0 ;
151+ background : transparent ;
152+ border-radius : 0 ;
153+ }
154+
142155.code-fallback {
143156 margin : 0 ;
144157 padding : 12px ;
0 commit comments