From 0d3fae94bd941722b23d7e1d687ee828aa245f73 Mon Sep 17 00:00:00 2001 From: Seth Trowbridge Date: Wed, 20 Aug 2025 18:12:40 -0400 Subject: [PATCH] writer started --- css.py | 119 +++++++++++++++++++++++++++++++++++++------------------ sheet.py | 3 ++ 2 files changed, 84 insertions(+), 38 deletions(-) create mode 100644 sheet.py diff --git a/css.py b/css.py index 7a6ecf9..5a98320 100644 --- a/css.py +++ b/css.py @@ -1,8 +1,24 @@ from dataclasses import dataclass -from typing import Optional, Tuple, List, Union +from typing import Optional, Tuple, Union, Dict, List import random +css_final:List[str] = [] +css_lines:List[str] = [] +def css_class(css_context:str): + global css_lines + output = f'{css_context}{{ {"".join(css_lines)} }}' + css_lines = [] + css_final.append(output) + +def css_write(str:str): + css_lines.append(str) + +def css_dump(): + global css_final + output = "".join(css_final) + css_final = [] + return output class Unit(): unit = "px" def __init__(self, amount:float): @@ -19,12 +35,26 @@ class EM(Unit): class REM(Unit): unit = "rem" + class Cluster(): + + map:Dict[str, str] = {} + def __init__(self): + self.key = random.randrange(1000, 5000) pass def __repr__(self)->str: + print("repr called on cluster") #todo: flesh this out / provide overrides for each inheriting class - return "" + return self.render() + + def render(self)->str: + output:List[str] = [] + for key in self.map: + value = self.__getattribute__(self.map[key]) + if value: + output.append(f'{key}:{value};') + return "\n".join(output) @dataclass class Font(Cluster): @@ -32,57 +62,70 @@ class Font(Cluster): kerning: Optional[str] = None size: Optional[Unit] = None + map = { + "font-family":"family", + "font-kerning":"kerning", + "font-size":"size" + } + @dataclass class Space(Cluster): top: Optional[Unit] = None right: Optional[Unit] = None bottom: Optional[Unit] = None left: Optional[Unit] = None - @dataclass class XForm(Space): width: Optional[Unit] = None height: Optional[Unit] = None angle: Optional[float] = None -@dataclass -class Size(): - def __init__(self, minWidth:int = 0): +class Chainer(): + + def __init__(self) -> None: + self.accessed = 0 pass - def __getitem__(self, keys:Union[Cluster, Tuple[Cluster, ...]]): - self.keys = keys - return self - def __repr__(self) -> str: - if isinstance(self.keys, tuple): - return f'\n'.join(str(k) for k in self.keys) + + def __getitem__(self, args:Union[Cluster, Tuple[Cluster, ...]]): + if isinstance(args, tuple): + children = f'\n'.join(k.render() for k in args) else: - return str(self.keys) - -class Atomic(): - def __init__(self, *parts:Cluster): - self.output:List[str] = [] - for part in parts: - self.output.append(f'max-width({part[0]}px)'+"{"+part[1].render()+"}") - - def __getitem__(self, keys:Tuple[int, *tuple[Cluster, ...]]): - self.keys = keys + children = args.render() + if self.accessed: + css_write(f'@media(max-width:{self.accessed}px){{ {children} }}') + else: + css_write(children) + self.accessed = 0 + return self + + def __call__(self, key:int): + self.accessed = key return self +CSS = Chainer() -### example use: -print( - -Atomic -( - Font( size=PX(18) ), - XForm( left=PX(10) ) -) -[ - ( - 512, - Font( size=PX(22) ), - XForm( left=PX(18) ) - ) -] +########################## + + +class _SHEET(type): + last_accessed:Optional[str] = None + def __getattribute__(cls, name:str): + if name != "__name__" and name != "__module__": + css_class(f'.{cls.__module__}.{cls.__name__}.{name}') + return super().__getattribute__(name) + +class SHEET(metaclass=_SHEET): + pass +class UserMadeSheet(SHEET): + Paragraph=CSS[ + Font( size=PX(10) ), + ](512)[ + Font( size=PX(18), family="sans" ), + ](1024)[ + Font( size=PX(120) ), + ] + + Anchor=CSS[ + Font( size=PX(123) ) + ] -) diff --git a/sheet.py b/sheet.py new file mode 100644 index 0000000..c91a458 --- /dev/null +++ b/sheet.py @@ -0,0 +1,3 @@ +from css import UserMadeSheet, css_dump +print(UserMadeSheet.Paragraph, UserMadeSheet.Anchor) +print(css_dump()) \ No newline at end of file