HyperFrames v0.7.107 版本解读富文本预览编辑、渲染反馈时机与稳定性修复【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframesHyperFrames v0.7.107发布于 2026-08-11是一次聚焦 Studio 编辑体验与渲染管线可靠性的版本更新。本版本为 Studio 引入了直接在预览画面中编辑并样式化富文本的能力支持混合选区与部分字符范围run的样式操作同时将用户反馈提示从会话计数触发改为渲染结束时触发并围绕音频混音、视频捕获与颜色分级修复了多项稳定性问题。读完本文你将掌握该版本富文本编辑的完整交互形态、其背后的富文本安全清理机制richTextSanitize.ts以及各修复项对应的底层实现原理与验证方式。版本概览v0.7.107 的变更集中在五个方向方向变更摘要归属富文本编辑在预览中直接编辑与样式化文本支持混合选区与字符 run 样式Studio / Core富文本安全富文本进入 composition 前统一执行清理Core反馈机制反馈提示改在渲染结束时弹出而非按会话计数StudioSkills 发布停止 embedded-captions 携带 author-only 路径slideshow 去重Skills稳定性修复捕获回退、预览重载、编码延迟、音量包络、分级图层透出多模块其中富文本编辑与安全清理是本版本的功能主线下文展开详解稳定性修复部分逐个拆解其根因与验证路径。Studio 富文本编辑在预览中直接编辑与样式化文本v0.7.107 之前Studio 中文本的样式调整主要依赖设计面板本版本将其推进到所见即所得的新阶段——直接在预览画面中编辑文本并对其中的部分字符进行样式化。能力一预览内直接编辑[#3143] 实现了在预览中编辑文本。用户点击预览中的文本图层即可进入编辑状态修改结果通过 contenteditable 元素写回磁盘上的 composition 文件。这意味着文本内容与样式的调整不再需要切到源编辑器或属性面板编辑回路被显著缩短。能力二对字符 run 应用样式[#3142] 将样式操作细化到一段字符run of characters粒度。选中文本中的某几个字符后可以直接对其应用加粗、斜体、下划线、颜色、字体等样式而不会影响同图层内其他文字。这为标题强调、关键词高亮等常见动效文案场景提供了细粒度的样式控制手段。能力三混合选区的完整色板展示[#3144] 解决了混合选区mixed selection的颜色展示问题。当选中区域包含多种颜色时Studio 的色板swatch会逐一展示选区中的所有颜色而不是只显示其中一个。这一细节对确认某段文字内部到底用了哪些颜色的排查场景非常实用。与富文本安全清理的联动预览内编辑带来一个关键安全前提编辑产生的 markup 会从 contenteditable 元素一路进入磁盘上的 composition 文件。v0.7.107 为此引入了唯一的写入边界——富文本清理模块详见下一节即任何进入 composition 的富文本都必须先经过清理该边界在服务端写入 composition 字节前被无条件应用。富文本安全边界sanitizeRichTextChildren 深入解析富文本编辑的引入使原本只存在于 Studio 内部的 HTML 结构具备了向 composition 文件旅行的能力。为杜绝粘贴、拖拽等不可信来源的 markup 造成 XSS 或布局破坏Core 提供了唯一的清理模块richTextSanitize.ts。白名单设计允许什么清理模块采用默认拒绝 白名单放行策略内联文本编辑最多只能携带以下内容允许的标签FORMATTING_TAGSSPAN、B、STRONG、I、EM、U、BR除此之外的一切标签都不是文本样式。非白名单标签一律被 unwrap解包而非删除——这样即使遇到意外标签用户的文字也不会丢失只是格式被还原详见 richTextSanitize.ts。允许的样式属性FORMATTING_STYLE_PROPScolor、background-color、font-weight、font-style、text-decoration-line、 font-family、font-size、letter-spacing、line-height、-webkit-text-fill-color一个值得注意的实现细节这份清单曾经只保留纯绘制属性如 color、font-weight理由是会移动或改变文字尺寸的属性会改变 composition 布局而布局是设计面板的职责。但实践发现这个推理限制错了对象——设计面板恰好在这些 span 上写入这些排版属性作为其文本图层把它们清理掉并不会阻止文本编辑改变布局反而会删除用户已经设置的布局例如给一个词上色会静默丢掉兄弟图层的字号。因此白名单最终以值是否越出样式表为界限而非编辑器能否保留自己的属性见 richTextSanitize.ts 的注释。允许的属性FORMATTING_ATTRSdata-hf-text-key、data-hf-id这两个属性是文本图层被跟踪的身份标识其余属性id、class、事件处理器等一律剥离。属性值必须是裸 token/^[A-Za-z0-9_:-]$/其中:是有意保留的因为文本 key 使用child:1这类选择器式 token两个允许的属性都不会被解释为 URL见 richTextSanitize.ts。危险值拦截拒绝什么即使属性和样式名都在白名单内值也必须通过安全审查。UNSAFE_VALUE正则拦截任何试图越出样式表的值/url\(|expression\(|javascript:|vbscript:|import|\//i也就是说url(...)可能加载远程资源/字体、expression(...)旧式 CSS 表达式注入、javascript:/vbscript:协议、import以及/闭合序列都会被直接拒绝见 richTextSanitize.ts。不透明标签整体删除而非解包对于SCRIPT、STYLE、TEMPLATE、NOSCRIPT、IFRAME、OBJECT、EMBED、SVG、MATH这类标签采取整体删除策略OPAQUE_TAGS。原因很直观其他标签被解包后留下的是文字而这些标签的内容不是文字——把script解包会把它的源码变成可见文本见 richTextSanitize.ts。实现要点就地处理与无递归遍历就地清理sanitizeRichTextChildren(parent)只处理元素内部不触碰元素自身调用方拥有该元素的所有权不可信 markup 必须先解析到惰性文档inert document注释明确警告绝不要先把不可信 HTML 赋给活着的 DOM 元素再调用本函数因为活动内容可能在清理开始前就执行无递归的后序遍历使用显式栈帧visit/sanitize两阶段替代递归防止恶意深度的粘贴 markup打爆服务端或浏览器调用栈见 richTextSanitize.ts声明拆分感知引号与括号splitDeclarations只按括号深度为 0 且不在引号内的分号拆分因此color: rgb(1, 2, 3)会被视为一条完整声明引号内的分号如font-family: Roboto Mono; a不会被误拆见 richTextSanitize.ts。测试验证双解析器契约richTextSanitize.test.ts 为该模块提供了极其详尽的契约测试覆盖但不限于保留带样式的 span、嵌套格式、br以及设计面板写入的完整排版属性font-family、font-size、letter-spacing、line-height剥离事件处理器onclick、非法属性id、class、data-x、危险值url(...)、javascript:、expression(...)、实体编码的脚本协议、大小写折叠的协议解包非格式标签div、p、h1、img而保留文字整体删除script、svg等不透明标签清理是不动点对同一节点连续清理两次结果一致15000 层深度的对抗性嵌套不会导致递归栈溢出见 richTextSanitize.test.ts。测试还在 jsdom 与 linkedom 两套 DOM 实现下各跑一遍全部用例保证清理契约不依赖由哪个解析器在信任边界构造惰性树。反馈机制渲染结束即询问而非会话计数[#3205] 调整了 Studio 用户反馈提示的触发时机当一次渲染结束时弹出反馈请求而不是按会话计数器触发。从源码看反馈提示由feedbackTrigger模块驱动Studio 的 StudioFeedbackCard.tsx 注释明确写着Shown byfeedbackTriggerafter a render。这一调整的价值在于时机相关性用户在刚完成一次渲染后对当前体验的记忆与评价最鲜活此时请求反馈获得的信息质量远高于在任意会话节点弹出的打断式询问同时它也降低了反馈弹窗对编辑流程的干扰频率。稳定性修复逐项拆解Skills停发 author-only 路径slideshow 去重[#3225]修复了 embedded-captions 技能发布时携带仅作者可见的路径的问题并对 slideshow 内容做了去重。这属于发布产物层面的卫生修复保证消费方拿到的技能包不包含对作者本地环境的路径依赖。Capture网络空闲超时后回退到 DOM 就绪[#3224]页面捕获capture原先等待networkidle2网络空闲后才截帧但部分页面存在长连接或持续轮询导致导航超时。修复实现在 navigateForCapture.ts先用networkidle2尝试导航超时预算为networkIdleAttemptTimeoutMs(totalTimeoutMs)即min(30_000, totalTimeoutMs)NETWORK_IDLE_ATTEMPT_MS 30_000仅当错误确属导航超时、且网络空闲尝试未耗尽全部预算时才用剩余预算以domcontentloaded重新导航并在结果中标记fellBackFromNetworkIdle: true若网络空闲尝试已占满总预算则直接抛出原始错误。这样既保留了网络空闲高质量截帧的优先策略又为永远等不到空闲的页面提供了确定性的兜底路径见 navigateForCapture.ts。Studiodev 模式下匹配写入回执编辑不再重载预览[#3206]在开发模式下写入回执write receipt不匹配曾导致一次编辑就会触发整个预览重新加载。修复让回执形态对齐使预览在编辑后保持连贯避免闪烁与状态丢失。Producer混音输出可记录编码器延迟的容器[#3200]音频混音若输出到无法记录编码器延迟encoder delay的容器成片会出现首尾音画偏移。修复让混音结果进入能够承载该延迟信息的容器。相关约束可参见 audioPadTrim.ts 中关于encoder delay/flush 引入的时长契约的处理逻辑。Core预览音量包络按 clip 而非 timeline 取键[#3198]音频自动化包络的时间模型是 **clip-local片段本地**的包络点的时间以片段起点为基准而非 composition 时间轴。相关模块 audioAutomation.ts 顶部注释明确写道times are clip-local, so an envelope travels with the clip when it moves片段移动时包络随之移动。修复前预览阶段错误地按 timeline 位置索引音量包络导致同一片段在不同时间位置的预览音量不一致修复后预览与渲染共享同一套 clip-local 插值逻辑画面与声音不再各说各话。Core禁止已分级画面透过非活动片段透出[#3196]颜色分级graded plate后的画面在片段处于非活动状态时仍可能透出到合成结果。该修复确保只有活动片段的已分级画面参与合成避免静音/停用片段仍然污染最终画面。版本定位与升级建议v0.7.107 的核心价值是把文本编辑推进到预览内、并为其建立安全边界若你在 Studio 中大量制作字幕、标题与强调文本建议尽快体验预览内编辑与 run 级样式并利用混合选区色板核对多色文本富文本清理作为进入 composition 的唯一写入边界对所有走 Studio 或服务端写入的富文本内容生效无需额外配置捕获回退逻辑让networkidle2无法满足的页面也能可靠截帧若你遇到 capture 超时类问题可重点验证本版本行为。以上修复均有对应的源码与测试支撑富文本清理契约见 richTextSanitize.test.ts双解析器 15000 层深度对抗用例捕获回退见 navigateForCapture.test.ts 与 navigateForCapture.ts音量包络模型见 audioAutomation.ts 的 clip-local 设计。需要查看完整变更范围时可对比 v0.7.106 与 v0.7.107 的提交历史。【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
