需求

从一大段文中解析出 markdown 文本所需的 Front Matter 元数据

Front Matter 解析逻辑

依赖 <think> 标签或特定起始位置的逻辑是非常脆弱的,因为有些大模型输出的数据没有 think 标签。因而采用更健壮的 “Seek and Extract”(搜寻与提取) 策略。

新逻辑详解

  1. 清洗预处理 (Pre-clean):

    • 将所有换行符统一规范化为 \n
    • 检查并移除外层的 Markdown 代码块包裹 (如 markdown ... ),只保留内部内容。
  2. 定位起始符 (Scan Start):

    • 逐行扫描文本,寻找第一个严格等于 --- (忽略尾部空格) 的行。
    • 关键点: 这意味着 LLM 输出的任何前置废话(如 “Thinking Process…”, “Here is the file:”, <think>...</think>)都会被自动跳过并视为噪点。
  3. 定位结束符 (Scan End):

    • 从起始符的下一行开始,继续寻找下一个 --- 行。
    • 如果找不到成对的结束符,则判定为解析失败(避免错误截取)。
  4. 精准提取 (Extract):

    • YAML: 截取两个 --- 之间的所有行。
    • Body: 截取结束符之后的所有行,并去除首部多余空行。
    • Noise: 起始符之前的所有内容被丢弃。
  5. 校验 (Validate):

    • 尝试解析提取出的 YAML。如果解析失败(非有效 YAML 对象),则回退,避免因偶然出现的 --- 导致程序崩溃。

优势

  • 零依赖: 无需引入 gray-matter,保持代码轻量。
  • 抗干扰: 完美免疫 LLM 的思维链输出、开场白、Markdown 格式包裹等常见噪点。
  • 兼容性: 只要输出中包含标准的 Front Matter 块,无论它藏在哪里,都能被精准挖出来。