CKEditor5 использовать модель в пользовательском обработчике данных
Я играл с CKEDitor5 и пытался создать собственный обработчик данных. Я хотел бы использовать модель в toData
преобразование, но метод вызывается с view/DocumentFragment
объект. Так что мой вопрос заключается в том, как я могу преобразовать это в model/DocumentFragment
объект (или как получить доступ к модели из процессора данных).
Обновление (поскольку оно не может вписаться в комментарий): Позвольте мне попытаться объяснить, что именно я пытаюсь сделать (или я уже сделал), более подробно. Я понял, как использовать доступ к самой модели, но это показалось плохим решением, как вы также указали.
Так что в основном я хочу создать DataProcessor
преобразовать данные редактора в BBCode, что, я думаю, звучит достаточно разумно.
С одной стороны, toView
Метод прост, поскольку можно предположить, что преобразование BBCode в HTML уже реализовано (в моем случае). А из HTML, кажется, тривиально загрузить данные редактора (тем же процессом, который используется процессором Markdown).
С другой стороны, кажется проще конвертировать в BBCode из данных модели, чем из вида. Главным образом потому, что view/DocumentFragment
object и остальная часть дерева представления - это просто еще одно представление DOM или HTML. Мне действительно все равно, является ли жирным <b>
или же <strong>
я просто хочу знать, text
узел имеет bold
атрибут или нет.
Используя эту модель, я надеюсь работать с семантикой, а не с представлением, используемым в HTML. Кажется немного бессмысленным в основном отображать все теги HTML на их эквиваленты BBCode (даже если CKE5 хорошо справляется с обеспечением согласованных тегов HTML). Так что, с моей точки зрения, использование модели имеет больше смысла. Преобразовать из семантического представления в "формат данных" проще, чем преобразовать в "формат данных" (дерево представления, DOM, HTML, код Морзе), а затем создать "карту представления" после этого.
В течение долгого времени нам не удавалось использовать RTE или WYSIWYG-редакторы, а именно трудность перехода с HTML на BBCode. Теперь у CKE5 есть модель, которую, кажется, легко преобразовать во что угодно, поскольку она не зависит не только от формата HTML, но и от HTML, отображаемого в редакторе (этого нельзя сказать о дереве представлений, поскольку это точно HTML в редактор - по крайней мере, это не то, что производит contenteditable, но все еще недостаточно хорошо).
Также: я только что сделал Plugin
который устанавливает DataProcessor
, поскольку это было то, что делает особенность Markdown также (где-то в документах). Это плохая идея?
Еще раз спасибо за ваш ответ.
1 ответ
Недавно аналогичный вопрос был поднят на CKE5 GitHub. Вопрос в том, чтобы получить данные JSON в виде выходных данных редактора, но затронутая вами тема также частично освещена.
(...) как получить доступ к модели из процессора данных
Есть определенные проблемы и риски, связанные с работой прямо на модели. Это не то, что рекомендуется. Это объясняется в связанном посте.
(...) мой вопрос в том, как я могу преобразовать это в
model/DocumentFragment
Это лучший (менее рискованный) подход, чем прямая работа на модели. Однако я должен спросить - почему вы хотите конвертировать из модели? Может быть, есть лучшее решение вашей проблемы?
Для преобразования между представлением и моделью необходимо использовать DataController#toView
а также DataController#toModel
, DataController
экземпляр доступен на Editor#data
, Чтобы использовать его в процессоре данных, процессору данных потребуется доступ к экземпляру редактора.
Я бы предложил создать свой собственный класс редактора, расширяя один из классов редактора CKE5. Затем в новом конструкторе класса редактора перезаписать обработчик данных, а также передать экземпляр редактора. Что-то вроде:
class MyEditor extends ClassicEditor {
constructor() {
this.data.processor = new MyDataProcessor( this );
}
}
class MyDataProcessor() {
constructor( editor ) {
this._editor = editor;
}
toData( viewDocumentFragment ) {
const modelDocumentFragment = this._editor.data.toModel( viewDocumentFragment );
// ...
}
toView( modelData ) {
// ...
this._editor.data.toView( ... );
// ...
}
}
Они просто показывают направление, а не рабочие / проверенные образцы.
Тем не менее, я хотел бы знать, почему вы настаиваете на использовании модели, а не представления для создания выходных данных редактора.
КСТАТИ. Если вы продолжите и будете это реализовывать, весь процесс будет немного глупым:). Сначала вы получите данные модели, затем преобразуете их в представление (в процессоре данных), затем редактор возьмет данные просмотра и преобразует их обратно в модель:). Так что, возможно, вам также будет интересно перезаписать Editor#setData
метод, поэтому ненужные преобразования не будут иметь место.