Source code for joop.web.templater

"""Templating environment factory for joop.

Contains key implementation for joop templates, providing structure for data
    access inside jinja templates.
If it isn't a joop env, it won't work with joop templating.

Classes:
    EnvironmentFactory:
        A factory class for creating and configuring Jinja2 Environment instances.

        Methods:
            create_environment(**kwargs):
                Creates and configures a Jinja2 Environment instance.
                Registers subcomponent and ata functions.

            _get_joop(ctx: Context) -> dict:
                Retrieves the 'joop' dictionary from the Jinja2 context.

            subcomponent(ctx: Context, subcomponent_name: str) -> Markup:
                Retrieves and marks a subcomponent as safe HTML.

            data(ctx: Context, key: str) -> str:
                Retrieves data associated with a key from the Jinja2 context.

Usage:
    - Use `EnvironmentFactory.create_environment()` to create a Jinja2 Environment.
    - Use `subcomponent` and `data` methods to access joop data and subcomponents within a rendered template.

"""

from jinja2 import Environment as JinjaEnvironment, pass_context
from jinja2.runtime import Context
from markupsafe import Markup

_JOOP_ROOT = 'joop'
_SUBCOMPONENT_ROOT = 'sc'
_DATA_ROOT = 'data'

[docs] class EnvironmentFactory: """ A factory class for creating and configuring Jinja2 Environment instances. This class provides static methods to create a Jinja2 Environment and to define custom functions for interacting with the Jinja2 context, such as retrieving subcomponents and data. Methods: create_environment(**kwargs): Creates and configures a Jinja2 Environment instance. _get_joop(ctx: Context) -> dict: Retrieves the 'joop' dictionary from the Jinja2 context. subcomponent(ctx: Context, subcomponent_name: str) -> Markup: Retrieves and marks a subcomponent as safe HTML. data(ctx: Context, key: str) -> str: Retrieves data associated with a key from the Jinja2 context. """
[docs] @staticmethod def create_environment(**kwargs): """Factory method to create and configure a Jinja2 Environment. Important: Registers the two main joop functions to the environment: 'subcomponents' and 'data'. Args: **kwargs: Arbitrary keyword arguments to configure the Jinja2 Environment. Returns: JinjaEnvironment: A configured Jinja2 Environment instance. Usage Example: env = EnvironmentFactory.create_environment(autoescape=True) """ env = JinjaEnvironment(**kwargs) env.globals.update({ 'subcomponent': EnvironmentFactory.subcomponent, 'data': EnvironmentFactory.data, }) return env
@staticmethod def _get_joop(ctx: Context) -> dict: """ Retrieve the 'joop' dictionary from the Jinja2 context. Used by both `subcomponent` and `data` functions. May seem like a lot of overhead, but it centralizes logic and keeps everything in its place. Args: ctx (Context): The Jinja2 context object. Returns: dict: The 'joop' dictionary if it exists, otherwise an empty dictionary. """ return ctx.get(_JOOP_ROOT, {})
[docs] @staticmethod @pass_context def subcomponent(ctx: Context, subcomponent_name: str) -> Markup: """ Retrieve and mark a subcomponent as safe HTML. Args: ctx (Context): The Jinja2 context object. subcomponent_name (str): The name of the subcomponent to retrieve. Returns: Markup: The safe HTML content of the subcomponent, or an empty string if the subcomponent is not found. This function accesses the Jinja2 context to fetch a subcomponent stored under a specific name. It ensures that the subcomponent is retrieved safely and marked as safe HTML. If the subcomponent does not exist, an empty string is returned. """ _sc_val = EnvironmentFactory._get_joop(ctx).get(_SUBCOMPONENT_ROOT, {}).get(subcomponent_name, "") return Markup(_sc_val)
[docs] @staticmethod @pass_context def data(ctx: Context, key: str) -> str: """ Retrieve data associated with a key from the Jinja2 context. Args: ctx (Context): The Jinja2 context object. key (str): The key for the data to be retrieved. Returns: str: The data associated with the key, or an empty string if not found. This function accesses the Jinja2 context to fetch data stored under a specific key. It ensures that the data is retrieved safely and returns an empty string if the key does not exist in the context. """ _sc_val = EnvironmentFactory._get_joop(ctx).get(_DATA_ROOT, {}).get(key, "") return _sc_val