quill.formatText() 不允许嵌套格式

quill.formatText() won't allow nested formats

我正在使用 quill.formatText() 向我的文本编辑器添加自定义 "highlight" 格式。我像这样扩展了一个印迹:

let Inline = Quill.import('blots/inline');
class highlight extends Inline {
    static create() {
      return super.create();
    }

    static formats() {
      return true;
    }
}
highlight.blotName = 'highlight';
highlight.className = 'highlight';
highlight.tagName = 'span';
Quill.register(highlight);

然后调用 quill.formatText(start, selectionLength, 'highlight', true);,它将我的选择包装在 <span class="highlight"> 标记中。到目前为止,一切都很好。

麻烦的是,我希望每个选择都包含在自己的 span 标签中。当我对文本进行两次选择时,一个在另一个里面,只剩下外面的span

例如,文本 test inside text。如果除了单词 inside 之外,我还突出显示了整个字符串,我希望得到:

<span class="highlight">Test <span class="highlight">inside</span> text</span>

而我实际得到:

<span class="highlight">Test inside text</span>

这似乎是 QuillJS 在幕后进行的优化 - 无论如何我可以关闭它,以便我可以保留两个嵌套的 spans?

这不仅仅是一个优化——它是确定性 Quill 保证所必需的。如果你有一些文本 "Test inside text" 并说它是粗体,Quill 保证输出是 <strong>Test inside text</strong>,而不是 <strong>Test inside </strong><strong>text</strong><strong>Test <strong>inside</strong> text</strong> 或无限数量的 HTML 合法选项。

Quill 被设计为明确的,因此您可以从设计中消除歧义,或者使用允许它的编辑器。

与其将格式设置为 true 或 false,不如尝试将其设置为某种标识用例的 id。然后,您可以向 span 添加一个数据属性来保存 id,或者创建一个唯一的 class,就像您的评论中那样。

您可能会发现这个 Pull Request on quill 有助于找到适合您的解决方案(或者直接使用此代码)

https://github.com/quilljs/quill/pull/1217