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

Вместо того, чтобы сделать формат true или false, попробуйте сделать его своего рода идентификатором, который идентифицирует прецедент. Затем вы можете добавить атрибут данных в диапазон для хранения идентификатора или создать уникальный класс, как в ваших комментариях.

Вы можете найти эту Толкай запрос на перу полезной в получении решения, которое будет работать для вас (или просто использовать этот код непосредственно)

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

+0

Привет, Рик, это именно то, что я ищу. Код в этом PR выглядит довольно просто, поэтому я должен уметь его отлаживать для своих нужд. – Pete

1

Это не просто оптимизация - это необходимо для гарантии детерминизма. Если у вас есть текст «Тест внутри текста» и говорят, что он выделен полужирным шрифтом, Quill гарантирует, что вывод <strong>Test inside text</strong>, а не <strong>Test inside </strong><strong>text</strong> или <strong>Test <strong>inside</strong> text</strong> или бесконечное количество вариантов права HTML.

Quill спроектирован так, чтобы быть однозначным, чтобы вы могли либо устранить двусмысленность от своего дизайна, либо использовать редактор, который позволяет это.

+0

Привет, Джейсон, спасибо за ответ. Я понимаю, почему механизм существует, чтобы предотвратить недействительный HTML, но пример «span' выше совершенно правдоподобен и недвусмыслен. Добавление произвольных тегов «span» предназначалось для использования пользовательского Blot - например, если есть какой-то текст, который заключен в два класса «подсветки», а не только один, он должен отображаться более темным, независимо кликать и т. Д. Если нет способ «отключить» этот детерминизм, так сказать, есть ли другой способ достичь этого? Я только вставляю эти основные моменты в режиме readOnly. – Pete

+0

Нет примера, который я опубликовал, является совершенно легальным HTML. Но это неоднозначно, как ваш пример, в чем проблема. – jhchen

+0

Я вижу. В этом случае был бы рекомендованный способ изменить «className» моего пользовательского «выделения» Blot? Так что в 'quill.formatText()' я мог бы пройти, например, дополнительный параметр, например: 'quill.formatText (start, length, 'highlight', 2, true);' а затем логика где-нибудь в Blot сделать className «highlight-2». Таким образом, я мог бы сделать «highlight-1», «highlight-2» и т. Д., Которые не будут мешать и сливаться.Я понимаю, что это не фактический синтаксис 'formatText', но у меня нет достаточно глубокого понимания блотов, чтобы узнать, возможно ли что-то подобное. – Pete

Смежные вопросы