CKEditor5 - представление модели положения и диапазон преобразования - PullRequest
0 голосов
/ 26 апреля 2018

Класс 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>'}, где ˇ будет там, где указывает соответствующий объект положения.

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

1 Ответ

0 голосов
/ 27 апреля 2018

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

...