Библиотека Remark предназначена для работы с
Markdown в JavaScript и предоставляет гибкие средства для парсинга и
трансформации текстового контента. Одной из задач, с которой
сталкиваются при работе с Markdown, является корректная обработка
переносов строк. В стандартном Markdown одиночный перенос строки внутри
параграфа игнорируется, а для создания новой строки требуется двойной
перенос. Плагин remark-breaks решает эту проблему,
позволяя интерпретировать одиночные переносы строк как
<br> при генерации HTML через
Rehype.
Для использования remark-breaks необходимо установить
сам Remark и плагин:
npm install remark remark-breaks
Подключение плагина в коде выглядит следующим образом:
import {remark} from 'remark';
import remarkBreaks from 'remark-breaks';
import remarkHtml from 'remark-html';
const markdown = `Первая строка
Вторая строка`;
remark()
.use(remarkBreaks)
.use(remarkHtml)
.process(markdown)
.then((file) => {
console.log(String(file));
});
Принцип работы: плагин преобразует одиночные
переносы строк в <br> элементы при конвертации
Markdown в HTML.
remark-breaks не требует сложной конфигурации, однако
его поведение можно регулировать через интеграцию с другими
плагинами:
Совместимость с GitHub Flavored Markdown (GFM)
GFM по умолчанию поддерживает переносы строк при одиночных переносах в
параграфах. При использовании remark-breaks нужно
учитывать, что он может дублировать <br> в сочетании
с remark-gfm.
Интеграция с Rehype После обработки Markdown через Remark, текст можно передать в Rehype для дальнейшей трансформации и генерации HTML:
import {remark} from 'remark';
import remarkBreaks from 'remark-breaks';
import rehype from 'rehype';
import rehypeStringify from 'rehype-stringify';
import remark2rehype from 'remark-rehype';
remark()
.use(remarkBreaks)
.use(remark2rehype)
.use(rehypeStringify)
.process(markdown)
.then((file) => {
console.log(String(file));
});
Важно: порядок подключения плагинов имеет значение.
remark-breaks должен использоваться до преобразования в
Rehype (remark-rehype), чтобы переносы строк корректно
превратились в <br>.
Строка 1
Строка 2
После применения remark-breaks результат в HTML
будет:
<p>Строка 1<br>Строка 2</p>
Список и блоки кода В списках или блоках кода
плагин не добавляет <br> — переносы
остаются в исходной форме, так как Markdown уже учитывает их
специфическим образом.
Текст с уже существующими
<br> Если Markdown содержит явные
<br>, плагин не удаляет их и не дублирует.
<br> добавляются только там, где
нужно, чтобы не нарушать семантику HTML.import {remark} from 'remark';
import remarkBreaks from 'remark-breaks';
import remarkGfm from 'remark-gfm';
import remark2rehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';
import rehypeSlug from 'rehype-slug';
const markdown = `Заголовок
Следующая строка с переносом
- Элемент списка
- Еще один элемент`;
remark()
.use(remarkGfm)
.use(remarkBreaks)
.use(remark2rehype)
.use(rehypeSlug)
.use(rehypeStringify)
.process(markdown)
.then((file) => {
console.log(String(file));
});
В этом примере одиночные переносы в параграфах корректно
преобразуются в <br>, списки и заголовки
обрабатываются по правилам GFM, а Rehype добавляет идентификаторы к
заголовкам.
remark-breaks обеспечивает простое и предсказуемое управление переносами строк в Markdown, интегрируясь с полным стеком Remark → Rehype и создавая чистый и удобный HTML без дополнительных сложностей.