Параметр smartypants

Параметр smartypants является одной из настроек библиотеки Marked, предназначенной для работы с Markdown в JavaScript. Его основная задача — преобразование обычных символов в текстовые, более «типографически правильные» аналоги. Это особенно полезно для улучшения визуального восприятия текста на веб-страницах.

Основные функции smartypants

При включении smartypants Marked автоматически заменяет следующие элементы:

  1. Кавычки

    • Прямые одинарные и двойные кавычки (' и ") преобразуются в «умные» кавычки (, , , ).

    • Пример:

      const input = '"Hello", he said.';
      const output = marked(input, { smartypants: true });
      // Результат: “Hello”, he said.
  2. Дефисы и тире

    • Двойное тире (--) преобразуется в длинное тире ().

    • Простой дефис в некоторых контекстах может оставаться без изменений.

    • Пример:

      const input = 'Wait--what?';
      const output = marked(input, { smartypants: true });
      // Результат: Wait—what?
  3. Многоточие

    • Три точки (...) заменяются на единый символ многоточия ().

    • Пример:

      const input = 'Loading...';
      const output = marked(input, { smartypants: true });
      // Результат: Loading…
  4. Строчные апострофы и обратные кавычки

    • Апострофы и обратные одинарные кавычки в определённых контекстах заменяются на правильные типографские аналоги.

    • Пример:

      const input = "It's a test.";
      const output = marked(input, { smartypants: true });
      // Результат: It’s a test.

Использование smartypants в Marked

Для включения параметра достаточно передать его в объект настроек при вызове функции marked:

const marked = require('marked');

const markdownText = '"Hello world" -- he said...';
const html = marked(markdownText, { smartypants: true });

console.log(html);
// Вывод: <p>“Hello world” — he said…</p>

Можно включить smartypants глобально, настроив marked через marked.setOptions:

marked.setOptions({
  smartypants: true
});

const htmlGlobal = marked('"Test" -- example...');
console.log(htmlGlobal);
// Вывод: <p>“Test” — example…</p>

Влияние на безопасность и производительность

  • smartypants не влияет на безопасность Markdown, так как изменения затрагивают только текстовые символы.
  • Производительность обработки слегка снижается при больших объёмах текста, так как библиотека выполняет дополнительные регулярные выражения для замены символов.
  • При работе с динамическим контентом важно учитывать, что включение smartypants может изменять исходные символы, что иногда нежелательно, например при генерации кода или технических текстов.

Настройка поведения

Marked предоставляет возможность детальной настройки smartypants через собственные опции:

  • Отключение конкретных замен:

    • Если требуется отключить обработку конкретных символов, можно использовать кастомные правила через расширения (extensions) и перехватывать преобразования.

Пример расширения, которое отключает замену дефисов на тире:

const smartypantsExtension = {
  name: 'noDashes',
  level: 'inline',
  renderer(token) {
    if (token.type === 'text') {
      return token.raw.replace(/--/g, '--'); // оставляем двойное тире без изменений
    }
    return token.raw;
  }
};

marked.use({ extensions: [smartypantsExtension], smartypants: true });

const htmlCustom = marked('Wait--what?');
console.log(htmlCustom);
// Вывод: <p>Wait--what?</p>

Практические советы

  • Использовать smartypants целесообразно для публикации текстов с естественным языком, где важна типографика.
  • Не рекомендуется включать при генерации технической документации с кодом, путями файлов или формулами.
  • В комбинации с другими опциями Marked (gfm, breaks, headerIds) smartypants корректно работает в большинстве случаев без конфликтов.

Итоговая структура работы

  1. Подключение библиотеки.
  2. Включение smartypants через объект настроек.
  3. При необходимости создание расширений для точного контроля замен.
  4. Генерация HTML с учётом типографских символов.

Использование параметра smartypants делает Markdown-контент визуально более профессиональным и удобным для чтения, превращая стандартные символы в типографически корректные аналоги без изменения логики документа.