jianuo's picture
first
09321b6
raw
history blame
No virus
1.71 kB
import re
from ..subprocess_code_interpreter import SubprocessCodeInterpreter
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