zhenxun_bot/zhenxun/ui/builders/core/notebook.py
Rumio 6124e217d0
Some checks failed
检查bot是否运行正常 / bot check (push) Waiting to run
Sequential Lint and Type Check / ruff-call (push) Waiting to run
Sequential Lint and Type Check / pyright-call (push) Blocked by required conditions
Release Drafter / Update Release Draft (push) Waiting to run
Force Sync to Aliyun / sync (push) Waiting to run
Update Version / update-version (push) Waiting to run
CodeQL Code Security Analysis / Analyze (${{ matrix.language }}) (none, javascript-typescript) (push) Has been cancelled
CodeQL Code Security Analysis / Analyze (${{ matrix.language }}) (none, python) (push) Has been cancelled
♻️ refactor(UI): 重构UI渲染服务为组件化分层架构 (#2025)
* ♻️ refactor(UI): 重构UI渲染服务为组件化分层架构

♻️ **架构重构**
- UI渲染服务重构为组件化分层架构
- 解耦主题管理、HTML生成、截图功能

 **新增功能**
- `zhenxun.ui` 统一入口,提供 `render`、`markdown`、`vstack` 等API
- `RenderableComponent` 基类和渲染协议抽象
- 新增主题管理器和截图引擎模块

⚙️ **配置优化**
- UI配置迁移至 `superuser/ui_manager.py`
- 新增"重载UI主题"管理指令

🔧 **性能改进**
- 优化渲染缓存,支持组件级透明缓存
- 所有UI组件适配新渲染流程

* 🚨 auto fix by pre-commit hooks

---------

Co-authored-by: webjoin111 <455457521@qq.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-08-18 23:08:22 +08:00

121 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import builtins
from pathlib import Path
from ...models.core.base import RenderableComponent
from ...models.core.notebook import NotebookData, NotebookElement
from ..base import BaseBuilder
__all__ = ["NotebookBuilder"]
class NotebookBuilder(BaseBuilder[NotebookData]):
"""
一个用于链式构建 Notebook 页面的辅助类。
"""
def __init__(self, data: list[NotebookElement] | None = None):
elements = data if data is not None else []
data_model = NotebookData(elements=elements)
super().__init__(data_model, template_name="components/core/notebook")
self._elements = elements
def text(self, text: str) -> "NotebookBuilder":
"""添加Notebook文本"""
self._elements.append(NotebookElement(type="paragraph", text=text))
return self
def head(self, text: str, level: int = 1) -> "NotebookBuilder":
"""添加Notebook标题"""
if not 1 <= level <= 4:
raise ValueError("标题级别必须在1-4之间")
self._elements.append(NotebookElement(type="heading", text=text, level=level))
return self
def image(
self,
content: str,
caption: str | None = None,
) -> "NotebookBuilder":
"""添加Notebook图片"""
src = ""
if isinstance(content, Path):
src = content.absolute().as_uri()
elif content.startswith("base64"):
src = f"data:image/png;base64,{content.split('base64://', 1)[-1]}"
else:
src = content
self._elements.append(NotebookElement(type="image", src=src, caption=caption))
return self
def quote(self, text: str | list[str]) -> "NotebookBuilder":
"""添加Notebook引用文本"""
if isinstance(text, str):
self._elements.append(NotebookElement(type="blockquote", text=text))
elif isinstance(text, list):
for t in text:
self._elements.append(NotebookElement(type="blockquote", text=t))
return self
def code(self, code: str, language: str = "python") -> "NotebookBuilder":
"""添加Notebook代码块"""
self._elements.append(
NotebookElement(type="code", code=code, language=language)
)
return self
def list(self, items: list[str], ordered: bool = False) -> "NotebookBuilder":
"""添加Notebook列表"""
self._elements.append(NotebookElement(type="list", data=items, ordered=ordered))
return self
def add_divider(self, **kwargs) -> "NotebookBuilder":
"""
添加分隔线。
:param kwargs: Divider组件的可选参数, 如 margin, color, style, thickness。
"""
from ...models.components import Divider
self.add_component(Divider(**kwargs))
return self
def add_component(
self, component: "RenderableComponent | BaseBuilder"
) -> "NotebookBuilder":
"""
向 Notebook 中添加一个可渲染的自定义组件。
"""
component_data = (
component.data if isinstance(component, BaseBuilder) else component
)
if not isinstance(component_data, RenderableComponent):
raise TypeError(
f"add_component 只能接受 RenderableComponent 或其 Builder"
f"但收到了 {type(component)}"
)
self._elements.append(
NotebookElement(type="component", component=component_data)
)
return self
def add_texts(self, texts: builtins.list[str]) -> "NotebookBuilder":
"""批量添加多个文本段落"""
for text in texts:
self.text(text)
return self
def add_quotes(self, quotes: builtins.list[str]) -> "NotebookBuilder":
"""批量添加引用"""
for quote in quotes:
self.quote(quote)
return self
def build(self) -> NotebookData:
"""
构建并返回 NotebookData 模型实例。
"""
self._data.elements = self._elements
return super().build()