Как получить выделенную позицию текста (блок, атрибут, смещение) в Гутенберге - PullRequest
0 голосов
/ 11 февраля 2020

Я делаю плагин для редактора 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).

Что я хочу сделать (сводка):

  1. Выделить текст (с помощью мыши)
  2. Получить выбранную позицию текста (blockId, attribute, offset)
  3. Изменить выбранный текст на тот, который я хочу (например, вставить ссылку)
  4. Обновить блок (или заменить его новым содержимым)

На данный момент он работает только тогда, когда я могу получить имя атрибута.

Вопросы:

  1. Есть ли лучший способ получить текущий выбор, чем использование getSelectionStart/End?
  2. Возможно ли получить фактический имя атрибута из цифры c значение атрибута ключа?
...