2025-08-28 09:20:15 +08:00
|
|
|
from collections.abc import Iterable
|
2025-08-15 16:34:37 +08:00
|
|
|
from typing import Literal
|
|
|
|
|
|
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
2025-08-18 23:08:22 +08:00
|
|
|
from .base import ContainerComponent, RenderableComponent
|
2025-08-15 16:34:37 +08:00
|
|
|
|
|
|
|
|
__all__ = ["NotebookData", "NotebookElement"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NotebookElement(BaseModel):
|
|
|
|
|
"""一个 Notebook 页面中的单个元素"""
|
|
|
|
|
|
|
|
|
|
type: Literal[
|
|
|
|
|
"heading",
|
|
|
|
|
"paragraph",
|
|
|
|
|
"image",
|
|
|
|
|
"blockquote",
|
|
|
|
|
"code",
|
|
|
|
|
"list",
|
|
|
|
|
"divider",
|
|
|
|
|
"component",
|
|
|
|
|
]
|
|
|
|
|
text: str | None = None
|
|
|
|
|
level: int | None = None
|
|
|
|
|
src: str | None = None
|
|
|
|
|
caption: str | None = None
|
|
|
|
|
code: str | None = None
|
|
|
|
|
language: str | None = None
|
|
|
|
|
data: list[str] | None = None
|
|
|
|
|
ordered: bool | None = None
|
2025-08-18 23:08:22 +08:00
|
|
|
component: RenderableComponent | None = None
|
2025-08-15 16:34:37 +08:00
|
|
|
|
|
|
|
|
|
2025-08-18 23:08:22 +08:00
|
|
|
class NotebookData(ContainerComponent):
|
2025-08-15 16:34:37 +08:00
|
|
|
"""Notebook转图片的数据模型"""
|
|
|
|
|
|
|
|
|
|
style_name: str | None = None
|
|
|
|
|
elements: list[NotebookElement]
|
2025-08-18 23:08:22 +08:00
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def template_name(self) -> str:
|
|
|
|
|
return "components/core/notebook"
|
|
|
|
|
|
2025-08-28 09:20:15 +08:00
|
|
|
def get_children(self) -> Iterable[RenderableComponent]:
|
2025-08-18 23:08:22 +08:00
|
|
|
for element in self.elements:
|
|
|
|
|
if element.type == "component" and element.component:
|
2025-08-28 09:20:15 +08:00
|
|
|
yield element.component
|