富文本编辑器Quill全套教程


Quill简介

Quill是一款现代的富文本编辑器,它以其API驱动的设计和对文本格式的深度理解而著称。与传统的富文本编辑器不同,Quill专注于以字符为中心,构建了一个直观且易于使用的API,使得开发者能够轻松地对文本进行格式化和编辑。它的核心API允许开发者通过任意索引和长度进行访问或修改,而其事件API则以直观的JSON格式报告更改,极大地简化了文本编辑的过程。

Quill的设计理念不仅仅局限于传统的文本编辑功能,它还考虑到了网络内容的多样性和丰富性。Quill公开了自己的文档模型,这是一个对DOM的强大抽象,允许开发者进行内容和格式的扩展和定制。这使得Quill能够支持无限可能的格式和内容,包括嵌入幻灯片、交互式清单和3D模型等,满足了现代网络环境下对内容创作工具的高要求。

在跨平台支持方面,Quill坚持高标准,确保在不同的操作系统和浏览器上都能提供一致的用户体验。无论是在桌面还是移动设备上,Quill都能保证内容和格式的一致性,为用户提供无缝的编辑体验。

Quill的使用门槛极低,即使是没有相关经验的开发者也能快速上手。通过几行简单的JavaScript代码,用户就可以开始使用Quill的强大功能。Quill提供了合理的默认设置,用户可以根据自己的需求进行定制,享受丰富且一致的编辑体验。总而言之,Quill以其灵活性、易用性和强大的功能,成为了现代网络内容创作的理想选择。

一、核心概念


Quill是一个现代的、开源的富文本编辑器,常用于网页和应用程序中。它以其灵活性和模块化而著名,允许开发者高度定制以适应不同的需求。Quill的实现包括多个核心概念,下面是一些最关键的:

  1.  Delta:Delta是Quill中用于表示文本更改和内容状态的主要数据格式。它是一个丰富的操作列表,可以表达添加、删除、格式化文本等操作。Deltas使得实现撤销、重做和文档协作编辑变得简单。 
  2.  Parchment:Parchment是Quill背后的文档模型。它定义了如何在Quill编辑器内部表示文本和格式。Parchment使用Blot来构建文档的抽象表示,每个Blot代表文档中的一个可编辑元素,例如一个字符、一个格式化标签或一个嵌入的内容(如图片)。 
  3.  Blot:Blot是Parchment文档模型中的基本构建块。每个Blot代表文档中的一个元素,可以是一个文本块、一个格式、一个容器或一个嵌入物(如图片、视频)。Blot可以嵌套,使得复杂的文档结构通过简单的构建块组合而成。 
  4.  Module:Quill是模块化设计的,这意味着它的功能可以通过添加模块来扩展。模块可以是任何东西,从简单的工具栏按钮到复杂的第三方API集成。这种设计让开发者能够自定义编辑器以满足特定需求,而不必从头开始构建。 
  5.  Toolbar:Toolbar是Quill的一个模块,提供了一个用户界面,使用户能够轻松应用格式化选项,如粗体、斜体、下划线、列表和其他富文本功能。Toolbar可以高度定制,开发者可以选择包括哪些格式化选项。 
  6.  Themes:Quill支持主题,这允许开发者和设计师定制编辑器的外观和感觉。Quill提供了一些内置主题,但也允许创建完全自定义的主题。 
  7.  API:Quill提供了一个强大的API,允许开发者编程方式控制编辑器的行为,包括内容的创建、修改、格式化以及事件处理。这使得开发者可以构建复杂的编辑功能,如文本分析、自动格式化和更多。 
  8.  Events:Quill触发多种事件,使得开发者可以响应编辑器内发生的各种动作,如文本改变、选择改变等。这为开发高度交互的编辑体验提供了可能。 

Quill的这些概念共同构成了一个强大而灵活的编辑框架,能够适应从简单的文本编辑到复杂的富文本处理的各种需求。

二、Quill的实现原理


Quill 是一个流行的富文本编辑器,它使用了 Deltas 和 Parchment 这两个核心概念来实现富文本的编辑和样式渲染。下面是对这两个概念及其在 Quill 中作用的详细解释:

1. Deltas

Deltas 是 Quill 中用于表示文本更改的数据格式。它是一个富有表现力的格式,能够捕获一系列操作,这些操作可以可以是插入(Insert)、删除(Delete)、保留(Retain)。Delta 对象本质上是一个包含这些操作的数组。每个操作都是一个对象,描述了应该对文本执行的操作(如插入、删除、保留)以及相关的属性(如加粗、斜体、颜色等)。

  1.  插入(Insert)操作
    插入操作用于将新内容添加到文档中。它可以是纯文本,也可以是具有特定格式的文本或非文本元素(如图片、视频等)。
    语法示例: 
{ insert: 'Hello, world!' }
{ insert: 'Hello, world!', attributes: { bold: true } }
{ insert: { image: 'http://path/to/image.png' } }

  1.  删除(Delete)操作
    删除操作用于从文档中移除一定数量的字符。它只需要一个数字来表示要删除的字符数。
    语法示例: 
{ delete: 5 }


这表示删除从当前位置开始的5个字符。 

  1.  保留(Retain)操作
    格式操作用于修改文档中特定文本的格式,比如字体大小、颜色等。它需要指定格式的范围和要应用的格式。
    语法示例: 

{ retain: 6, attributes: { bold: true } }


这表示保留当前位置开始的6个字符,并将它们加粗。 

案例示例

假设我们有一个文档,其中包含文本 "Hello, world!",我们想要进行以下操作:

  1. 跳过前5个字符("Hello")。
  2. 加粗接下来的7个字符(", world")。
  3. 删除最后的感叹号。
  4. 在文档末尾插入 " Have a nice day!"。

这些操作的Deltas表示如下:

[{ retain: 5 },{ retain: 7, attributes: { bold: true } },{ delete: 1 },{ insert: " Have a nice day!" }
]

这个序列的意思是:

  1. 保留前5个字符("Hello")。
  2. 接下来的7个字符(", world")将被加粗。
  3. 删除一个字符("!")。
  4. 在文档的末尾插入字符串 " Have a nice day!"。

通过这样的Deltas序列,Quill可以准确地执行一系列复杂的编辑操作,从而有效地更新和渲染文本编辑器的状态。

使用 Deltas 的好处

  • 不变性(Immutability):Deltas 一旦创建,就不会改变。这有助于避免副作用和状态管理的复杂性,也便于实现撤销/重做功能。
  • 操作合并(Operational Transformation):Deltas 可以用于实现协作编辑,即多个用户同时编辑同一文档。通过操作合并,可以将不同用户的更改无冲突地集成到文档中。
  • 轻量级:Deltas 只描述改变的部分,不需要存储整个文档状态,从而降低了数据传输和存储的开销。

2. Parchment

Parchment 是 Quill 中的一个文档模型,负责维护文档的结构和样式。它是 Quill 的扩展点,允许开发者自定义格式和嵌入内容。Parchment 定义了一系列的 blot(墨迹),每个 blot 对应文档中的一个元素,如一个字符、一行或一个嵌入的图片。

Parchment 的特点

  • 模块化:Parchment 允许开发者通过定义新的 blot 来扩展编辑器的功能,使其能够渲染和编辑各种类型的内容。
  • 抽象层:Parchment 提供了一个抽象层,隔离了文档内容和它们在编辑器中的视觉表示。这意味着开发者可以改变内容的渲染方式,而不影响内容本身的结构或意义。
  • DOM 无关:虽然 Parchment 通常用于浏览器中,但它被设计为与 DOM 解耦的,这使得它可以在非浏览器环境中使用,如服务器端或测试环境。

Deltas 和 Parchment 的关系(重点理解)

  •  应用 Deltas: 当用户在 Quill 编辑器中进行编辑时,每个操作(如键入文字、应用格式等)都会生成一个或多个 Delta 操作。这些 Delta 操作随后被应用到 Parchment 文档模型上,实际上改变了文档的内容和格式。例如,一个insert操作会在 Parchment 中创建一个新的文本 Blot,而一个格式化操作则可能修改现有 Blot 的属性。 
  •  生成 Deltas: 当文档的状态改变时(无论是通过用户交互还是程序化的编辑),Parchment 模型的这些更改会被转换回 Delta 操作。这些 Delta 可以被用来记录更改、撤销/重做操作,或者将编辑器的状态同步到服务器。 
  •  格式化与属性: Parchment 使用 Attributor 类(包括 StyleAttributor 和 ClassAttributor)来处理特定的格式化属性,这些属性再通过 Deltas 应用到文本上。这意味着 Delta 中的格式化指令直接对应于 Parchment 中如何设置和管理这些属性。 

简而言之,Deltas 提供了一种描述文本更改的方式,而 Parchment 提供了实现这些更改的机制。Deltas 定义了"什么"更改应该发生,而 Parchment 处理"如何"在文档模型中实现这些更改。

三、定制Quill


请参看详细文档:如何定制Quill

四、构建自定义模块


请参看详细文档:构建自定义模块

五、Parchment使用与实现原理


具体的Parchment的使用和实现请参看以下两篇内容:

  • 使用Parchment自定义Quill
  • Parchment的实现原理

六、Delta的设计思想


请参看详细文档:设计Delta格式

至此,已经介绍完了Quill的使用与实现原理,赶紧开始制作属于你自己的富文本编辑器吧!如果本文对你有帮助,请记得点赞。关注我,分享更多实用技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker,anaconda环境的部署与迁移

功能上线将提上日程,但是如何将我windows环境下的程序放到linux服务器的测试环境跑通呢?这是我这整个清明假期将要解决的一件事,最蠢的办法就是看自己的环境下有哪些依赖,如何到服务器上一个一个下,但是首先这个方法很…

操作系统导论课后作业-第十七章答案

课程作业-第十七章: 17.1首先以标志flag -n 10 -H 0 -p BEST -s 0运行程序来产生一些随机的分配和空闲。你能预测malloc()/free()会返回什么吗?你可以在每次请求后猜测空闲列表的状态吗?随着时间的推移,你对空闲列表有什么发现&a…

深度学习模型--残差网络(ResNet)

AI大模型学习 方向一:AI大模型学习的理论基础 提示:探讨AI大模型学习的数学基础、算法原理以及模型架构设计等。可以深入分析各种经典的深度学习模型,如卷积神经网络(CNN)、循环神经网络(RNN)以…

【gurobi】AttributeError: Index out of range for attribute ‘X‘

解释代码错误“ early_time[r,v] max(0 , (arrival_t[r,v].X - data.Early_time[r])) File "src\gurobipy\var.pxi", line 125, in gurobipy.Var.__getattr__ File "src\gurobipy\var.pxi", line 153, in gurobipy.Var.getAttr File "src\gurobipy\a…

c++20协程详解(三)

前言 前面两节我们已经能够实现一个可用的协程框架了。但我们一定还想更深入的了解协程,于是我们就想尝试下能不能co_await一个协程。下面会涉及到部分模板编程的知识,主要包括(模板偏特化,模板参数列表传值,模板函数…

谷歌(Google)技术面试——在线评估问题(三)

谷歌(Google)面试过程的第一步,你可能会收到一个在线评估链接。 评估有效期为 7 天,包含两个编码问题,需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处,还提供了有关 Google 面试不…

进销存管理系统:食品批发零售迈向数字化未来-亿发

随着消费逐步复苏,食品批发零售行业也迎来了客流的回升,实体店重新焕发了生机。然而,随着数字化时代的来临,传统的食品批发零售企业面临着新的挑战和机遇。些企业正积极实施数字化转型,通过布局线上线下多业态的融合发…

设计模式:单例模式六种实现

单例模式有多种实现方式,每种方式都有其设计思想、优缺点以及适用的使用场景。以下是一些常见的单例实现方式: 1. 懒汉式(线程不安全) 设计思想 这种实现方式采用了类加载的懒加载机制来保证单例只在第一次使用时被创建。 实现代码 public class Singleton {private s…

分布式事务之Seata使用

分布式事务解决方案之Seata Seata的概念 Seata是阿里巴巴开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 Seata官网给出的架构示例如下&#…

ruoyi-nbcio-plus基于vue3的flowable流程设计器主界面升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

C# 字节数组 byte[] 关于byte的小寄巧 以及Encoding和BitConverter

怎么读字节数组里面的内容 先是小错误 之 ToString然后是怎么办使用UTF-8编码使用ASCII编码使用其他编码未知编码注意 小demo下一个demo关于发送端的(发送新行)手搓bug编码之搓ascii encodeing评价为不如BitConverter一根 先是小错误 之 ToString 在C#中…

Docker客户端命令

一、在客户端输入 docker 命令,来查看 Docker 客户端的所有命令选项。 docker 使用 podman 模拟 Docker CLI 的功能,并创建 /etc/containers/nodocker 文件以静默消息。管理 pods、容器和镜像。 用法:podman [选项] [命令] 命令: attach 附加到一个正在运行的容器 auto-upd…

mysql故障排查

MySQL是目前企业最常见的数据库之一日常维护管理的过程中,会遇到很多故障汇总了常见的故障,MySQL默认配置无法满足高性能要求 一 MySQL逻辑架构图 客户端和连接服务核心服务功能存储擎层数据存储层 二 MySQL单实例常见故障 故障1 ERROR 2002 (HY000)…

深入理解npm常用命令

npm(Node Package Manager)是 Node.js 的包管理工具,用于管理 Node.js 应用程序的依赖包。除了安装、更新和卸载依赖包外,npm 还提供了许多其他功能,如初始化项目、运行脚本、查看依赖树等。本文将详细介绍一些常用的 …

RabbitMQ3.x之六_RabbitMQ使用场景

RabbitMQ3.x之六_RabbitMQ使用场景 文章目录 RabbitMQ3.x之六_RabbitMQ使用场景1. 为什么选择 RabbitMQ?1. 可互操作2. 灵活3. 可靠 2. 常见用户案例1. 服务解耦2. 远程过程调用3. 流处理4. 物联网 1. 为什么选择 RabbitMQ? RabbitMQ 是一个可靠且成熟的…

linux------jekins构建cicd

🎈个人主页:靓仔很忙i 💻B 站主页:👉B站👈 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:linux 🤝希望本文对您有所裨益,如有不足之处&#…

vue3+threejs新手从零开发卡牌游戏(二十四):添加p2战斗逻辑

用代码模拟p2战斗逻辑,按流程进行步骤拆分: 1.p2抽卡 2.p2召唤怪兽上场 3.p2战斗 其中战斗部分分为几种情况: 情况一:p2场上卡牌由大到小进行排序,按序轮询可以攻击的卡牌,然后攻击p1场上卡牌由大到小…

第19次修改了可删除可持久保存的前端html备忘录:换了一个特别的倒计时时钟

第19次修改了可删除可持久保存的前端html备忘录:换了一个特别的倒计时时钟 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><met…

android framework 学习笔记(1)

学习资料&#xff1a;《Android Framework 开发揭秘》_哔哩哔哩_bilibili 什么是android framework 看图说话&#xff0c;android框架从上至下分为&#xff1a; 应用层(Application)&#xff0c;Java framework(Application Framework),Native framework. 包括Libraries 和 A…

数据透视:将三特征数据集转为矩阵

本文记录利用 wps的excel软件 将包含三个变量的数据集转换成矩阵的表达形式。 1.三特征数据集 三特征数据集/三元数据集&#xff1a;原始数据集的一般表达形式。每一行代表一个样本&#xff0c;每一列代表一个变量&#xff0c;共有3个变量。 2.数据透视表 设置3个变量的行、列和…