Класс engine/conversion/mapper
реализует необходимую мне функциональность, однако у меня есть несколько вопросов о том, как наиболее эффективно получить / построить этот объект.
Я хотел бы получить объект Mapper
в состоянии, когда оба способа (модель для просмотра и для просмотра в модель) возможны одновременно.
a) Есть ли способ получить 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>'}
, где ˇ
будет там, где указывает соответствующий объект положения.
Я надеюсь, что это несколько ясно, что я пытаюсь сделать, это заняло немного времени, так как я пытался описать проблему, чтобы вы могли лучше судить о моем решении, я пытаюсь применить к нему.