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