Формат Markdown отлично подходит для документации. Его легко читать и изменять без применения специальных редакторов.
Этот кодстайл помогает нам достичь трёх целей:
- Markdown документы легко читать не только в отрендеренном виде, но и в исходном коде.
- Документы легко поддерживать - редактировать, проводить ревью. Стиль на разных проектах не отличается.
- Синтаксис простой и запоминаемый.
Перед прочтением кодстайла ознакомьтесь с синтаксисом Markdown:
- Синтаксис Markdown - синтаксис, который поддерживается везде
- CommonMark - спецификация Markdown, совместимая с большинством платформ
- GitHub Flavored Markdown - дополнительные возможности, которые добавляет GitHub
- GitLab Flavored Markdown - дополнительные возможности, которые добавляет GitLab
- VuePress Extensions for Markdown - дополнительные возможности для работы с Markdown в VuePress
Частично пункты кодстайла взяты из Markdown style guide от Google.
Оглавление:
- Именование файла
- Язык документа
- Структура файла
- Перенос строки
- Заголовки
- Списки
- Фрагменты кода
- Ссылки
- Изображения
Используем lower_snake_case за исключением общепринятых имён файлов: README.md, CHANGELOG.md, LICENSE.md, CONTRIBUTING.md и т.д.
Имя файла должно отражать его содержимое и в идеальном случае совпадать с заголовком документа.
Исключение - файлы README.md и index.md, которые отображаются при открытии каталога по умолчанию.
Если внутри каталога важен порядок Markdown файлов, используйте цифры в качестве префикса имени файла:
guide
├── 01_getting_started.md
├── 02_configuration.md
├── ...
└── 12_changelog.md
Выбор русского или английского языка для документа зависит от области применения. Английский язык следует выбрать, если вы не хотите ограничивать применение документа русскоязычной аудиторией, например если это документация к библиотеке. В остальных случаях лучше выбрать русский язык, чтобы снизить порог входа и исключить недопонимание из-за языкового барьера.
Для большинства документов достаточно такой структуры:
# Заголовок документа
Краткое вступление.
Оглавление (TOC)
## Заголовок раздела
Содержимое раздела.# Заголовок документа: в идеале должен совпадать или почти совпадать с названием файла, если документ написан на английскомКраткое вступление: вступление из нескольких предложений, которое даёт понимание о содержании документа. Представьте, что вы не знакомы с темой, описанной в документе. Прочитав вступление вы должны понять о чем этот документ и для чего он написан.Оглавление (TOC): предоставляет механизм навигации к нужной теме. Подробнее способы создания оглавления рассмотрены в отдельном разделе - "Оглавление".## Заголовок раздела: заголовки, начиная со второго уровня.
Хорошая практика - оставлять ссылки на дополнительные материалы, относящиеся к теме, в конце документа. Так вы поможете пользователям, которые хотят глубже погрузиться в тему или не нашли нужную информацию в вашем документе.
На платформах с поддержкой Markdown часто есть поддержка автоматической генерации оглавления.
Например, в GitLab нужно для этого использовать тег [[_TOC_]]:
Краткое вступление.
[[_TOC_]]
## Заголовок разделаПри просмотре отрендеренного документа вместо тега
[[_TOC_]]отобразится оглавление со ссылками на разделы.
Функция генерации оглавления не входит в спецификацию CommonMark, поэтому её реализация отличается в зависимости от платформы:
Если вам нужно, чтобы документ одинаково отображался на разных платформах, не используйте тег для автоматической генерации оглавления. Универсальное решение - генерировать оглавление с помощью утилиты DocToc.
Ограничения по длине строки нет. Для удобства чтения файлов, используйте редактор, который поддерживает "soft wrapping" - когда длинная строка визуально отображается на нескольких строках, но физически остаётся одной строкой.
Строку переносим после каждого предложения. Благодаря переносу по предложениям, а не по длине строки, получается меньше изменённых строк и такие изменения проще ревьюить.
Если вы используете перенос по длине строки, при изменении одной строки в параграфе скорее всего придётся вносить изменения и во все следующие за ней строки. Худший случай - изменение длины первой строки:
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras a ullamcorper
- enim, eu eleifend elit. Orci varius natoque penatibus et magnis dis parturient
- montes, nascetur ridiculus mus. Praesent quis magna ipsum.
+ Lorem ipsum dolor sit amet, consectetur. Cras a ullamcorper enim, eu eleifend
+ elit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur
+ ridiculus mus. Praesent quis magna ipsum.Если использовать перенос по предложениям, будет изменена только одна строка:
- Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ Lorem ipsum dolor sit amet, consectetur.
Cras a ullamcorper enim, eu eleifend elit.
Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Praesent quis magna ipsum.Спецификация CommonMark даёт нам два варианта переноса строки внутри параграфа:
- Добавление двух и более пробелов в конце строки
- Добавление обратного слеша (
\) в конце строки
Всегда используйте обратный слеш для принудительного переноса. Строку заканчивающуюся двумя пробелами невозможно отличить от строки без пробелов в конце без редактора, который умеет подсвечивать пробелы в конце строк. Кроме того, многие удаляют пробелы в конце строк при автоматическом форматировании.
Для переноса строки не используем HTML тег <br />.
Параграфы разделяем пустыми строками.
## Heading 2Всегда используем заголовки в стиле ATX (с #).
Заголовки в стиле SETEXT (с - и =) сложнее поддерживать:
- при изменении длины заголовка, нужно изменить и строку под заголовком, если хочется чтобы заголовок оставался красивым
- чтобы поменять уровень заголовка, нужно заменить все символы под заголовком, в то время как для стиля ATX достаточно добавить или убрать один символ
- в стиле SETEXT можно объявить заголовки только 1-го и 2-го уровня, для заголовков 3-го и дальше уровня всё равно придётся использовать ATX
- легко перепутать уровень заголовка.
Heading 1 or 2?
---------------Отделяем заголовок от остального текста пустыми строками:
Текст перед заголовком.
## Заголовок
Текст после заголовкаБез отступов заголовок сливается с текстом и становится менее заметен:
Текст перед заголовком.
## Заголовок
Текст после заголовка. Не делайте так, нужно добавить пустую строку перед текстом.Списки отделяем от остального текста документа пустыми строками. Тогда изменения вносимые в список в диффах не будут смешиваться с изменениями текста документа:
Текст документа.
- Item 1
- Item 2
Продолжение текста.Для нумерованных списков, которые могут изменяться используем ленивую нумерацию. Такие списки проще поддерживать, потому что при добавлении нового элемента в список индексы последующих элементов не изменятся:
1. Item A
1. Item B
1. Item B.1
1. Item B.2
1. Item CЕсли список небольшой и вы не планируете его изменять, лучше полностью пронумеровать его. Такой список проще читать в коде:
1. Item A
2. Item B
3. Item CИспользуйте `бэктики` для выделения кода и имен файлов и пакетов внутри абзаца:
Чтобы обновить оглавление в файле `README.md`,
запустите команду `doctoc README.md`.Не стоит заключать в бэктики названия библиотек или технологий:
Мы используем `Kotlin` и бэктики где ни попадя.
Не делайте `так`.Во всех случаях когда вам не нужно встраивать код в абзац, используйте блоки кода:
```kotlin
dependencies {
implementation(platform(kotlin("bom", version = 1.5.21)))
}
```Всегда указывайте язык для блоков кода, тогда будет работать подсветка синтаксиса.
Отступ в 4 пробела тоже интерпретируется как блок кода. У таких блоков нельзя указать язык, но они выглядят немного чище в коде. Используйте блоки кода с отступами если нужно написать несколько однострочных сниппетов подряд:
Установите YARN:
npm install -g yarn
После этого установите зависимости:
yarn install
Теперь можно запустить локальный сервер с документацией:
yarn docs:dev
Блоки кода следует отделять от остального текста пустыми строками. Тогда изменения вносимые в блоки кода в диффах не будут смешиваться с изменениями текста документа:
Текст документа.
```markdown
В Markdown можно делать **жирный текст** или *курсив*.
Или ***всё вместе***.
```
Продолжение текста.Длинные ссылки усложняют чтение документа. Сокращайте ссылки когда это возможно убирая необязательные параметры в ссылках или используя короткую форму ссылок.
Названия ссылок вроде "ссылка" или "тык" не информативны и ни о чем не говорят при беглом просмотре документа. В большинстве случаев такие названия только занимают место и их можно опустить.
Кодстайл можно посмотреть по [ссылке](style_guide.md).
Кстати, там написано, что такие ссылки не информативны ([тык](style_guide.md#links)).Лучше писать предложение как будто ссылки нет, а потом превратить в ссылку наиболее подходящую фразу:
Посмотрите [кодстайл](style_guide.md) перед тем как редактировать документацию.
Кстати, там есть [секция "Ссылки"](style_guide.md#links), описывающая как правильно оформлять ссылки.Спецификация CommonMark позволяет объявлять алиасы ссылок (link reference):
[Алиасы ссылок][link-alias] это очень удобно.
[link-alias]: https://spec.commonmark.org/0.30/#link-reference-definitionИспользуя алиасы вместо ссылок мы получаем несколько преимуществ:
- текст со ссылками выглядят аккуратнее и его проще читать
- алиасы можно использовать несколько раз, при этом не нужно в каждом месте использования писать ссылку
- все ссылки собраны в одном месте в конце документа и их проще проверять на актуальность и обновлять.
Ссылки, которые принадлежат вам полезно отделять пустой строкой от тех которые вы не контролируете. Скорее всего изменения чаще будут вноситься в подконтрольные ссылки, поэтому располагаем их выше:
Текст документа.
[01]: docs/01_getting_started.md
[02]: docs/02_configuration.md
[sqlite]: https://sqlite.org/Для консистентности все алиасы называем в lower-kebab-case.
Алиасы не чувствительны к регистру и если алиас совпадает с названием ссылки, его можно опустить.
В некоторых случая ссылки можно объявлять более компактно:
[CommonMark] - это наиболее распространённая спецификация Markdown.
[commonmark]: https://commonmark.orgАлиасы не приносят пользу и их не стоит использовать если документ представляет собой набор ссылок:
## Документация
- [Соглашения](conventions.md)
- [Архитектура](arch.md)
## Полезные ссылки
- [Jira](https://jira.superproject.com/)Markdown поддерживает вставку изображений в документ:
Смотрите какая милота:\
Хорошая практика - сохранять картинки в каталог рядом с документом и добавлять изображение используя относительную ссылку. В этом случае вы будете уверены, что картинка не пропадёт из документа:
Схема интеграции с сервисами заказчика:\
По умолчанию нажатие на картинку открывает файл с картинкой. Сделать картинку некликабельной не получится, но можно переопределить ссылку:
# Bat Bunker
[](#)\
(Попробуйте нажать на логотип, у вас ничего не получится)
Наши спонсоры (логотипы кликабельны):\
[](https://wayne.enterprises/)