Параметр pedantic

В библиотеке Marked параметр pedantic используется для управления поведением парсера Markdown в строгом соответствии с оригинальной спецификацией Markdown, как она была определена Джоном Грубером. Включение этого параметра изменяет обработку некоторых синтаксических конструкций, делая их более консервативными и предсказуемыми для старых текстов Markdown.

Основное назначение

По умолчанию Marked допускает ряд «нестрогих» расширений Markdown, которые упрощают работу с текстом и делают парсинг более гибким. Параметр pedantic отключает эти расширения, заставляя парсер вести себя так, как это делал бы классический Markdown:

  • Заголовки с ведущими символами # обрабатываются строго, без дополнительных пробелов или интерпретаций.
  • Разделители горизонтальных линий (---, ***) требуют точного соблюдения формата.
  • Упрощённая интерпретация списков и ссылок.

Синтаксис использования

Параметр задаётся при конфигурации Marked:

import { marked } from 'marked';

marked.setOptions({
  pedantic: true
});

Также его можно передавать при вызове функции marked напрямую:

const markdownText = "# Заголовок\n\n* Элемент списка";
const html = marked(markdownText, { pedantic: true });

Влияние на заголовки

Когда pedantic включён, парсер обрабатывает заголовки по оригинальным правилам Markdown:

  • Заголовок уровня 1 должен начинаться с одного #, за которым обязательно следует пробел.
  • Заголовки с # без пробела не будут интерпретироваться как заголовки, а останутся обычным текстом.
  • Альтернативная разметка заголовков через подчёркивания (=== и ---) сохраняется, но также строго проверяется на корректность расположения символов.

Пример:

#Правильный заголовок
# Неправильный заголовок

При pedantic: true только второй вариант будет корректно обработан как заголовок.

Обработка списков

Параметр pedantic влияет на распознавание маркированных и нумерованных списков:

  • Требуется строгий отступ для вложенных списков.
  • Элементы списка должны начинаться с корректного символа (*, - или +) и пробела.
  • Нумерованные списки требуют, чтобы число и точка были сразу перед пробелом (1. Элемент), иначе элемент не считается частью списка.

Пример:

- Элемент 1
 - Элемент 2

С pedantic: true второй элемент не будет восприниматься как вложенный, а останется обычным текстом с тире.

Влияние на ссылки и изображения

С включённым pedantic:

  • Ссылки с пробелами вокруг текста или URL могут не обрабатываться.
  • Синтаксис [текст](URL) и ![альт](URL) должен точно соответствовать оригинальной спецификации.
  • Автоопределение ссылок (autolinks) отключается для нестандартных форматов.

Пример:

[Пример]( https://example.com )  // В pedantic:true пробелы запрещены

Обработка переносов строк

В классическом Markdown перенос строки в конце строки без двойного пробела не создаёт <br>:

  • С pedantic: false библиотека может автоматически добавлять <br> для удобства.
  • С pedantic: true <br> появляется только при наличии двух пробелов в конце строки или явного HTML-тега <br>.

Особенности применения

Параметр pedantic полезен в следующих случаях:

  1. Совместимость со старыми текстами Markdown, созданными строго по спецификации.
  2. Контроль точного парсинга, когда важен строгий формат заголовков и списков.
  3. Сценарии миграции контента, где необходимо избежать неожиданного изменения структуры при автоматическом парсинге.

Однако включение pedantic ограничивает гибкость Markdown, делая невозможными некоторые расширения, используемые современными редакторами.

Практический пример

const markdown = `
# Заголовок 1
## Заголовок 2
- Элемент списка
  - Вложенный элемент
[Ссылка](https://example.com)
`;

const htmlStrict = marked(markdown, { pedantic: true });
console.log(htmlStrict);

Результат будет соответствовать строгому стандарту Markdown, без автоматических интерпретаций или добавления <br> там, где это не предусмотрено спецификацией.

Резюме особенностей

  • Строгие заголовки: обязательный пробел после #.
  • Списки: точный отступ и символы, строгое соблюдение нумерации.
  • Ссылки и изображения: только стандартный синтаксис [текст](URL) и ![альт](URL).
  • Переносы строк: <br> добавляется только при двойном пробеле.
  • Совместимость: максимальная приближенность к оригинальному Markdown.

Использование pedantic позволяет создать парсер, который ведёт себя предсказуемо в старых проектах и строго соблюдает классическую разметку Markdown без расширений.