From d1d6252e8b94bc5b506e48f0096583a15c094b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Ke=C3=9Fler?= Date: Fri, 18 Feb 2022 00:23:01 +0100 Subject: [PATCH] implement correct dropping modes --- PyTeX/format/default_macros.py | 1 + PyTeX/format/enums.py | 28 +++++++++++++++++++++++++--- PyTeX/format/macros.py | 34 ++++++++++++++++++++++++++++++---- PyTeX/format/tex_formatter.py | 2 +- 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/PyTeX/format/default_macros.py b/PyTeX/format/default_macros.py index d66f8d0..f255067 100644 --- a/PyTeX/format/default_macros.py +++ b/PyTeX/format/default_macros.py @@ -32,6 +32,7 @@ def get_default_macros(tex_flavour: TeXFlavour): ConfigBeginMacro(), MacroCodeBeginMacro(), MacroCodeEndMacro(), + GuardMacro(), ] tex2 = [ ArgumentMacro( diff --git a/PyTeX/format/enums.py b/PyTeX/format/enums.py index 690d295..05efc25 100644 --- a/PyTeX/format/enums.py +++ b/PyTeX/format/enums.py @@ -2,15 +2,37 @@ from __future__ import annotations from enum import Enum from typing import Optional -from PyTeX.logger import logger - class FormatterMode(Enum): normal = 0 - drop = 1 + normal_drop = 1 macrocode = 2 macrocode_drop = 3 meta = 4 + meta_drop = 5 + + def to_drop(self): + switcher = { + FormatterMode.normal: FormatterMode.normal_drop, + FormatterMode.macrocode: FormatterMode.macrocode_drop, + FormatterMode.meta: FormatterMode.meta_drop + } + return switcher[self] + + def to_undrop(self): + switcher = { + FormatterMode.normal_drop: FormatterMode.normal, + FormatterMode.macrocode_drop: FormatterMode.macrocode, + FormatterMode.meta_drop: FormatterMode.meta + } + return switcher[self] + + def is_drop(self) -> bool: + return self.value in [ + FormatterMode.normal_drop.value, + FormatterMode.macrocode_drop.value, + FormatterMode.meta_drop.value + ] class NamingScheme(Enum): diff --git a/PyTeX/format/macros.py b/PyTeX/format/macros.py index 0b78a2c..aac4e25 100644 --- a/PyTeX/format/macros.py +++ b/PyTeX/format/macros.py @@ -133,6 +133,23 @@ class SingleLineMacro(Macro, ABC): return True +class RegexSingleLineMacro(SingleLineMacro, ABC): + def __init__( + self, + regex: str, + strip: str = ' %\n' + ): + self.regex = regex + super(RegexSingleLineMacro, self).__init__(strip) + + def _matches(self, line: str) -> Optional[str]: + match = re.search(self.regex, line) + if match is not None: + return match.group() + else: + return None + + class SimpleSingleLineMacro(SingleLineMacro, ABC): def __init__( self, @@ -146,14 +163,23 @@ class SimpleSingleLineMacro(SingleLineMacro, ABC): return self.chars if self.chars in line else None +class GuardMacro(RegexSingleLineMacro): + def __init__(self): + super(GuardMacro, self).__init__(r'<(\*|/|@@=)[a-zA-Z]*>') + + def _apply(self, line, formatter) -> Union[str, List[str]]: + match = re.search(self.regex, line) + return '%' + match.group() + + class ConfigBeginMacro(SimpleSingleLineMacro): def __init__(self): super(ConfigBeginMacro, self).__init__(FORMATTER_PREFIX + INFILE_CONFIG_BEGIN_CONFIG) def _apply(self, line: str, formatter) -> Union[str, List[str]]: - if formatter.mode not in [FormatterMode.normal, FormatterMode.meta]: + if formatter.mode.is_drop(): raise NotImplementedError # invalid config begin - formatter.mode = FormatterMode.drop + formatter.mode = formatter.mode.to_drop() return [] @@ -162,9 +188,9 @@ class ConfigEndMacro(SimpleSingleLineMacro): super(ConfigEndMacro, self).__init__(FORMATTER_PREFIX + INFILE_CONFIG_END_CONFIG) def _apply(self, line: str, formatter) -> Union[str, List[str]]: - if not formatter.mode == FormatterMode.drop: + if not formatter.mode.is_drop(): raise NotImplementedError # invalid - formatter.mode = FormatterMode.normal + formatter.mode = formatter.mode.to_undrop() return [] diff --git a/PyTeX/format/tex_formatter.py b/PyTeX/format/tex_formatter.py index e1694a0..aa42c50 100644 --- a/PyTeX/format/tex_formatter.py +++ b/PyTeX/format/tex_formatter.py @@ -152,7 +152,7 @@ class TexFormatter(PyTeXFormatter, ABC): def write_line(self, line: str): if self._output_file is None: raise NotImplementedError - if not self._mode == FormatterMode.drop or self._mode == FormatterMode.macrocode_drop: + if not self.mode.is_drop(): self._output_file.write(line) def format_pre_header(self) -> None: