感谢 Fluent Editor 开源富文本首位贡献者!
本文由体验技术团队Kagol原创。
2024年8月20日,刚开源一周的富文本 Fluent Editor 迎来了第一位贡献者:zzxming
1、Bug 描述
zzxming 同学修复了 Fluent Editor 富文本表格模块的一个隐藏 Bug:
fix: table module can't save background color #10
缺陷描述:通过表格右键菜单设置单元格背景色之后,生成的 delta 中缺失单元格背景色信息,导致通过 setContents 方法设置的富文本表格单元格丢失了背景色。
这样描述可能比较绕口,zzxming 同学非常贴心地做了一个 Demo 用于复现该问题:
最小可复现 Demo:https://stackblitz.com/edit/vitejs-vite-quwkzn?file=src%2FApp.vue&terminal=dev
2、Bug 复现步骤
第一步:在表格单元格中右键,给单元格设置一个背景色。
第二步:通过 editor.getContents() 获取到的对应的 delta。
const delta = { "ops": [ { "attributes": { "table-col": { "width": "100" } }, "insert": "\n" }, { "attributes": { "table-cell-line": { "rowspan": "1", "colspan": "1", "row": "row-xapy", "cell": "cell-e89w" }, "row": "row-xapy", "cell": "cell-e89w", "rowspan": "1", "colspan": "1" }, "insert": "\n" } ] }
可以看到 delta 没有携带单元格背景色信息。
第三步:将 delta 通过 setContents 方法回填到富文本中,单元格没有背景色。
editor.setContents(delta)
3、解决方案
修改文件:packages/fluent-editor/src/table/formats/table.ts
修复该问题主要分成以下步骤:
- 把 delta 中的 cell-bg 设置到 qlbt-cell-line 节点的
data-cell-bg
属性中 - 从 qlbt-cell-line 节点中拿到
data-cell-bg
的值,回填到单元格背景色 - 将 DOM 节点中的
data-cell-bg
值,保存到 delta 中
3.1 将 delta 中 cell-bg 信息设置到 DOM 节点中
将 delta 信息设置到 DOM 节点中,一般是在 blot 的
static create
方法中进行。
static create(value) { const node = super.create(value); ... - CELL_ATTRIBUTES.forEach((attrName) => { - node.setAttribute(`data-${attrName}`, value[attrName] || CELL_DEFAULT[attrName]); + [...CELL_ATTRIBUTES, 'cell-bg'].forEach((attrName) => { + const keyValue = value[attrName] || CELL_DEFAULT[attrName]; + keyValue && node.setAttribute(`data-${attrName}`, keyValue); }); ... return node; }
先从 delta(value) 中拿到 cell-bg 信息,然后设置到 DOM 节点的 data-cell-bg 属性中。
value 的结构:
{ rowspan: '1', colspan: '1', row: 'row-xapy', cell: 'cell-e89w', cell-bg: '#ffff00' }
3.2 回填 cell-bg 到单元格背景色
zzxming
同学不仅修复了这个 Bug,还做了一个小重构,将设置单元格背景色这个功能抽成了一个函数 setCellBg
,并且加了详细的注释,点赞👍
/** this method is for TableCellLine to change cell background color * if use `format('cell-bg', value)` will loop trigger * TableCellLine.optimize -> TableCell.format -> TableCellLine.optimize ... */ setCellBg(value?: string) { if (value) { this.domNode.style.backgroundColor = value } else { this.domNode.style.backgroundColor = 'initial' } }
在 TableCellLine 类的 optimize 方法中调用该函数,以便把 delta 中的 cell-bg 颜色设置到表格单元格。
3.3 将 cell-bg 信息保存到 delta 中
将 DOM 的信息保存到 delta 中,一般是在 blot 的
static format
方法中进行。
在 TableCellLine 类的 static format 方法中调用了 reduceFormats 函数,给该函数传入 cell-bg 信息。
static formats(domNode) { const formats = {}; if (formats['list']) { formats['list'] = domNode.classList.item(0); } - return reduceFormats(domNode, formats); + return reduceFormats(domNode, formats, ['cell-bg']); }
在 reduceFormats 中获取到 DOM 中的 data-cell-bg,并设置到 delta 数据中。
- function reduceFormats(domNode, formats) { - return CELL_ATTRIBUTES.concat(CELL_IDENTITY_KEYS).reduce((tableFormats, attribute) => { + function reduceFormats(domNode:HTMLElement, formats:Record<string, any>, extraFormat: string[] = []) { + return [...CELL_ATTRIBUTES, ...CELL_IDENTITY_KEYS, ...extraFormat].reduce((tableFormats, attribute) => { if (domNode.hasAttribute(`data-${attribute}`)) { tableFormats[attribute] = domNode.getAttribute(`data-${attribute}`) || undefined; } return tableFormats; }, formats); }
该问题已解决,可以通过以下链接进行验证:
详见 zzxming 同学提交的 PR:
fix: table module can't save background color #10
3.4 优化点
这里其实有个优化点(欢迎 PR 👏):
目前 zzxming 同学在 static create 和 reduceFormats 方法中传入 cell-bg 都是直接增加的,其实可以放到 CELL_ATTRIBUTES 常量数组中,合理利用现有的代码😋。
- export const CELL_ATTRIBUTES = ['rowspan', 'colspan']; + export const CELL_ATTRIBUTES = ['rowspan', 'colspan', 'cell-bg'];
感谢 zzxming 同学对 Fluent Editor 的贡献,目前已发布 v3.18.3 版本,欢迎朋友们使用 Fluent Editor,感兴趣也欢迎一起参与共建。
往期文章推荐:
- Fluent Editor:一个基于 Quill 2.0 的富文本编辑器,功能强大、开箱即用!
- 重回铁王座!时隔5年!Quill 2.0 终于发布啦
- 深入浅出 Quill 系列之使用篇1:Quill 基本使用和配置
- 深入浅出 Quill 系列之使用篇2:通过 Quill API 实现对编辑器内容的完全控制
- 深入浅出 Quill 系列之原理篇1:现代富文本编辑器 Quill 的模块化机制
- 深入浅出 Quill 系列之原理篇2:现代富文本编辑器 Quill 的内容渲染机制
- 深入浅出 Quill 系列之实践篇1:如何将龙插入到编辑器中?
- 深入浅出 Quill 系列之实践篇2:整个贪吃蛇游戏到编辑器里玩儿吧
- 深入浅出 Quill 系列之选型篇:Quill 富文本编辑器的实践
- Kagol 个人博客:https://kagol.github.io/blogs
关于OpenTiny
TinyVue 源码:https://github.com/opentiny/tiny-vue (欢迎 Star ⭐)
TinyEngine 源码:https://github.com/opentiny/tiny-engine (欢迎 Star ⭐)
B站:https://space.bilibili.com/15284299
欢迎加入 OpenTiny 开源社区。添加微信小助手 opentiny-official 一起参与交流前端技术~
(温馨提示:OpenTiny CCF开源创新大赛也在持续报名中,欢迎大家一起报名参赛,赢取10W奖金:https://www.gitlink.org.cn/competitions/track1_openTiny )

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Apache SeaTunnel Zeta 引擎源码解析(一)Server端的初始化
引入 本系列文章是基于 Apache SeaTunnel 2.3.6版本,围绕Zeta引擎给大家介绍其任务是如何从提交到运行的全流程,希望通过这篇文档,对刚刚上手SeaTunnel的朋友提供一些帮助。 我们整体的文章将会分成三篇,从以下方向给大家介绍: SeaTunnel Server端的初始化 Client端的任务提交流程 Server端的接收到任务的执行流程 由于涉及源码解析,涉及篇幅较大,所以分成系列文章来记录下一个任务的整体流程。 参考 [ST-Engine][Design] The Design of LogicalPlan to PhysicalPlan:https://github.com/apache/seatunnel/issues/2269 作者介绍 大家好,我是刘乃杰,一名大数据开发工程师,参与Apache SeaTunnel的开发也有一年多的时间了,不仅给SeaTunnel提交了一些PR,而且添加的一些功能也非常有意思,欢迎大家来找我交流,其中包括支持Avro格式文件,SQL Transform中支持嵌套结构查询,给节点添加Tag达到资源隔离等。 近期推送Sea...
- 下一篇
JS 网页全自动翻译 v3.8 发布,增加第二个美国翻译集群
两行 js 实现 html 全自动翻译。 无需改动页面、无语言配置文件、无 API Key、对 SEO 友好! 升级说明 translate.js 增加对翻译结果全部转小写显示的能力,以避免大小写混合感觉有些乱。(此能力只限使用 translate.service 翻译通道才有效) translate.js 企业版增加两个网络节点,分别位于香港、美国。 translate.js 优化繁体字的识别精度 translate.service 企业级翻译通道增加美国集群主机 translate.service 企业级翻译通道部署架构优化,有原本的国内北京集群,转为默认使用美国的集群提供服务,而国内北京集群提供备用,出现异常情况时自动触发进行主备切换,充分保障翻译通道的稳定。 translate.service 企业级翻译通道集群的SLB后端节点自动化测速优化,有原本的线程、定时任务 外,又增加一层健康检查,充分保障SLB后端每个节点的实时测速接入集群。 translate.api 修复 StringUtil.urlToString 如果这个字符串本身是特殊字符或者艺术字等,转换出来的字符串是乱...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7