File size: 1,739 Bytes
fcdf91d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
from ..subprocess_code_interpreter import SubprocessCodeInterpreter
import re
class JavaScript(SubprocessCodeInterpreter):
file_extension = "js"
proper_name = "JavaScript"
def __init__(self):
super().__init__()
self.start_cmd = "node -i"
def preprocess_code(self, code):
return preprocess_javascript(code)
def line_postprocessor(self, line):
# Node's interactive REPL outputs a billion things
# So we clean it up:
if "Welcome to Node.js" in line:
return None
if line.strip() in ["undefined", 'Type ".help" for more information.']:
return None
# Remove trailing ">"s
line = re.sub(r'^\s*(>\s*)+', '', line)
return line
def detect_active_line(self, line):
if "## active_line " in line:
return int(line.split("## active_line ")[1].split(" ##")[0])
return None
def detect_end_of_execution(self, line):
return "## end_of_execution ##" in line
def preprocess_javascript(code):
"""
Add active line markers
Wrap in a try catch
Add end of execution marker
"""
# Split code into lines
lines = code.split("\n")
processed_lines = []
for i, line in enumerate(lines, 1):
# Add active line print
processed_lines.append(f'console.log("## active_line {i} ##");')
processed_lines.append(line)
# Join lines to form the processed code
processed_code = "\n".join(processed_lines)
# Wrap in a try-catch and add end of execution marker
processed_code = f"""
try {{
{processed_code}
}} catch (e) {{
console.log(e);
}}
console.log("## end_of_execution ##");
"""
return processed_code |