summaryrefslogtreecommitdiff
path: root/htmtl/expression_parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'htmtl/expression_parser.py')
-rw-r--r--htmtl/expression_parser.py70
1 files changed, 59 insertions, 11 deletions
diff --git a/htmtl/expression_parser.py b/htmtl/expression_parser.py
index 6db16b1..9a91ebb 100644
--- a/htmtl/expression_parser.py
+++ b/htmtl/expression_parser.py
@@ -1,6 +1,6 @@
-from typing import Dict, Any, Optional
+from typing import Dict, Any
-from htmtl.expression_modifier import ExpressionModifier
+from .expression_modifier import ExpressionModifier
class ExpressionParser:
@@ -12,16 +12,64 @@ class ExpressionParser:
self.__expression_modifiers = expression_modifiers
def parse(self, expression: str) -> Any:
- pass
+ # no curly brackets means that the whole thing is an interpolation
+ if expression.count("{") != expression.count("}"):
+ parsed_interpolation = self.__parse_interpolation(expression)
- def parse_interpolation(self, interpolation: str) -> Any:
- pass
+ return parsed_interpolation
- def use_modifier(self, value: Any, modifier_name: str, modifier_opts: list[Any]) -> Any:
- pass
+ # otherwise only parts of it are
+ parsed_expression = ""
+ interpolation_start = None
+ interpolation_end = None
- def find_modifier(self, name: str) -> Optional[ExpressionModifier]:
- pass
+ for idx, char in enumerate(expression):
+ parsed_expression += char
- def var_to_val(self, var: str) -> Any:
- pass \ No newline at end of file
+ if char == "{":
+ interpolation_start = idx
+
+ if char == "}":
+ interpolation_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
+
+ return parsed_expression
+
+ def __parse_interpolation(self, interpolation: str) -> Any:
+ parts = interpolation.split("|")
+ value = self.__var_to_val(parts[0].strip())
+ modifiers = [x.strip() for x in parts[1:]] if len(parts) > 1 else []
+
+ for modifier in modifiers:
+ modifier_parts = modifier.split(":")
+ modifier_name = modifier_parts[0].strip()
+ modifier_opts = [x.strip() for x in modifier_parts[1:]] if len(modifier_parts) > 1 else []
+ value = self.__use_modifier(value, modifier_name, modifier_opts)
+
+ return value
+
+ def __use_modifier(self, value: Any, modifier_name: str, modifier_opts: list[Any]) -> Any:
+ for modifier in self.__expression_modifiers:
+ modifier_instance = modifier()
+
+ if modifier_instance.name == modifier_name:
+ return modifier_instance.modify(value, modifier_opts)
+
+ return None
+
+ def __var_to_val(self, var: str) -> Any:
+ parts = var.split(".")
+ value = self.__data
+
+ for part in parts:
+ if part in value:
+ value = value[part]
+ else:
+ return None
+
+ return value