""" Markdown模板切片工具。 LLM需要“按章调用”,因此必须把Markdown模板解析为结构化章节队列。 这里通过轻量正则和缩进启发式,兼容“# 标题”与 “- **1.0 标题** / - 1.1 子标题”等多种写法。 """ from __future__ import annotations import re import unicodedata from dataclasses import dataclass, field from typing import List, Optional SECTION_ORDER_STEP = 10 @dataclass class TemplateSection: """ 模板章节实体。 记录标题、slug、序号、层级、原始标题、章节编号与提纲, 方便后续节点在提示词中引用并保持锚点一致。 """ title: str slug: str order: int depth: int raw_title: str number: str = "" chapter_id: str = "" outline: List[str] = field(default_factory=list) def to_dict(self) -> dict: """ 将章节实体序列化为字典。 该结构广泛用于提示词上下文以及 layout/word budget 节点的输入。 """ return { "title": self.title, "slug": self.slug, "order": self.order, "depth": self.depth, "number": self.number, "chapterId": self.chapter_id, "outline": self.outline, } heading_pattern = re.compile(r"^(#{1,6})\s+(.*)$") bullet_pattern = re.compile(r"^[-*+]\s+(.*)$") number_pattern = re.compile(r"^(?P\d+(?:\.\d+)*)(?:[\s、::.-]+(?P