Для использования библиотеки Marked необходимо сначала её установить через npm:
npm install marked
После установки библиотеку можно подключить в проекте:
const { marked } = require('marked');
Для использования в браузере доступен вариант через CDN:
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
После подключения глобальная функция marked() становится
доступной для преобразования Markdown в HTML.
Библиотека Marked предназначена для преобразования текста,
написанного в Markdown, в HTML. Основной метод —
marked():
const markdown = `
# Заголовок первого уровня
Текст с **жирным выделением** и *курсивом*.
`;
const html = marked(markdown);
console.log(html);
Результатом будет:
<h1>Заголовок первого уровня</h1>
<p>Текст с <strong>жирным выделением</strong> и <em>курсивом</em>.</p>
Marked позволяет гибко настраивать процесс преобразования через
объект options:
marked.setOptions({
gfm: true, // Включение расширенного синтаксиса GitHub
breaks: true, // Перенос строки при одной новой строке
smartLists: true, // Умные списки
smartypants: true // Преобразование кавычек и тире в типографские символы
});
Проверка работы настроек:
const markdown = "Пример\nновой строки";
const html = marked(markdown); // <p>Пример<br>новой строки</p>
Для более точного контроля над HTML можно создавать собственный рендерер:
const renderer = {
heading(text, level) {
return `<h${level} class="custom-heading">${text}</h${level}>`;
},
link(href, title, text) {
return `<a href="${href}" title="${title || ''}" target="_blank">${text}</a>`;
}
};
marked.use({ renderer });
const markdown = "# Заголовок с кастомным классом";
const html = marked(markdown);
Для предотвращения XSS можно использовать функцию
DOMPurify или встроенные методы для безопасного вывода:
import DOMPurify from 'dompurify';
const unsafeHtml = marked(markdown);
const safeHtml = DOMPurify.sanitize(unsafeHtml);
Marked поддерживает асинхронное преобразование через промисы и функции обратного вызова, что полезно при интеграции с внешними источниками данных:
marked.parseAsync(markdown)
.then(html => console.log(html))
.catch(err => console.error(err));
В React Markdown обычно рендерится через dangerouslySetInnerHTML:
function MarkdownViewer({ content }) {
return <div dangerouslySetInnerHTML={{ __html: marked(content) }} />;
}
Для Vue:
<div v-html="markedContent"></div>
<script>
import { marked } from 'marked';
export default {
data() {
return { markdown: '# Заголовок' };
},
computed: {
markedContent() {
return marked(this.markdown);
}
}
};
</script>
Marked поддерживает:
highlight.js или Prism.js)gfmПример таблицы:
| Имя | Возраст |
|------|--------:|
| Иван | 25 |
| Анна | 30 |
Рендеринг в HTML:
<table>
<thead>
<tr><th>Имя</th><th>Возраст</th></tr>
</thead>
<tbody>
<tr><td>Иван</td><td>25</td></tr>
<tr><td>Анна</td><td>30</td></tr>
</tbody>
</table>
Для расширенного анализа Markdown Marked предоставляет возможность работать с лексером:
const tokens = marked.lexer(markdown);
console.log(tokens);
Токены позволяют:
Пример добавления кастомного правила:
marked.use({
tokenizer: {
customBold(src) {
const match = /^\+\+([\s\S]+?)\+\+/.exec(src);
if (match) {
return { type: 'strong', raw: match[0], text: match[1] };
}
}
}
});
Marked можно расширять через плагины, которые модифицируют парсер или рендерер. Пример использования с подсветкой синтаксиса кода:
import hljs from 'highlight.js';
marked.setOptions({
highlight: function(code, lang) {
return hljs.highlight(code, { language: lang }).value;
}
});
Эта библиотека сочетает простоту использования с гибкой настройкой, позволяя адаптировать процесс преобразования Markdown в HTML под конкретные задачи веб-приложений, редакторов и панелей инструментов.