import os import shlex import tempfile import shutil from pathlib import Path from PIL import Image from .utils import load_file_path from .error import InterpreterError from .image import GlitchImage class Interpreter: """Interpreter for scritcher instructions/statements.""" def __init__(self): self.orig_path = None self.img = None def _cmd_noop(self): pass def _cmd_load(self, loadpath: str): source_path = load_file_path(loadpath) self.orig_path = source_path # create a temporary file to hold bmp data handle, bmp_path = tempfile.mkstemp('.bmp') os.close(handle) self.img = GlitchImage(source_path, Path(bmp_path)) self.img.load() def _cmd_quicksave(self): suffix = self.img.original.suffix name = self.img.original.name.replace(suffix, '') parent_folder = self.orig_path.parents[0] # we need to search all files that match the pattern NAME_g* # then we save on the one _g suffix above it. # e.g if the original path is "miya.png", we want to search for # files named "miya_g1.raw", "miya_g2.raw", and then we want to write # on "miya_g3.raw". index = 0 for glitched_out in parent_folder.glob(f'{name}_g*'): try: idx = int(glitched_out.name.strip(name + '_g')[0]) # glob() doesnt seem to show a stable order. anyways, we can # just only update our index when its the maximum found if idx > index: index = idx except (IndexError, ValueError): continue # create our next glitched path out_path = shutil.copyfile( self.img.path, parent_folder / f'{name}_g{index + 1}.raw') print('saved to', out_path) def run(self, line: str): """Run a single line.""" print(f'running {line!r}') args = shlex.split(line) command = args[0] if command != 'load' and self.img is None: print('warn: no file loaded.') try: method = getattr(self, f'_cmd_{command}') except AttributeError: raise InterpreterError(f'Command {command!r} not found') method(*args[1:])