|
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): |
|
|
|
|
|
if "Welcome to Node.js" in line: |
|
return None |
|
if line.strip() in ["undefined", 'Type ".help" for more information.']: |
|
return None |
|
|
|
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 |
|
""" |
|
|
|
|
|
lines = code.split("\n") |
|
processed_lines = [] |
|
|
|
for i, line in enumerate(lines, 1): |
|
|
|
processed_lines.append(f'console.log("## active_line {i} ##");') |
|
processed_lines.append(line) |
|
|
|
|
|
processed_code = "\n".join(processed_lines) |
|
|
|
|
|
processed_code = f""" |
|
try {{ |
|
{processed_code} |
|
}} catch (e) {{ |
|
console.log(e); |
|
}} |
|
console.log("## end_of_execution ##"); |
|
""" |
|
|
|
return processed_code |