From 81440460f299af1f6ff3d7713549a02e911dd8c5 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sat, 5 Oct 2024 12:04:36 -0700 Subject: [PATCH] feat: editable code block --- .../components/chat/Messages/CodeBlock.svelte | 70 ++++++++++++++----- .../chat/Messages/ContentRenderer.svelte | 9 ++- .../components/chat/Messages/Markdown.svelte | 11 ++- .../Messages/Markdown/MarkdownTokens.svelte | 14 +++- .../chat/Messages/ResponseMessage.svelte | 9 +++ src/lib/components/common/CodeEditor.svelte | 43 ++++++++++-- .../workspace/Functions/FunctionEditor.svelte | 15 +++- .../workspace/Tools/ToolkitEditor.svelte | 15 +++- 8 files changed, 155 insertions(+), 31 deletions(-) diff --git a/src/lib/components/chat/Messages/CodeBlock.svelte b/src/lib/components/chat/Messages/CodeBlock.svelte index ba6d6fc06..7c64e7446 100644 --- a/src/lib/components/chat/Messages/CodeBlock.svelte +++ b/src/lib/components/chat/Messages/CodeBlock.svelte @@ -5,14 +5,16 @@ import { v4 as uuidv4 } from 'uuid'; - import { getContext, getAllContexts, onMount } from 'svelte'; + import { getContext, getAllContexts, onMount, tick, createEventDispatcher } from 'svelte'; import { copyToClipboard } from '$lib/utils'; import 'highlight.js/styles/github-dark.min.css'; import PyodideWorker from '$lib/workers/pyodide.worker?worker'; + import CodeEditor from '$lib/components/common/CodeEditor.svelte'; const i18n = getContext('i18n'); + const dispatch = createEventDispatcher(); export let id = ''; @@ -20,6 +22,15 @@ export let lang = ''; export let code = ''; + let _code = ''; + $: if (code) { + updateCode(); + } + + const updateCode = () => { + _code = code; + }; + let _token = null; let mermaidHtml = null; @@ -32,6 +43,18 @@ let result = null; let copied = false; + let saved = false; + + const saveCode = () => { + saved = true; + + code = _code; + dispatch('save', code); + + setTimeout(() => { + saved = false; + }, 1000); + }; const copyCode = async () => { copied = true; @@ -233,22 +256,11 @@ __builtins__.input = input`); (async () => { await drawMermaidDiagram(); })(); - } else { - // Function to perform the code highlighting - const highlightCode = () => { - highlightedCode = hljs.highlightAuto(code, hljs.getLanguage(lang)?.aliases).value || code; - }; - - // Clear the previous timeout if it exists - clearTimeout(debounceTimeout); - // Set a new timeout to debounce the code highlighting - debounceTimeout = setTimeout(highlightCode, 10); } }; $: if (token) { if (JSON.stringify(token) !== JSON.stringify(_token)) { - console.log('hi'); _token = token; } } @@ -295,28 +307,50 @@ __builtins__.input = input`); {:else} {/if} {/if} + + + -
+			 {
+					saveCode();
+				}}
+				on:change={(e) => {
+					_code = e.detail.value;
+				}}
+			/>
+		
+
+		
 
 		
- + { + dispatch('update', e.detail); + }} + />
{#if floatingButtons} diff --git a/src/lib/components/chat/Messages/Markdown.svelte b/src/lib/components/chat/Messages/Markdown.svelte index e5373d39d..cdf0d5f5a 100644 --- a/src/lib/components/chat/Messages/Markdown.svelte +++ b/src/lib/components/chat/Messages/Markdown.svelte @@ -7,6 +7,9 @@ import markedKatexExtension from '$lib/utils/marked/katex-extension'; import MarkdownTokens from './Markdown/MarkdownTokens.svelte'; + import { createEventDispatcher } from 'svelte'; + + const dispatch = createEventDispatcher(); export let id; export let content; @@ -31,5 +34,11 @@ {#key id} - + { + dispatch('update', e.detail); + }} + /> {/key} diff --git a/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte b/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte index a1df4b67e..931dea598 100644 --- a/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte +++ b/src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte @@ -1,16 +1,18 @@ -
+
diff --git a/src/lib/components/workspace/Functions/FunctionEditor.svelte b/src/lib/components/workspace/Functions/FunctionEditor.svelte index 074d0bbe6..3f85c9f2a 100644 --- a/src/lib/components/workspace/Functions/FunctionEditor.svelte +++ b/src/lib/components/workspace/Functions/FunctionEditor.svelte @@ -21,6 +21,15 @@ description: '' }; export let content = ''; + let _content = ''; + + $: if (content) { + updateContent(); + } + + const updateContent = () => { + _content = content; + }; $: if (name && !edit && !clone) { id = name.replace(/\s+/g, '_').toLowerCase(); @@ -336,10 +345,14 @@ class Pipe: