这些是 Tiny Cloud 和 TinyMCE Enterprise 的发行说明。如需了解 TinyMCE 最新社区版本的信息,请参阅 TinyMCE 更新日志。
概述
TinyMCE 8.7.0 于 2026 年 6 月 30 日星期二发布,适用于 TinyMCE Enterprise 和 Tiny Cloud。本发行说明概述了 TinyMCE 8.7.0 的变更内容,包括:
配套的 Premium 插件变更
改进
新增功能
变更
Bug 修复
配套的 Premium 插件变更
以下 Premium 插件更新随 TinyMCE 8.7.0 一同发布。
修订历史(Revision History)
TinyMCE 8.7.0 版本包含配套发布的 修订历史 Premium 插件。
修订历史 包含以下新增功能。
修订可归属为 AI 并显示 AI 徽章
修订现在支持可选的 metadata 属性。将其 source 字段设置为 'ai' 可将修订标记为 AI 辅助修订,使集成者能够跟踪由 TinyMCE AI 插件生成的内容。默认情况下,AI 辅助修订的卡片上会渲染 AI 徽章。将新的 revisionhistory_ai_attribution 选项设为 false 可隐藏该徽章。
有关将修订归属为 AI 的详细信息,请参阅 归属 AI 辅助修订。
有关 修订历史 插件的信息,请参阅:修订历史。
建议编辑(Suggested Edits)
TinyMCE 8.7.0 版本包含配套发布的 建议编辑 Premium 插件。
建议编辑 包含以下改进和新增功能。
AI 辅助建议可显示 AI 徽章
建议编辑现在会记录使用 TinyMCE AI 插件所做的编辑,并将其标记为 AI 辅助编辑。默认情况下,这些编辑的卡片上会显示 AI 徽章。将新的 suggestededits_ai_attribution 选项设为 false 可隐藏该徽章。
suggestededits_model 模式现为版本 2。使用版本 1 保存的模型在加载时会自动迁移。
现在可以切换跟踪建议
建议编辑现在支持在编辑时切换建议跟踪。新的 suggestededits-tracking 工具栏按钮 和 菜单项,以及 SuggestedEditsToggleTracking 命令,允许用户在将编辑作为建议跟踪或直接应用于内容之间切换。 suggestededits_auto_approve 配置选项现在也控制它们的默认状态。
由于切换跟踪从根本上改变了建议编辑的体验,因此默认不包含该按钮和菜单项。必须在编辑器配置中显式地将它们添加到工具栏或菜单中。
审查完成时也会触发建议编辑 hasChanges 事件
以前,SuggestedEditsHasChangesUpdate 事件仅与其他编辑器事件(如输入、选择或聚焦)一起触发。单独完成审查不会触发该事件,因此 hasChanges API 返回的值可能会过时。结果,任何依赖该 API 的集成在审查完成时都不会收到更新。
在 TinyMCE 8.7.0 中,只要 hasChanges API 中的值发生变化,就会触发 SuggestedEditsHasChangesUpdate 事件,包括审查完成时。
有关 建议编辑 插件的信息,请参阅:建议编辑。
导出为 PDF
TinyMCE 8.7.0 版本包含配套发布的 导出为 PDF Premium 插件。
导出为 PDF 包含以下新增功能。
现在可以在 getContent 的事件和 nodeFilter 中使用 export 类型
导出为 PDF 插件现在会调用带有 export 属性(设置为 pdf)的 tinymce.editor.getContent()。TinyMCE 会将此属性传递给 GetContent 事件和序列化器节点过滤器,因此集成者可以应用针对 PDF 导出的内容过滤,而不影响常规内容的检索。
有关在导出期间过滤内容的信息,请参阅:导出特定的内容过滤。有关 导出为 PDF 插件的信息,请参阅:导出为 PDF。
导出为 Word
TinyMCE 8.7.0 版本包含配套发布的 导出为 Word Premium 插件。
导出为 Word 包含以下新增功能。
现在可以在 getContent 的事件和 nodeFilter 中使用 export。
Export to Word 插件现在会使用设置了 export 属性(值为 word)的 tinymce.editor.getContent()。TinyMCE 会将该属性传递给 GetContent 事件和序列化器的 nodeFilter,因此集成人员可以应用针对 Word 导出的内容过滤,而不会影响常规内容获取。
有关导出过程中过滤内容的信息,请参阅:Export-specific content filtering。有关 Export to Word 插件的信息,请参阅:Export to Word。
Page Embed
TinyMCE 8.7.0 版本包括 Page Embed 高级版插件的配套发布。
Page Embed 包含以下修复。
通过 pageembed 插件插入的 iframe 无法使用左对齐、居中对齐和右对齐工具栏按钮进行对齐。
此前,左对齐、居中对齐和右对齐工具栏按钮对通过 Page Embed 插件插入的 iframe 无效。选中嵌入的 iframe 并选择对齐方式不会改变其位置。
在 TinyMCE 8.7.0 中,左对齐、居中对齐和右对齐工具栏按钮可以对齐通过 Page Embed 插件插入的 iframe。
有关 Page Embed 插件的信息,请参阅:Page Embed。
Inline CSS
TinyMCE 8.7.0 版本包括 Inline CSS 高级版插件的配套发布。
Inline CSS 包含以下修复。
使用 Inline CSS 获取 HTML 内容时未包含 fullpage 的页眉和页脚。
此前,当启用 Full Page HTML 插件时,Inline CSS 插件的 getContent API 不会返回完整的 HTML 文档。文档的外围页眉和页脚会被省略,导致输出不适合用于生成适合发送电子邮件的文档等使用场景。
在 TinyMCE 8.7.0 中,Inline CSS 插件会检测 Full Page HTML 插件是否已启用,并在其输出中包含文档页眉和页脚。getContent API 现在会按预期返回完整的 HTML 文档。
有关 Inline CSS 插件的信息,请参阅:Inline CSS。
TinyMCE AI
TinyMCE 8.7.0 版本包括 TinyMCE AI 高级版插件的配套发布。
TinyMCE AI 包含以下改进、修复和新增功能。
将 TinyMCE AI 插件添加到 npm-premium + ZIP 下载中。
从 TinyMCE 8.7.0 开始,TinyMCE AI 插件首次可供自托管客户使用。此前,该插件只能从 Tiny Cloud CDN 加载。
从本版本起,tinymceai 插件包含在 tinymce-premium NPM 包中,并且可以通过 Tiny Account 以独立插件 .zip 下载的形式获取。该插件仅作为附加组件分发,不包含在任何 TinyMCE ZIP 捆绑包中。
自托管插件仍必须连接到 AI 服务实例。可将其指向托管的 Tiny Cloud AI 服务,或部署 自托管 AI 服务,以将内容保留在主机网络内。有关安装步骤,请参阅:Quick start: TinyMCE from NPM or Yarn。有关插件配置的信息,请参阅:TinyMCE AI。
当 body 元素在自定义 content_style 中使用 position: relative 时,差异叠加层可能会错位
此前,当编辑器 body 元素在自定义 content_style 中使用 position: relative 时,预览快捷操作(如“翻译”)会显示错位的差异叠加层。该叠加层将 body 元素用作其包含块,但定位逻辑仍使用视口。因此,高亮切口会相对于翻译文本偏移。采用打印样式布局和定位 body 元素的文档模板可能会导致预览难以使用。
在 TinyMCE 8.7.0 中,差异叠加层会独立于编辑器内容样式渲染。无论自定义 body 定位如何,叠加层都会与翻译文本对齐,并且切口会按预期高亮显示活动翻译内容。
新增 tinymceai_tool_data_callback 选项,用于自定义 MCP 工具运行时显示的状态消息
TinyMCE AI 插件现在支持 tinymceai_tool_data_callback 选项。当 MCP 服务器在流式响应期间发送 mcp-tool-result 或 mcp-tool-notification 事件时,将运行此函数。该函数应返回一个字符串,该字符串将显示为在 AI 模型调用 MCP 工具时 Chat 侧边栏中显示的状态消息。
自定义审阅文本区域在为空时会显示滚动条。
之前,TinyMCE AI 审阅侧边栏的自定义审阅(Custom review)部分中的文本区域即使为空也会显示滚动条。占位符文本可能会滚动,文本区域的边角也显示为被截断,这导致控件看起来似乎损坏了。
在 TinyMCE 8.7.0 中,自定义审阅文本区域使用了更大的默认高度,因此占位符无需滚动条即可完全显示,且文本区域在为空时能正确渲染。
未提供 tinymceai_default_model 时,插件不再显示控制台警告。
之前,当未设置 tinymceai_default_model 选项时,即使省略该选项也是有效的,TinyMCE AI 插件也会记录一条控制台警告。该警告暗示了配置错误,从而引起了混淆。
在 TinyMCE 8.7.0 中,当未提供 tinymceai_default_model 选项时,TinyMCE AI 插件不再记录控制台警告。
在聊天(Chat)和操作(Actions)预览模式下,高亮的建议在点击时不再显示为选中状态,因为针对这些建议没有后续操作可用。
之前,在 TinyMCE AI 聊天和 TinyMCE AI 快速操作(Quick Actions)的预览模式下,点击高亮的建议会显示选中状态,尽管预览模式并未为高亮的建议提供任何操作。选中状态使建议看起来具有交互性,导致用户期望得到预览模式并不提供的后续操作。
在 TinyMCE 8.7.0 中,预览模式下 TinyMCE AI 聊天和 TinyMCE AI 快速操作中的高亮建议不再响应点击,也不再显示选中状态。高亮部分保持可见以供参考,因此预览模式呈现的是最终文本的只读视图。
TinyMCE AI 插件现在会向 SetContent 和 BeforeSetContent 事件载荷中添加 ai 属性。
之前,TinyMCE AI 插件在将内容置入编辑器时,未将其标记为 AI 生成。监听 BeforeSetContent 和 SetContent 事件的集成无法可靠地将这些内容与其他来源设置的内容区分开,也无法应用特定于来源的处理、跟踪或分析。
在 TinyMCE 8.7.0 中,TinyMCE AI 插件在设置内容时,会向 BeforeSetContent 和 SetContent 事件载荷添加 ai 属性。事件处理程序可以检查此属性,以检测 TinyMCE AI 生成的内容,并根据其来源做出响应。
上下文源(Context sources)现在可以在加载时移除。
之前,用户无法在文件仍在上传时从 TinyMCE AI 对话中移除上下文源。如果用户添加了一个大文件(例如图片或 PDF),则必须等待上传至 AI 服务完成后才能将其移除。插件没有提供取消已进行中请求的方法。
在 TinyMCE 8.7.0 中,上下文源上的移除按钮现在会立即取消正在进行的上传。用户无需等待请求完成,即可在上下文源加载时将其移除。
聊天功能现在可以更新空文档。
之前,聊天功能在生成内容时不会更新空文档。由于 AI 服务在文档为空时无法应用编辑,聊天功能仅在聊天侧边栏中显示生成的内容。
在 TinyMCE 8.7.0 中,AI 聊天现在可以处理对空文档的更新。当编辑器为空时,生成的内容将直接插入到文档中,而不仅仅是显示在侧边栏中。
审阅模式的键盘导航现已与聊天侧边栏保持一致。
之前,审阅(Review)侧边栏的键盘导航与聊天侧边栏不一致,因此在两个侧边栏之间切换时,仅使用键盘的工作流表现不一致。按 Esc 键也可能拒绝所有待处理的建议,而不是移动焦点,这意味着键盘用户可能会无意中丢弃建议。
在 TinyMCE 8.7.0 中,审阅侧边栏的键盘导航与聊天侧边栏相匹配。Ctrl+Alt+S 快捷键可打开审阅侧边栏并聚焦于此。Tab 和 Shift+Tab 键可在建议卡片和每张卡片上的按钮之间移动。按 Esc 键现在会移动焦点,而不再拒绝待处理的建议。仅使用键盘的用户无需鼠标即可导航并应用建议。
新增 tinymceai_reviews_change_tone_menu 选项以控制更改语气(Change Tone)审阅菜单。
TinyMCE 8.7.0 为 TinyMCE AI 添加了 tinymceai_reviews_change_tone_menu 选项。此选项控制更改语气审阅中出现的语气选项及其顺序。仅支持预设语气 ID。重复的 ID 将被移除,菜单按配置的顺序显示语气。如果选项包含无效的语气 ID,配置将被拒绝,并使用默认语气。有关有效语气 ID 和选项详情,请参阅 tinymceai_reviews_change_tone_menu。
应用审阅后,审阅侧边栏不再显示“未找到改进建议”(No improvements found)。
之前,如果在模型仍在响应时隐藏了审阅侧边栏,并且随后的审阅建议被从预览页脚应用或跳过,审阅状态将不会重置。即使审阅已完成,重新打开审阅侧边栏时也会显示“审阅完成 — 未找到改进建议”,而不是审阅列表。恢复审阅选项的唯一方法是重新加载编辑器。
在 TinyMCE 8.7.0 中,当侧边栏隐藏时,从 Preview 页脚应用或跳过建议后,review 状态现在会正确重置。重新打开 Review 侧边栏会再次显示 review 列表,因此无需重新加载编辑器即可继续运行 review。
解包嵌套列表项的提示现在会保留内容
以前,当 model 将嵌套块解包为顶层块时(例如将 <li> 项转换为 <p> 段落),会重用原始元素的 ID。diffing 逻辑将这些重用的 ID 视为对嵌套元素的更新,因此某些提示会间歇性地移除内容,而不是解包。现在,重用的 ID 只有在指向顶层元素时才会被视为已存在的块;否则会作为新元素处理。解包嵌套元素的编辑现在可以可靠地应用并保留内容。
切换回较早的会话现在会继续该会话
以前,一个回归导致较早的会话无法在 Chat 侧边栏中正确加载。在开始新的 chat 后,返回较早的会话并发送提示会开始一段脱节的交互,而不是继续原始线程。现在,切换到已存在的会话会恢复其 conversation ID,因此后续提示会继续所选会话。
图像编辑现在会作用于包含多张图像内容中的正确图像
以前,发送到 model 的图像没有被唯一标识,因此引用特定图像的提示可能会将一张图像误认为另一张,并将更改(例如 alt 文本更新)应用到错误的图像。TinyMCE AI 现在会对每个 img 元素进行唯一标记,以减少被误认的可能性。图像编辑现在会应用于目标图像,即使内容包含多张图像。
集成商现在可以通过 tinymceai_reviews 选项添加自定义 AI review
以前,Review 侧边栏仅支持一组固定的内置 review,通过 tinymceai_reviews 选项以 ID 选择。集成商没有受支持的方式添加命名 review、参数化提示或混合内置与自定义 review 的菜单。集成商不得不依赖通用流程,例如 Custom review,而不是 Review 侧边栏中的专用 review 操作。
在 TinyMCE 8.7.0 中,tinymceai_reviews 选项除了现有的内置字符串 ID 之外,还接受集成商定义的 review 对象。集成商可以定义 simple、list 和 input review 类型,每种类型都可包含自定义名称、描述和提示。完整 schema 和示例请参见 tinymceai_reviews 选项。
在内容已被替换时,AI 建议预览不再显示已删除文本
以前,在 review AI 建议时,预览会将替换操作的已删除文本和插入文本并排显示。这会让预览显得杂乱且更难阅读,因为需要同时解析原始内容和新内容,尤其是在文档包含多个替换时。
在 TinyMCE 8.7.0 中,预览会隐藏替换操作的已删除文本,仅显示新内容。选择某个替换时,会显示并高亮插入的内容,而被移除的文本保持隐藏。单独的删除操作在选择时仍会显示被移除的文本,因此纯删除仍然完全可见。这使得在 review AI 生成的更改时,预览更简洁且更易阅读。
AI 预览与编辑器内容结构不一致,导致样式渲染差异
以前,AI 建议预览会在预览 iframe body 内的 wrapper 元素中渲染内容,而不是像编辑器那样直接渲染到 iframe body。由于预览和编辑器结构不同,注入的样式可能出现不同的渲染结果。绝对定位元素以及 body 级别的 CSS 规则并不总是以相同方式应用,这可能导致一些故障,例如表格 header 和 footer 对齐错误。
在 TinyMCE 8.7.0 中,预览会将内容直接插入 iframe body,使其结构与编辑器保持一致。注入的样式现在会在两者中产生相同的视觉结果,并且预览会以与编辑器一致的方式渲染。
在 review AI 建议时,批量操作按钮现在会反映当前进度
以前,在 review AI 建议时,批量操作按钮总是显示 Skip remaining 和 Apply remaining,即使在任何建议被应用或跳过之前也是如此。这会让人困惑,因为尚未做出任何决策。
在 TinyMCE 8.7.0 中,批量操作按钮会反映当前进度。在做出第一个决策之前,它们显示 Skip all 和 Apply all,在至少一个建议被应用或跳过之后,则切换为 Skip remaining 和 Apply remaining。该行为在 Chat 和 Quick Actions 流程中保持一致。
一些 tooltip 现在仅在内容过长无法完整显示时出现
以前,TinyMCE AI 界面中的某些 tooltip 只要满足触发条件就会显示,即使内容已完整可见。这增加了不必要的视觉干扰。
在 TinyMCE 8.7.0 中,这些 tooltip 仅在内容因过长而被截断时出现。这减少了不必要的 tooltip,并保持界面更简洁。
用户提示中的空白未在 AI Chat 历史中正确渲染
此前,AI Chat 历史记录中显示的用户提示会折叠连续的空格和换行符。多行提示显示为单行连续文本,因此聊天线程中的消息与输入的内容不匹配。
在 TinyMCE 8.7.0 中,AI Chat 历史记录中的用户提示保留其原始换行和间距,同时长行仍会在消息内换行。提示现在按输入的原样显示。
将 AI 建议预览中仅含图标的按钮替换为带标签的“Apply”和“Skip”按钮
此前,AI 建议预览使用仅含图标的接受和拒绝按钮,因此每个操作的含义依赖于图标及其工具提示。这导致操作含义模糊且更难被发现。
在 TinyMCE 8.7.0 中,AI 建议预览使用带标签的按钮:主按钮 Apply 用于接受建议,次按钮 Skip 用于拒绝建议。更清晰的标签使每个操作一目了然,并提高了可访问性。
调整浏览器窗口大小时,AI 建议 diff 覆盖层并非总能保持对齐
此前,在 AI Chat 生成新内容后,调整浏览器窗口大小可能导致 AI 建议 diff 覆盖层与底层文本不对齐。在某些布局中,高亮会脱离其标记的内容,使建议预览看起来异常。
在 TinyMCE 8.7.0 中,预览覆盖层会跟踪更多类型的尺寸变化。diff 覆盖层现在保持与生成内容对齐,从而确保 AI 建议预览的准确性。
减少了 AI 审阅建议卡片中的间距
此前,AI 审阅侧边栏中的审阅建议卡片使用的内边距比预期更大,导致卡片布局与设计不一致。
在 TinyMCE 8.7.0 中,卡片头部与正文之间的间距已减少以符合设计。审阅建议卡片现在外观更紧凑、更一致。
使用 premium snow skin 时,编辑器内容会透过 AI 建议预览显示
此前,在使用 premium Snow skin 时,AI 建议预览覆盖层具有透明背景。底层编辑器内容会透过预览显示,使得阅读和评估 AI 生成的建议变得困难。
在 TinyMCE 8.7.0 中,AI 建议预览在 Snow skin 中使用纯白背景。建议现在显示在干净、无遮挡的背景上。
预览页脚中的键盘导航现在会聚焦当前活动的视图模式,而不是始终聚焦第一个
此前,在 AI Chat 中将键盘焦点移动到预览页脚时,焦点总是会落在第一个视图模式选项上,而不是当前活动的那个。这导致在 Diff 模式和 Preview 选项卡之间的键盘导航不太可预测。
在 TinyMCE 8.7.0 中,焦点会移动到预览页脚中当前活动的视图模式。键盘导航现在反映了当前选中的选项。
在离开未解决的建议之前会显示确认对话框,例如在快速操作期间切换到另一个侧边栏或打开侧边栏时
此前,在 AI 建议仍未解决时,在 AI Chat 和 Review 侧边栏之间切换,或在快速操作期间打开侧边栏,会永久丢弃这些建议及任何已应用的更改。一次意外的点击就可能导致进度丢失。
在 TinyMCE 8.7.0 中,在离开未解决的建议之前会显示确认对话框。只有确认后操作才会继续,从而防止意外丢失进行中的更改。在 Safari 中,当悬停在因省略号缩短的上下文源或对话标题上时,会同时显示两个工具提示
此前,在 Safari 中,悬停在因省略号缩短的文本(如 AI Chat 对话标题或上下文源)上时,可能会同时显示两个工具提示:浏览器的原生工具提示和插件的自定义工具提示。
在 TinyMCE 8.7.0 中,对于 Safari 中的这些元素,只会显示原生工具提示。现在悬停时会按预期显示单个工具提示。中止并开始新对话时可能会报告错误
此前,中止流式 AI 响应并开始新对话可能会报告错误。中止响应会触发文档删除操作,而该操作有时会失败。
在 TinyMCE 8.7.0 中,当 AI 请求被中止时,文档将不再被删除。中止响应并开始新对话不再报告此错误。AI 响应 HTML 现在在预览中显示之前会通过编辑器的内容管道进行过滤
此前,AI 预览中显示的内容在应用之前不会经过编辑器内容规则的过滤。在严格的 schema 配置下,更改可能会显示在预览中、被接受,然后在应用到编辑器时被移除,因此最终结果与预览不一致。
在 TinyMCE 8.7.0 中,AI 响应 HTML 在显示在预览中之前会通过编辑器的内容管道进行过滤。预览现在反映了将添加到编辑器中的内容,如果过滤删除了所有内容,用户会收到通知。如果侧边栏在模型开始响应之前关闭,AI Chat 状态会丢失
此前,如果 Chat 侧边栏在模型开始响应提示之前关闭,AI Chat 对话的状态可能会丢失。插件仅在响应开始时记录是哪个侧边栏启动了响应,因此预先关闭侧边栏不会留下记录。重新打开侧边栏会重置对话和任何待处理的预览。
在 TinyMCE 8.7.0 中,侧边栏在提示发送后立即被记录。在响应就绪前关闭并重新打开 Chat 侧边栏不再重置对话。
有关 TinyMCE AI 插件的信息,请参阅:TinyMCE AI。
改进
TinyMCE 8.7.0 还包含以下改进:
移除表情符号对话框“全部”标签页的 300 项限制
此前,表情符号对话框将全部标签页限制为 300 项。此限制是一种变通方案,因为渲染所有可用表情符号(超过 1,200 个)会导致性能问题和卡顿体验。
在 TinyMCE 8.7.0 中,表情符号对话框的渲染性能已优化,全部标签页的 300 项限制已移除。现在显示所有可用表情符号。
在打开的菜单上按 Tab 或 Shift+Tab 现在会关闭菜单并将焦点移至下一个或上一个可聚焦元素
此前,在打开的下拉菜单内按 Tab 或 Shift+Tab 会在菜单项之间循环焦点,而不是关闭菜单。此行为不符合无障碍指南,该指南建议按 Tab 键应关闭菜单并将焦点移至 tab 顺序中的下一个或上一个元素。因此,对于依赖键盘或辅助技术的用户而言,通过菜单进行键盘导航的可预测性较低。
在 TinyMCE 8.7.0 中,在打开的菜单上按 Tab 或 Shift+Tab 现在会关闭菜单并将焦点移至 tab 顺序中的下一个或上一个可聚焦元素。这使得键盘导航更具可预测性,并使下拉菜单的行为符合无障碍指南。
编辑器大小调整手柄现在使用浏览器 pointer events,以便在不同集成环境中更可靠地工作
此前,编辑器大小调整手柄依赖覆盖元素来捕获指针移动,这需要提升编辑器的堆叠顺序。这导致在调整编辑器大小期间,编辑器会出现在 TinyMCE AI 插件使用的浮动侧边栏之上。
在 TinyMCE 8.7.0 中,大小调整手柄改为使用现代浏览器 pointer events。这消除了对覆盖元素和提升堆叠顺序的需求,从而在不同集成环境中提供更可靠的大小调整,并解决了与浮动侧边栏的重叠问题。
新增内容
TinyMCE 8.7.0 还包含以下新增内容:
用于屏幕阅读器播报的新 tinymce.dom.AriaAnnouncer API
TinyMCE 8.7.0 添加了 tinymce.dom.AriaAnnouncer API,用于通过 aria-live 区域向屏幕阅读器发送消息,而不会移动焦点。announce 方法接受一条消息和一个可选的 { assertive } 设置。集成者可以使用它来播报格式更改,例如通过监听 FormatApply 和 FormatRemove 事件。
tinymce.dom.AriaAnnouncer.announce('Bold on');
tinymce.dom.AriaAnnouncer.announce('Error occurred', { assertive: true });变更
TinyMCE 8.7.0 还包含以下变更:
将 LESS 数学模式从 always 更改为 parens-division。
此前,Oxide Less 编译器以 math: 'always' 运行,将每个 / 字符都视为除法运算符。使用现代 CSS 颜色语法时,Oxide Less 编译器可能会错误地编译诸如 rgb(10 10 10 / 10%) 或 hsl(from var(--color) h s l / 10%) 之类的函数。在某些情况下,编译器会在不发出警告的情况下静默生成不正确的值,例如 rgb(10 10 10 / 10%) 变成 rgb(10, 10, 1) 而不是保留 alpha 通道。
在 TinyMCE 8.7.0 中,Oxide Less 编译器使用 parens-division 数学模式。编译器仅在运算被括号包裹时才执行除法,并在 CSS 颜色语法中保留 /。TinyMCE 更新了 Oxide Less 文件中现有的除法表达式,以将除法包裹在括号中。编译 Oxide Less 的自定义皮肤作者必须将除法运算包裹在括号中。
从源代码构建 TinyMCE 现在使用 Bun 而非 Yarn
此前,从源代码构建 TinyMCE 需要 Yarn,并且仓库提供了 yarn.lock 文件来锁定依赖版本。贡献者和自定义皮肤作者会运行 yarn、yarn build 和 yarn oxide-start 等命令。
在 TinyMCE 8.7.0 中,仓库使用 Bun 进行包管理和构建脚本,并提供 bun.lock 文件来替代 yarn.lock。等效命令为 bun install、bun run build 和 bun oxide-start。Yarn 不再解析仓库依赖。此更改不影响从 npm 安装 TinyMCE 或从内容分发网络 (CDN) 加载 TinyMCE 的集成者。有关更新后的皮肤构建步骤,请参阅 创建皮肤。
错误修复
TinyMCE 8.7.0 还包含以下错误修复:
块级格式现在在跨表格单元格选择时针对正确的元素
此前,当选择多个表格单元格时,检查块级是否可以重命名时不会检查嵌套元素。例如,对于包含标题的 blockquote,应用新的标题格式会更改 blockquote 而不是标题。
在 TinyMCE 8.7.0 中,该检查会检查嵌套元素,因此块级格式会应用于正确的元素。
当选择不可编辑的内联元素时,现在可以应用块级格式
此前,选中内联 contenteditable="false" 元素(例如被Media插件包裹的iframe)并应用块级格式(例如自定义类或标题样式)时,会静默失败,且不会产生任何效果。
在TinyMCE 8.7.0中,在此情况下,块级格式会应用到最近的可编辑父级块,包括添加类和样式,以及更改块标签。
缩进现在会应用到所有选中的表格单元格
此前,在选中多个表格单元格的情况下应用缩进时,只会影响松开指针时所在的单元格。该操作使用的是浏览器的原生选择,而非编辑器的单元格选择,因此其余选中的单元格保持不变。
在TinyMCE 8.7.0中,缩进会应用到选区中的每个单元格。
拖放或复制粘贴图片时,未向标签添加 width 和 height。
此前,当用户将图片拖放或复制粘贴到编辑器中时,TinyMCE会插入一个不含 width 和 height 属性的 img 标签。插入的 img 标签缺少“图片”对话框会添加的尺寸属性。
在TinyMCE 8.7.0中,编辑器会读取拖放或粘贴的图片的尺寸,并将 width 和 height 属性添加到 img 标签。拖放或粘贴的图片现在会包含与“图片”对话框添加的相同的 width 和 height 属性。
当编辑器托管在shadow DOM中且其父元素具有 overflow:scroll 时,工具提示会被裁剪。
此前,当TinyMCE在shadow DOM(例如Web组件)中运行时,如果宿主元素的父元素使用了 overflow: scroll,那么该元素会裁剪超出宿主元素边界的工具提示。被裁剪的工具提示可能会变得无法辨认。
TinyMCE 8.7.0会将工具提示的定位限制在宿主元素的边界内。现在,工具提示会重新定位以保持在宿主元素内,并且在TinyMCE于shadow DOM中运行时保持可见。
删除列表项内的换行符会删除整个列表项。
此前,在原本为空的列表项内按 Backspace 键删除换行符 (<br>) 时,会删除整个列表项,而不仅仅是换行符。该问题会影响通过 Shift + Enter 创建的列表(包括嵌套列表),并且会在无警告的情况下删除内容。
在TinyMCE 8.7.0中,Backspace 键只会删除换行符,并保留空的列表项。
解析时,style属性中的CSS自定义属性名称和颜色值会被转为小写
此前,TinyMCE的样式解析器在读取 style 属性时,会将CSS自定义属性名称(例如 --MyColor )以及 color 和 background-color 的值转为小写。这会改变区分大小写的值,包括CSS自定义属性、模板占位符(例如 {{FooBar}} )以及十六进制颜色(例如 #AABBCC ),因此受影响的样式有时无法按创作时的原样渲染。
在TinyMCE 8.7.0中,样式解析器会保留CSS自定义属性名称以及 color 和 background-color 值的原始大小写。标准属性名称仍会转为小写,且其他处理(例如RGB到十六进制的转换、简写合并以及安全过滤)保持不变。区分大小写的颜色和自定义属性现在会完全保持创作时的原样。
深色模式下,聚焦的链接的文字颜色与背景颜色相同
此前,在深色模式下,聚焦或选中的链接会以与背景相同的文字颜色显示。这会导致链接文本在选中时无法阅读。
在TinyMCE 8.7.0中,深色模式下选中的链接文本会以白色显示。链接在聚焦时保持可读,从而提高了深色模式下的可访问性。
position为 'line' 的上下文工具栏在溢出视口时不会重新定位到另一侧
此前,配置了 position: 'line' 的上下文工具栏(例如quickbar)在溢出视口边缘时不会重新定位。在这种情况下,工具栏可能会被截断,导致用户无法点击其按钮。
在TinyMCE 8.7.0中,使用 position: 'line' 的上下文工具栏在空间不足时会翻转到另一侧。该工具栏在受限布局中会保持完全可见且可用。
部分带有注释的文本在打印时被隐藏,尽管它本应可见
此前,由注释功能(例如拼写指示器)标记的文本在打印页面时可能会被隐藏。这些注释被包裹在内部占位符元素中,而这些元素在打印时会被隐藏,这同时也隐藏了其中包含的文本。
在TinyMCE 8.7.0中,仅作为包装器的占位符元素在打印时会隐藏其样式而非其内容。注释高亮在打印输出中保持隐藏,而底层文本则会按预期打印。
解决了一个Chromium bug,在该bug中点击 li 右侧可能会失败
此前,点击列表项内容右侧时,光标可能会放置在项的开头而非实际点击的位置。这是由一个Chromium浏览器bug引起的,该bug会将插入符移动到不正确的位置。
在TinyMCE 8.7.0中,一个有针对性的变通方案可以检测这种情况并纠正插入符的位置。现在,点击列表项右侧会将光标放置在预期的位置。
使用撤销快捷键无法正确恢复编辑器选区
此前,在删除选区后按撤销快捷键(Ctrl+Z,macOS 上为 Cmd+Z),光标可能会停留在错误位置。早先的一项更改会在每次按下 Ctrl 或 Cmd 时登记一个额外的撤销步骤,因此在恢复被删除内容之前先记录了该步骤。
在 TinyMCE 8.7.0 中,仅当 Ctrl 或 Cmd 与 Backspace 或 Delete 一同按下时才会登记该撤销步骤,而不是在每次按下 Ctrl 或 Cmd 时都登记。撤销删除选区操作现在可以正确恢复内容以及原始选区。
在未进行本地构建的情况下启动 Oxide 皮肤演示会失败,并出现含糊不清的错误
此前,如果在未从仓库根目录构建 TinyMCE 的情况下启动 Oxide 皮肤演示,会报错 chalk.red is not a function。演示构建任务试图报告缺少本地构建,然后替换为云端托管的 TinyMCE 副本。但报告步骤却引发了该错误。自定义皮肤作者无法运行演示来测试皮肤更改,而且错误消息也未将缺少本地构建标识为原因。
在 TinyMCE 8.7.0 中,演示构建任务会停止并显示一条指明所需步骤的消息:
Local TinyMCE build not found. Run `bun run build` in the repository root to build TinyMCE before starting the skin demo.
演示构建任务不再替换为云端托管的 TinyMCE 副本,因此演示始终基于本地构建运行。自定义皮肤作者现在可以在启动演示之前构建 TinyMCE,从而解决该失败问题。