Source code for pyexlatex.models.template

from pyexlatex.models.section.base import TextAreaMixin
from pyexlatex.models.item import ItemBase


[docs]class Template(TextAreaMixin, ItemBase): r""" Base class for creating custom Pyexlatex templates. To use, simply subclass Template, then in __init__, set the attribute .contents, and call super().__init__(). The .contents attribute should be set to a string, pyexlatex object, or iterable of those. Examples: Contents can be a Pyexlatex object or string: >>> import pyexlatex as pl >>> class BoldUnderline(pl.Template): >>> >>> def __init__(self, contents): >>> self.contents = pl.Bold(pl.Underline(contents)) >>> super().__init__() >>> >>> print(BoldUnderline('woo')) \textbf{\underline{woo}} Contents can also be an iterable of strings or Pyexlatex objects >>> import pyexlatex as pl >>> class BoldAndUnderline(pl.Template): >>> >>> def __init__(self, bold_contents, underline_contents, *other_contents): >>> self.contents = [ >>> pl.Bold(bold_contents), >>> pl.Underline(underline_contents), >>> *other_contents >>> ] >>> super().__init__() >>> >>> print(BoldAndUnderline('woo bold', 'woo underline', 'something')) \textbf{woo bold} \underline{woo underline} something """
[docs] def __init__(self): self._validate_contents() super().__init__(None, self.contents)
def __str__(self): if isinstance(self.contents, str): return self.contents elif hasattr(self.contents, 'is_LatexItem') and self.contents.is_LatexItem: # Another pyexlatex item is the root contents, allow it to determine str output return str(self.contents) else: # An iterable of pyexlatex items from pyexlatex.logic.builder import _build return _build(self.contents) def _validate_contents(self): contents_exception = ContentParseException( f'not able to parse attribute .contents in {self.__class__.__name__}. ' f'Ensure that .contents is set to a string, a pyexlatex item, or ' f'an iterable. Got {self.contents} of type {type(self.contents)}.' ) if isinstance(self.contents, str): return elif hasattr(self.contents, 'is_LatexItem') and self.contents.is_LatexItem: return elif isinstance(self.contents, dict): raise contents_exception else: try: from pyexlatex.logic.builder import _build _build(self.contents) except TypeError as e: if 'can only join an iterable' in e: raise contents_exception
[docs]class ContentParseException(Exception): pass