| | 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 |