Spaces:
Running
Running
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. | |
""" | |
# Add active line indicators to the code | |
code = self.add_active_line_indicators(code) | |
# Escape double quotes | |
code = code.replace('"', r"\"") | |
# Wrap in double quotes | |
code = '"' + code + '"' | |
# Prepend start command for AppleScript | |
code = 'osascript -e ' + code | |
# Append end of execution indicator | |
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): | |
# Add log command to indicate the line number | |
if line.strip(): # Only add if line is not empty | |
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 Exception as e: | |
print(e) | |
pass | |
return None | |
def detect_end_of_execution(self, line): | |
""" | |
Detects end of execution marker in the output. | |
""" | |
return '##end_of_execution##' in line | |