Я делаю плагин для редактора WordPress Gutenberg, который добавляет боковую панель со списком ссылок или действий или параметров форматирования.
Так, например, идея такова: вы выбираете какой-то текст в редакторе, затем нажимаете ссылку на боковой панели плагина, и выделенный текст переносится в тег <a>
с помощью пользовательского шаблона.
Это должно работать для каждого блока и типа блока, но у меня проблема. Я использую этот код, чтобы получить текущий выбор:
const selectionStart = select('core/block-editor').getSelectionStart();
const selectionEnd = select('core/block-editor').getSelectionEnd();
const blockId = selectionStart.clientId;
const attributeKey = selectionStart.attributeKey;
Функции getSelectionStart(or End)
вернуть объект:
{clientId: "69d28b23-ef15-4d80-b030-b66ddce271ab", attributeKey: "values", offset: 79}
Это простой случай, отлично работает с core/paragraph
, core/list
и некоторые другие типы блоков, где attributeKey
фактически соответствует имени атрибута, которое содержит содержимое блока. Но если выделенный текст находится внутри core/image
или core/gallery
, то getSelectionStart()
возвращает что-то вроде этого:
{clientId: "a0625aca-e39b-43ef-9f1c-3ee3ad567c2c", attributeKey: 93, offset: 7}
Как вы можете видеть, attributeKey не является строкой и числом (93 в этот случай) не является константой - это зависит от позиции блока (чем больше блоков у вас до этого, тем больше будет это число). Так что теперь я понятия не имею, какой атрибут мне нужно изменить (поскольку в некоторых случаях их несколько, например content
, value
, caption
, et c).
Что я хочу сделать (сводка):
- Выделить текст (с помощью мыши)
- Получить выбранную позицию текста (blockId, attribute, offset)
- Изменить выбранный текст на тот, который я хочу (например, вставить ссылку)
- Обновить блок (или заменить его новым содержимым)
На данный момент он работает только тогда, когда я могу получить имя атрибута.
Вопросы:
- Есть ли лучший способ получить текущий выбор, чем использование
getSelectionStart/End
? - Возможно ли получить фактический имя атрибута из цифры c значение атрибута ключа?