CKEditor5 - представление модели положения и диапазон преобразования

engine/conversion/mapper Класс реализует функциональность, которая мне нужна, однако у меня есть несколько вопросов о том, как получить / построить этот объект наиболее эффективно.

Я хотел бы получить Mapper Объект находится в состоянии, когда оба способа (модель для просмотра и модель для просмотра) возможны одновременно.

а) есть ли способ получить Mapper от DataController (например, событие)?

б) если я должен построить свой собственный Mapper тогда каков наилучший способ сделать это?

Я действительно хотел бы избежать необходимости изменять DataControllerОднако я бы предпочел решение, которое с наибольшей вероятностью будет совместимо с будущими версиями CKEditor5.

Обновление (с дополнительным контекстом): в основном этот вопрос является продолжением использования модели в DataProcessor в toData метод.

Я начинаю с поставленной задачи и после того, как объясню, что именно я пытаюсь сделать с позициями, которые больше связаны с исходным вопросом.

Итак, мне нужно преобразовать данные редактора в BBCode (пока все хорошо), однако я не знаю, что такое HTML для чего-либо (другой плагин установил бы схему для bold а также italic так далее). Таким образом, я хотел бы использовать модель для некоторых преобразований, так как, например, преобразование текстовых узлов из модели кажется таким простым, даже несмотря на то, что мне приходится самому преобразовывать атрибуты в теги.

Однако, несмотря на предупреждения по моему другому вопросу о том, что он может быть слишком сложным, и мне лучше конвертировать, например, из DOM (с которым я все еще не согласен), я решил сделать его еще более сложным и конвертировать из обоих вид и модель. И вот мы подошли к этому вопросу.

Мой план для преобразования заключается в следующем:

а) конвертировать viewFragment к modelFragment, И здесь я хотел бы, чтобы все преобразования позиций были доступны между ними обоими способами.

b) Передайте оба на конвейере преобразования, где есть некоторая общая структура для обработки элементов и текстовых узлов, с расширяемым набором объектов "правила преобразования", чтобы обрабатывать paragraph и boldАтрибут.

В b) каждое "правило преобразования" может решить, из чего они хотят преобразовать (представление, модель, преобразование в представление в DOM или Markdown или что-либо еще), а затем вернуть результат преобразования в тексте, позиция модели, указывающая перед следующим элементом для обработки, и та же позиция в представлении.

Так, например, <p><b>text</b></p><p>...</p> будучи текстом, обработчик данных получит позицию перед первым p как в модели, так и в представлении плюс фрагмент документа. И когда случится вся магия, он вернет объект, который имеет {result:'[b]text[/b]\n\n', modelPos:'[par]...[/par]ˇ[par]...[/par]', viewPos: '<p><b>text</b></p>ˇ<p>...</p>'}, где ˇ было бы, где соответствующие позиции объекта указывает.

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

1 ответ

Решение

К сожалению, проблема, которую вы описали, довольно сложна и, вероятно, слишком широка для SO ответа. Вот почему я буду кратким ответом.

К сожалению, я не вижу простой и разумный способ использования DataControllers Mapper в твоем случае. Это означает, что вам нужно будет взломать его так или иначе.

Также, как правило, Mapper используется только в конверсии по убыванию, поэтому только когда вы делаете DataController#toView, Запомни. Нам никогда не было необходимости использовать Mapper при загрузке данных.

Я думаю о простейшем способе взломать его, но, если честно, я думаю, что вам придется изменить DataController или просто подготовить свой кусок кода, который делает такие вещи, как DataController#toView, Создайте свой собственный экземпляр Mapper и не очищайте привязки в вашем коде.

Кроме того, вы можете создать свой собственный MyMapper а также MyDataController классы, которые расширяют классы CKE5. MyDataController может перезаписать #mapper собственность -> this.mapper = new MyMapper(), А также MyMapper может отправить какое-то событие, когда оно очищено. В этом случае вы можете скопировать данные картографа для своего использования.

Последний вариант - создать проблему на CKE5 Github. Я мог видеть это в DataController#toView очистка может быть перенесена в начало метода. Не должно быть никаких вредных результатов этого изменения, и картограф может использоваться до следующего toView вызов. Если вы создадите проблему, мы можем обсудить это изменение внутри компании и, возможно, реализовать его.

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