scritcher/scritcher/executer.py

79 lines
2.3 KiB
Python
Raw Normal View History

2019-06-07 03:13:43 +00:00
import os
2019-06-07 02:28:15 +00:00
import shlex
2019-06-07 03:13:43 +00:00
import tempfile
2019-06-07 03:21:27 +00:00
import shutil
2019-06-07 03:13:43 +00:00
from pathlib import Path
from PIL import Image
2019-06-07 03:13:43 +00:00
2019-06-07 02:55:59 +00:00
from .utils import load_file_path
from .error import InterpreterError
from .image import GlitchImage
2019-06-07 02:28:15 +00:00
class Interpreter:
"""Interpreter for scritcher instructions/statements."""
def __init__(self):
2019-06-07 03:13:43 +00:00
self.orig_path = None
self.img = None
2019-06-07 02:28:15 +00:00
def _cmd_noop(self):
pass
2019-06-07 02:55:59 +00:00
def _cmd_load(self, loadpath: str):
2019-06-07 03:13:43 +00:00
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()
2019-06-07 03:13:43 +00:00
def _cmd_quicksave(self):
suffix = self.img.original.suffix
name = self.img.original.name.replace(suffix, '')
2019-06-07 03:13:43 +00:00
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".
2019-06-07 03:13:43 +00:00
index = 0
for glitched_out in parent_folder.glob(f'{name}_g*'):
2019-06-07 03:13:43 +00:00
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
2019-06-07 03:13:43 +00:00
except (IndexError, ValueError):
continue
2019-06-07 03:21:27 +00:00
# create our next glitched path
out_path = shutil.copyfile(
self.img.path, parent_folder / f'{name}_g{index + 1}.raw')
2019-06-07 03:21:27 +00:00
print('saved to', out_path)
2019-06-07 03:13:43 +00:00
2019-06-07 02:55:59 +00:00
2019-06-07 02:28:15 +00:00
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:
2019-06-07 02:55:59 +00:00
print('warn: no file loaded.')
2019-06-07 02:28:15 +00:00
try:
method = getattr(self, f'_cmd_{command}')
except AttributeError:
raise InterpreterError(f'Command {command!r} not found')
method(*args[1:])