Source code for pybloqs.block.convenience

from typing import Any, Dict, Iterable, Optional, Type, Union

from pybloqs.block.base import BaseBlock
from pybloqs.block.text import Raw

_block_types: Dict[Type, Type[BaseBlock]] = {}


def add_block_types(objects: Union[Type, Iterable[Type]], block_cls: Type[BaseBlock]) -> None:
    if not isinstance(objects, Iterable):
        objects = [objects]
    for o in objects:
        _block_types[o] = block_cls


# noinspection PyPep8Naming
[docs] def Block( contents: Any = None, title: Optional[str] = None, title_level: int = 3, title_wrap: bool = False, inherit_cfg: bool = True, **kwargs, ) -> BaseBlock: """ Constructs a composable layout element that will be rendered automatically by IPython Notebooks. It can also be saved in HTML, PDF, PNG or JPEG formats. Content is handled as follows: - Lists, tuples and sets are written out into a grid layout, with a single column by default. Individual elements of the grid are parsed recursively. - DataFrames are written out as an interactive HTML table. - Strings are written out in a raw format, preserving any HTML content in them. - Nested blocks are simply wrapped, unless there is more than one in which case the same logic applies as for lists, tuples and sets. :param contents: Contents to put in a block. :param title: Optional title of the block. :param title_level: Optional title level (adjusts the size and TOC level), 1 being the biggest and 9 being the smallest. :param title_wrap: Toggles whitespace wrapping of the title. (Default: False). :param inherit_cfg: Optional. Set to False to ensure that the block does not inherit any parameters from parents. :param cascade_cfg: Set to True to enable parmater cascading from this block. A value of False means that child blocks do not inherit parameters from this block. :param kwargs: Optional styling arguments. The `style` keyword argument has special meaning in that it allows styling to be grouped as one argument. It is also useful in case a styling parameter name clashes with a standard block parameter. :return: A block instance. """ block_cls = None # Need to loop to catch inherited classes as well for key, value in _block_types.items(): if isinstance(contents, key): block_cls = value break # Try some additional transformations if no suitable mapping found if block_cls is None: if isinstance(contents, str): block_cls = Raw elif isinstance(contents, BaseBlock): # If there is no title, there is no point to wrap the existing block if title is None: return contents class _NestedBlock(BaseBlock): container_tag = None def __init__(self) -> None: super().__init__( title=title, title_level=title_level, title_wrap=title_wrap, inherit_cfg=inherit_cfg, **kwargs ) def _to_static(self) -> BaseBlock: return contents._to_static() def _write_contents(self, *sub_args, **sub_kwargs) -> None: contents._write_block(*sub_args, **sub_kwargs) return _NestedBlock() elif contents is None: block_cls = Raw contents = "" else: raise ValueError(f"Unrecognized argument type: {type(contents)}") return block_cls( contents, title=title, title_level=title_level, title_wrap=title_wrap, inherit_cfg=inherit_cfg, **kwargs )