diff options
Diffstat (limited to 'htmtl')
| -rw-r--r-- | htmtl/attribute_parser.py | 4 | ||||
| -rw-r--r-- | htmtl/expression_modifier.py | 11 | ||||
| -rw-r--r-- | htmtl/expression_modifiers/truncate.py | 16 | ||||
| -rw-r--r-- | htmtl/expression_parser.py | 20 | ||||
| -rw-r--r-- | htmtl/htmtl.py | 13 |
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]]): |
