2017-01-23 72 views
2

我使用quill.formatText()为我的文本编辑器添加自定义的“高亮”格式。我伸出一个印迹,像这样:quill.formatText()不允许嵌套格式

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在幕后进行的优化 - 无论如何,我可以关闭它,这样我就可以保持嵌套span

+0

此外,备案,使得两个不相交的亮点蜜饯这两个'跨度'就好了。只有当它们相交或嵌套时,Quill才会决定优化。 – Pete

回答

1

而不是使格式正确或错误,尝试使其某种标识用例的id。然后,您可以向跨度添加数据属性以保存该ID,或者在您的评论中创建一个独特的类。

您可能会发现在鹅毛笔在得到一个解决方案有帮助的这个拉入请求,会为你的工作(或者干脆直接使用此代码)

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

+0

Hi Rik,这正是我要找的。该PR中的代码看起来非常简单,所以我应该能够根据我的需求做出决定。 – Pete

1

这不是一个单纯的优化 - 它是必要的确定性奎尔保证。如果您有一些文本“Test inside text”并且将其标注为粗体,则Quill保证输出为<strong>Test inside text</strong>,而不是<strong>Test inside </strong><strong>text</strong><strong>Test <strong>inside</strong> text</strong>或无限数量的HTML合法选项。

羽毛笔的设计是明确的,所以您可以从设计中删除歧义,或使用允许使用的编辑器。

+0

嗨杰森,谢谢你的回复。我明白为什么这个机制能够防止无效的HTML,但上面的'span's例子是完全有效和明确的。添加任意'span'标记是使用自定义Blot的一个要点 - 例如,如果有一些文本被两个“高亮”类所包含,而不是一个,它应该显示较暗,可以独立点击等。如果没有一种“关闭”决定论的方式,可以说,有没有其他办法可以实现这一点?我只在'readOnly'模式中插入这些高光。 – Pete

+0

没有我发布的例子是完全合法的HTML。但它是模棱两可的,就像你的例子,这是问题所在。 – jhchen

+0

我明白了。在那种情况下,会不会有推荐的方法来改变我的自定义“突出显示”Blot的'className'?因此,在'quill.formatText()'中,我可以传入一个额外的参数,例如:'quill.formatText(start,length,'highlight',2,true);'然后在Blot中的某处使className为“highlight-2”。这样我就可以制作不会干涉和合并的“高光-1”,“高光-2”等等。我意识到这不是'formatText'的实际语法,但是我对于Blots知之甚少,不知道是否有可能。 – Pete