В экосистеме Remark и Rehype текстовые узлы (text nodes)
играют ключевую роль в представлении содержимого документа. Они
представляют собой «атомарные» единицы текста в дереве синтаксического
анализа (AST — Abstract Syntax Tree) и используются для хранения всех
строковых данных между тегами или разметкой.
В Markdown и HTML деревьях текстовые узлы имеют простую структуру. В
случае Remark для Markdown узел текста имеет тип text:
{
type: 'text',
value: 'Пример текста'
}
'text' для текстовых
узлов.В Rehype для HTML аналогичная структура:
{
type: 'text',
value: 'Содержимое текстового узла'
}
Несмотря на схожесть, в Rehype узлы могут включать дополнительные
свойства при необходимости, например позиционные данные
(position), которые используются для точной привязки к
исходному коду.
Текстовые узлы всегда являются листьями дерева AST. Они не
могут содержать дочерних элементов, в отличие от узлов типа
paragraph, heading или element.
Это делает их ключевыми для анализа, трансформации и генерации
текста.
Примеры узлов с текстовыми детьми:
{
type: 'paragraph',
children: [
{ type: 'text', value: 'Это простой текст внутри абзаца.' }
]
}
В данном случае paragraph является контейнером, а
текстовый узел хранит непосредственно содержимое.
Текстовые узлы часто подвергаются трансформации для следующих задач:
Пример обхода дерева с использованием
unist-util-visit:
import { visit } from 'unist-util-visit';
visit(tree, 'text', (node) => {
node.value = node.value.toUpperCase();
});
После выполнения этого кода все текстовые узлы документа будут преобразованы в верхний регистр.
Часто текст может быть разбит на несколько узлов из-за особенностей парсера. Для обработки целостного текста применяются методы конкатенации узлов:
const paragraphNode = {
type: 'paragraph',
children: [
{ type: 'text', value: 'Первое ' },
{ type: 'text', value: 'слово' },
{ type: 'text', value: ' в абзаце.' }
]
};
const fullText = paragraphNode.children.map(node => node.value).join('');
// 'Первое слово в абзаце.'
Такая практика необходима при анализе текста, извлечении ключевых слов или преобразовании документа.
Текстовые узлы сохраняют все пробелы, переносы строк и символы, присутствующие в исходном документе. Это важно для корректной генерации Markdown и HTML. В Rehype для HTML также учитываются специальные символы, которые могут быть закодированы как HTML-сущности:
{ type: 'text', value: 'Символ & должен быть экранирован' }
При рендеринге парсер автоматически преобразует & в
&, сохраняя корректность HTML.
Текстовые узлы часто являются объектом внимания при разработке плагинов для Remark и Rehype:
Пример преобразования текста в Markdown, добавление эмфазы к ключевым словам:
visit(tree, 'text', (node, index, parent) => {
if (node.value.includes('важно')) {
parent.children[index] = {
type: 'emphasis',
children: [{ type: 'text', value: node.value }]
};
}
});
Текстовые узлы тесно связаны с inline-элементами
(например, emphasis, strong,
link). Внутри таких элементов текст всегда представлен
отдельными текстовыми узлами, что обеспечивает унифицированную обработку
документа:
{
type: 'strong',
children: [
{ type: 'text', value: 'Сильный текст' }
]
}
Это позволяет гибко применять трансформации к любой части текста независимо от её окружения.
unist-util-visit для
точечного изменения узлов.Текстовые узлы представляют собой основу всех текстовых операций в Remark и Rehype. Глубокое понимание их структуры и правил обработки позволяет создавать эффективные плагины, выполнять анализ контента и точно контролировать вывод Markdown или HTML.