From 18a7634f5cf2b69a1672409e23ed924fc7aeab27 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Thu, 16 May 2024 18:05:43 -1000 Subject: [PATCH] fix: python code execution --- .../components/chat/Messages/CodeBlock.svelte | 124 +++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/src/lib/components/chat/Messages/CodeBlock.svelte b/src/lib/components/chat/Messages/CodeBlock.svelte index 91b4dc79d..a488b7f05 100644 --- a/src/lib/components/chat/Messages/CodeBlock.svelte +++ b/src/lib/components/chat/Messages/CodeBlock.svelte @@ -21,6 +21,116 @@ }, 1000); }; + const checkPythonCode = (str) => { + // Check if the string contains typical Python keywords, syntax, or functions + const pythonKeywords = [ + 'def', + 'class', + 'import', + 'from', + 'if', + 'else', + 'elif', + 'for', + 'while', + 'try', + 'except', + 'finally', + 'return', + 'yield', + 'lambda', + 'assert', + 'pass', + 'break', + 'continue', + 'global', + 'nonlocal', + 'del', + 'True', + 'False', + 'None', + 'and', + 'or', + 'not', + 'in', + 'is', + 'as', + 'with' + ]; + + for (let keyword of pythonKeywords) { + if (str.includes(keyword)) { + return true; + } + } + + // Check if the string contains typical Python syntax characters + const pythonSyntax = [ + 'def ', + 'class ', + 'import ', + 'from ', + 'if ', + 'else:', + 'elif ', + 'for ', + 'while ', + 'try:', + 'except:', + 'finally:', + 'return ', + 'yield ', + 'lambda ', + 'assert ', + 'pass', + 'break', + 'continue', + 'global ', + 'nonlocal ', + 'del ', + 'True', + 'False', + 'None', + ' and ', + ' or ', + ' not ', + ' in ', + ' is ', + ' as ', + ' with ', + ':', + '=', + '==', + '!=', + '>', + '<', + '>=', + '<=', + '+', + '-', + '*', + '/', + '%', + '**', + '//', + '(', + ')', + '[', + ']', + '{', + '}' + ]; + + for (let syntax of pythonSyntax) { + if (str.includes(syntax)) { + return true; + } + } + + // If none of the above conditions met, it's probably not Python code + return false; + }; + const executePython = async (text) => { executed = true; @@ -31,9 +141,15 @@ outputDiv.innerText = 'Running...'; } + text = text + .split('\n') + .map((line, index) => (index === 0 ? line : ' ' + line)) + .join('\n'); + // pyscript let div = document.createElement('div'); - let html = ` + let html = ` + import js import sys import io @@ -48,7 +164,7 @@ original_stdout = sys.stdout sys.stdout = output_capture try: - ${text} + ${text} except Exception as e: # Capture any errors and write them to the output capture print(f"Error: {e}", file=output_capture) @@ -68,7 +184,7 @@ def display_message(): output_div.innerText = captured_output display_message() - `; +`; div.innerHTML = html; const pyScript = div.firstElementChild; @@ -94,7 +210,7 @@ display_message()
{@html lang}
- {#if lang === 'python'} + {#if lang === 'python' || checkPythonCode(code)}