summaryrefslogtreecommitdiff
path: root/htmtl
diff options
context:
space:
mode:
Diffstat (limited to 'htmtl')
-rw-r--r--htmtl/attribute_parser.py4
-rw-r--r--htmtl/expression_modifier.py11
-rw-r--r--htmtl/expression_modifiers/truncate.py16
-rw-r--r--htmtl/expression_parser.py20
-rw-r--r--htmtl/htmtl.py13
5 files changed, 49 insertions, 15 deletions
diff --git a/htmtl/attribute_parser.py b/htmtl/attribute_parser.py
index e62025c..fe52162 100644
--- a/htmtl/attribute_parser.py
+++ b/htmtl/attribute_parser.py
@@ -1,5 +1,5 @@
from abc import ABC, abstractmethod
-from typing import Any, Dict
+from typing import Any, Dict, Optional
from dompa.nodes import Node
from htmtl.expression_parser import ExpressionParser
@@ -17,5 +17,5 @@ class AttributeParser(ABC):
return self.__expression_parser.parse(expression)
@abstractmethod
- def traverse(self, node: Node):
+ def traverse(self, node: Node) -> Optional[Node]:
pass \ No newline at end of file
diff --git a/htmtl/expression_modifier.py b/htmtl/expression_modifier.py
index 1986d92..69d6a86 100644
--- a/htmtl/expression_modifier.py
+++ b/htmtl/expression_modifier.py
@@ -7,4 +7,13 @@ class ExpressionModifier(ABC):
@abstractmethod
def modify(self, value: Any, opts: list[Any]) -> Any:
- pass \ No newline at end of file
+ pass
+
+
+def modifier(name: str):
+ def wrapper(cls: type[ExpressionModifier]):
+ cls.name = name
+
+ return cls
+
+ return wrapper \ No newline at end of file
diff --git a/htmtl/expression_modifiers/truncate.py b/htmtl/expression_modifiers/truncate.py
new file mode 100644
index 0000000..41a1bdb
--- /dev/null
+++ b/htmtl/expression_modifiers/truncate.py
@@ -0,0 +1,16 @@
+from typing import Any
+
+from ..expression_modifier import ExpressionModifier, modifier
+
+
+@modifier("truncate")
+class Truncate(ExpressionModifier):
+ def modify(self, value: Any, opts: list[Any]) -> Any:
+ if isinstance(value, str) and len(opts) > 0:
+ if all([x in "1234567890" for x in opts[0]]):
+ char_limit = int(opts[0])
+
+ if len(value) > char_limit:
+ return f"{value[:char_limit - 3]}..."
+
+ return value
diff --git a/htmtl/expression_parser.py b/htmtl/expression_parser.py
index 9a91ebb..d5b83e7 100644
--- a/htmtl/expression_parser.py
+++ b/htmtl/expression_parser.py
@@ -20,23 +20,23 @@ class ExpressionParser:
# otherwise only parts of it are
parsed_expression = ""
- interpolation_start = None
- interpolation_end = None
+ interp_start = None
+ interp_end = None
for idx, char in enumerate(expression):
parsed_expression += char
if char == "{":
- interpolation_start = idx
+ interp_start = idx
if char == "}":
- interpolation_end = idx + 1
+ interp_end = idx + 1
- if interpolation_start is not None and interpolation_end is not None:
- interpolation = expression[interpolation_start:interpolation_end]
- parsed_expression = parsed_expression.replace(interpolation, self.__parse_interpolation(interpolation[1:-1]))
- interpolation_start = None
- interpolation_end = None
+ if interp_start is not None and interp_end is not None:
+ interp = expression[interp_start:interp_end]
+ parsed_expression = parsed_expression.replace(interp, self.__parse_interpolation(interp[1:-1]))
+ interp_start = None
+ interp_end = None
return parsed_expression
@@ -60,7 +60,7 @@ class ExpressionParser:
if modifier_instance.name == modifier_name:
return modifier_instance.modify(value, modifier_opts)
- return None
+ return value
def __var_to_val(self, var: str) -> Any:
parts = var.split(".")
diff --git a/htmtl/htmtl.py b/htmtl/htmtl.py
index ffbbe87..d9fb312 100644
--- a/htmtl/htmtl.py
+++ b/htmtl/htmtl.py
@@ -2,7 +2,9 @@ from typing import Any
from dompa import Dompa
from .attribute_parser import AttributeParser
from .attribute_parsers.inner_text import InnerText
+from .attribute_parsers.outer_text import OuterText
from .expression_modifier import ExpressionModifier
+from .expression_modifiers.truncate import Truncate
from .expression_parser import ExpressionParser
@@ -16,13 +18,20 @@ class Htmtl:
self.__dom = Dompa(template)
self.__data = data or {}
self.__attribute_parsers = self.__default_attribute_parsers()
- self.__expression_modifiers = []
+ self.__expression_modifiers = self.__default_expression_modifiers()
self.__parse()
@staticmethod
def __default_attribute_parsers() -> list[type[AttributeParser]]:
return [
- InnerText
+ InnerText,
+ OuterText,
+ ]
+
+ @staticmethod
+ def __default_expression_modifiers() -> list[type[ExpressionModifier]]:
+ return [
+ Truncate,
]
def set_attribute_parsers(self, parsers: list[type[AttributeParser]]):