Source code for pyexlatex.models.lists.base

from typing import Optional, Union, Sequence, TYPE_CHECKING
if TYPE_CHECKING:
    from pyexlatex.presentation.beamer.overlay.overlay import Overlay
from pyexlatex.models.item import Item
from mixins.repr import ReprMixin
from pyexlatex.models.lists.item import ListItem
from pyexlatex.models.section.base import TextAreaMixin
from pyexlatex.models.format.fills import VFill
from pyexlatex.logic.type_check import item_is_in_allowed_type_strs


[docs]class VerticalFillMixin: vertical_fill = False
[docs] def vertically_space_content(self, items): output = [] for item in items: if not can_be_included_directly_in_list(item): output.append(ListItem(item)) else: output.append(item) if self.vertical_fill: output.append(VFill()) if self.vertical_fill: output = output[:-1] # strip final vertical fill, only fill inbetween items return output
[docs]class ListBase(TextAreaMixin, VerticalFillMixin, Item, ReprMixin): name = 'list' repr_cols = ['contents']
[docs] def __init__(self, items: Sequence, overlay: Optional['Overlay'] = None, vertical_fill: bool = False, **kwargs): self.items = items self.overlay = overlay self.vertical_fill = vertical_fill self.add_data_from_content(items) self.content = self.vertically_space_content(items) env_modifier_overlay = f'[{overlay}]' if overlay is not None else None super().__init__(self.name, self.content, env_modifiers=env_modifier_overlay, **kwargs)
[docs]def can_be_included_directly_in_list(item) -> bool: check_funcs = [ _can_be_included_directly_in_list_but_is_not_list, _item_is_list_or_list_base ] for func in check_funcs: if func(item): return True return False
def _can_be_included_directly_in_list_but_is_not_list(item) -> bool: allowed_values = [ 'SetCounter', 'Raw', 'TextSize' ] return item_is_in_allowed_type_strs(item, allowed_values) def _item_is_list_or_list_base(item) -> bool: allowed_values = [ 'ListItem', 'ListBase' ] return item_is_in_allowed_type_strs(item, allowed_values)