Для корректного получения выделенного текста из редактора Gutenberg, особенно если ваш контент содержит HTML-теги, вы можете использовать разные подходы. Один из них — это использование метода `createRange` для работы с текстовым содержимым, что позволяет игнорировать HTML-теги.
Вот пример того, как можно получить выделенный текст, учитывая HTML-теги в контенте:
```javascript
import { select } from '@wordpress/data';
import { createRef } from '@wordpress/element';
// Функция для получения выделенного текста
const getSelectedText = () => {
const { getSelectedBlock, getSelectionStart, getSelectionEnd } = select('core/block-editor');
const block = getSelectedBlock();
if (!block || block.name !== 'core/paragraph') return '';
const content = block.attributes.content;
// Создаем временный элемент для обработки HTML
const tempDiv = document.createElement('div');
tempDiv.innerHTML = content;
// Флаг для хранения текста
let selectedText = '';
// Получаем выделение
const selection = window.getSelection();
const range = selection.getRangeAt(0);
const rangeStart = range.startContainer;
const rangeEnd = range.endContainer;
// Если выделение внутри одного узла
if (rangeStart === rangeEnd) {
selectedText = range.toString();
} else {
// Обходим узлы между началом и концом выделения
let node = rangeStart;
while (node) {
// Добавляем текст выделенных узлов
if (node.nodeType === Node.TEXT_NODE) {
selectedText += node.textContent.slice(rangeStart === node ? range.startOffset : 0,
rangeEnd === node ? range.endOffset : node.length);
}
// Переходим к следующему узлу
if (node === rangeEnd) break; // Если достигли конца выделения
node = node.nextSibling || node.parentNode.nextSibling;
}
}
return selectedText;
};
```
### Объяснение:
1. **Создание временного элемента**: Мы создаем временный элемент `div`, чтобы загрузить HTML-содержимое. Это позволяет нам работать с текстом, как с обычным текстом, а не с HTML.
2. **Получение выделенного текста**: Мы используем метод `getSelection()`, чтобы получить текущее выделение. `Range` помогает нам обработать выделение, даже если оно охватывает несколько узлов.
3. **Обработка текстовых узлов**: Мы обходим текущее выделение, извлекая текст из узлов, соответствующих началу и концу выделения, тем самым игнорируя HTML-теги.
Этот подход должен дать вам корректный выделенный текст, независимо от наличия HTML-тегов в контенте.