From 1a6989734ec6767f4848dc63a18ab8e9bfec2955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Ke=C3=9Fler?= Date: Tue, 8 Feb 2022 17:04:16 +0100 Subject: [PATCH] implement simple tex formatter --- PyTeX/format/formatterif.py | 18 ++++++++------ PyTeX/format/pytex_formatter.py | 3 ++- PyTeX/format/simple_tex_formatter.py | 21 +++++++++++++++- PyTeX/format/tex_formatter.py | 37 +++++++++++++++++++--------- 4 files changed, 58 insertions(+), 21 deletions(-) diff --git a/PyTeX/format/formatterif.py b/PyTeX/format/formatterif.py index bbf1f5c..2de433e 100644 --- a/PyTeX/format/formatterif.py +++ b/PyTeX/format/formatterif.py @@ -1,10 +1,11 @@ from pathlib import Path from typing import List, Optional, Dict, Tuple +from abc import ABC, abstractmethod from .config import Config -class FormatterIF: +class FormatterIF(ABC): """ A formatter is bound to a specific input file with some building configuration. @@ -18,6 +19,7 @@ class FormatterIF: self._input_file: Optional[Path] = input_file self._config: Optional[Config] = config + @abstractmethod def format(self, build_dir: Path, overwrite: bool = False) -> Optional[List[Tuple[str, Dict]]]: """ :param build_dir: Directory where output files are written to @@ -26,15 +28,21 @@ class FormatterIF: build of the output files, a list of the file names and their needed configurations. Else None. """ - raise NotImplementedError + @abstractmethod @property def output_files(self) -> List[str]: """ :return: List of files that will be built when the formatter is invoked """ - raise NotImplementedError + + @abstractmethod + @property + def dependencies(self) -> List[str]: + """ + :return: List of dependencies (as str filenames) + """ @property def input_file(self) -> Path: @@ -55,7 +63,3 @@ class FormatterIF: @config.setter def config(self, config: Config): self._config = config - - @property - def dependencies(self) -> List[str]: - raise NotImplementedError diff --git a/PyTeX/format/pytex_formatter.py b/PyTeX/format/pytex_formatter.py index 06f4ca9..446268f 100644 --- a/PyTeX/format/pytex_formatter.py +++ b/PyTeX/format/pytex_formatter.py @@ -8,9 +8,10 @@ from .formatterif import FormatterIF from .formatting_config import FormattingConfig from .generic_text import GenericText from ..logger import logger +from abc import ABC, abstractmethod -class PyTeXFormatter(FormatterIF): +class PyTeXFormatter(FormatterIF, ABC): def __init__( self, input_file: Optional[Path] = None, diff --git a/PyTeX/format/simple_tex_formatter.py b/PyTeX/format/simple_tex_formatter.py index 0e3637e..1cbfab3 100644 --- a/PyTeX/format/simple_tex_formatter.py +++ b/PyTeX/format/simple_tex_formatter.py @@ -1,5 +1,24 @@ from .tex_formatter import TexFormatter +from pathlib import Path +from typing import Optional, List, Tuple, Dict class SimpleTeXFormatter(TexFormatter): - pass + def open_output_stream(self, build_dir: Path): + out_file = build_dir / self.input_file.with_suffix('').name + if out_file.exists(): + raise NotImplementedError + else: + self._output_file = out_file.open() + + def close_output_stream(self): + self._output_file.close() + + def future_config(self) -> Optional[List[Tuple[str, Dict]]]: + pass + + def dependencies(self) -> List[str]: + return [] + + def output_files(self) -> List[str]: + return [] diff --git a/PyTeX/format/tex_formatter.py b/PyTeX/format/tex_formatter.py index 7d052a7..9949c9c 100644 --- a/PyTeX/format/tex_formatter.py +++ b/PyTeX/format/tex_formatter.py @@ -1,5 +1,6 @@ from pathlib import Path from typing import List, TextIO, Optional, Tuple, Dict +from abc import ABC, abstractmethod from .macros import Macro from .pytex_formatter import PyTeXFormatter @@ -52,13 +53,35 @@ class LineStream: return self._file_exhausted & len(self._cached_lines) == 0 -class TexFormatter(PyTeXFormatter): +class TexFormatter(PyTeXFormatter, ABC): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._macros: List[Macro] = [] self._line_stream: Optional[LineStream] = None self._output_file: Optional[TextIO] = None + @abstractmethod + def open_output_stream(self, build_dir: Path) -> None: + """ + + :param build_dir: Where to open output stream + """ + + @abstractmethod + def close_output_stream(self) -> None: + """ + + :return: + """ + + @abstractmethod + @property + def future_config(self) -> Optional[List[Tuple[str, Dict]]]: + """ + # TODO + :return: + """ + @property def line_stream(self) -> LineStream: if self._line_stream is None: @@ -89,16 +112,6 @@ class TexFormatter(PyTeXFormatter): raise NotImplementedError self._output_file.write(line) - def open_output_stream(self): - raise NotImplementedError - - def close_output_stream(self): - raise NotImplementedError - - @property - def future_config(self) -> Optional[List[Tuple[str, Dict]]]: - raise NotImplementedError - def format_pre_header(self) -> None: pass @@ -123,7 +136,7 @@ class TexFormatter(PyTeXFormatter): self._shipout_line() def format(self, build_dir: Path, overwrite: bool = False) -> Optional[List[Tuple[str, Dict]]]: - self.open_output_stream() + self.open_output_stream(build_dir) self.format_pre_header() self.format_header() self.format_post_header()