Markdown
Markdown
Markdown — это лёгкий язык разметки: ты пишешь обычный текст с несколькими служебными значками (звёздочки, решётки, дефисы), а конвертер превращает его в HTML, PDF или что угодно другое. Главная идея: исходник должен оставаться удобочитаемым сам по себе, без рендеринга.
История
Markdown придумал в марте 2004 года американский программист и блогер Джон Грубер (John Gruber) — автор сайта daringfireball.net. Он сделал это в соавторстве с Аароном Шварцем (Aaron Swartz) — тем самым активистом и одним из ранних соразработчиков RSS и Reddit; Аарон трагически погиб в 2013 году в 26 лет.
Какую проблему решали в 2004 году. В тот момент блогосфера росла взрывом — Movable Type, WordPress, LiveJournal. Люди писали посты в браузерных текстовых полях, и для форматирования приходилось вручную набирать HTML: <p>, <strong>, <a href="...">. Это медленно, ошибки в тегах ломают вёрстку, а исходник выглядит как мусор. У многих движков были свои «упрощённые разметки» (BBCode на форумах, Textile, Setext), но они были разрознены и часто уродливо смотрелись в plain text.
Грубер сформулировал главное требование коротко: «исходник должен быть так же удобочитаем, как и финальный текст». То есть человек, читающий .md-файл в любом блокноте без какого-либо рендеринга, должен понимать что к чему. Звёздочки вокруг слова — это явный визуальный сигнал «выделено», даже если их никто не превратит в <em>.
Вехи развития:
- 2004 — первая версия Markdown 1.0, perl-скрипт
Markdown.plот Грубера. - 2007 — PHP Markdown Extra (Michel Fortin) добавляет таблицы, сноски, definition lists.
- 2009 — MultiMarkdown расширяет синтаксис для академических текстов (метаданные, цитирование).
- 2014 — выходит CommonMark — попытка стандартизировать Markdown. Инициировали Jeff Atwood (сооснователь Stack Overflow), John MacFarlane и другие. До этого у каждого парсера была своя интерпретация спорных мест, и одна и та же разметка рендерилась по-разному.
- 2017 — публикуется GitHub Flavored Markdown (GFM) на базе CommonMark. Добавляет таблицы, чек-боксы
- [ ], зачёркивание, автоссылки, fenced code blocks с указанием языка. - 2020-е — Markdown становится фактическим стандартом для документации, README, заметок (Obsidian, Notion-экспорт), статических блогов и теперь — промтов для ИИ-ассистентов.
Текущий статус: оригинальная спецификация Грубера так и не получила официального продолжения и осталась в виде того самого perl-скрипта 2004 года. Грубер до сих пор владеет «брендом» Markdown и в 2014-м публично возражал против переименования CommonMark из «Standard Markdown» (его попросили убрать слово). Это редкий случай в IT, когда автор намеренно отказался от формальной стандартизации, и сообщество просто пошло своим путём.
Что это такое
Markdown — это облегчённый язык разметки (lightweight markup language). Слова важные: «язык разметки» означает, что в тексте есть служебные символы, которые говорят «это заголовок», «это ссылка», «это код». «Облегчённый» — что этих символов мало и они выбраны так, чтобы не мешать чтению.
Пример. Вот сырой Markdown:
# Привет
Это **жирно**, а это *курсив*.
Ссылка: [Wikipedia](https://ru.wikipedia.org).
- пункт списка
- ещё пункт
Прочитать это можно без всякого рендера и всё равно понять структуру. Это и есть основная фишка.
Markdown — не один язык, а семейство диалектов. Базовый набор (заголовки, списки, жирный/курсив, ссылки, картинки, цитаты, код) одинаков почти везде. Дальше начинаются расширения, и это место главной путаницы.
- CommonMark — попытка железно зафиксировать поведение базового набора (как именно интерпретировать пограничные случаи, например
*foo *bar* baz*). - GitHub Flavored Markdown (GFM) — то, что ты видишь в README на GitHub: добавляет таблицы, чек-боксы, fenced code с подсветкой, автоссылки.
- MultiMarkdown — для академических текстов: сноски, библиография, формулы.
- Pandoc Markdown — мощнейший диалект, который понимает Pandoc — конвертер «всё во всё». Поддерживает формулы, footnote, цитирование в стиле BibTeX.
- Obsidian/Notion/Bear — каждый со своими доработками: бэк-линки
[[заметка]], callouts> [!warning], frontmatter с метаданными.
Markdown vs HTML: HTML — это формат вывода, Markdown — формат ввода. Markdown всегда конвертируется во что-то — чаще всего в HTML, реже в PDF или другие форматы. Если ты пишешь в Notepad и сохраняешь .md, ты пока не получил веб-страницу — нужен парсер.
Markdown vs форматы документов (DOCX, Pages): эти форматы хранят и шрифты, и стили, и точные размеры. Markdown хранит только структуру — «это заголовок второго уровня», «это пункт списка», — а оформление подставляется при рендере через CSS или шаблоны. Это в одну сторону ограничение (нельзя задать «вот эту строку сделай Comic Sans 14pt»), в другую сторону — освобождение (один и тот же текст легко переоформить под десять разных тем).
Аналогии из жизни
1. Рукописная записка vs распечатанный документ.
Пишешь записку: «КУПИ» большими, «молоко 2л» меньшими, подчёркиваешь срочное. Любой читающий разберётся без шрифтов и стилей — структура понятна из самой записи. Markdown — это твоя записка, формализованная: «БОЛЬШЕ ВСЕГО» = #, «выделено» = **...**.
Где ломается: в записке ты можешь нарисовать стрелочку или схему, в Markdown — только текст и базовые блоки. Сложную диаграмму придётся делать через картинку или встроенный язык типа Mermaid.
2. Партитура для уличного гитариста (табулатура) vs нотный стан.
Табулатура — это ASCII-разметка для гитары: цифры и горизонтальные линии. Любой гитарист поймёт за 5 минут. Нотный стан — это полноценный язык, ему учат годами, но он точнее (длительности нот, нюансы динамики). Markdown — это табулатура: научился за вечер, передаёт 90% задач, а сложное оставь для LaTeX или HTML.
Где ломается: табулатура не передаёт длительность ноты точно, а Markdown — все нюансы вёрстки. Если тебе нужна полиграфия аптечной точности, бери InDesign, а не Markdown.
3. Сценарий пьесы vs её постановка.
Сценарий — текст с пометками: «(тихо)», «(в сторону)», «Действие 1». Из одного и того же сценария можно поставить разные спектакли — классический, авангардный, киноверсию. Markdown — это сценарий: разметка хранит сюжет (структуру), а театр (HTML+CSS) ставит вид.
Где ломается: по сценарию нельзя понять, как звучит конкретный голос актёра, по Markdown — как точно встанут пиксели. Это абстракция, и в этом её сила и её предел.
Как это работает
Когда ты пишешь Markdown-файл и хочешь увидеть его как веб-страницу, в фоне происходит pipeline (последовательность этапов):
Шаг 1. Лексический анализ (tokenizer / lexer).
Парсер читает текст символ за символом и режет его на токены — атомарные элементы. Видит # в начале строки — токен «начало заголовка». Видит пустую строку — токен «разделитель абзацев». Видит ``` — токен «начало блока кода».
Шаг 2. Построение синтаксического дерева (AST).
Из плоского потока токенов парсер собирает дерево: корень — документ, дети — блоки (заголовки, абзацы, списки), листья — инлайн-элементы (текст, ссылка, выделение). Это дерево — внутреннее представление, с ним удобно работать программно: пройти по всем заголовкам, найти все ссылки, посчитать слова.
document
├── heading (level=1)
│ └── text "Привет"
├── paragraph
│ ├── text "Это "
│ ├── strong
│ │ └── text "жирно"
│ └── text "."
└── list (ordered=false)
├── item
│ └── text "пункт"
└── item
└── text "ещё пункт"
Шаг 3. Рендеринг (output).
По дереву пробегает рендерер и выплёвывает целевой формат. Для HTML это будут <h1>Привет</h1>, <p>Это <strong>жирно</strong>.</p> и так далее. Для PDF — соответствующие команды LaTeX или прямого рендера. Один и тот же AST можно отрендерить во что угодно — отсюда универсальность.
Где находятся «спорные места».
Markdown как формат довольно расплывчат, особенно в краевых случаях. Что значит *foo*bar* — это <em>foo</em>bar* или *foo<em>bar</em>? Что делать с разными типами кавычек? Можно ли вкладывать жирный в курсив, и в каком порядке? У оригинального Markdown.pl поведение было непредсказуемым на таких примерах, и каждый клон-парсер реализовывал по-своему. CommonMark появился именно как формальная спецификация — список из ~600 тест-кейсов, по которым можно проверить, правильно ли парсер реагирует.
Жаргон в скобках:
- inline (внутри строки) — выделение, ссылка, код одной строкой.
- block (блок) — заголовок, абзац, список, цитата, fenced code.
- fenced code block (огороженный блок кода) — между
```или~~~. - front matter (метаданные в начале файла) — секция в YAML/TOML/JSON между двумя строками
---для тегов, даты, заголовка. В CommonMark не входит, но используется почти везде (Hugo, Jekyll, Obsidian). - GFM (GitHub Flavored Markdown) — диалект GitHub с таблицами и чек-боксами.
- AST (Abstract Syntax Tree, абстрактное синтаксическое дерево) — внутреннее древовидное представление документа.
Главный фокус Markdown
Markdown — это не один формат, а соглашение «как сделать структуру читаемого текста машинно-парсируемой». Поэтому он легко обрастает диалектами и поэтому же его в принципе невозможно стандартизировать целиком. CommonMark стандартизирует только базу.
Где встречается в обычной жизни
- GitHub README. Когда ты заходишь на любой open-source проект и видишь красиво оформленное описание с картинкой, разделами и таблицей — это
.md-файл в корне репозитория, отрендеренный GitHub-ом. - Чаты Slack, Discord, Telegram. В Slack ты пишешь
*жирно*и_курсив_— это упрощённый Markdown. Discord понимает**жирный**и тройные```для кода. Telegram частично —**и обратные кавычки. - Заметки на Mac и iPhone. Apple Notes теперь умеет в Markdown-импорт. Obsidian, Bear, IA Writer — целиком на Markdown. Когда ты в Obsidian жмёшь
Ctrl+B, программа просто вставляет**вокруг текста. - Письма ChatGPT/Claude/Gemini. Ответы языковых моделей форматируются именно в Markdown — модель пишет
**жирно**и заголовки##, а интерфейс рендерит. Если попросить Claude вернуть «голый текст», он перестанет ставить звёздочки. - README в проекте. Файл, который ты сейчас читаешь — Markdown. И статьи на этом блоге, и
CLAUDE.mdв репозитории — всё.md.
Где встречается в IT и бизнесе
- Документация продуктов. ReadTheDocs, GitBook, Docusaurus, MkDocs, Hugo — все рендерят Markdown в сайты документации. Stripe, Twilio, Cloudflare держат свои docs.* поддомены на Markdown-исходниках.
- Static site generators (генераторы статических сайтов). Hugo, Jekyll, Hexo, Eleventy, Astro — превращают папку с
.mdв готовый сайт. Этот блог Паши работает ровно по такой схеме:articles/*.md+ шаблоны →built/*/index.html. - Корпоративные базы знаний. Notion (внутри хранит модифицированный Markdown), Obsidian Sync, Outline, BookStack. Когда команда экспортирует Notion-страницу — получает
.md. - Промты и инструкции для ИИ.
CLAUDE.md,AGENTS.md,.cursorrules— это Markdown-файлы, которые ИИ-ассистенты читают как контекст. Markdown идеально подходит, потому что и человек, и модель легко его разбирают. - Тикеты и комментарии. Jira (частично), Linear, GitHub Issues, GitLab — везде Markdown в комментариях и описаниях задач.
Кто пользуется
- GitHub — около 100+ миллионов разработчиков и сотни миллионов репозиториев, у каждого есть
README.md. Это, вероятно, главный пользователь Markdown в мире. - Reddit — комментарии форматируются в Markdown с момента запуска (2005). Здесь, кстати, отсюда и пошёл вкус Аарона Шварца к лёгкой разметке — он был среди ранних разработчиков сайта.
- Stack Overflow — все вопросы и ответы пишутся в Markdown с 2008 года.
- Notion — 50+ миллионов пользователей по их собственным заявлениям (точно не знаю — найди свежий отчёт). Внутри хранит блоки, а на экспорт даёт Markdown.
- Obsidian — счётчик пользователей точно не знаю, но в районе нескольких миллионов; вся локальная база — папка с
.md. - OpenAI / Anthropic / Google AI Studio — все стримят ответы в Markdown.
- Hugo — самый популярный SSG, на нём держится documentation у Kubernetes, Let's Encrypt, многих open-source проектов.
Альтернативы и конкуренты
-
AsciiDoc. Создан в 2002 (Stuart Rackham), мощнее Markdown: точное управление таблицами, переменные, includes, готовая поддержка PDF. Используется в больших книгах и в IBM, Red Hat. Плюсы: строже специфицирован, лучше для книг и больших технических руководств. Минусы: синтаксис тяжелее, чтения исходника без рендера хуже.
-
reStructuredText (RST). Стандарт документации Python (Sphinx), формат для readthedocs до его поддержки Markdown. Плюсы: жёсткая спека, много расширений для технических текстов. Минусы: синтаксис менее интуитивный (
.. note::, подчёркивание заголовков символами), вне Python-мира почти не используется. -
HTML напрямую. Плюсы: мощнее всего, точное управление вёрсткой, нет промежуточного парсинга. Минусы: многословный, исходник нечитаем глазами, ручная разметка медленнее.
-
Org mode. Формат Emacs (с 2003, Carsten Dominik). Плюсы: мощнее Markdown (таблицы со встроенным spreadsheet, planning, agenda, исполняемые блоки кода). Минусы: хорошо работает только в Emacs; вне него поддержка кустарная.
-
Typst. Молодой (2023) язык для научной вёрстки, конкурент LaTeX. Плюсы: компактный синтаксис, быстрая компиляция, modern toolchain. Минусы: ниша — научные документы и книги, для блогов и README избыточен.
Когда НЕ стоит использовать
- Когда нужны сложные таблицы с объединением ячеек, цветами, точной шириной колонок. Markdown-таблицы примитивны (одна строка = одна строка таблицы, никакого rowspan/colspan). Если делаешь финансовый отчёт или большой data sheet — нужен HTML или Excel-export.
- Когда нужна полиграфия аптечной точности. Markdown даёт структуру, а не вёрстку пикселей. Для книги, идущей в типографию, бери LaTeX или InDesign. Markdown через Pandoc → PDF в простых случаях вытащит, но шрифтовые тонкости — нет.
- Когда документ интерактивный. Формы, скрипты, динамическое содержимое — это в HTML или React, а не в Markdown. Расширения типа MDX (Markdown + JSX) частично решают, но это уже гибрид, а не чистый Markdown.
Связанные понятия
- HTML (HyperText Markup Language) — целевой формат рендера Markdown в вебе. Уже разобран в этом блоге.
- CommonMark — формальная спецификация базового Markdown с тест-сьютом из ~600 случаев.
- GFM (GitHub Flavored Markdown) — диалект GitHub: таблицы, чек-боксы, fenced code, автоссылки.
- YAML front matter — блок метаданных в начале
.md-файла между---, хранит заголовок, дату, теги. - Pandoc — швейцарский нож для конвертации между Markdown, HTML, DOCX, LaTeX, PDF и десятками других форматов. Написан John MacFarlane (один из авторов CommonMark).
- Static Site Generator (SSG) — программа, которая превращает папку Markdown-файлов в готовый сайт (Hugo, Jekyll, Astro).
- MDX — Markdown с возможностью встраивать React-компоненты. Популярен в Docusaurus и Next.js.
Литература и источники
- «Markdown: Syntax» — официальная страница Грубера.
daringfireball.net/projects/markdown/syntax. Это и есть «оригинал», 2004 года. - «CommonMark Spec» — формальная спецификация.
spec.commonmark.org. Здесь все тест-кейсы, по которым проверяют парсеры. - «GitHub Flavored Markdown Spec» —
github.github.com/gfm. Расширение CommonMark. - Wikipedia: Markdown — ru.wikipedia.org/wiki/Markdown — хороший обзор истории и диалектов.
- «Mastering Markdown» — guide от GitHub. Искать в Google по запросу "GitHub Mastering Markdown" — стабильная страница на guides.github.com.
- «The Markdown Guide» by Matt Cone — markdownguide.org, полноценная книга по диалектам и расширениям.
Где встретилось у меня
В этом самом блоге всё опирается на Markdown: статьи (articles/*.md) с frontmatter, скрипт build.sh рендерит их в HTML через шаблоны. Вчера в логах попадались разговоры про сами callout-выноски (> [!warning], > [!insight]) — это расширение Markdown, которое появилось в GFM в 2023 году и которое уже используется в шаблоне этого блога. Ещё один привычный пример того же дня — CLAUDE.md в корне репозитория: инструкции для меня, написанные в Markdown, потому что и человек, и модель читают этот формат без потерь.
Краткое резюме
- Markdown — лёгкая разметка, придуманная Джоном Грубером и Аароном Шварцем в 2004 году, чтобы писать читаемый сырой текст и автоматически получать из него HTML.
- Главный принцип — исходник должен оставаться читаемым без рендера. Звёздочки вокруг слова — это уже сигнал «выделено», даже если никто не превратит их в
<em>. - Markdown — это семейство диалектов, а не один формат. Базу пытается стандартизировать CommonMark (с 2014), а самый ходовой расширенный диалект — GFM на GitHub.
- Pipeline рендера простой: текст → токены → AST → целевой формат. Поэтому из одного
.mdможно собрать и сайт, и PDF, и DOCX. - Где живёт сегодня: README на GitHub, документация продуктов, статические блоги, заметки в Obsidian/Notion, промты для ИИ-моделей. По объёму — один из самых распространённых текстовых форматов в IT.
- Где не стоит: сложные таблицы, точная полиграфия, интерактивные документы. Для этого есть HTML, LaTeX, специализированные форматы.