Как реализовать плагин-заполнитель, который работает с заполнителями в виде простого текста? - PullRequest
1 голос
/ 19 марта 2019

Я пытаюсь реализовать плагин, который переводит заполнители открытого текста типа __firstName__ в модель, подобную <placeholder key="__firstName__"></placeholder> и наоборот.

Я следовал руководству по , реализующему встроенный виджет , который действительно помог начать.

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

<p>Hi __firstName__,</p>

становится:

<$root>
    <paragraph>
        "Hi "
        <placeholder key="__firstName__">
        </placeholder>
        ","
    </paragraph>
</$root>

Я сейчас изо всех сил пытаюсь заставить работать часть dataDowncast.Я внес эти изменения только в отношении dataDowncast, возвращая текст вместо элемента с текстом внутри:

conversion.for('dataDowncast').elementToElement({
    model: 'placeholder',
    view: (modelItem, viewWriter) => {
        var key = modelItem.getAttribute('key');

        return viewWriter.createText(key);
    }
});

Теперь я столкнулся с двумя проблемами.

1 .:dataDowncast приводит к этому:

<p>Hi _,_firstName__</p>

Все, что следует за заполнителем, кажется, смещено влево или, другими словами, кажется, полностью игнорирует длину заполнителя (-1).elementToElement вообще предназначено для исключения текста вместо элемента?Или мне просто нужно как-то сообщить автору о длине текста?

2 .: Если в модели более двух заполнителей один за другим:

<$root>
    <paragraph>
        <placeholder key="__firstName__">
        </placeholder>
        <placeholder key="__lastName__">
        </placeholder>
        <placeholder key="__salutation__">
        </placeholder>
    </paragraph>
</$root>

dataDowncast вызывает эту ошибку:

Uncaught TypeError: Cannot read property 'name' of undefined
at Mapper.getModelLength (mapper.js:428)
at Mapper._findPositionIn (mapper.js:493)
at Mapper.on (mapper.js:94)
at Mapper.fire (emittermixin.js:211)
at Mapper.toViewPosition (mapper.js:277)
at DowncastDispatcher.modelViewSplitOnInsert (converters.js:214)
at DowncastDispatcher.fire (emittermixin.js:211)
at DowncastDispatcher._testAndFire (downcastdispatcher.js:473)
at DowncastDispatcher.convertInsert (downcastdispatcher.js:184)
at DataController.toView (datacontroller.js:207)

Это может быть косвенной ошибкой.

Используются зависимости:

"@ckeditor/ckeditor5-editor-inline": "12.0.0",    
"@ckeditor/ckeditor5-widget": "11.0.0",

Нет активных плагинов.

1 Ответ

0 голосов
/ 20 марта 2019

Является ли elementToElement() даже исключением текста вместо элемента?

Все помощники 3 elementToElement() (двусторонние, восходящие и нисходящие) ожидают, что на обоих концах (в модели и на виде) у вас есть элементы. Они преобразуют один элемент в другой.

В целом существует 4 основных типа преобразователей:

  • между элементами модели и вида,
  • между атрибутом модели и элементом вида (должно быть AttributeElement затем),
  • между атрибутами модели и вида,
  • от маркеров модели до подсветки или элемента вида.

Можно написать собственные конвертеры для больших блоков структур вида (когда больший фрагмент представления представлен одной деталью в модели), но это относится к нередактируемой части представления (например, к телу виджета). ). В редактируемой части содержимого все в представлении должно хорошо отображаться с чем-то в модели, потому что каждая позиция в представлении должна отображаться в какую-то позицию в модели. И наоборот.

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

Теоретически, может быть возможно изменить то, как позиции и элементы отображаются здесь. CKEditor 5 Mapper предлагает некоторые механизмы для этого (посмотрите на события), но я бы не пошел по этому пути. Это требует действительно глубоких знаний и тестов (даже я не уверен, сколько работы требуется ?).

Итак, следуйте инструкции по заполнению , где элемент модели преобразуется в элемент вида и наоборот.

...