from typing import List, Protocol, Tuple class StrArgsToStr(Protocol): def __call__(self, *children: str) -> str: ... ClassArg = str|List[str]|Tuple[str, ...]|None class ProxyDict(dict): name:str attrs:str def __init__(self, name:str, attrs:str): self.name = name self.attrs = attrs def __getitem__(self, key:str|Tuple[str, ...]): return f'<{self.name}{self.attrs}>{"".join(key) if isinstance(key, tuple) else key}' def MakeAttrs(classes:ClassArg, id:str|None, attributes: dict[str, str | None]) -> str: if classes: attributes['class'] = " ".join(classes) if isinstance(classes, (list, tuple)) else classes if id: attributes['id'] = id attrList: List[str] = [""] for key, value in attributes.items(): if value: attrList.append(f'{key}="{value}"') return " ".join(attrList) def ElWrapped(name: str, classes:ClassArg = None, id:str|None = None, attrs: dict[str, str | None] = {}, children:ClassArg = ()) -> ProxyDict: return ProxyDict(name, MakeAttrs(classes, id, attrs)) def ElInline(name: str, classes:ClassArg = None, id:str|None = None, attrs: dict[str, str | None] = {}) -> str: return f'<{name} {MakeAttrs(classes, id, attrs)}/>' def SimpleWrapped(name:str): def proxy(classes:ClassArg = None, id:str|None = None): return ElWrapped(name, classes, id) return proxy def SimpleInline(name:str): def proxy(classes:ClassArg = None, id:str|None = None): return ElInline(name, classes, id) return proxy def A(classes:ClassArg = None, id:str|None = None, href:str|None = None, target:str|None = None): return ElWrapped("a", classes, id, {"href":href, "target":id}) def IMG(classes:ClassArg = None, id:str|None = None, src:str|None = None): return ElInline("img", classes, id, {"src":src}) DIV = SimpleWrapped("div") P = SimpleWrapped("P") BR = SimpleInline("br") HR = SimpleInline("hr") SPAN = SimpleWrapped("span") print( DIV(classes="outer") [ A(classes="CTA Orange", href="www.link")["click"] ] )