[TOC]
Quill编辑器的核心优势是有丰富的API和强大的定制能力。当你想在Quill的API上扩展功能时,将其作为一个模块来管理可能会比较方便。在本文中,我将介绍构建一种技术器模块的方法,这是许多文字处理软件的常见功能。
注意:Quill含有特定功能的内置模块,你可以通过实现你自己模块并用相同的名称注册来覆盖这些默认[模块](../模块modules.md)。
## 文字计数
文字计数器的核心功能就是计算编辑器中的字数,并在通过某些UI显示出来。因此,我们需要:
1. 监听Quill的text-change时间
1. 计算字数
1. 显示结果.
让我们之间展示一恶搞完整的例子!
```js
// 实现并注册模块
Quill.register('modules/counter', function(quill, options) {
var container = document.querySelector('#counter');
quill.on('text-change', function() {
var text = quill.getText();
//用这种方法计算字数有几个问题,我们以后会解决
container.innerText = text.split(/\s+/).length;
});
});
// 现在,我们可以像这样初始化Quill
var quill = new Quill('#editor', {
modules: {
counter: true
}
});
```
这样,我们在Quill中添加了一个自定义模块。函数功能可以作为模块[注册](../api.md),并且注册时可以传递相应的Quill对象和任何选项。
## 使用Options
模块可以传递一个option对象,这个option对象可以用作调整所需的行为。我们可以使用这个来接受显示计数器的容器,而不是硬编码字符串。
下面,我们让计数器实现计算单词或字符的功能:
```js
Quill.register('modules/counter', function(quill, options) {
var container = document.querySelector(options.container);
quill.on('text-change', function() {
var text = quill.getText();
if (options.unit === 'word') {
container.innerText = text.split(/\s+/).length + ' words';
} else {
container.innerText = text.length + ' characters';
}
});
});
var quill = new Quill('#editor', {
modules: {
counter: {
container: '#counter',
unit: 'word'
}
}
});
```
## 构造器(Constructors)
由于任何函数都可以注册为Quill模块,我们可以用ES5 constructor或ES6类来实现计数器功能。
这让我们可以直接访问和使用模块。
```js
var Counter = function(quill, options) {
this.quill = quill;
this.options = options;
var container = document.querySelector(options.container);
var _this = this;
quill.on('text-change', function() {
var length = _this.calculate();
container.innerText = length + ' ' + options.unit + 's';
});
};
Counter.prototype.calculate = function() {
var text = this.quill.getText();
if (this.options.unit === 'word') {
return text.split(/\s+/).length;
} else {
return text.length;
}
};
Quill.register('modules/counter', Counter);
var quill = new Quill('#editor', {
modules: {
counter: {
container: '#counter',
unit: 'word'
}
}
});
var counter = quill.getModule('counter');
// 我们可以直接访问calculate。
console.log(counter.calculate(), 'words');
```
## 打包
现在,我们发布这个ES6模块并且修复一些讨厌的错误。就这样。
```js
class Counter {
constructor(quill, options) {
this.quill = quill;
this.options = options;
this.container = document.querySelector(options.container);
quill.on('text-change', this.update.bind(this));
this.update(); // 初始化内容
}
calculate() {
let text = this.quill.getText();
if (this.options.unit === 'word') {
text = text.trim();
// Splitting empty text returns a non-empty array
return text.length > 0 ? text.split(/\s+/).length : 0;
} else {
return text.length;
}
}
update() {
var length = this.calculate();
var label = this.options.unit;
if (length !== 1) {
label += 's';
}
this.container.innerText = length + ' ' + label;
}
}
Quill.register('modules/counter', Counter);
var quill = new Quill('#editor', {
modules: {
counter: {
container: '#counter',
unit: 'word'
}
}
});
```
- 前言
- 快速开始(quick_start)
- 下载(download)
- 配置(configuration)
- 格式(formats)
- API
- 内容(contents)
- 格式化(formatting)
- 选区(selection)
- 编辑器(editor)
- 事件(events)
- 模型(model)
- 扩展(extension)
- 增量(Delta)
- 模块(modules)
- 工具栏(toolbar)
- 键盘(keyboard)
- 历史记录(history)
- 粘贴板(clipboard)
- 语法高亮(syntax)
- 主题(themes)
- 更多教程
- 为什么选择Quill?
- 如何定制Quill?
- 设计Delta格式(未翻译)
- 构建一个自定义模块
- 将Quill加入你的编译管线(未翻译)
- Cloning Medium with Parchment
- 和其它富文本编辑器的对比(未翻译)
- Designing the Delta Format
- 扩展模块
- vue-quill-editor
- quill-image-extend-module
- quill-image-resize-module
- quill-image-drop-module
- quill-better-table
- quilljs-table
- 更多模块