diff --git a/src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens.svelte b/src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens.svelte
index 01536a7bef..a453653514 100644
--- a/src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens.svelte
+++ b/src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens.svelte
@@ -107,6 +107,8 @@
{:else if token.type === 'del'}
+ {:else if token.type === 'underline'}
+
{:else if token.type === 'inlineKatex'}
{#if token.text}
diff --git a/src/lib/components/common/RichTextInput.svelte b/src/lib/components/common/RichTextInput.svelte
index 53a042b6f5..2654c319fd 100644
--- a/src/lib/components/common/RichTextInput.svelte
+++ b/src/lib/components/common/RichTextInput.svelte
@@ -125,6 +125,11 @@
}
});
+ turndownService.addRule('underline', {
+ filter: 'u',
+ replacement: (content) => `${content}`
+ });
+
import { onMount, onDestroy, tick, getContext } from 'svelte';
import { createEventDispatcher } from 'svelte';
diff --git a/src/lib/utils/marked/extension.ts b/src/lib/utils/marked/extension.ts
index 86939c9151..c3f69faada 100644
--- a/src/lib/utils/marked/extension.ts
+++ b/src/lib/utils/marked/extension.ts
@@ -102,11 +102,30 @@ function detailsExtension() {
};
}
+function underlineExtension() {
+ return {
+ name: 'underline',
+ level: 'inline',
+ start: (src: string) => src.indexOf(''),
+ tokenizer(this: any, src: string) {
+ const match = /^([\s\S]+?)<\/u>/.exec(src);
+ if (!match) return;
+
+ return {
+ type: 'underline',
+ raw: match[0],
+ text: match[1],
+ tokens: this.lexer.inlineTokens(match[1])
+ };
+ }
+ };
+}
+
export default function (options = {}) {
return {
tokenizer: {
lheading: lheadingTokenizer as any
},
- extensions: [detailsExtension()]
+ extensions: [detailsExtension(), underlineExtension()]
};
}