首页/文章/富文本

富文本格式粘贴的问题

2024-09-02
18507 分钟
...

回到最初的问题,利用富文本编辑器,编写邮件模板,或者说,提供一个编辑器,用来编写邮件。如果说编写邮件而已,大可以在 word 或者其他编辑器里写好内容,但这里的一个特点就是 占位符 。所以说,这是要保持邮件编辑器的功能,然后还能使用占位符。

前面也是利用了 vue-quill-editor实现了 占位符 ,且具有不可编辑的特点。另外也具有了编辑器的基础功能,如文字大小、颜色、背景、居中、缩进等等。在开发中,只关注于编辑器本身,即这个编辑器能编辑就可以了,忽略了 邮件 这个功能。

后面也是在实际应用中发现了这个问题,样式丢失,所以总结起来有以下几点问题。

1. 系统内的样式

通过观察 element 发现,vue-quill-editor使用的是类样式,比如居中,就是ql-align-center。当在新增页面居中文字时,没有样式问题。在编辑页面,数据回显后页面问题。但是当在详情页,不使用vue-quill-editor,而是使用v-html渲染时,就发现完全没有样式。窥其原因,就是项目内没有ql-align-center这个样式。解决办法当然也很简单,按照vue-quill-editor的内置样式,自己写一份放在项目中。

2. 系统外的样式

在系统内,因为自己配置了对应的样式,因此没有样式问题。但是当我们应用了这个邮件模板,将邮件发送出去后,在另一端,居中等样式是失效的,让用户配置对应的样式是不合理也是不可能的。所以为保证样式问题,编辑器的样式不能使用class,而必须使用 内联样式。通过查阅祥资料,vue-quill-editor支持 class内联style ,但是默认了 class

1.配置字体大小

引入 .scss文件,设置编辑器的样式。

import './quill-editor.scss';
const fontSizeStyle = Quill.import('attributors/style/size'); 
fontSizeStyle.whitelist = ['14px', '16px', '18px', '20px', '22px', '24px', '26px', '28px', '30px', '32px', '34px', '36px'];
Quill.register(fontSizeStyle, true);

注册该配置后,设置字体大小时,fontSize 就是写在了 style 上。

2.配置对齐方式
const Align = Quill.import('attributors/style/align');
Align.whitelist = ['right', 'center', 'justify'];
Quill.register(Align, true);

同样,配置该配置后,text-align 就写在了 style 上。

3.缩进问题思考

这个问题应该是 以上第二点解决的,但却放在这里,因为有点特殊————无法设置

按照我们的理解,缩进应该是 text-indent , 但在 vue-quill-editor 里,缩进却是用了 padding-left,而且是 clsss 样式。在vue-quill-editor里并没有像居中一样,提供 style 的方案。所以在缩进这块,我的想法是使用野路子,根据 class ,设置相应的映射关系,给标签加上 text-intent 的 style。

此种设想,我经过多次尝试,思路是这样的,如果标签有缩进 ql-indent-1 这种类名,再加上text-indent

1. 查找标签

正则匹配含有 class="ql-indent-*"的标签,但是标签会存在单一标签,多层嵌套标签,因此使用正则很难能匹配到正确的标签。经过多次测试,发现缩进都是加在 p标签 上,那就简单一点,匹配 p标签头

2. 添加 style

这里有两个注意点,得先判断一下原来有没有 style 。如果已存在 style ,则是向 style 里添加 text-indent; 如果没有 style 则是设 style="text-indent:3em" 之类的。在实操过程中,如果原先没有 style ,那添加 style 是非常顺利的。如果原先就存在 style ,比如说,原先就有 style="text-align:center",这时添加 text-indent:3em ,这里也没问题。

但是忽略了一点,在我设置缩进之后,再进行对齐,就有问题了。缩进之后是 style="text-indent:3em",这是设置居中,毕竟不是方法处理的,打印编辑器内容就会发现,这个标签里面有两个 style 。 如

      <p class="ql-indent-1" style="text-indent:3em" style="text-align: center;">你好</p>

这就难搞了,意味着要在某个节点对这个编辑器内容进行处理,比如说提交表单的时候,把字符串处理好,添加style,只留有一个 style 等,再存入数据库。不过在实操过程中,确实是处理好了,保证只有一个 style ,缩进的样式也写入了 style ,并存入了数据库,但在数据回显的时候,出了问题。

  • 样式格式化

    在数据向 vue-quill-editor 回显的时候,编辑器做了处理,可以理解成不是这个编辑设置的 style ,它都通过去掉。前面是已经设置了 text-indent ,但是数据在渲染到富文本后,通过调试 element 发现,这个样式并不存在。

  • 占位符失效

    之前的占位符经过了处理,就是设置了颜色,添加了类名和不可编辑的属性。如

   <span class="non-editable" style="color: blue;" contenteditable="false"></span>

但是在数据回显的时候,这个 span 被处理了,变成了一个普通的 span ,这个不可编辑的功能没了,这是不能被接受的。另外为什么会变成这样,也是不得而知。

4.其它问题思考

经过这些操作,好像只完成了对齐方式的处理。用方法处理缩进带来的缺陷太大了。另外回到 邮件的基本功能 ,发现目前的编辑器,并没有实现原格式粘贴,就算是完成缩进,那也只是完成一小点。

对于原格式粘贴,boss 的原话是:人家为了方便,从 word 粘贴过去应该要支持。 我思考了一下,先不说 word 的问题,单单从数据来源出发,比如在别的编辑器写好,复制粘贴。如果别的编辑器没有带 style 样式,那如何粘贴其样式,就是所谓的保留原格式? 对于原格式,我查了一下哪个编辑器支持,有说是 Tinymce ,正好 vue-element-admin 框架自带了,我试了一下,并没有完全成功。同样也有另一种声音,说配合 Microsoft 的一个插件,可以粘贴 word 的原格式,不过需要付费,这也试不了啊。

总之,人家需要实现一个可以粘贴原格式的编辑器,如 foxmail 这些,但目前来说,有这种开源的富文本编辑器吗?

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
富文本2025-01-04
Monaco Editor,代码编辑器神器
本文介绍了 Monaco Editor 这款微软开源的基于浏览器的代码编辑器,它功能强大,包括语法高亮、代码补全等,具有轻量、可定制、跨平台等特点。文中阐述了其应用场景、使用方法、基本概念等,还列举了类似项目并给出项目地址,适合多种开发需求。 关联问题: Monaco支持哪些语言 如何定制Monaco 怎样优化界面效果 Monaco Editor是微软开源的一款基于浏览器的代码编辑器,它源自于Visual Studio Code(简称V...
学习
富文本2024-05-09
vue3集成tinymce
简介 看了一圈富文本编辑器,发现 和 比较符合自己的需求,功能上 更加丰富、简单一些。 吐槽 吐槽一下 的官网,给了 这个组件包,但是没想到就只是简单包装了一下(期初以为下载完这个包,引入vue组件内就完成了!),没想到如果只是单独引入这个包,是需要 的,而且是云托管方式去下载 ,导致反复看官网折腾了好久! 自托管集成方式 有两种方式,一种是使用包管理工具、另一种是zip包。 ,因为 还是挺大的,开发和打包过程影响编译时间。 以下面技术...
学习
富文本2024-05-08
新一代富文本编辑器框架lexical入门
是一款 基于 开发的网页端文本编辑框架,具备高拓展性架构,以高可靠性、易用性以及性能表现为核心设计思想。本身不与任何框架绑定,可独立于 、 使用(不过由于 与 的亲和性, 有 版)。使用者可在其基础上建立属于自己的独一无二的文本编辑器 目前在 内部,每天 通过 、 、 、 、 等产品服务千百万用户,稳定性及可靠性值得信赖 的核心包(上图左侧部分)只有22kb,其余能力以 形式提供。框架支持延迟加载, 可以在用户真正操作编辑器的时候再加载...
学习
富文本2024-05-06
再遇协同编辑:Yjs + Quill,文档协同编辑竟如此简单
通过上一篇文章 ,相信各位小伙伴对 OT 和 CRDT 协同算法有了一定的了解,并且对 Yjs 有了初步的认识,本文主要教会大家如何使用 Yjs 来实现 Quill 的协同编辑,以及针对 Yjs 的一些重要概念进行讲解。 因为协作需要服务端的支持,所有没有 demo,具体实现请 。 Yjs 介绍 官方介绍: 用于构建 Google Docs 和 Figma 等协作应用程序的模块化构建块 。 基于 CRDT ,帮助实现高性能的协作应用程序...
学习
富文本2024-04-25
Vue使用wangEditor富文本编辑器报错(ot find a descendant at path [0,1] in node: {“children“:[{“type“:“paragraph)_cannot find a descendant at path [0,1] in node
答案 时渲染dom报错问题: 每题的答案 修改文字样式后切换报错 解决办法: 在动态切换答案回显的同时删除 wangEditor 的实例然后异步重新创建一遍进行回显 代码片段:
学习
富文本2024-04-15
Editor.js 开发 Notion 风格富文本编辑器
前言 开发一个编辑博客内容的富文本编辑器,风格类似于 Notion 块级的编辑器,研究了 开源项目,和它的风格接近,editorjs 界面简洁,操作个人感觉很高级,插件灵活易扩展,样式可编辑修改,开发成本也没有那么复杂 介绍 Editor.js 亮点 用户界面友好 :Editor.js 提供了一个直观且易于使用的用户界面,能够轻松地创建和编辑文档 模块化编辑 : 使用块级元素(blocks)的方式组织文本,每个块负责处理不同类型的内容,...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录