fix(multiple-subtitles): [PKG-MULTI-SUB-07] preserve inline timestamps and caption text

This commit is contained in:
Harvey Zhao committed 2026-09-13 11:50:50 +08:00
1 parent da64aae267
commit 7f226ff822
24 files changed
+8660 -132

No files matched your search

@@ -0,0 +1,49 @@
# PKG-MULTI-SUB-07 内嵌时间戳与显示层修复
九份历史实现已复现 `<00:02.000>` 被包装成字符串并输出 `<NaN:NaN.NaN>`。
本次保留数字 TimestampNode,处理顶层与嵌套节点,在有效的 VTT class 节点中承载
时间戳。解析树仍不可变,重复选择/reset 不积累包装;文本、标签和轨序的原回归保留。
私有 WrappedNode 现在与 CueNode 一样要求数字时间戳,编译负例从 8 项增为 9 项。
## 原生与自定义字幕层
直接输出有效时间戳后,Chromium 中的发布/候选核心都把 `<00:02.000>` 显示成文字。
这不是测试超时或资源加载失败,最初两个失败断言及截图/trace 已保留。
因此新增 caption.ts,在既有 subtitleAfterUpdate 事件后处理插件生成的专用标记。
- 原生 WebVTT 中的 `<c.artplayer-multiple-subtitles-timestamp>` 是合法 class 节点,
其中的数字时间戳仍解析为 processing instruction,cue.text 不被显示层修改。
- HTML 不会把 `<c.class>` 与 `</c>` 配对,后面的字幕可能成为该元素的子节点。
直接删除标记曾导致后文丢失;已通过真实浏览器复现并修正为移除前导时间指令、
将其余子节点移回父层。对应失败报告保留,最终断言检查前后文字。
- 不对整段文字做时间戳正则删除。仅处理专用标记中的前导指令,普通用户文字和
原有 `.art-subtitle-<name>` CSS 钩子保留。public cue.text 修改产生的字面量标签
有真实浏览器回归,清空/reset 后正常恢复原字幕。
- 注册的监听器由当前 lifetime 管理,失败/销毁时移除;已有资源测试改为检查所有
监听器集合为空。没有增加新公开选项、返回值或事件,不改变逐 cue 显示策略。
## 验证范围
纯测试覆盖开始/中间/末尾、多个毫秒时间戳、Unicode、嵌套标签、冻结树、重复选择
和重新解析有效 VTT;历史时间戳失败仍保持,不将候选修复覆盖进旧预期。
原生场景检查开头/中间/末尾三个 processing instruction、前后文字、红色样式、
字面量标签保留、清空/reset,以及原有 SRT、销毁/HTTP/Blob/视频切源场景。
通过源码/main/legacy 与发布/候选核心,在 Chromium/Firefox/Windows WebKit 重跑。
具体结果、编译器和输入指纹见[验证](../baselines/multiple-subtitles-timestamps.json)。
最终三入口各 37 项回归通过,本包 267 项通过;原生各 36 项,共 108 项通过,
原生 processing instruction 精确为 00:00:01.250、00:00:02.000、00:00:03.500。
完整 CI 2337 项通过(1987 单元、14 工程、336 基线),严格生产 TS 353 文件。
状态更新后 9 项元数据测试通过。显式 lint 无错误/警告,全量 lint 保留既有生成声明警告。
## 独立发现与后续边界
给字面量场景提供正常 `&lt;...&gt;` 输入时,vendor 生成了 `<;...>;`。九份历史实现
又复现 `&lt;`、`&gt;`、`&amp;` 的多余分号,新增 MULTI-SUB-ENTITY-01,由 05 处置。
本任务不改 vendor;最终字面量显示测试通过公开 cue.text 修改隔离显示层,明确不代表
该实体解码缺陷已修复。额外分号的初始六个浏览器失败记录保留。
04 的公开类型、完整旧核心/实体设备、实体解码、全部样式/编辑器和安装消费者仍待
后续任务。正常构建更新三个产物及 docs 副本;无新依赖、公开声明和版本变更。
本任务独立本地提交,不推送、不发布。回退恢复原 NaN 输出并移除显示监听器;
已发布失败基线及新发现记录仍可追溯。