mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-21 04:00:04 +08:00
✨ feat(renderer): 添加 Jinja2 inline_asset 全局函数
- 新增 `RendererService._inline_asset_global` 方法,并注册为 Jinja2 全局函数 `inline_asset`。
- 允许模板通过 `{{ inline_asset('@namespace/path/to/asset.svg') }}` 直接内联已注册命名空间下的资源文件内容。
- 主要用于解决内联 SVG 时可能遇到的跨域安全问题。
- 【重构】优化 `ResourceResolver.resolve_asset_uri` 中对命名空间资源 (以 `@` 开头) 的解析逻辑,确保能够正确获取文件绝对路径并返回 URI。
- 改进 `RenderableComponent.get_extra_css`,使其在组件定义 `component_css` 时自动返回该 CSS 内容。
- 清理 `Renderable` 协议和 `RenderableComponent` 基类中已存在方法的 `[新增]` 标记。
This commit is contained in:
@@ -75,6 +75,7 @@ class RendererService:
|
||||
self._custom_globals: dict[str, Callable] = {}
|
||||
|
||||
self.filter("dump_json")(self._pydantic_tojson_filter)
|
||||
self.global_function("inline_asset")(self._inline_asset_global)
|
||||
|
||||
def _create_jinja_env(self) -> Environment:
|
||||
"""
|
||||
@@ -176,9 +177,24 @@ class RendererService:
|
||||
|
||||
return decorator
|
||||
|
||||
async def _inline_asset_global(self, namespaced_path: str) -> str:
|
||||
"""
|
||||
一个Jinja2全局函数,用于读取并内联一个已注册命名空间下的资源文件内容。
|
||||
主要用于内联SVG,以解决浏览器的跨域安全问题。
|
||||
"""
|
||||
if not self._jinja_env or not self._jinja_env.loader:
|
||||
return f"<!-- Error: Jinja env not ready for {namespaced_path} -->"
|
||||
try:
|
||||
source, _, _ = self._jinja_env.loader.get_source(
|
||||
self._jinja_env, namespaced_path
|
||||
)
|
||||
return source
|
||||
except TemplateNotFound:
|
||||
return f"<!-- Asset not found: {namespaced_path} -->"
|
||||
|
||||
async def initialize(self):
|
||||
"""
|
||||
[新增] 延迟初始化方法,在 on_startup 钩子中调用。
|
||||
延迟初始化方法,在 on_startup 钩子中调用。
|
||||
|
||||
负责初始化截图引擎和主题管理器,确保在首次渲染前所有依赖都已准备就绪。
|
||||
使用锁来防止并发初始化。
|
||||
|
||||
Reference in New Issue
Block a user