В библиотеке Marked каждый блок текста в Markdown,
который отделён пустой строкой, по умолчанию преобразуется в
HTML-параграф <p>. Рендеринг параграфов является
базовой функциональностью, на которой строятся более сложные элементы
разметки, такие как списки, цитаты и таблицы.
Простейший пример работы с параграфами выглядит следующим образом:
import { marked } from 'marked';
const markdownText = `
Это первый параграф.
Это второй параграф.
`;
const html = marked(markdownText);
console.log(html);
Вывод:
<p>Это первый параграф.</p>
<p>Это второй параграф.</p>
Параграф формируется при наличии пустой строки между блоками текста. Без пустой строки Marked объединит последовательные строки в один параграф.
По умолчанию одинарный перенос строки внутри параграфа не создаёт новую строку в HTML. Для добавления разрыва строки используется два пробела в конце строки:
const markdownText = `Первая строка с пробелами в конце
Вторая строка в том же параграфе.`;
const html = marked(markdownText);
console.log(html);
Вывод:
<p>Первая строка с пробелами в конце<br>
Вторая строка в том же параграфе.</p>
Использование <br> происходит автоматически при
соблюдении правила двух пробелов.
Marked позволяет переопределять стандартное поведение через объект Renderer. Это полезно для добавления классов CSS, атрибутов или дополнительных обёрток вокруг параграфов:
import { marked } from 'marked';
const renderer = {
paragraph(text) {
return `<p class="custom-paragraph">${text}</p>\n`;
}
};
const markdownText = `
Это параграф с кастомным рендерером.
`;
const html = marked(markdownText, { renderer });
console.log(html);
Вывод:
<p class="custom-paragraph">Это параграф с кастомным рендерером.</p>
Таким образом, можно гибко управлять HTML-выводом, не затрагивая базовый Markdown.
Параграфы могут содержать встроенные элементы Markdown, такие как
жирный текст, курсив, ссылки,
код и изображения. Marked корректно обрабатывает такие
вложенные конструкции:
const markdownText = `
Это **жирный текст** и *курсив* в одном параграфе.
Ссылка: [Google](https://www.google.com)
Код: \`console.log('Hello');\`
`;
const html = marked(markdownText);
console.log(html);
Вывод:
<p>Это <strong>жирный текст</strong> и <em>курсив</em> в одном параграфе.
Ссылка: <a href="https://www.google.com">Google</a>
Код: <code>console.log('Hello');</code></p>
Все эти элементы остаются частью одного <p>, если
между строками нет пустой строки.
Пустые строки без текста автоматически игнорируются. Если требуется явно создать пустой параграф, можно использовать специальную конструкцию:
const markdownText = `
Текст перед пустым параграфом.
Текст после пустого параграфа.
`;
const html = marked(markdownText);
console.log(html);
Вывод:
<p>Текст перед пустым параграфом.</p>
<p> </p>
<p>Текст после пустого параграфа.</p>
Использование обеспечивает корректное
отображение визуально пустого блока в HTML.
При рендеринге сложных структур, таких как цитаты или списки, Marked различает внутренние параграфы. Например:
const markdownText = `
> Это цитата.
>
> Содержит второй параграф внутри.
`;
const html = marked(markdownText);
console.log(html);
Вывод:
<blockquote>
<p>Это цитата.</p>
<p>Содержит второй параграф внутри.</p>
</blockquote>
Каждый параграф внутри цитаты оборачивается в <p>
и сохраняет структуру вложенности.
Marked поддерживает глобальные опции для управления рендерингом,
включая режимы gfm, breaks,
smartLists. Например, для автоматического
преобразования всех переносов строк в <br>
используется опция breaks: true:
const html = marked("Строка 1\nСтрока 2", { breaks: true });
console.log(html);
Вывод:
<p>Строка 1<br>
Строка 2</p>
Эта настройка особенно полезна при отображении текстов с частыми переносами, таких как чаты или комментарии.
Рендеринг параграфов в Marked — фундаментальная возможность для построения HTML из Markdown. Тонкая настройка через Renderer и опции позволяет полностью контролировать внешний вид и структуру текста, включая вложенные элементы и переносы строк. Понимание работы с параграфами облегчает интеграцию Markdown в любые веб-приложения и расширяет возможности кастомизации.