是否可以创建具有复杂子结构的自定义 format/blot?
Is it possible to create a custom format/blot with complex substructure?
我正在研究 Quill 在项目中的使用,我需要知道是否可以创建比单个元素和单个参数更复杂的自定义 format/blot。
我想要的布局之一的示例是:
<span class="format-container">
<span class="format-info" data-attr="param 1 (non-displayed)">
param 2 (displayed to user -- click to invoke application UI to edit)
</span>
<span class="format-content">
User's text/child elements go here
</span>
</span>
在我调查的所有情况下,自定义格式都是内联范围的,并且仍然有一个父容器和一个用于放置子内容的位置。
Quill 中的自定义格式目前似乎没有很好的记录。我仔细查看了源代码,发现这在 0.20.1 中很可能是不可能的。然而,我觉得它在 1.0.0 beta w/Parchment 中是可行的,我只是不确定我实际需要写什么的细节。
这在 1.0.0 中可行吗?如果可以,怎么实现?
编辑: 这就是我想要的:
文档和指南仍在编写中,但最好了解现有自定义格式的实现方式。特别是公式格式似乎与您的用例非常相似。
所以,我最终想出了如何以最小的努力做到这一点。它涉及为 Quill 1.3 或更高版本定义新的印迹类型,相同的代码应该适用于旧版本但是未经测试。
有关工作示例,请参阅代码片段。关键是扩展现有的 Embed blot 'blots/embed' 并定义您自己的工具栏处理程序以注入任意 DOM 节点实例。
// utility function used to inherit non prototypical methods/properties
function extend(target, base) {
for (var prop in base) {
target[prop] = base[prop];
}
}
// definition of a custom Blot.
(function(Embed) {
'use strict';
function Span() {
Object.getPrototypeOf(Embed).apply(this, arguments);
}
Span.prototype = Object.create(Embed && Embed.prototype);
Span.prototype.constructor = Span;
extend(Span, Embed);
Span.create = function create(value) {
return value; // expects a domNode as value
};
Span.value = function value(domNode) {
return domNode;
};
Span.blotName = 'span';
Span.tagName = 'SPAN';
Span.className = 'complex';
Quill.register(Span, true);
})(Quill.import('blots/embed')); // import the embed blot. This is important as this is being extended
// custom handler for the toolbar button
var handler = function() {
var complexSpan = document.getElementById('complextype').firstElementChild.cloneNode(true);
var selection = quill.getSelection();
quill.insertEmbed(selection.index, 'span', complexSpan);
}
// instantiate quill. Note that modules.toolbar.handlers has a 'span' handler. Quill parses this from // the class on the button in the toolbar markup: 'ql-span' this is 'ql-' + blotName
var quill = new Quill('#editor', {
modules: {
toolbar: {
container: '.toolbar',
handlers: {
'span': handler
}
}
},
theme: 'snow'
});
:root {
--complex-bgcolor: #767676;
--font-color: #FFFFFF;
}
html {
font-size: 10px;
}
button.ql-span {
width: 15rem !important;
}
.complex {
border-radius: 1rem;
border: 0.2rem solid black;
margin: 0.3rem;
}
.inner {
border-radius: 1rem;
background: var(--complex-bgcolor);
color: var(--font-color);
padding-left: 0.6rem;
padding-right: 0.6rem;
}
.formatting {
font-weight: bold;
font-style: italic;
text-decoration: underline;
}
.nested {
margin-left: 0.3rem;
margin-right: 0.3rem;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.1/quill.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.1/quill.snow.css" />
<div id="wrapper">
<div id="toolbar" class="toolbar">
<span class="ql-formats">
<button class="ql-bold"></button>
<button class="ql-italic"></button>
<button class="ql-underline"></button>
</span>
<span class="ql-formats">
<button class="ql-span">Complex Span Type</button>
</span>
</div>
<div id="editor">Lorem Ipsum
<span contenteditable="false">
<span class="complex" spellcheck="false">
<span class="inner">Format applied</span>
<span class="nested">More text</span>
<span class="formatting">with formatting</span>
<span class="nested">dolor</span>
</span>
</span> sit amet
</div>
</div>
<div id="complextype" style="display:none;">
<span contenteditable="false"><span class="complex" spellcheck="false"><span class="inner">Format applied</span><span class="nested">More text</span><span class="formatting">with formatting</span><span class="nested">dolor</span></span></span>
</div>
我正在研究 Quill 在项目中的使用,我需要知道是否可以创建比单个元素和单个参数更复杂的自定义 format/blot。
我想要的布局之一的示例是:
<span class="format-container">
<span class="format-info" data-attr="param 1 (non-displayed)">
param 2 (displayed to user -- click to invoke application UI to edit)
</span>
<span class="format-content">
User's text/child elements go here
</span>
</span>
在我调查的所有情况下,自定义格式都是内联范围的,并且仍然有一个父容器和一个用于放置子内容的位置。
Quill 中的自定义格式目前似乎没有很好的记录。我仔细查看了源代码,发现这在 0.20.1 中很可能是不可能的。然而,我觉得它在 1.0.0 beta w/Parchment 中是可行的,我只是不确定我实际需要写什么的细节。
这在 1.0.0 中可行吗?如果可以,怎么实现?
编辑: 这就是我想要的:
文档和指南仍在编写中,但最好了解现有自定义格式的实现方式。特别是公式格式似乎与您的用例非常相似。
所以,我最终想出了如何以最小的努力做到这一点。它涉及为 Quill 1.3 或更高版本定义新的印迹类型,相同的代码应该适用于旧版本但是未经测试。
有关工作示例,请参阅代码片段。关键是扩展现有的 Embed blot 'blots/embed' 并定义您自己的工具栏处理程序以注入任意 DOM 节点实例。
// utility function used to inherit non prototypical methods/properties
function extend(target, base) {
for (var prop in base) {
target[prop] = base[prop];
}
}
// definition of a custom Blot.
(function(Embed) {
'use strict';
function Span() {
Object.getPrototypeOf(Embed).apply(this, arguments);
}
Span.prototype = Object.create(Embed && Embed.prototype);
Span.prototype.constructor = Span;
extend(Span, Embed);
Span.create = function create(value) {
return value; // expects a domNode as value
};
Span.value = function value(domNode) {
return domNode;
};
Span.blotName = 'span';
Span.tagName = 'SPAN';
Span.className = 'complex';
Quill.register(Span, true);
})(Quill.import('blots/embed')); // import the embed blot. This is important as this is being extended
// custom handler for the toolbar button
var handler = function() {
var complexSpan = document.getElementById('complextype').firstElementChild.cloneNode(true);
var selection = quill.getSelection();
quill.insertEmbed(selection.index, 'span', complexSpan);
}
// instantiate quill. Note that modules.toolbar.handlers has a 'span' handler. Quill parses this from // the class on the button in the toolbar markup: 'ql-span' this is 'ql-' + blotName
var quill = new Quill('#editor', {
modules: {
toolbar: {
container: '.toolbar',
handlers: {
'span': handler
}
}
},
theme: 'snow'
});
:root {
--complex-bgcolor: #767676;
--font-color: #FFFFFF;
}
html {
font-size: 10px;
}
button.ql-span {
width: 15rem !important;
}
.complex {
border-radius: 1rem;
border: 0.2rem solid black;
margin: 0.3rem;
}
.inner {
border-radius: 1rem;
background: var(--complex-bgcolor);
color: var(--font-color);
padding-left: 0.6rem;
padding-right: 0.6rem;
}
.formatting {
font-weight: bold;
font-style: italic;
text-decoration: underline;
}
.nested {
margin-left: 0.3rem;
margin-right: 0.3rem;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.1/quill.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.1/quill.snow.css" />
<div id="wrapper">
<div id="toolbar" class="toolbar">
<span class="ql-formats">
<button class="ql-bold"></button>
<button class="ql-italic"></button>
<button class="ql-underline"></button>
</span>
<span class="ql-formats">
<button class="ql-span">Complex Span Type</button>
</span>
</div>
<div id="editor">Lorem Ipsum
<span contenteditable="false">
<span class="complex" spellcheck="false">
<span class="inner">Format applied</span>
<span class="nested">More text</span>
<span class="formatting">with formatting</span>
<span class="nested">dolor</span>
</span>
</span> sit amet
</div>
</div>
<div id="complextype" style="display:none;">
<span contenteditable="false"><span class="complex" spellcheck="false"><span class="inner">Format applied</span><span class="nested">More text</span><span class="formatting">with formatting</span><span class="nested">dolor</span></span></span>
</div>