RFC:图表注释中 x / y 与表头列名的宽松匹配

背景

Markdown 表格图表使用 HTML 注释配置轴字段,例如:

{/* {"chartType": "column", "x": "年份", "y": "GDP总量", "title": "..."} */}

表头常把单位写在列名里,例如 GDP总量(万亿元),而注释里为可读性只写 GDP总量。解析器原先要求 x、y 与列 dataIndex 完全一致,否则将整张表降级为普通表格,导致图表无法渲染。

目标

  • 在不破坏已有「注释与表头字符串完全一致」行为的前提下,支持「表头 = 注释中的逻辑名 + 括号内的单位或补充说明」的匹配。
  • 匹配成功后,将配置中的 x / y 规范化为表头实际列名(即 dataIndex),保证后续 ChartRender 等仍用真实键访问 dataSource。

非目标

  • 不做模糊搜索或编辑距离(避免 销量 误匹配 累计销量)。
  • 不自动推断未在注释中出现的列;仅当注释中的名字是表头列名的前缀且后缀符合下文规则时匹配。

规范

定义:逻辑列名与表头列名

  • 逻辑列名 F:注释里 x / y 的非空字符串,首尾空白已 trim。
  • 表头列名 C:Markdown 表头经 normalizeFieldName 后的列名字符串(与当前 dataIndex 一致)。

匹配规则

当且仅当满足以下之一时,认为 C 对应配置中的字段 F:

  1. 精确匹配:C === F。

  2. 前缀 + 括号后缀:C 以 F 开头,且剩余部分 R = C.slice(F.length) 满足:

    • R 为空,或
    • R 整体匹配正则(Unicode 属性):
    ^(\s*[((][^))]+[))])+\s*$

    即:仅由一段或多段「全角或半角括号包裹的非括号片段」及可选空白组成。典型合法后缀:(万亿元)、(%)、(辆)、(A)(B)。

不满足前缀关系的一律不匹配(例如 C = "GDP总量估算" 与 F = "GDP总量")。

解析算法

对每张表,在得到列 dataIndex 列表 K 后,对每个图表配置项的 x、y(若存在且为非空字符串):

  1. 若 F ∈ K,规范化结果为 F。
  2. 否则在 K 中寻找第一个满足 columnKeyMatchesConfiguredField(C, F) 的 C;若存在,规范化结果为 C。
  3. 否则保持原字符串(与旧行为一致:校验失败则整张表不作为图表)。

多图表配置(数组)时对每一项分别执行。

实现参考

  • src/MarkdownEditor/editor/parser/parse/parseTable.ts:columnKeyMatchesConfiguredField、resolveChartAxisFieldToColumnKey、normalizeChartConfigAxisFields。

兼容性

  • 表头与注释已完全一致的用例行为不变。
  • 仅当新增「前缀 + 合法括号后缀」形式时才会从「降级表格」变为「图表」;不会改写无关列名。

测试用例建议

表头列名注释 y是否匹配
GDP总量(万亿元)GDP总量是
5月交付量(辆)5月交付量是
新能源车双积分比例(%)新能源车双积分比例(%)是(精确)
累计销量销量否
GDPGDP总量否

状态

  • Implemented:与本 RFC 同步合入解析逻辑与单元测试。