Skip to content

docs-gen: 无标题的 {@link ../x.zod.ts} 被渲染成「链接套链接」—— 2 张已发布参考页正文里能直接看到 #6136

Description

@os-zhuang

在实施 #5059(参考页开篇取块规则)时,给渲染管线补 pin 用例顺带扫出。#5059 不同根因、不同代码段(#5059 改的是选哪个 doc block,本单在选定之后的渲染链),故单独立单。与 #5553 同处一条渲染链但也是第三条独立缺陷:#5553 是按行拆段落 + 花括号无差别转义,修好那两点也不会修好这一条。

现象(origin/main 8195184e)

packages/spec/scripts/lib/file-description.ts(#5059build-docs.ts 抽出前是 getFileDescription())对模块 JSDoc 依次做两次替换:

// 1) 先把 {@link target} 换成 markdown 链接
.replace(/\{@link\s+([^}]+?)\s*\}/g, (_m, target) => {
  const route = sourcePathToDocsRoute(target.trim());
  return route ? `[${target.trim()}](${route})` : `\`${target.trim()}\``;
})
// 2) 再把「正文里裸露的源码路径」也换成链接
.replace(/(?<!\()\b((?:\.\.\/)?[\w-]+\/[\w.-]+\.zod\.ts)\b(?!\))/g, (_m0, p) => {  })

第 (1) 步产出的是 [../a/b.zod.ts](/docs/references/a/b) —— 链接文本里就是那条路径。第 (2) 步的前后瞻只排除了「前面是 (」和「后面是 )」,而这里路径前面是 [、后面是 ],所以第二次照样命中,再包一层。

落到已发布页面上(两处,grep -rn '\[\.\./\[' content/docs/references/):

content/docs/references/automation/etl.mdx:54:
See also: [../[integration/connector.zod.ts](/docs/references/integration/connector)](/docs/references/integration/connector) for the Enterprise Connector layer

content/docs/references/integration/connector.mdx:102:
See also: [../[automation/etl.zod.ts](/docs/references/automation/etl)](/docs/references/automation/etl) for the ETL Pipeline layer (data engineering)

读者看到的是一个链接文本里又嵌了一个链接 —— MDX 渲染后是残缺的方括号与重复文字,不是一条可点的「另见」。

触发条件

只有无标题形式 {@link 路径} 会中招;带标题的 {@link 路径 | 文本} 走的是上面那条更靠前的替换,产出的链接文本是「文本」而不是路径,第 (2) 步匹配不到。两处受害都来自 @see 标签(@see ../integration/connector.zod.ts 先被改写成 See also: …,再被第 (2) 步吃掉),形状与 {@link} 无标题分支等价。

修法方向(未验证)

第 (2) 步的职责是「补上正文里裸露的路径」,所以它必须跳过已经在 markdown 链接内的路径 —— 与 escape-mdx.ts 需要感知反引号跨度是同一类问题。可行做法:第 (2) 步只在链接语法之外的片段上跑(先按 \[[^\]]*\]\([^)]*\) 切段),而不是靠加长前后瞻(前后瞻挡不住嵌套)。

验收:grep -rn '\[\.\./\[' content/docs/references/ 归零,且上面两句恢复成单个可点链接。#5059 已把这段渲染抽到 lib/file-description.ts 并配了 scripts/file-description.test.ts,新用例可直接加在那里,不必跑整个生成器再 grep .mdx

影响面

2 张已发布参考页的正文各一处,读者今天访问就能看到。纯展示层,无运行时/协议语义。

范围外,故单开,不在 #5059 的 PR(#6134)里改 —— 那个 PR 只改选块规则,渲染链一字未动(它的 pin 用例特意用带标题的 {@link … | …} 形式,并在注释里写明「不 pin 这条已知缺陷,pin 了等于追认」)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions