pyx/proxy.py
2025-08-15 09:12:47 -04:00

56 lines
1.7 KiB
Python

from typing import List, Protocol, Tuple, Union
def MakeAttrs(css:str|Tuple[str, ...]|None, id:str|None, attributes: dict[str, str | None] = {}) -> str:
if css:
attributes['class'] = " ".join(css) if isinstance(css, (list, tuple)) else css
if id:
attributes['id'] = id
attrList: List[str] = []
for key, value in attributes.items():
if value:
attrList.append(f'{key}="{value}"')
return " ".join(attrList)
class ComplexProxyLeaf(dict):
name:str = ""
attrs:str = ""
def __init__(self, name:str):
self.name = name
def __call__(self, css:str|None = None, id:str|None = None):
self.attrs = MakeAttrs(css, id)
return self
def __repr__(self) -> str:
return f'<{self.name} {self.attrs}/>'
class ComplexProxyBranch(ComplexProxyLeaf):
name:str = ""
attrs:str = ""
def __init__(self, name:str):
self.name = name
def __call__(self, css:str|None = None, id:str|None = None):
self.attrs = MakeAttrs(css, id)
return self
def __repr__(self) -> str:
return f'<{self.name} {self.attrs}></{self.name}>'
def __getitem__(self, key:Union[str, 'ComplexProxyBranch', ComplexProxyLeaf, Tuple[Union[str, 'ComplexProxyBranch', ComplexProxyLeaf], ...]]) -> str:
if isinstance(key, tuple):
children = "".join(str(k) for k in key)
else:
children = key
return f'<{self.name} {self.attrs}>{children}</{self.name}>'
IMG = ComplexProxyLeaf("img")
BR = ComplexProxyLeaf("br")
A = ComplexProxyBranch("a")
print(
A
[
"click here",
BR,
A(css="www.site.com")
[
IMG(id="image.png")
]
]
)