45 lines
1.7 KiB
Python
45 lines
1.7 KiB
Python
import os
|
|
import json
|
|
from typing import Any
|
|
|
|
from botbuilder.schema import Attachment
|
|
class TemplateEngine:
|
|
def __init__(self, template_name: str, template_path: str = "templates/") -> None:
|
|
self.__name = template_name
|
|
self.__path = template_path
|
|
self.__template_path = f"{self.__path}{self.__name}.json"
|
|
self.__template = self.__load_template()
|
|
|
|
def __load_template(self) -> dict[str, Any]:
|
|
with open(self.__template_path, "r", encoding="utf-8") as f:
|
|
return json.loads(f.read())
|
|
|
|
def __replace_placeholders(self, obj: Any, data: dict) -> Any:
|
|
"""Recursively replace placeholders in dict/list/string values."""
|
|
if isinstance(obj, dict):
|
|
return {k: self.__replace_placeholders(v, data) for k, v in obj.items()}
|
|
elif isinstance(obj, list):
|
|
return [self.__replace_placeholders(item, data) for item in obj]
|
|
elif isinstance(obj, str):
|
|
return obj.format(**data)
|
|
else:
|
|
return obj
|
|
|
|
def __generate_card(self, data: dict) -> dict[str, Any]:
|
|
template = self.__load_template()
|
|
return self.__replace_placeholders(template, data)
|
|
|
|
def generate(self, data: dict) -> dict[str, Any]:
|
|
return self.__generate_card(data)
|
|
|
|
def attachment(self, data: dict) -> Attachment:
|
|
return Attachment(
|
|
content_type="application/vnd.microsoft.card.adaptive",
|
|
content=self.generate(data)
|
|
)
|
|
|
|
def json_dict(self, data: dict) -> dict:
|
|
return self.generate(data)
|
|
|
|
def json(self, data: dict) -> str:
|
|
return json.dumps(self.generate(data)) |