belun.app Блог
EN

Таблицы в Markdown: выравнивание, экранирование и важные правила

Как на самом деле работают таблицы GFM: строка-разделитель, двоеточия выравнивания, экранирование вертикальной черты и границы возможностей.

Разработчик редактирует таблицу Markdown в документации на ноутбуке за рабочим столом

Широкую таблицу в Markdown руками пишут ровно один раз. Первую набирают аккуратно, считая вертикальные черты. Вторую вставляют из Excel и потом минут десять правят.

Обидно, потому что сам синтаксис крошечный. Почти вся боль — из-за трёх-четырёх правил, о которых нигде не предупреждают, пока не наступишь.

Строка-разделитель и есть таблица

Таблица — это строка заголовка, строка из дефисов и дальше строки с данными:

| Пакет | Версия | Назначение |
| --- | --- | --- |
| astro | 5.1.1 | статическая сборка |

Уберите строку с дефисами — и таблицы больше нет. Останутся три строки текста с чертами, которые так и отрисуются. Это самая частая причина, по которой таблица в пул-реквесте выглядит как обычный абзац.

Строка заголовка ещё и намертво фиксирует число колонок. Спецификация GFM говорит об этом прямо: если в строке данных ячеек меньше, недостающие добавятся пустыми, а если больше — лишние выбросятся. Молча. Без единого предупреждения. Строка просто теряет последнюю колонку, а замечаешь ты это коммитов через пять.

Выравнивание — это двоеточия, и больше ничего

Строка с дефисами задаёт выравнивание сразу для всей колонки:

  • :--- по левому краю
  • :---: по центру
  • ---: по правому краю
  • --- как решит обработчик, обычно влево

Выровнять одну ячейку иначе, чем колонку, нельзя. Выровнять таблицу целиком на странице — тоже. Если нужно то или другое, вы пишете уже HTML, а не Markdown. Сталкиваются с этим нечасто, но всех, кто пришёл из Word, это удивляет.

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

Пробелы нужны вам, а не обработчику

Выровненная таблица выглядит так:

| Пакет       | Версия  | Назначение         |
| ----------- | ------- | ------------------ |
| astro       | 5.1.1   | статическая сборка |

Любой обработчик первым делом срезает пробелы внутри ячеек, так что на результат они не влияют вообще. Смысл только один: чтобы сырой файл читался, когда его открыли в редакторе. На таблице из двенадцати колонок такое выравнивание примерно удваивает размер файла и делает шумным каждый будущий diff — поэтому часть команд его отключает. Отрисовываются оба варианта одинаково, так что это вопрос вкуса.

Черта, переносы и прочие острые углы

Вертикальная черта внутри текста ячейки эту ячейку и завершает. Экранируйте её как \|, и символ отрисуется обычным. Место, на котором спотыкаются: это работает и внутри кода в обратных кавычках. Запись `a|b` в таблице всё равно разрежет ячейку, кавычки не спасают, и писать придётся `a\|b`. Спецификация GFM оговаривает это отдельным пунктом — видимо, багов на эту тему завели немало.

В ячейке живёт только строчное содержимое. Жирный шрифт, ссылки, картинки, код в кавычках — пожалуйста. Списки, заголовки, блоки кода — нет. И строка таблицы обязана уместиться в одну физическую строку файла, так что перенос внутри ячейки — это буквальный тег <br>. Некрасиво, зато работает везде, и других вариантов нет.

Соберите таблицу в сетке, а черты и экранирование оставьте инструменту. Попробуйте прямо здесь — всё считается в браузере, ничего никуда не загружается.

Попробуйте инструмент

Генератор таблиц Markdown →