Ver Fonte

fix: python code execution

Timothy J. Baek há 11 meses atrás
pai
commit
18a7634f5c
1 ficheiros alterados com 120 adições e 4 exclusões
  1. 120 4
      src/lib/components/chat/Messages/CodeBlock.svelte

+ 120 - 4
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 = `<py-script type="py" worker>
+		let html = `
+<py-script type="py" worker>
 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()
-			</py-script>`;
+</py-script>`;
 
 		div.innerHTML = html;
 		const pyScript = div.firstElementChild;
@@ -94,7 +210,7 @@ display_message()
 			<div class="p-1">{@html lang}</div>
 
 			<div class="flex items-center">
-				{#if lang === 'python'}
+				{#if lang === 'python' || checkPythonCode(code)}
 					<button
 						class="copy-code-button bg-none border-none p-1"
 						on:click={() => {