123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- <script lang="ts">
- import { onMount } from 'svelte';
- import type { Token } from 'marked';
- import { revertSanitizedResponseContent, unescapeHtml } from '$lib/utils';
- import CodeBlock from '$lib/components/chat/Messages/CodeBlock.svelte';
- import MarkdownInlineTokens from '$lib/components/chat/Messages/MarkdownInlineTokens.svelte';
- import KatexRenderer from './KatexRenderer.svelte';
- export let id: string;
- export let tokens: Token[];
- export let top = true;
- const headerComponent = (depth: number) => {
- return 'h' + depth;
- };
- </script>
- <!-- {JSON.stringify(tokens)} -->
- {#each tokens as token, tokenIdx}
- {#if token.type === 'hr'}
- <hr />
- {:else if token.type === 'heading'}
- <svelte:element this={headerComponent(token.depth)}>
- <MarkdownInlineTokens id={`${id}-${tokenIdx}-h`} tokens={token.tokens} />
- </svelte:element>
- {:else if token.type === 'code'}
- <CodeBlock
- id={`${id}-${tokenIdx}`}
- {token}
- lang={token?.lang ?? ''}
- code={revertSanitizedResponseContent(token?.text ?? '')}
- />
- {:else if token.type === 'table'}
- <table>
- <thead>
- <tr>
- {#each token.header as header, headerIdx}
- <th style={token.align[headerIdx] ? '' : `text-align: ${token.align[headerIdx]}`}>
- <MarkdownInlineTokens
- id={`${id}-${tokenIdx}-header-${headerIdx}`}
- tokens={header.tokens}
- />
- </th>
- {/each}
- </tr>
- </thead>
- <tbody>
- {#each token.rows as row, rowIdx}
- <tr>
- {#each row ?? [] as cell, cellIdx}
- <td style={token.align[cellIdx] ? '' : `text-align: ${token.align[cellIdx]}`}>
- <MarkdownInlineTokens
- id={`${id}-${tokenIdx}-row-${rowIdx}-${cellIdx}`}
- tokens={cell.tokens}
- />
- </td>
- {/each}
- </tr>
- {/each}
- </tbody>
- </table>
- {:else if token.type === 'blockquote'}
- <blockquote>
- <svelte:self id={`${id}-${tokenIdx}`} tokens={token.tokens} />
- </blockquote>
- {:else if token.type === 'list'}
- {#if token.ordered}
- <ol start={token.start || 1}>
- {#each token.items as item, itemIdx}
- <li>
- <svelte:self
- id={`${id}-${tokenIdx}-${itemIdx}`}
- tokens={item.tokens}
- top={token.loose}
- />
- </li>
- {/each}
- </ol>
- {:else}
- <ul>
- {#each token.items as item, itemIdx}
- <li>
- <svelte:self
- id={`${id}-${tokenIdx}-${itemIdx}`}
- tokens={item.tokens}
- top={token.loose}
- />
- </li>
- {/each}
- </ul>
- {/if}
- {:else if token.type === 'html'}
- {@html token.text}
- {:else if token.type === 'paragraph'}
- <p>
- <MarkdownInlineTokens id={`${id}-${tokenIdx}-p`} tokens={token.tokens ?? []} />
- </p>
- {:else if token.type === 'text'}
- {#if top}
- <p>
- {#if token.tokens}
- <MarkdownInlineTokens id={`${id}-${tokenIdx}-t`} tokens={token.tokens} />
- {:else}
- {unescapeHtml(token.text)}
- {/if}
- </p>
- {:else if token.tokens}
- <MarkdownInlineTokens id={`${id}-${tokenIdx}-p`} tokens={token.tokens ?? []} />
- {:else}
- {unescapeHtml(token.text)}
- {/if}
- {:else if token.type === 'inlineKatex'}
- {#if token.text}
- <KatexRenderer
- content={revertSanitizedResponseContent(token.text)}
- displayMode={token?.displayMode ?? false}
- />
- {/if}
- {:else if token.type === 'blockKatex'}
- {#if token.text}
- <KatexRenderer
- content={revertSanitizedResponseContent(token.text)}
- displayMode={token?.displayMode ?? false}
- />
- {/if}
- {:else if token.type === 'space'}
- {''}
- {:else}
- {console.log('Unknown token', token)}
- {/if}
- {/each}
|