summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsko Nõmm <asko@nmm.ee>2024-12-30 18:51:58 +0200
committerAsko Nõmm <asko@nmm.ee>2024-12-30 18:51:58 +0200
commit1ac6564a775835dd9bc93a2fb48ef87f9fc2daed (patch)
tree68bc998db7dd5d1b203671822273283eb6b6176a
parent69968c9e34ae57cfee905d94fc98ec6a83fbe92b (diff)
bump
-rw-r--r--hello.py2
-rw-r--r--htmtl/__init__.py2
-rw-r--r--htmtl/attribute_parser.py21
-rw-r--r--htmtl/attribute_parsers/__init__.py1
-rw-r--r--htmtl/attribute_parsers/inner_text.py9
-rw-r--r--htmtl/expression_modifier.py7
-rw-r--r--htmtl/expression_parser.py27
-rw-r--r--htmtl/htmtl.py47
8 files changed, 109 insertions, 7 deletions
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("<!DOCTYPE html><html><head></head><body><div>as<img>more text goes here</div></body></html>").toHtml()
+ print(Htmtl("<div inner-text=\"hello\">asdasd</div>").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