RFC:图表注释中 x / y 与表头列名的宽松匹配
背景
Markdown 表格图表使用 HTML 注释配置轴字段,例如:
表头常把单位写在列名里,例如 GDP总量(万亿元),而注释里为可读性只写 GDP总量。解析器原先要求 x、y 与列 dataIndex 完全一致,否则将整张表降级为普通表格,导致图表无法渲染。
目标
- 在不破坏已有「注释与表头字符串完全一致」行为的前提下,支持「表头 = 注释中的逻辑名 + 括号内的单位或补充说明」的匹配。
- 匹配成功后,将配置中的
x/y规范化为表头实际列名(即dataIndex),保证后续ChartRender等仍用真实键访问dataSource。
非目标
- 不做模糊搜索或编辑距离(避免
销量误匹配累计销量)。 - 不自动推断未在注释中出现的列;仅当注释中的名字是表头列名的前缀且后缀符合下文规则时匹配。
规范
定义:逻辑列名与表头列名
- 逻辑列名
F:注释里x/y的非空字符串,首尾空白已 trim。 - 表头列名
C:Markdown 表头经normalizeFieldName后的列名字符串(与当前dataIndex一致)。
匹配规则
当且仅当满足以下之一时,认为 C 对应配置中的字段 F:
-
精确匹配:
C === F。 -
前缀 + 括号后缀:
C以F开头,且剩余部分R = C.slice(F.length)满足:R为空,或R整体匹配正则(Unicode 属性):
即:仅由一段或多段「全角或半角括号包裹的非括号片段」及可选空白组成。典型合法后缀:
(万亿元)、(%)、(辆)、(A)(B)。
不满足前缀关系的一律不匹配(例如 C = "GDP总量估算" 与 F = "GDP总量")。
解析算法
对每张表,在得到列 dataIndex 列表 K 后,对每个图表配置项的 x、y(若存在且为非空字符串):
- 若
F ∈ K,规范化结果为F。 - 否则在
K中寻找第一个满足columnKeyMatchesConfiguredField(C, F)的C;若存在,规范化结果为C。 - 否则保持原字符串(与旧行为一致:校验失败则整张表不作为图表)。
多图表配置(数组)时对每一项分别执行。
实现参考
src/MarkdownEditor/editor/parser/parse/parseTable.ts:columnKeyMatchesConfiguredField、resolveChartAxisFieldToColumnKey、normalizeChartConfigAxisFields。
兼容性
- 表头与注释已完全一致的用例行为不变。
- 仅当新增「前缀 + 合法括号后缀」形式时才会从「降级表格」变为「图表」;不会改写无关列名。
测试用例建议
状态
- Implemented:与本 RFC 同步合入解析逻辑与单元测试。
