Библиотека remark является мощным инструментом для работы с Markdown в экосистеме JavaScript. Одной из её ключевых особенностей является возможность расширения стандартного синтаксиса Markdown через плагины. remark-gfm — это официальный плагин, реализующий поддержку GitHub Flavored Markdown (GFM), который включает расширенные элементы разметки, используемые на платформе GitHub.
GitHub Flavored Markdown расширяет стандартный Markdown следующими функциями:
Таблицы Позволяют создавать структурированные данные в виде таблиц с выравниванием столбцов. Пример синтаксиса:
| Имя | Возраст | Город |
|-----------|--------:|------------|
| Иван | 25 | Москва |
| Екатерина | 30 | Санкт-Петербург |
В remark-gfm таблицы автоматически распознаются и корректно преобразуются в дерево MDAST.
Зачёркнутый текст Поддержка синтаксиса
~~текст~~ для создания зачёркнутого текста:
Этот текст ~~не актуален~~.Авто-ссылки Преобразует URL и email в
кликабельные ссылки без явного использования синтаксиса
[текст](url):
https://example.com
user@example.com
remark-gfm распознаёт такие строки и автоматически создает узлы типа
link в MDAST.
Задачные списки (Task Lists) Добавляет поддержку
списков с флажками [ ] и [x], которые широко
используются в документации и TODO-листах на GitHub:
- [x] Сделано
- [ ] В процессе
- [ ] Не начато
В MDAST каждый элемент превращается в listItem с полем
checked.
Для использования плагина необходимо установить его через npm или yarn:
npm install remark remark-gfm
Базовая интеграция с remark выглядит так:
import { remark } from 'remark';
import gfm from 'remark-gfm';
const markdown = `
| Имя | Возраст |
|-----|--------|
| Алексей | 28 |
- [x] Сделано
`;
remark()
.use(gfm)
.process(markdown)
.then((file) => {
console.log(String(file));
});
В результате все GFM-элементы корректно обрабатываются, а структура документа может быть дополнительно модифицирована через другие плагины.
remark-gfm расширяет дерево Markdown AST (MDAST), добавляя специализированные узлы:
table — для таблицtableRow — для строк таблицыtableCell — для ячеекdelete — для зачёркнутого текстаlistItem с полем checked — для задачПример MDAST для задачного списка:
{
"type": "list",
"ordered": false,
"children": [
{
"type": "listItem",
"checked": true,
"children": [{ "type": "paragraph", "children": [{ "type": "text", "value": "Сделано" }] }]
},
{
"type": "listItem",
"checked": false,
"children": [{ "type": "paragraph", "children": [{ "type": "text", "value": "В процессе" }] }]
}
]
}
Эта структура позволяет последующим плагинам и преобразователям, таким как rehype, корректно рендерить Markdown в HTML или другие форматы.
remark-gfm часто используется в связке с rehype, что позволяет преобразовывать Markdown в HTML с поддержкой GFM:
import { remark } from 'remark';
import gfm from 'remark-gfm';
import remarkRehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';
remark()
.use(gfm)
.use(remarkRehype)
.use(rehypeStringify)
.process(markdown)
.then((file) => {
console.log(String(file));
});
После такой цепочки таблицы, задачи и зачёркнутый текст рендерятся в
соответствующие HTML-элементы (<table>,
<input type="checkbox">, <del>),
полностью повторяя функциональность GFM на GitHub.
remark-gfm не требует обязательной конфигурации, но можно управлять обработкой некоторых элементов через опции:
~ вместо ~~ для зачёркивания.Пример настройки:
remark()
.use(gfm, { singleTilde: true })
.process(markdown)
Это позволяет гибко адаптировать поведение плагина под собственные стандарты Markdown.
remark-gfm является стандартным выбором для проектов, где требуется полноценная поддержка расширенного Markdown GitHub без ручной обработки синтаксиса.