fix: python code execution

This commit is contained in:
Timothy J. Baek 2024-05-16 18:05:43 -10:00
parent 325fd2b97b
commit 18a7634f5c

View File

@ -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={() => {