|
| 1 | +from typing import Any, Optional, Iterable, Union, Callable |
| 2 | + |
| 3 | +from magic_filter import MagicFilter |
| 4 | + |
| 5 | +from textcompose.container.container import BaseContainer |
| 6 | +from textcompose.content.content import Value, Condition |
| 7 | + |
| 8 | + |
| 9 | +class List(BaseContainer): |
| 10 | + def __init__( |
| 11 | + self, |
| 12 | + *items: Value, |
| 13 | + getter: Union[MagicFilter, Callable[[dict[str, Any]], Iterable]], |
| 14 | + sep: Optional[str] = "\n\n", |
| 15 | + inner_sep: str = "\n", |
| 16 | + when: Condition | None = None, |
| 17 | + ) -> None: |
| 18 | + super().__init__(*items, when=when) |
| 19 | + self.items = items |
| 20 | + self.getter = getter |
| 21 | + self.sep = sep |
| 22 | + self.inner_sep = inner_sep |
| 23 | + |
| 24 | + def _render_item(self, item_value: Any, context: dict[str, Any], **kwargs) -> str | None: |
| 25 | + rendered_parts = [ |
| 26 | + self.resolve_value(item_tpl, {"item": item_value, "context": context}, **kwargs) for item_tpl in self.items |
| 27 | + ] |
| 28 | + return self.inner_sep.join(filter(None, rendered_parts)) or None |
| 29 | + |
| 30 | + def render(self, context: dict[str, Any], **kwargs) -> str | None: |
| 31 | + if not self._check_when(context, **kwargs): |
| 32 | + return None |
| 33 | + |
| 34 | + items_iterable = self.resolve_value(self.getter, context, **kwargs) |
| 35 | + if not items_iterable: |
| 36 | + return None |
| 37 | + |
| 38 | + rendered_items = [self._render_item(item_value, context, **kwargs) for item_value in items_iterable] |
| 39 | + |
| 40 | + return self.sep.join(filter(None, rendered_items)) or None |
0 commit comments