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 метод, поэтому ненужные преобразования не будут иметь место.

Другие вопросы по тегам