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 ответа. Вот почему я буду кратким ответом.
К сожалению, я не вижу простой и разумный способ использования DataController
s Mapper
в твоем случае. Это означает, что вам нужно будет взломать его так или иначе.
Также, как правило, Mapper
используется только в конверсии по убыванию, поэтому только когда вы делаете DataController#toView
, Запомни. Нам никогда не было необходимости использовать Mapper
при загрузке данных.
Я думаю о простейшем способе взломать его, но, если честно, я думаю, что вам придется изменить DataController
или просто подготовить свой кусок кода, который делает такие вещи, как DataController#toView
, Создайте свой собственный экземпляр Mapper
и не очищайте привязки в вашем коде.
Кроме того, вы можете создать свой собственный MyMapper
а также MyDataController
классы, которые расширяют классы CKE5. MyDataController
может перезаписать #mapper
собственность -> this.mapper = new MyMapper()
, А также MyMapper
может отправить какое-то событие, когда оно очищено. В этом случае вы можете скопировать данные картографа для своего использования.
Последний вариант - создать проблему на CKE5 Github. Я мог видеть это в DataController#toView
очистка может быть перенесена в начало метода. Не должно быть никаких вредных результатов этого изменения, и картограф может использоваться до следующего toView
вызов. Если вы создадите проблему, мы можем обсудить это изменение внутри компании и, возможно, реализовать его.