2017-01-23 71 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