Библиотека Marked — это мощный инструмент для парсинга Markdown в JavaScript, обеспечивающий высокую скорость и гибкость. Одной из наиболее востребованных возможностей является пользовательская подсветка кода, позволяющая интегрировать собственные механизмы для выделения синтаксиса внутри блоков кода.
highlightMarked поддерживает опцию highlight, которая вызывается
для каждого блока кода. Она принимает два параметра: code и
language. Результатом работы функции должна быть строка с
HTML-разметкой, где код подсвечен по выбранному синтаксису.
import { marked } from 'marked';
import hljs from 'highlight.js';
marked.setOptions({
highlight: function(code, language) {
if (language && hljs.getLanguage(language)) {
return hljs.highlight(code, { language }).value;
}
return hljs.highlightAuto(code).value;
}
});
Ключевые моменты:
language), библиотека
highlight.js использует его напрямую.highlightAuto.Для специальных языков или диалектов можно расширить возможности подсветки, зарегистрировав новый язык в библиотеке подсветки:
hljs.registerLanguage('mylang', function(hljs) {
return {
keywords: 'если иначе пока',
contains: [
hljs.C_LINE_COMMENT_MODE,
hljs.C_BLOCK_COMMENT_MODE,
hljs.QUOTE_STRING_MODE
]
};
});
marked.setOptions({
highlight: function(code, language) {
if (language === 'mylang') {
return hljs.highlight(code, { language: 'mylang' }).value;
}
return hljs.highlightAuto(code).value;
}
});
Такой подход позволяет интегрировать любой кастомный синтаксис, обеспечивая точное выделение элементов кода.
Marked поддерживает асинхронное выполнение функции подсветки через промисы. Это полезно, если подсветка требует внешних ресурсов или сложных вычислений:
marked.setOptions({
async highlight(code, language) {
const result = await fetchHighlight(code, language);
return result;
}
});
fetchHighlight может быть любой функцией, возвращающей
промис с HTML-кодом. Это расширяет возможности интеграции с внешними
сервисами подсветки или WebAssembly-движками.
Кроме опции highlight, библиотека позволяет создавать
собственные рендереры, которые управляют выводом HTML
для блоков кода:
const renderer = new marked.Renderer();
renderer.code = function(code, language) {
const highlighted = hljs.highlightAuto(code).value;
return `<pre class="custom-code"><code>${highlighted}</code></pre>`;
};
marked.setOptions({ renderer });
Преимущества использования кастомного рендерера:
<pre> и
<code>.При создании пользовательской подсветки необходимо учитывать безопасность:
escapeHTML) для защиты от XSS.Пример безопасного рендеринга:
function escapeHTML(html) {
return html
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
renderer.code = function(code, language) {
const highlighted = hljs.highlightAuto(code).value;
return `<pre><code>${escapeHTML(highlighted)}</code></pre>`;
};
Иногда необходимо подсвечивать сложные шаблонные строки или многорядные фрагменты кода. Для этого рекомендуется:
Большие документы Markdown с множеством блоков кода могут замедлять рендеринг. Рекомендуется:
highlight.js с минимальной конфигурацией
языков.Хотите, я подготовлю следующую статью по теме Расширенные возможности рендерера Marked с примерами сложной интеграции и плагинов?