370 lines
9.8 KiB
Python
370 lines
9.8 KiB
Python
"""
|
||
Report Engine JSON契约(IR)Schema定义。
|
||
|
||
这里集中维护所有章节级别的Schema与可用于提示词的文本表示,
|
||
确保章节生成、校验与渲染对同一个结构有统一认知。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import json
|
||
from typing import Any, Dict, List
|
||
|
||
IR_VERSION = "1.0"
|
||
|
||
# ====== 基础常量 ======
|
||
ALLOWED_INLINE_MARKS: List[str] = [
|
||
"bold",
|
||
"italic",
|
||
"underline",
|
||
"strike",
|
||
"code",
|
||
"link",
|
||
"color",
|
||
"font",
|
||
"highlight",
|
||
"subscript",
|
||
"superscript",
|
||
"math",
|
||
]
|
||
|
||
ALLOWED_BLOCK_TYPES: List[str] = [
|
||
"heading",
|
||
"paragraph",
|
||
"list",
|
||
"table",
|
||
"blockquote",
|
||
"hr",
|
||
"code",
|
||
"math",
|
||
"figure",
|
||
"callout",
|
||
"kpiGrid",
|
||
"widget",
|
||
"toc",
|
||
]
|
||
|
||
# ====== Schema定义 ======
|
||
inline_mark_schema: Dict[str, Any] = {
|
||
"type": "object",
|
||
"required": ["type"],
|
||
"properties": {
|
||
"type": {"type": "string", "enum": ALLOWED_INLINE_MARKS},
|
||
"value": {"type": ["string", "number", "object"]},
|
||
"href": {"type": "string", "format": "uri-reference"},
|
||
"title": {"type": "string"},
|
||
"style": {"type": "object"},
|
||
},
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
inline_run_schema: Dict[str, Any] = {
|
||
"type": "object",
|
||
"required": ["text"],
|
||
"properties": {
|
||
"text": {"type": "string"},
|
||
"marks": {
|
||
"type": "array",
|
||
"items": {"$ref": "#/definitions/inlineMark"},
|
||
},
|
||
},
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
heading_block: Dict[str, Any] = {
|
||
"title": "HeadingBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "heading"},
|
||
"level": {"type": "integer", "minimum": 1, "maximum": 6},
|
||
"text": {"type": "string"},
|
||
"anchor": {"type": "string"},
|
||
"numbering": {"type": "string"},
|
||
"subtitle": {"type": "string"},
|
||
},
|
||
"required": ["type", "level", "text", "anchor"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
paragraph_block: Dict[str, Any] = {
|
||
"title": "ParagraphBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "paragraph"},
|
||
"inlines": {
|
||
"type": "array",
|
||
"items": {"$ref": "#/definitions/inlineRun"},
|
||
},
|
||
"align": {"type": "string", "enum": ["left", "center", "right", "justify"]},
|
||
},
|
||
"required": ["type", "inlines"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
list_block: Dict[str, Any] = {
|
||
"title": "ListBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "list"},
|
||
"listType": {"type": "string", "enum": ["ordered", "bullet", "task"]},
|
||
"items": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "array",
|
||
"items": {"$ref": "#/definitions/block"},
|
||
},
|
||
},
|
||
},
|
||
"required": ["type", "listType", "items"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
table_block: Dict[str, Any] = {
|
||
"title": "TableBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "table"},
|
||
"colgroup": {"type": "array", "items": {"type": "object"}},
|
||
"rows": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "object",
|
||
"properties": {
|
||
"cells": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "object",
|
||
"properties": {
|
||
"rowspan": {"type": "integer", "minimum": 1},
|
||
"colspan": {"type": "integer", "minimum": 1},
|
||
"align": {
|
||
"type": "string",
|
||
"enum": ["left", "center", "right"],
|
||
},
|
||
"blocks": {
|
||
"type": "array",
|
||
"items": {"$ref": "#/definitions/block"},
|
||
},
|
||
},
|
||
"required": ["blocks"],
|
||
"additionalProperties": True,
|
||
},
|
||
}
|
||
},
|
||
"required": ["cells"],
|
||
"additionalProperties": True,
|
||
},
|
||
},
|
||
"caption": {"type": "string"},
|
||
"zebra": {"type": "boolean"},
|
||
},
|
||
"required": ["type", "rows"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
blockquote_block: Dict[str, Any] = {
|
||
"title": "BlockquoteBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "blockquote"},
|
||
"blocks": {
|
||
"type": "array",
|
||
"items": {"$ref": "#/definitions/block"},
|
||
},
|
||
"variant": {"type": "string"},
|
||
},
|
||
"required": ["type", "blocks"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
hr_block: Dict[str, Any] = {
|
||
"title": "HorizontalRuleBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "hr"},
|
||
"variant": {"type": "string"},
|
||
},
|
||
"required": ["type"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
code_block: Dict[str, Any] = {
|
||
"title": "CodeBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "code"},
|
||
"lang": {"type": "string"},
|
||
"content": {"type": "string"},
|
||
"caption": {"type": "string"},
|
||
},
|
||
"required": ["type", "content"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
math_block: Dict[str, Any] = {
|
||
"title": "MathBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "math"},
|
||
"latex": {"type": "string"},
|
||
"displayMode": {"type": "boolean"},
|
||
},
|
||
"required": ["type", "latex"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
figure_block: Dict[str, Any] = {
|
||
"title": "FigureBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "figure"},
|
||
"img": {
|
||
"type": "object",
|
||
"properties": {
|
||
"src": {"type": "string"},
|
||
"alt": {"type": "string"},
|
||
"width": {"type": "number"},
|
||
"height": {"type": "number"},
|
||
"srcset": {"type": "string"},
|
||
},
|
||
"required": ["src"],
|
||
"additionalProperties": True,
|
||
},
|
||
"caption": {"type": "string"},
|
||
"responsive": {"type": "boolean"},
|
||
},
|
||
"required": ["type", "img"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
callout_block: Dict[str, Any] = {
|
||
"title": "CalloutBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "callout"},
|
||
"tone": {
|
||
"type": "string",
|
||
"enum": ["info", "warning", "success", "danger"],
|
||
},
|
||
"title": {"type": "string"},
|
||
"blocks": {
|
||
"type": "array",
|
||
"items": {"$ref": "#/definitions/block"},
|
||
},
|
||
},
|
||
"required": ["type", "tone", "blocks"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
kpi_block: Dict[str, Any] = {
|
||
"title": "KPIGridBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "kpiGrid"},
|
||
"items": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "object",
|
||
"properties": {
|
||
"label": {"type": "string"},
|
||
"value": {"type": "string"},
|
||
"unit": {"type": "string"},
|
||
"delta": {"type": "string"},
|
||
"deltaTone": {"type": "string", "enum": ["up", "down", "neutral"]},
|
||
},
|
||
"required": ["label", "value"],
|
||
"additionalProperties": True,
|
||
},
|
||
},
|
||
"cols": {"type": "integer"},
|
||
},
|
||
"required": ["type", "items"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
widget_block: Dict[str, Any] = {
|
||
"title": "WidgetBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "widget"},
|
||
"widgetId": {"type": "string"},
|
||
"widgetType": {"type": "string"},
|
||
"props": {"type": "object"},
|
||
"data": {"type": "object"},
|
||
"dataRef": {"type": "string"},
|
||
},
|
||
"required": ["type", "widgetId", "widgetType"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
toc_block: Dict[str, Any] = {
|
||
"title": "TOCBlock",
|
||
"type": "object",
|
||
"properties": {
|
||
"type": {"const": "toc"},
|
||
"depth": {"type": "integer", "minimum": 1, "maximum": 4},
|
||
"autoNumbering": {"type": "boolean"},
|
||
},
|
||
"required": ["type"],
|
||
"additionalProperties": True,
|
||
}
|
||
|
||
block_variants: List[Dict[str, Any]] = [
|
||
heading_block,
|
||
paragraph_block,
|
||
list_block,
|
||
table_block,
|
||
blockquote_block,
|
||
hr_block,
|
||
code_block,
|
||
math_block,
|
||
figure_block,
|
||
callout_block,
|
||
kpi_block,
|
||
widget_block,
|
||
toc_block,
|
||
]
|
||
|
||
CHAPTER_JSON_SCHEMA: Dict[str, Any] = {
|
||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||
"title": "ReportEngineChapterIR",
|
||
"type": "object",
|
||
"required": ["chapterId", "title", "anchor", "order", "blocks"],
|
||
"properties": {
|
||
"chapterId": {"type": "string"},
|
||
"anchor": {"type": "string"},
|
||
"title": {"type": "string"},
|
||
"order": {"type": "number"},
|
||
"summary": {"type": "string"},
|
||
"blocks": {
|
||
"type": "array",
|
||
"items": {"$ref": "#/definitions/block"},
|
||
},
|
||
"xrefs": {"type": "object"},
|
||
"widgets": {"type": "array", "items": {"type": "string"}},
|
||
"footnotes": {"type": "array", "items": {"type": "object"}},
|
||
"errors": {"type": "array", "items": {"type": "string"}},
|
||
"metadata": {"type": "object"},
|
||
},
|
||
"additionalProperties": True,
|
||
"definitions": {
|
||
"inlineMark": inline_mark_schema,
|
||
"inlineRun": inline_run_schema,
|
||
"block": {"oneOf": block_variants},
|
||
},
|
||
}
|
||
|
||
CHAPTER_JSON_SCHEMA_TEXT: str = json.dumps(
|
||
CHAPTER_JSON_SCHEMA,
|
||
ensure_ascii=False,
|
||
indent=2,
|
||
)
|
||
|
||
__all__ = [
|
||
"IR_VERSION",
|
||
"ALLOWED_INLINE_MARKS",
|
||
"ALLOWED_BLOCK_TYPES",
|
||
"CHAPTER_JSON_SCHEMA",
|
||
"CHAPTER_JSON_SCHEMA_TEXT",
|
||
]
|