为 Quill blot 实现自定义编辑器
Implement custom editor for Quill blot
我正在尝试自定义 Quill editor for my needs. I managed to implement and insert custom blots, as described in https://quilljs.com/guides/cloning-medium-with-parchment/ 但我需要编辑附加到我的印迹的数据,例如 link 的 URL。 Quill 的默认实现为 link 显示一个小的 "inline" 编辑框。我想自己实现类似的东西,但就是不明白。我没有在文档和指南中找到任何提示。阅读 Quill 的源代码,我无法弄清楚 links 的编辑对话框是在哪里实现的。任何起点都将不胜感激。
这是部分答案。请参阅文件“https://github.com/quilljs/quill/blob/develop/themes/snow.js”
中的第 41-64 行
我还没有尝试实现类似的东西,但看起来 Quill 正在观察一个 "selection-change" 事件并检查选择是否在具有定义的 link.
的 LinkBlot 上
SnowTooltip class 包括对选择器 'a.ql-preview'、'ql-editing'、'a.ql-action' 和 'a.ql-remove' 的引用,我们在 link-编辑工具提示。
this.quill.on(
Emitter.events.SELECTION_CHANGE,
(range, oldRange, source) => {
if (range == null) return;
if (range.length === 0 && source === Emitter.sources.USER) {
const [link, offset] = this.quill.scroll.descendant(
LinkBlot,
range.index,
);
if (link != null) {
this.linkRange = new Range(range.index - offset, link.length());
const preview = LinkBlot.formats(link.domNode);
this.preview.textContent = preview;
this.preview.setAttribute('href', preview);
this.show();
this.position(this.quill.getBounds(this.linkRange));
return;
}
} else {
delete this.linkRange;
}
this.hide();
},
);
我试过类似的东西。正确的做法应该是创建一个模块。不幸的是,你已经知道它并不像看起来那么容易。
让我向您指出一些有用的资源,这些资源对我理解如何为 quill 创建扩展有很大帮助。
Quills 维护者正在管理 Awesome quill 列表。
我建议特别关注
- quill-emoji 它包含在书写时显示工具提示表情符号的代码
- quill-form 也许某些表单扩展包含一些代码可以为您指明正确的方向
这是我使用自定义羽毛笔模块对其进行的尝试。
const InlineBlot = Quill.import('blots/inline');
class NamedLinkBlot extends InlineBlot {
static create(value) {
const node = super.create(value);
node.setAttribute('href', value);
node.setAttribute('target', '_blank');
return node;
}
}
NamedLinkBlot.blotName = 'namedlink';
NamedLinkBlot.tagName = 'A';
Quill.register('formats/namedlink', NamedLinkBlot);
const Tooltip = Quill.import('ui/tooltip');
class NamedLinkTooltip extends Tooltip {
show() {
super.show();
this.root.classList.add('ql-editing');
}
}
NamedLinkTooltip.TEMPLATE = [
'<a class="ql-preview" target="_blank" href="about:blank"></a>',
'<input type="text" data-link="https://quilljs.com">',
'Url displayed',
'<input type="text" data-name="Link name">',
'<a class="ql-action"></a>',
'<a class="ql-remove"></a>',
].join('');
const QuillModule = Quill.import('core/module');
class NamedLinkModule extends QuillModule {
constructor(quill, options) {
super(quill, options);
this.tooltip = new NamedLinkTooltip(this.quill, options.bounds);
this.quill.getModule('toolbar').addHandler('namedlink', this.namedLinkHandler.bind(this));
}
namedLinkHandler(value) {
if (value) {
var range = this.quill.getSelection();
if (range == null || range.length === 0) return;
var preview = this.quill.getText(range);
this.tooltip.show();
}
}
}
Quill.register('modules/namedlink', NamedLinkModule);
const quill = new Quill('#editor', {
theme: 'snow',
modules: {
namedlink: {},
toolbar: {
container: [
'bold',
'link',
'namedlink'
]
}
}
});
查看工具提示:
- Select任意字
- 点击link按钮右边的隐形按钮,你的光标会变成手形
需要解决的主要问题:
- 为了自定义工具提示,您需要从 SnowTooltip 复制大部分代码 主要痛点是您无法轻松扩展该工具提示。
- 您还需要调整事件侦听器的代码,但应该很简单
我正在尝试自定义 Quill editor for my needs. I managed to implement and insert custom blots, as described in https://quilljs.com/guides/cloning-medium-with-parchment/ 但我需要编辑附加到我的印迹的数据,例如 link 的 URL。 Quill 的默认实现为 link 显示一个小的 "inline" 编辑框。我想自己实现类似的东西,但就是不明白。我没有在文档和指南中找到任何提示。阅读 Quill 的源代码,我无法弄清楚 links 的编辑对话框是在哪里实现的。任何起点都将不胜感激。
这是部分答案。请参阅文件“https://github.com/quilljs/quill/blob/develop/themes/snow.js”
中的第 41-64 行我还没有尝试实现类似的东西,但看起来 Quill 正在观察一个 "selection-change" 事件并检查选择是否在具有定义的 link.
的 LinkBlot 上SnowTooltip class 包括对选择器 'a.ql-preview'、'ql-editing'、'a.ql-action' 和 'a.ql-remove' 的引用,我们在 link-编辑工具提示。
this.quill.on(
Emitter.events.SELECTION_CHANGE,
(range, oldRange, source) => {
if (range == null) return;
if (range.length === 0 && source === Emitter.sources.USER) {
const [link, offset] = this.quill.scroll.descendant(
LinkBlot,
range.index,
);
if (link != null) {
this.linkRange = new Range(range.index - offset, link.length());
const preview = LinkBlot.formats(link.domNode);
this.preview.textContent = preview;
this.preview.setAttribute('href', preview);
this.show();
this.position(this.quill.getBounds(this.linkRange));
return;
}
} else {
delete this.linkRange;
}
this.hide();
},
);
我试过类似的东西。正确的做法应该是创建一个模块。不幸的是,你已经知道它并不像看起来那么容易。
让我向您指出一些有用的资源,这些资源对我理解如何为 quill 创建扩展有很大帮助。 Quills 维护者正在管理 Awesome quill 列表。
我建议特别关注
- quill-emoji 它包含在书写时显示工具提示表情符号的代码
- quill-form 也许某些表单扩展包含一些代码可以为您指明正确的方向
这是我使用自定义羽毛笔模块对其进行的尝试。
const InlineBlot = Quill.import('blots/inline');
class NamedLinkBlot extends InlineBlot {
static create(value) {
const node = super.create(value);
node.setAttribute('href', value);
node.setAttribute('target', '_blank');
return node;
}
}
NamedLinkBlot.blotName = 'namedlink';
NamedLinkBlot.tagName = 'A';
Quill.register('formats/namedlink', NamedLinkBlot);
const Tooltip = Quill.import('ui/tooltip');
class NamedLinkTooltip extends Tooltip {
show() {
super.show();
this.root.classList.add('ql-editing');
}
}
NamedLinkTooltip.TEMPLATE = [
'<a class="ql-preview" target="_blank" href="about:blank"></a>',
'<input type="text" data-link="https://quilljs.com">',
'Url displayed',
'<input type="text" data-name="Link name">',
'<a class="ql-action"></a>',
'<a class="ql-remove"></a>',
].join('');
const QuillModule = Quill.import('core/module');
class NamedLinkModule extends QuillModule {
constructor(quill, options) {
super(quill, options);
this.tooltip = new NamedLinkTooltip(this.quill, options.bounds);
this.quill.getModule('toolbar').addHandler('namedlink', this.namedLinkHandler.bind(this));
}
namedLinkHandler(value) {
if (value) {
var range = this.quill.getSelection();
if (range == null || range.length === 0) return;
var preview = this.quill.getText(range);
this.tooltip.show();
}
}
}
Quill.register('modules/namedlink', NamedLinkModule);
const quill = new Quill('#editor', {
theme: 'snow',
modules: {
namedlink: {},
toolbar: {
container: [
'bold',
'link',
'namedlink'
]
}
}
});
查看工具提示:
- Select任意字
- 点击link按钮右边的隐形按钮,你的光标会变成手形
需要解决的主要问题:
- 为了自定义工具提示,您需要从 SnowTooltip 复制大部分代码 主要痛点是您无法轻松扩展该工具提示。
- 您还需要调整事件侦听器的代码,但应该很简单