Многоточие

Markdown-it — это мощная и гибкая библиотека для преобразования текста в формате Markdown в HTML. Она написана на JavaScript и ориентирована на высокую скорость работы и расширяемость. Основная задача — корректная генерация HTML с поддержкой плагинов и расширений, обеспечивающих кастомные синтаксические конструкции.


Установка и базовое подключение

Установка через npm:

npm install markdown-it

Подключение и создание экземпляра парсера:

const MarkdownIt = require('markdown-it');
const md = new MarkdownIt();

Базовое преобразование Markdown в HTML выполняется методом render:

const result = md.render('# Заголовок\n\nТекст с **жирным** выделением.');
console.log(result);

Результатом будет корректно сгенерированный HTML:

<h1>Заголовок</h1>
<p>Текст с <strong>жирным</strong> выделением.</p>

Настройка опций

Markdown-it предоставляет ряд встроенных опций, влияющих на рендеринг:

const md = new MarkdownIt({
  html: true,           // разрешает HTML внутри Markdown
  xhtmlOut: false,      // генерировать XHTML
  breaks: true,         // перевод строки при одинарном переносе
  linkify: true,        // автоматически превращает URL в ссылки
  typographer: true     // включает типографические улучшения (кавычки, тире)
});

Ключевые опции:

  • html — позволяет вставлять HTML-теги напрямую.
  • breaks — управляет интерпретацией перевода строк.
  • linkify — автоматически обнаруживает URL и email-адреса.
  • typographer — преобразует обычные символы в типографически корректные (например, три точки ... в многоточие ).

Работа с токенами

Markdown-it использует промежуточное представление текста в виде токенов. Каждый элемент Markdown конвертируется в токены, которые затем рендерятся в HTML. Это позволяет расширять функциональность через плагины или кастомные правила.

Пример просмотра токенов:

const tokens = md.parse('**Жирный текст**', {});
console.log(tokens);

Типичный токен имеет структуру:

{
  "type": "strong_open",
  "tag": "strong",
  "attrs": null,
  "map": [0, 1],
  "nesting": 1,
  "level": 0,
  "children": null,
  "content": ""
}

Понимание токенов критично для создания собственных правил обработки Markdown.


Создание пользовательских правил

Markdown-it позволяет добавлять правила через метод use. Пример добавления правила для конвертации кастомного синтаксиса:

function myPlugin(md) {
  md.inline.ruler.after('emphasis', 'highlight', function(state, silent) {
    const start = state.pos;
    if (state.src[start] !== '^') return false;

    let end = state.src.indexOf('^', start + 1);
    if (end === -1) return false;

    if (!silent) {
      const token = state.push('highlight_open', 'mark', 1);
      token.markup = '^';

      const text = state.src.slice(start + 1, end);
      const textToken = state.push('text', '', 0);
      textToken.content = text;

      state.push('highlight_close', 'mark', -1);
    }

    state.pos = end + 1;
    return true;
  });
}

md.use(myPlugin);
console.log(md.render('Это ^важно^'));

Результат:

<p>Это <mark>важно</mark></p>

Работа с многоточиями

Многоточие в Markdown-it можно обработать через типографику. Опция typographer автоматически преобразует три точки ... в правильный символ .

const md = new MarkdownIt({ typographer: true });
console.log(md.render('Пример... продолжение'));

Результат:

<p>Пример… продолжение</p>

Для расширенной кастомизации можно использовать плагин markdown-it-replace или создавать собственное правило:

function ellipsisPlugin(md) {
  md.core.ruler.push('ellipsis', function(state) {
    state.tokens.forEach(token => {
      if (token.type === 'inline') {
        token.children.forEach(child => {
          if (child.type === 'text') {
            child.content = child.content.replace(/\.{3}/g, '…');
          }
        });
      }
    });
  });
}

md.use(ellipsisPlugin);
console.log(md.render('Тест... три точки'));

Результат:

<p>Тест… три точки</p>

Интеграция с другими библиотеками

Markdown-it легко интегрируется с синтаксическим подсветчиком кода:

const hljs = require('highlight.js');

const md = new MarkdownIt({
  highlight: function(str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return '<pre class="hljs"><code>' +
               hljs.highlight(str, { language: lang }).value +
               '</code></pre>';
      } catch (__) {}
    }
    return '<pre class="hljs"><code>' + md.utils.escapeHtml(str) + '</code></pre>';
  }
});

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


Расширения и плагины

Markdown-it поддерживает множество официальных и сторонних плагинов:

  • markdown-it-emoji — добавление emoji через синтаксис :smile:.
  • markdown-it-footnote — создание сносок.
  • markdown-it-container — кастомные блоки с классами и стилями.
  • markdown-it-abbr — сокращения и их определения.

Плагины подключаются методом use и могут быть комбинированы в любой последовательности для создания богатого Markdown-рендеринга.


Советы по производительности

  • Использовать один экземпляр MarkdownIt для повторного рендеринга большого количества текста.
  • При обработке больших документов применять метод parse для получения токенов и оптимизированного обхода дерева.
  • Отключать ненужные опции и плагины, чтобы снизить накладные расходы.

Markdown-it сочетает высокую скорость, гибкость и расширяемость, что делает его идеальным инструментом для проектов, где требуется точный контроль над рендерингом Markdown и поддержка нестандартных синтаксических конструкций.