Я пытаюсь реализовать плагин, который переводит заполнители открытого текста типа __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",
Нет активных плагинов.