Module tf.browser.html

HTML generation done in the Pythonic way.

Expand source code Browse git
"""HTML generation done in the Pythonic way.
"""
from ..core.generic import isIterable
from ..core.helpers import console, NBSP


H_ELEMENT_DEFS = """
    a
    b
    br>
    button
    code
    details
    div
    i
    input>
    li
    ol
    option
    p
    select
    span
    style
    summary
    table
    td
    tr
    ul
""".strip().split()

H_ELEMENTS = tuple(
    (x[0:-1], False) if x.endswith(">") else (x, True) for x in H_ELEMENT_DEFS
)
"""The HTML elements used in this tool."""


def dig(*content, sep=""):
    """A method to join nested iterables of strings into a string.

    Parameters
    ----------
    content: iterable or string
        Arbitrarily nested iterable of strings.
    sep: string, optional ""
        The string by which the individual strings from the iterables are to be joined.

    Returns
    -------
    string
        The fully joined string corresponding to the original iterables.
    """
    if len(content) == 0:
        return ""
    if len(content) == 1:
        content = content[0]
        return (
            sep.join(dig(c) for c in content)
            if isIterable(content)
            else
            str(content)
        )
    return sep.join(dig(c) for c in content)


def generate(close, tag, *content, **atts):
    """Transform the logical information for an HTML element into an HTML string.

    Parameters
    ----------
    close: boolean
        Whether the element must be closed with an end tag.
    tag: string
        The name of the tag.
    content: iterable
        The content of the element. This may be an arbitrarily nested iterable of
        strings.
    atts: dict
        The attributes of the element.

    Returns
    -------
    string
        The HTML string representation of an element.
    """
    endRep = f"""</{tag}>""" if close else ""

    attsRep = " ".join(
        (k if vl else "")
        if type(vl) is bool
        else f'''{"class" if k == "cls" else k}="{vl}"'''
        for (k, vl) in atts.items()
    )
    if attsRep:
        attsRep = f" {attsRep}"

    contentRep = dig(content)

    return f"""<{tag}{attsRep}>{contentRep}{endRep}"""


def elemFunc(close, elem):
    """Generates a function to serialize a specific HTML element.

    Parameters
    ----------
    close: boolean
        Whether the element needs an end tag.
    elem: string
        The name of the element.

    Returns
    -------
    function
        The function has the same signature as `generate()` except it does not
        take the parameters `close` and `tag`.
    """
    if close:

        def result(*content, **atts):
            return generate(close, elem, *content, **atts)

    else:

        def result(**atts):
            return generate(close, elem, **atts)

    return result


class H:
    """Provider of HTML serializing functions per element type.

    Also has a class attribute `nb`: the non-breaking space.

    For each HTML element in the specs (`H_ELEMENTS`) a corresponding
    generating function is added as method.
    """
    nb = NBSP


setattr(H, "join", dig)

for (elem, close) in H_ELEMENTS:
    setattr(H, elem, elemFunc(close, elem))


if __name__ == "__main__":
    console(H.input(type="hidden"))
    console(H.button("aap", "noot", "mies", type="hidden"))
    console(H.button(["aap", "noot", "mies"], type="hidden"))
    console(H.button(["aap", "noot", "mies", range(10)], type="hidden"))
    messages = [("error", "wrong!"), ("info", "succeeded!")]
    console(H.p((H.span(text, cls=lev) + H.br() for (lev, text) in messages)))
    console(H.join(range(10)))
    console(H.join([]))

Global variables

var H_ELEMENTS

The HTML elements used in this tool.

Functions

def dig(*content, sep='')

A method to join nested iterables of strings into a string.

Parameters

content : iterable or string
Arbitrarily nested iterable of strings.
sep : string, optional ""
The string by which the individual strings from the iterables are to be joined.

Returns

string
The fully joined string corresponding to the original iterables.
def elemFunc(close, elem)

Generates a function to serialize a specific HTML element.

Parameters

close : boolean
Whether the element needs an end tag.
elem : string
The name of the element.

Returns

function
The function has the same signature as generate() except it does not take the parameters close and tag.
def generate(close, tag, *content, **atts)

Transform the logical information for an HTML element into an HTML string.

Parameters

close : boolean
Whether the element must be closed with an end tag.
tag : string
The name of the tag.
content : iterable
The content of the element. This may be an arbitrarily nested iterable of strings.
atts : dict
The attributes of the element.

Returns

string
The HTML string representation of an element.

Classes

class H

Provider of HTML serializing functions per element type.

Also has a class attribute nb: the non-breaking space.

For each HTML element in the specs (H_ELEMENTS) a corresponding generating function is added as method.

Expand source code Browse git
class H:
    """Provider of HTML serializing functions per element type.

    Also has a class attribute `nb`: the non-breaking space.

    For each HTML element in the specs (`H_ELEMENTS`) a corresponding
    generating function is added as method.
    """
    nb = NBSP

Class variables

var nb

The type of the None singleton.

Methods

def a(*content, **atts)
def b(*content, **atts)
def br(**atts)
def button(*content, **atts)
def code(*content, **atts)
def details(*content, **atts)
def div(*content, **atts)
def i(*content, **atts)
def input(**atts)
def join(*content, sep='')

A method to join nested iterables of strings into a string.

Parameters

content : iterable or string
Arbitrarily nested iterable of strings.
sep : string, optional ""
The string by which the individual strings from the iterables are to be joined.

Returns

string
The fully joined string corresponding to the original iterables.
def li(*content, **atts)
def ol(*content, **atts)
def option(*content, **atts)
def p(*content, **atts)
def select(*content, **atts)
def span(*content, **atts)
def style(*content, **atts)
def summary(*content, **atts)
def table(*content, **atts)
def td(*content, **atts)
def tr(*content, **atts)
def ul(*content, **atts)