|
1 | | -<script lang="ts"> |
| 1 | +<script context="module" lang="ts"> |
| 2 | + import { marked, type Token } from 'marked'; |
2 | 3 | import { decode } from 'html-entities'; |
| 4 | +
|
| 5 | + const _detailTokensCache = new Map<string, Token[]>(); |
| 6 | + const DETAIL_CACHE_MAX = 500; |
| 7 | +
|
| 8 | + function getCachedDetailTokens(text: string, done: boolean = true): Token[] { |
| 9 | + if (!done) return marked.lexer(decode(text)); |
| 10 | + if (_detailTokensCache.has(text)) return _detailTokensCache.get(text)!; |
| 11 | + const tokens = marked.lexer(decode(text)); |
| 12 | + if (_detailTokensCache.size >= DETAIL_CACHE_MAX) { |
| 13 | + _detailTokensCache.delete(_detailTokensCache.keys().next().value!); |
| 14 | + } |
| 15 | + _detailTokensCache.set(text, tokens); |
| 16 | + return tokens; |
| 17 | + } |
| 18 | +</script> |
| 19 | + |
| 20 | +<script lang="ts"> |
3 | 21 | import { onMount, getContext } from 'svelte'; |
4 | 22 | const i18n = getContext('i18n'); |
5 | 23 |
|
6 | 24 | import fileSaver from 'file-saver'; |
7 | 25 | const { saveAs } = fileSaver; |
8 | 26 |
|
9 | | - import { marked, type Token } from 'marked'; |
10 | 27 | import { copyToClipboard, unescapeHtml } from '$lib/utils'; |
11 | 28 |
|
12 | 29 | import { WEBUI_BASE_URL } from '$lib/constants'; |
|
398 | 415 | <div class="mb-1.5" slot="content"> |
399 | 416 | <svelte:self |
400 | 417 | id={`${id}-${tokenIdx}-${detailIdx}-d`} |
401 | | - tokens={marked.lexer(decode(detailToken.text))} |
| 418 | + tokens={getCachedDetailTokens(detailToken.text, done)} |
402 | 419 | attributes={detailToken?.attributes} |
403 | 420 | {done} |
404 | 421 | {editCodeBlock} |
|
445 | 462 | <div class=" mb-1.5" slot="content"> |
446 | 463 | <svelte:self |
447 | 464 | id={`${id}-${tokenIdx}-d`} |
448 | | - tokens={marked.lexer(decode(token.text))} |
| 465 | + tokens={getCachedDetailTokens(token.text, done)} |
449 | 466 | attributes={token?.attributes} |
450 | 467 | {done} |
451 | 468 | {editCodeBlock} |
|
0 commit comments