From 41a83f1dc5793ba536c40e7dc7e0b0f4cedf6377 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 9 Mar 2025 23:49:26 +0000 Subject: [PATCH] refac: code update behaviour --- src/lib/components/common/CodeEditor.svelte | 42 +++++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/lib/components/common/CodeEditor.svelte b/src/lib/components/common/CodeEditor.svelte index d545d7236..82ff13937 100644 --- a/src/lib/components/common/CodeEditor.svelte +++ b/src/lib/components/common/CodeEditor.svelte @@ -33,15 +33,49 @@ const updateValue = () => { if (_value !== value) { + const changes = findChanges(_value, value); _value = value; - if (codeEditor) { - codeEditor.dispatch({ - changes: [{ from: 0, to: codeEditor.state.doc.length, insert: _value }] - }); + + if (codeEditor && changes.length > 0) { + codeEditor.dispatch({ changes }); } } }; + /** + * Finds multiple diffs in two strings and generates minimal change edits. + */ + function findChanges(oldStr, newStr) { + let changes = []; + let oldIndex = 0, + newIndex = 0; + + while (oldIndex < oldStr.length || newIndex < newStr.length) { + if (oldStr[oldIndex] !== newStr[newIndex]) { + let start = oldIndex; + + // Identify the changed portion + while (oldIndex < oldStr.length && oldStr[oldIndex] !== newStr[newIndex]) { + oldIndex++; + } + while (newIndex < newStr.length && newStr[newIndex] !== oldStr[start]) { + newIndex++; + } + + changes.push({ + from: start, + to: oldIndex, // Replace the differing part + insert: newStr.substring(start, newIndex) + }); + } else { + oldIndex++; + newIndex++; + } + } + + return changes; + } + export let id = ''; export let lang = '';