|
import os |
|
from ..subprocess_code_interpreter import SubprocessCodeInterpreter |
|
|
|
class AppleScript(SubprocessCodeInterpreter): |
|
file_extension = "applescript" |
|
proper_name = "AppleScript" |
|
|
|
def __init__(self): |
|
super().__init__() |
|
self.start_cmd = os.environ.get('SHELL', '/bin/zsh') |
|
|
|
def preprocess_code(self, code): |
|
""" |
|
Inserts an end_of_execution marker and adds active line indicators. |
|
""" |
|
|
|
code = self.add_active_line_indicators(code) |
|
|
|
|
|
code = code.replace('"', r'\"') |
|
|
|
|
|
code = '"' + code + '"' |
|
|
|
|
|
code = "osascript -e " + code |
|
|
|
|
|
code += '; echo "## end_of_execution ##"' |
|
|
|
return code |
|
|
|
def add_active_line_indicators(self, code): |
|
""" |
|
Adds log commands to indicate the active line of execution in the AppleScript. |
|
""" |
|
modified_lines = [] |
|
lines = code.split('\n') |
|
|
|
for idx, line in enumerate(lines): |
|
|
|
if line.strip(): |
|
modified_lines.append(f'log "## active_line {idx + 1} ##"') |
|
modified_lines.append(line) |
|
|
|
return '\n'.join(modified_lines) |
|
|
|
def detect_active_line(self, line): |
|
""" |
|
Detects active line indicator in the output. |
|
""" |
|
prefix = "## active_line " |
|
if prefix in line: |
|
try: |
|
return int(line.split(prefix)[1].split()[0]) |
|
except: |
|
pass |
|
return None |
|
|
|
def detect_end_of_execution(self, line): |
|
""" |
|
Detects end of execution marker in the output. |
|
""" |
|
return "## end_of_execution ##" in line |