mirror of
https://github.com/Faraphel/Atlas-Install.git
synced 2025-07-04 03:38:26 +02:00
67 lines
No EOL
1.9 KiB
Python
67 lines
No EOL
1.9 KiB
Python
from io import BytesIO
|
|
from typing import IO, TYPE_CHECKING
|
|
from abc import ABC, abstractmethod
|
|
|
|
from source.mkw.Patch.PatchOperation import AbstractPatchOperation
|
|
from source.translation import translate as _
|
|
|
|
if TYPE_CHECKING:
|
|
from source.mkw.Patch import Patch
|
|
|
|
|
|
class InvalidBmgLayerMode(Exception):
|
|
def __init__(self, layer_mode: str):
|
|
super().__init__(_("ERROR_BMG_LAYER_MODE_NOT_IMPLEMENTED") % layer_mode)
|
|
|
|
|
|
class AbstractLayer(ABC):
|
|
"""
|
|
Represent a Layer for a bmgtxt patch
|
|
"""
|
|
|
|
@abstractmethod
|
|
def patch_bmg(self, patch: "Patch", decoded_content: str) -> str:
|
|
"""
|
|
Patch a bmg with the actual layer. Return the new bmg content.
|
|
"""
|
|
...
|
|
|
|
@classmethod
|
|
def get(cls, layer: dict) -> "AbstractLayer":
|
|
"""
|
|
return the correct type of layer corresponding to the layer mode
|
|
:param layer: the layer to load
|
|
"""
|
|
for subclass in filter(lambda subclass: subclass.mode == layer["mode"], cls.__subclasses__()):
|
|
layer.pop("mode")
|
|
return subclass(**layer)
|
|
raise InvalidBmgLayerMode(layer["mode"])
|
|
|
|
|
|
class BmgTxtEditor(AbstractPatchOperation):
|
|
"""
|
|
edit a decoded bmg
|
|
"""
|
|
|
|
type = "bmgtxt-edit"
|
|
|
|
def __init__(self, layers: list[dict]):
|
|
"""
|
|
:param layers: layers
|
|
"""
|
|
self.layers = layers
|
|
|
|
def patch(self, patch: "Patch", file_name: str, file_content: IO) -> (str, IO):
|
|
decoded_content: str = file_content.read().decode("utf-8")
|
|
|
|
for layer in self.layers:
|
|
decoded_content = AbstractLayer.get(layer).patch_bmg(patch, decoded_content)
|
|
|
|
patch_content: IO = BytesIO(decoded_content.encode("utf-8"))
|
|
return file_name, patch_content
|
|
|
|
|
|
# Load the subclasses so that get_layer can filter them.
|
|
from source.mkw.Patch.PatchOperation.BmgTxtEditor import (
|
|
CTFileLayer, FormatOriginalTrackLayer, IDLayer, PatchLayer, RegexLayer
|
|
) |