Обработка файлов

Для работы с библиотекой Marked в Node.js её необходимо установить через 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():

const markdownString = '# Заголовок 1\n\nТекст параграфа';
const html = marked(markdownString);
console.log(html);

Результат:

<h1>Заголовок 1</h1>
<p>Текст параграфа</p>

Работа с файлами Markdown

Для обработки файлов используется модуль fs Node.js. Пример чтения файла Markdown и преобразования его в HTML:

const fs = require('fs');
const marked = require('marked');

fs.readFile('example.md', 'utf8', (err, data) => {
    if (err) throw err;
    const htmlContent = marked(data);
    fs.writeFile('example.html', htmlContent, (err) => {
        if (err) throw err;
        console.log('Файл example.html успешно создан.');
    });
});

Ключевые моменты:

  • fs.readFile позволяет загружать Markdown-файл.
  • marked(data) выполняет парсинг Markdown в HTML.
  • fs.writeFile сохраняет результат в HTML-файл.

Настройка рендеринга

Marked поддерживает кастомизацию через объект настроек. Примеры часто используемых параметров:

marked.setOptions({
    gfm: true,               // Поддержка GitHub Flavored Markdown
    breaks: true,            // Переводы строк интерпретируются как <br>
    headerIds: true,         // Добавление id к заголовкам
    mangle: false,           // Отключение искажения email-адресов
});

Можно также использовать пользовательский рендерер:

const renderer = new marked.Renderer();

renderer.link = function(href, title, text) {
    return `<a href="${href}" title="${title || ''}" target="_blank">${text}</a>`;
};

const html = marked(markdownString, { renderer });

Это позволяет полностью контролировать итоговый HTML для ссылок, изображений, заголовков и других элементов.

Потоковая обработка файлов

Для больших файлов удобно использовать потоковое чтение и запись:

const fs = require('fs');
const marked = require('marked');

const readStream = fs.createReadStream('large.md', 'utf8');
const writeStream = fs.createWriteStream('large.html');

let markdownBuffer = '';

readStream.on('data', chunk => {
    markdownBuffer += chunk;
});

readStream.on('end', () => {
    const html = marked(markdownBuffer);
    writeStream.write(html);
});

Такой подход минимизирует использование памяти и позволяет обрабатывать очень большие Markdown-документы.

Асинхронная обработка

Marked поддерживает асинхронный рендеринг с использованием промисов:

const fs = require('fs/promises');
const { marked } = require('marked');

async function convertFile(input, output) {
    const data = await fs.readFile(input, 'utf8');
    const html = await marked.parse(data);
    await fs.writeFile(output, html);
}

convertFile('example.md', 'example.html');

Преимущество: упрощает интеграцию с современными асинхронными цепочками и уменьшает вероятность блокировки потоков ввода-вывода.

Интеграция с шаблонами

Markdown, обработанный Marked, можно вставлять в HTML-шаблоны с помощью таких движков, как EJS, Pug или Handlebars:

const ejs = require('ejs');
const marked = require('marked');
const fs = require('fs');

const markdown = fs.readFileSync('article.md', 'utf8');
const htmlContent = marked(markdown);

const template = fs.readFileSync('template.ejs', 'utf8');
const finalHtml = ejs.render(template, { content: htmlContent });

fs.writeFileSync('output.html', finalHtml);

Это позволяет объединять Markdown-документы с динамическими страницами и шаблонами.

Работа с фронтендом

Для использования Marked в браузере:

<textarea id="markdown"></textarea>
<div id="preview"></div>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
    const textarea = document.getElementById('markdown');
    const preview = document.getElementById('preview');

    textarea.addEventListener('input', () => {
        preview.innerHTML = marked.parse(textarea.value);
    });
</script>

Ключевые моменты:

  • Используется метод marked.parse() для рендеринга Markdown в HTML.
  • Подключение через CDN упрощает работу без установки Node.js.
  • Реализуется мгновенный просмотр изменений Markdown в реальном времени.

Работа с безопасностью

При выводе пользовательского Markdown важно учитывать XSS-атаки. Marked позволяет использовать библиотеку DOMPurify для очистки HTML:

const DOMPurify = require('dompurify')(window);
const cleanHtml = DOMPurify.sanitize(marked.parse(userInputMarkdown));

Это предотвращает внедрение вредоносного кода через теги <script> и другие потенциально опасные элементы.

Итоговые рекомендации по обработке файлов

  • Для небольших файлов достаточно синхронного чтения и marked().
  • Для больших файлов лучше использовать потоковую обработку.
  • Настраивать рендерер для управления HTML-выходом и интеграции с шаблонами.
  • Обязательно обрабатывать пользовательский ввод через санитайзеры при работе в веб-приложениях.

Библиотека Marked обеспечивает гибкий и мощный способ преобразования Markdown в HTML, который подходит как для серверных сценариев с Node.js, так и для интерактивных веб-интерфейсов.