Глубокие погружения

Рождение Markdown: как plain text победил в вебе

koboshiCo-founder
·9 мин чтения
Рождение Markdown: как plain text победил в вебе
Кратко

Markdown начинался как сокращение для веб-писателей. Два десятилетия спустя он питает README на GitHub, статические сайты, приложения для заметок и большую часть вывода LLM. В этом посте разбираются его истоки, сравнение с HTML и форматами вроде docx и PDF, реальные компромиссы и инструменты с библиотеками, которые держат его в рабочем состоянии на разных платформах и языках программирования.

Откройте любой репозиторий на GitHub. Первое, что вы видите, — не код, а README.md. Обычно этот файл написан на Markdown, и это самый читаемый документ в проекте. Вакансии, научные статьи и юридические контракты редко хранятся в Markdown, но огромная часть технических текстов в вебе — да. Чтобы понять почему, нужно вернуться к формату, который задумывался для чтения до отображения.

Откуда взялся Markdown

В 2004 году Джон Грубер, технический писатель, опубликовал спецификацию синтаксиса Markdown при участии Аарона Шварца. Цель Грубера была практической: ему нужен был способ писать для веба, который выглядел бы хорошо в plain text и позже превращался в HTML. В то время веб работал на тегах. Написать пост означало обернуть каждый параграф, список и ссылку в угловые скобки. Грубер считал этот шум ненужным для той прозы, которую публиковало большинство людей.

Результатом стал небольшой набор соглашений:

  • Заголовки обозначаются символами #.
  • Списки — символами - или *.
  • Ссылки — конструкцией [text](url).
  • Выделение — *text* или _text_.
  • Код — в обратных апострофах.

Эти соглашения позаимствованы из email, Usenet и привычек plain text, которые писателям уже были знакомы. Markdown мало что изобрел. Он просто записал правила.

Грубер также выпустил эталонную реализацию — Markdown.pl, скрипт на Perl, который преобразовывал синтаксис в HTML. Сочетание читаемого исходного формата и детерминированного выходного сделало его простым для внедрения. Писатели получили файл, который можно редактировать в любом текстовом редакторе. Издатели — чистый HTML, который можно стилизовать с помощью CSS.

Markdown — это не HTML

Это звучит очевидно, но технически различие важно. HTML — структурированный формат документов. Он описывает элементы, атрибуты, вложенность и поведение. Браузеру без разницы, как исходник выглядит для человека; его интересует DOM, который можно построить из разметки.

Markdown — соглашение для написания текстов. У него нет DOM, обработчиков событий, форм и схемы метаданных, кроме того, что пользователи добавляют во frontmatter. Это ближе к shorthand, чем к языку разметки. Когда Markdown пропускают через парсер, на выходе обычно получается HTML, но сам Markdown касается только тех частей документа, которые писатель вводит вручную: заголовков, параграфов, выделения, списков, ссылок, изображений и кода.

Это различие определяет, где используется каждый формат:

ЗадачаMarkdownHTML
Написание первого черновикаБыстро, читается в любом редактореМногословно, прерывает поток
Diff в системе контроля версийЧистый, изменения на уровне предложенийШумный из-за тегов
Точная версткаСлаб по замыслуСильная
ИнтерактивностьНетВстроенная
СтилизацияДелегирована рендереруInline или CSS

HTML — финальная страница. Markdown — черновик.

Почему он так быстро распространился

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

Контроль версий. Когда Git стал стандартом, разработчики начали хранить документацию рядом с кодом. Plain text победил, потому что diff были читаемы. HTML и документы Word превращают небольшие правки в нечитаемые куски в diff. Markdown оставался разборчивым.

GitHub. В 2009 году GitHub начал рендерить файлы README.md на страницах репозиториев. Внезапно каждому проекту понадобился файл на Markdown. За ним последовал Stack Overflow с Markdown для вопросов и ответов. Разработчики выучили синтаксис, потому что платформы, которыми они пользовались ежедневно, требовали этого.

Генераторы статических сайтов. Инструменты вроде Jekyll, Hugo, Gatsby, а позже Next.js превращали файлы Markdown в полноценные сайты. Писатели могли публиковать тексты без CMS. Исходники лежали в Git-репозитории, а на этапе сборки генерировался HTML. Этот рабочий процесс, теперь называемый docs-as-code, превратил Markdown в формат входных данных для большой части современного веба.

Приложения для заметок дали последний толчок. Obsidian, Notion, Bear, Logseq и iA Writer поддерживают Markdown или его близкую разновидность. Формат вышел за пределы инструментов разработчиков и стал способом организации личных знаний.

Заменит ли Markdown docx и PDF?

Нет. Вопрос возникает потому, что Markdown кажется легким, а другие форматы — тяжелыми, но они решают разные задачи.

Файл .docx — это запакованный XML-пакет, созданный для расширенного редактирования: отслеживание изменений, комментарии, стили, оглавление, слияние почты и встроенные медиа. Это формат контрактов, отчетов и рукописей, которые требуют редактирования нетехническими пользователями туда и обратно.

PDF — формат электронных документов с фиксированной версткой. Он сохраняет шрифты, интервалы и разбивку на страницы на разных устройствах. Именно это нужно для финального счета, резюме или научной статьи, которые должны выглядеть одинаково везде.

Markdown — формат обмена. Он отлично подходит для черновиков, версионирования и публикации в вебе. Ужасен для верстки страниц, точной типографики и подготовки к печати. Реалистичный рабочий процесс: писать в Markdown, а затем конвертировать в docx или PDF, когда документ должен покинуть текстовый редактор.

Здесь становятся полезными конвертеры в браузере. Когда черновик Markdown нужно превратить в PDF, который можно передать, наш конвертер Markdown в PDF выполняет преобразование локально. Если вы начинаете с PDF и хотите редактируемый Markdown, конвертер PDF в Markdown извлекает структуру без загрузки файла.

Что Markdown делает хорошо — и где ломается

Преимущества

  • Читаемый исходник. Файл Markdown почти так же чист, как отрендеренная страница. Его можно читать в терминале, почтовом клиенте или приложении для заметок на телефоне.
  • Портативный. Это plain text. Никакого проприетарного вендора, лицензии или бинарного формата, который может повредиться.
  • Удобный для diff. Git показывает точно, какое предложение изменилось. Писатели и рецензенты сразу это замечают.
  • Много инструментов. В каждом языке программирования есть парсеры. На каждой крупной платформе — редакторы.
  • Нативный для веба. Он компилируется в HTML — реальный выходной формат веба.

Ограничения

  • Неоднозначная спецификация. Исходная спецификация Грубера оставляет крайние случаи неопределенными. Разные парсеры для одного и того же входа дают разный HTML. Поэтому существует CommonMark, но не каждый инструмент его использует.
  • Нет контроля над версткой. Нельзя позиционировать изображения, задавать поля страницы или определять стили печати без перехода на HTML или CSS.
  • Хаос диалектов. GitHub Flavored Markdown, Pandoc Markdown, MultiMarkdown, Obsidian Markdown и MDX добавляют несовместимые расширения. Файл, написанный для одного инструмента, может неправильно отобразиться в другом.
  • Таблицы и сноски — дополнение. Они поддерживаются расширениями, а не ядром синтаксиса, и их поведение различается.

Честный итог: Markdown хорош на 90% написания текста — параграфы, списки, ссылки и код. Оставшиеся 10% он отдает HTML или специализированным форматам.

Markdown в эпоху ИИ

Если вы использовали large language model (LLM), вы видели Markdown. Большинство чат-интерфейсов по умолчанию рендерят вывод LLM как Markdown. На то есть практические причины.

Во-первых, Markdown компактен. Токены дороги, а формат, который использует # вместо <h1></h1>, экономит место. Во-вторых, Markdown структурно прост. Заголовки, списки и блоки кода легко генерировать модели и легко валидировать парсеру. В-третьих, обучающие данные полны Markdown. GitHub, Stack Overflow, Reddit и сайты документации используют его, поэтому модели надежно учат синтаксис.

Помимо чат-вывода, Markdown стал форматом хранения для систем ИИ-знаний. Конвейеры Retrieval-Augmented Generation (RAG) часто разбивают документы на Markdown или plain text, потому что структура предсказуема. Векторные базы данных, инструменты для заметок и помощники по программированию хранят долгосрочный контекст в файлах Markdown, потому что их читают люди и парсят машины.

Риск — в несовместимости диалектов. Одна модель выдает таблицы в стиле GitHub; другая для той же таблицы использует HTML. База знаний, смешивающая диалекты, может сломаться при переносе между инструментами. Стандартизация на CommonMark или задокументированном диалекте — единственный способ сохранить портативность Markdown, сгенерированного ИИ.

Будущее и развитие Markdown

Markdown не станет более сложным форматом. Каждая попытка добавить в него больше возможностей — таблицы, сноски, списки определений, атрибуты — отдаляет его от той самой простоты, которая сделала его популярным. Настоящее развитие идет в двух направлениях.

Стандартизация. CommonMark, запущенный в 2014 году, определяет строгую спецификацию парсинга. Все больше инструментов его реализуют, что снижает неожиданности при переносе файла из одного парсера в другой.

Встраивание. MDX позволяет авторам импортировать React-компоненты внутри Markdown. Jupyter notebooks смешивают ячейки Markdown с исполняемым кодом. Генераторы статических сайтов используют Markdown как источник данных для структурированного контента. В каждом случае Markdown остается маленьким, а окружающий инструмент добавляет возможности.

Вероятное будущее — больше того же: Markdown как универсальный формат черновиков в plain text, а конвертеры превращают его в HTML, PDF, docx, слайды или что потребует целевая система.

Инструменты для чтения и редактирования по платформам

Для Markdown не нужно специальное приложение. Подойдет любой текстовый редактор. Тем не менее некоторые инструменты заметно упрощают работу.

Windows

  • VS Code с расширениями для Markdown: стандартный выбор разработчиков. Поддерживает превью, линтинг и рендеринг через Markdown-it.
  • Typora: минималистичный WYSIWYG-редактор, который скрывает синтаксис, пока он не понадобится.
  • MarkText: open-source альтернатива Typora с чистым разделенным видом.
  • Notepad++: подходит для быстрых правок, подсветка синтаксиса Markdown через плагины.

macOS

  • iA Writer: ориентирован на письмо без отвлечений и контроль синтаксиса.
  • Bear: приложение для заметок с Markdown-ish синтаксисом для управления личными знаниями.
  • Ulysses: популярен среди авторов длинных текстов, которые публикуют в вебе.
  • Marked 2: не редактор, а мощный рендерер live preview для файлов, отредактированных в другом месте.

Linux

  • Ghostwriter: редактор Markdown для письма без отвлечений с live preview.
  • Apostrophe: чистый редактор на GTK, разработанный для прозы.
  • ReText: простой редактор с экспортом в несколько форматов.
  • Vim / Neovim / Emacs: непревзойдены для писателей, которые уже живут в терминале.

Кроссплатформенные

  • Obsidian: knowledge base с локальным хранением, ссылками, графами и плагинами.
  • Logseq: outliner, который хранит все как Markdown или Org files.
  • Joplin: open-source приложение для заметок с end-to-end шифрованием и поддержкой Markdown.

Библиотеки Markdown по языкам

Если вы пишете ПО, которое парсит или рендерит Markdown, редко нужно писать парсер самостоятельно. Экосистема зрелая.

ЯзыкБиблиотекаПримечания
Pythonmarkdown, mistletoe, markdown-it-pymarkdown — классическая; markdown-it-py — порт, совместимый с CommonMark
JavaScript / TypeScriptmarked, markdown-it, remark / unifiedremark — часть экосистемы unified для обработки на основе AST
Gogoldmark, blackfridaygoldmark совместим с CommonMark и расширяем
Rustpulldown-cmark, comrakБыстрые, безопасные, ориентированы на CommonMark
Rubyredcarpet, kramdownredcarpet — GitHub-flavored; kramdown — используется в Jekyll по умолчанию
Javacommonmark-java, flexmark-javaflexmark поддерживает многие расширения в стиле Pandoc
C#MarkdigВысоко расширяемая, используется генераторами статических сайтов вроде Statiq

Большинство этих библиотек хорошо справляются с ядром синтаксиса. Различия проявляются в расширениях, производительности и строгости следования CommonMark. Выбирайте исходя из диалекта, который нужно поддерживать, а не только из языка, который вы используете.

Итог

Markdown победил не потому, что мощный. Он победил, потому что не мешает. Писатель может открыть любой текстовый редактор, набрать документ и закоммитить его в систему контроля версий, не думая о форматах файлов. Этот компромисс намеренный: Markdown жертвует точностью верстки в обмен на портативность и читаемость.

Этот компромисс объясняет, почему он лежит в основе README, документации, статических сайтов, приложений для заметок и теперь вывода ИИ. По той же причине он будет сосуществовать с docx и PDF. У каждого формата своя работа. Работа Markdown — быть отправной точкой в plain text. Когда нужно перенести эту точку в формат с более широкими возможностями, следующим шагом обычно становится конвертер.

Ещё посты в блоге