Source code for seutil.latex.File

from pathlib import Path
from typing import *

from .. import IOUtils, LoggingUtils
from .Macro import Macro
from .Table import Table


[docs]class File: logger = LoggingUtils.get_logger("latex.File") def __init__(self, path: Path, is_append: bool = False): """ Creates a latex file, currently for numbers/macros or tables. :param path: the path to the file. :param is_append: if set to true, then append to any existing file; otherwise overwrite the file. """ self.path: Path = path self.is_append: bool = is_append self.old_content: str = "" if self.is_append: if path.is_file(): self.old_content = IOUtils.load(path, "txt") # end if, if # Contents self.items: List[Union[str, Macro, Table]] = list() self.macros_indexed: Dict[str, Macro] = dict() return
[docs] def append(self, line: str) -> "File": """ Appends one line of text into the file. """ self.items.append(line) return self
[docs] def append_macro(self, macro: Macro) -> "File": if macro.key in self.macros_indexed: self.logger.warning(f"Redefining macro {macro.key}") # end if self.macros_indexed[macro.key] = macro self.items.append(macro) return self
[docs] def append_comment(self, line: str) -> "File": self.items.append("%% " + line) return self
[docs] def save(self) -> None: content = self.old_content + "\n" + self.eval_content() IOUtils.dump(self.path, content, "txt") return
[docs] def eval_content(self) -> str: content_lines: List[str] = list() if not self.is_append: content_lines.append(self.autogen_notice()) # end if for item in self.items: if isinstance(item, str): content_lines.append(item) elif isinstance(item, Macro): content_lines.append(item.eval_content(self.macros_indexed)) else: self.logger.warning("Skipping unsupported item") # end if # end for return "\n".join(content_lines)+"\n"
[docs] def load_macros_from_file(self, file: Path) -> "File": self.macros_indexed.update(Macro.load_from_file(file)) return self
def __iadd__(self, other: Union[str, Macro]): if isinstance(other, str): self.append(other) elif isinstance(other, Macro): self.append_macro(other) else: self.logger.warning("Skipping unsupported item") # end if return self
[docs] @classmethod def autogen_notice(cls) -> str: return "%% Automatically generated by pyutil.latex \n"