59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
from abc import ABC, abstractmethod
|
|
from dataclasses import dataclass
|
|
from logging import Logger
|
|
from pathlib import Path
|
|
from typing import Self, Generic, TypeVar
|
|
|
|
from docutranslate.exporter.base import Exporter
|
|
from docutranslate.ir.document import Document
|
|
from docutranslate.logger import global_logger
|
|
|
|
|
|
@dataclass(kw_only=True)
|
|
class WorkflowConfig:
|
|
logger: Logger | None = None
|
|
|
|
|
|
T_original = TypeVar('T_original', bound=Document)
|
|
T_Translated = TypeVar('T_Translated', bound=Document)
|
|
|
|
|
|
class Workflow(ABC, Generic[T_original, T_Translated]):
|
|
def __init__(self, logger: Logger = global_logger):
|
|
self.logger = logger
|
|
self.document_original: T_original | None = None
|
|
self.document_translated: T_Translated | None = None
|
|
|
|
def read_path(self, path: Path | str) -> Self:
|
|
document = Document.from_path(path)
|
|
self.document_original = document
|
|
return self
|
|
|
|
def read_bytes(self, content: bytes, stem: str, suffix: str) -> Self:
|
|
document = Document.from_bytes(content=content, stem=stem, suffix=suffix)
|
|
self.document_original = document
|
|
return self
|
|
|
|
@abstractmethod
|
|
def translate(self, *args, **kwargs) -> Self:
|
|
...
|
|
|
|
@abstractmethod
|
|
async def translate_async(self, *args, **kwargs) -> Self:
|
|
...
|
|
|
|
def _export(self, exporter: Exporter) -> Document:
|
|
if self.document_translated is None:
|
|
raise RuntimeError("Document has not been translated yet. Call translate() first.")
|
|
docu = exporter.export(self.document_translated)
|
|
return docu
|
|
|
|
def _save(self, exporter: Exporter, name: str = None, output_dir: Path | str = "./output"):
|
|
docu = self._export(exporter)
|
|
name = name or docu.name
|
|
output_path = Path(output_dir) / Path(name)
|
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
output_path.write_bytes(docu.content)
|
|
self.logger.info(f"文件已保存到{output_path.resolve()}")
|
|
return self
|