Попытка создать плагин для установки начального атрибута для ol
в ckEditor5.
Насколько я могу судить, модель содержит коллекцию listItems
.
Атрибут start должен быть установлен на ol
, однако, на родительском элементе списка, а не на самом элементе списка. Есть ли способ получить доступ к ol
из модели?
Я могу получить текущий li
с помощью
first(editor.model.document.selection.getSelectedBlocks())
. Есть ли способ установить атрибут для элемента ol
?
EDIT -код для получения атрибута на LI:
editor.model.schema.extend('listItem', { allowAttributes: 'listStart' });
editor.conversion.attributeToAttribute({
model: 'listStart',
view: 'start'
});
включает в модели: <listItem type="numbered" listStart="4">
, что будет переводить на это в представлении:
<ol>
<li start="4">words</li>
</ol>
что я пытаюсь
<ol start="4">
<li>words</li>
</ol>
Когда я изучаю источник, он выглядит так, как будто здесь автоматически создается ol
(или ul
):
function generateLiInUl( modelItem, conversionApi ) {
const mapper = conversionApi.mapper;
const viewWriter = conversionApi.writer;
const listType = modelItem.getAttribute( 'listType' ) == 'numbered' ? 'ol' : 'ul';
const viewItem = createViewListItemElement( viewWriter );
// ** OL or UL created here -->
const viewList = viewWriter.createContainerElement( listType, null );
viewWriter.insert( ViewPosition.createAt( viewList ), viewItem );
mapper.bindElements( modelItem, viewItem );
return viewItem;
}
ссылка наисточник
Есть ли событие, которое я мог наблюдать?Или в определении преобразования есть способ нацелить атрибут на родительский элемент?
UPDATE 2
Если мы собираемся модифицировать источник, мы можем перехватить downcastдобавив это к функции generateLiInUl
(спасибо MTilsted):
const listStart = modelItem.getAttribute('listStart');
if (listStart) {
viewWriter.setAttribute('start', listStart, viewList);
}
и для облегчения upcast добавьте это к функции viewModelConverter
const listStart = data.viewItem.parent.getAttribute('start');
if (listStart) {
writer.setAttribute( 'listStart', listStart, listItem );
}
Это немного уродливо в этоммы модифицируем источник, который является лаваш для обслуживания, и в upcast мы добавляем атрибут listStart
к каждому элементу listItem
в модели ... но это начало.
Я кратко рассмотрел добавление диспетчеров.. например:
data.upcastDispatcher.on( 'element:li', myCustomUpcastFunction );
, но не смог понять, как получить ссылку на элемент listItem
, который был добавлен в модель в функции viewModelConverter
, упомянутой выше.