From 1ac6564a775835dd9bc93a2fb48ef87f9fc2daed Mon Sep 17 00:00:00 2001 From: Asko Nõmm Date: Mon, 30 Dec 2024 18:51:58 +0200 Subject: bump --- hello.py | 2 +- htmtl/__init__.py | 2 +- htmtl/attribute_parser.py | 21 ++++++++++++++++ htmtl/attribute_parsers/__init__.py | 1 + htmtl/attribute_parsers/inner_text.py | 9 +++++++ htmtl/expression_modifier.py | 7 ++++++ htmtl/expression_parser.py | 27 ++++++++++++++++++++ htmtl/htmtl.py | 47 +++++++++++++++++++++++++++++++---- 8 files changed, 109 insertions(+), 7 deletions(-) create mode 100644 htmtl/attribute_parser.py create mode 100644 htmtl/attribute_parsers/inner_text.py create mode 100644 htmtl/expression_modifier.py create mode 100644 htmtl/expression_parser.py diff --git a/hello.py b/hello.py index 0cd0e9f..c8866ce 100644 --- a/hello.py +++ b/hello.py @@ -2,7 +2,7 @@ from htmtl import Htmtl def main(): - Htmtl("
asmore text goes here
").toHtml() + print(Htmtl("
asdasd
").html()) if __name__ == "__main__": diff --git a/htmtl/__init__.py b/htmtl/__init__.py index 7a91412..bdf128f 100644 --- a/htmtl/__init__.py +++ b/htmtl/__init__.py @@ -1 +1 @@ -from .htmtl import Htmtl \ No newline at end of file +from .htmtl import Htmtl diff --git a/htmtl/attribute_parser.py b/htmtl/attribute_parser.py new file mode 100644 index 0000000..e62025c --- /dev/null +++ b/htmtl/attribute_parser.py @@ -0,0 +1,21 @@ +from abc import ABC, abstractmethod +from typing import Any, Dict +from dompa.nodes import Node + +from htmtl.expression_parser import ExpressionParser + + +class AttributeParser(ABC): + __data: Dict[str, Any] + __expression_parser: ExpressionParser + + def __init__(self, data: Dict[str, Any], expression_parser: ExpressionParser) -> None: + self.__data = data + self.__expression_parser = expression_parser + + def expression(self, expression: str) -> Any: + return self.__expression_parser.parse(expression) + + @abstractmethod + def traverse(self, node: Node): + pass \ No newline at end of file diff --git a/htmtl/attribute_parsers/__init__.py b/htmtl/attribute_parsers/__init__.py index e69de29..d05c6db 100644 --- a/htmtl/attribute_parsers/__init__.py +++ b/htmtl/attribute_parsers/__init__.py @@ -0,0 +1 @@ +from .inner_text import InnerText \ No newline at end of file diff --git a/htmtl/attribute_parsers/inner_text.py b/htmtl/attribute_parsers/inner_text.py new file mode 100644 index 0000000..bd98010 --- /dev/null +++ b/htmtl/attribute_parsers/inner_text.py @@ -0,0 +1,9 @@ +from dompa.nodes import Node, TextNode +from htmtl.attribute_parser import AttributeParser + + +class InnerText(AttributeParser): + def traverse(self, node: Node): + if "inner-text" in node.attributes: + node.children = [TextNode(self.expression(node.attributes["inner-text"]))] + node.attributes.pop("inner-text") \ No newline at end of file diff --git a/htmtl/expression_modifier.py b/htmtl/expression_modifier.py new file mode 100644 index 0000000..abb1619 --- /dev/null +++ b/htmtl/expression_modifier.py @@ -0,0 +1,7 @@ +from abc import abstractmethod, ABC + + +class ExpressionModifier(ABC): + @abstractmethod + def modify(self, expression): + pass \ No newline at end of file diff --git a/htmtl/expression_parser.py b/htmtl/expression_parser.py new file mode 100644 index 0000000..6db16b1 --- /dev/null +++ b/htmtl/expression_parser.py @@ -0,0 +1,27 @@ +from typing import Dict, Any, Optional + +from htmtl.expression_modifier import ExpressionModifier + + +class ExpressionParser: + __data: Dict[str, Any] + __expression_modifiers: list[type[ExpressionModifier]] + + def __init__(self, data: Dict[str, Any], expression_modifiers: list[type[ExpressionModifier]]) -> None: + self.__data = data + self.__expression_modifiers = expression_modifiers + + def parse(self, expression: str) -> Any: + pass + + def parse_interpolation(self, interpolation: str) -> Any: + pass + + def use_modifier(self, value: Any, modifier_name: str, modifier_opts: list[Any]) -> Any: + pass + + def find_modifier(self, name: str) -> Optional[ExpressionModifier]: + pass + + def var_to_val(self, var: str) -> Any: + pass \ No newline at end of file diff --git a/htmtl/htmtl.py b/htmtl/htmtl.py index 10cd806..ffbbe87 100644 --- a/htmtl/htmtl.py +++ b/htmtl/htmtl.py @@ -1,13 +1,50 @@ +from typing import Any from dompa import Dompa +from .attribute_parser import AttributeParser +from .attribute_parsers.inner_text import InnerText +from .expression_modifier import ExpressionModifier +from .expression_parser import ExpressionParser class Htmtl: __dom: Dompa - __attribute_parsers: list - __expression_modifiers: list + __data: dict[str, Any] + __attribute_parsers: list[type[AttributeParser]] + __expression_modifiers: list[type[ExpressionModifier]] - def __init__(self, template: str, attribute_parsers = None, expression_modifiers = None): + def __init__(self, template: str, data: dict[str, Any] = None): self.__dom = Dompa(template) - self.__attribute_parsers = attribute_parsers or [] - self.__expression_modifiers = expression_modifiers or [] + self.__data = data or {} + self.__attribute_parsers = self.__default_attribute_parsers() + self.__expression_modifiers = [] + self.__parse() + @staticmethod + def __default_attribute_parsers() -> list[type[AttributeParser]]: + return [ + InnerText + ] + + def set_attribute_parsers(self, parsers: list[type[AttributeParser]]): + for parser in parsers: + if not isinstance(parser, AttributeParser): + raise TypeError("Attribute parser must extend the AttributeParser class.") + + self.__attribute_parsers = parsers + + def set_expression_modifiers(self, modifiers: list[type[ExpressionModifier]]): + for modifier in modifiers: + if not isinstance(modifier, ExpressionModifier): + raise NotImplementedError("Modifier must extend the ExpressionModifier class.") + + self.__expression_modifiers = modifiers + + def __parse(self) -> None: + expression_parser = ExpressionParser(self.__data, self.__expression_modifiers) + + for parser in self.__attribute_parsers: + parser_instance = parser(self.__data, expression_parser) + self.__dom.update(parser_instance.traverse) + + def html(self) -> str: + return self.__dom.html() \ No newline at end of file -- cgit v1.2.3