Как открыть файл .mmd
Файл .mmd — это текстовый файл с диаграммой Mermaid. Это не картинка и не двоичный формат: его можно открыть в любом текстовом редакторе и прочитать. Чтобы увидеть его как диаграмму, перетащите файл в рамку ниже. Он отрисуется прямо в браузере, и на сервер ничего не отправляется.
Перетащите сюда файл .mmd
Принимаются также .mermaid, .md и .txt. Файл читается в браузере и никуда не загружается.
Что такое файл .mmd
Mermaid — это текстовый синтаксис для диаграмм. Вы описываете диаграмму словами, а движок её рисует — ровно так же, как Markdown описывает форматирование, а движок выдаёт страницу. Файл .mmd содержит этот текст и ничего больше: ни оформления, ни данных изображения, ни метаданных.
В этом и весь смысл формата. Раз это текст, диаграмма может лежать в Git-репозитории рядом с кодом, который она описывает, и правка выглядит как читаемый дифф, а не как заменённый двоичный файл. Вот полноценный корректный файл .mmd:
flowchart LR
Commit[Пуш в main] --> Build[Запустить тесты]
Build -->|успех| Deploy[Выкатить в продакшн]
Build -->|сбой| Alert[Уведомить автора]
Deploy --> Smoke[Дымовой тест]
Smoke --> Done[Релиз завершён]Чем открыть файл .mmd
Если коротко: двойным щелчком .mmd не открывается почти ничем, потому что расширение не связано ни с одним приложением. На самом деле вам нужно что-то, что умеет рисовать Mermaid. Ниже то, что я проверил, и то, где это не работает.
Эта страницаОткрывает
Рисует файл сразу
Перетащите файл в рамку выше — и получите диаграмму. Шага загрузки нет: файл читается в браузере через File API и рисуется локально, поэтому способ подходит и для диаграмм, которые нельзя передавать third-party сервисам.
Если нужно не просто посмотреть, а изменить диаграмму, воспользуйтесь ссылкой под предпросмотром, чтобы открыть её в редакторе.
Любой текстовый редакторОткрывает
Показывает исходник, а не диаграмму
Блокнот, Notepad++, vim — что угодно. Файл .mmd — это текст в UTF-8, так что исходник вы увидите сразу. Диаграммы не увидите, и ничего при этом не сломано: внутри файла просто нет изображения.
Это самый быстрый способ проверить, действительно ли присланный файл является Mermaid: откройте его и посмотрите, начинается ли первая непустая строка с ключевого слова диаграммы — flowchart, sequenceDiagram, classDiagram, stateDiagram-v2, erDiagram или gantt.
GitHubНе открывает
Рисует блоки ```mermaid внутри Markdown, но не отдельные файлы .mmd
GitHub рисует Mermaid внутри огороженных блоков кода. В документации точно перечислено где: issues, Discussions, pull request'ы, вики и файлы Markdown. Отдельного файла .mmd в этом списке нет, и при открытии в файловом браузере репозитория показывается исходный текст.
Значит, чтобы диаграмма была видна на GitHub, она должна лежать внутри блока ```mermaid в файле .md, а не в отдельном .mmd. Держать .mmd как исходник и дублировать то же содержимое в README — распространённое и вполне разумное дублирование.
GitLabНе открывает
Рисует блоки ```mermaid, но не отдельные .mmd, и на более старом Mermaid
Картина та же, что у GitHub: Mermaid рисуется в огороженных блоках внутри Markdown, задач, merge request'ов и вики, но отрисовка отдельного файла .mmd нигде не задокументирована.
Есть и второй момент, который стоит знать, потому что он вызывает настоящую путаницу. GitLab.com заявляет поддержку Mermaid версии 10. Этот сайт работает на 11.12.2. Синтаксис, добавленный после десятой версии, рисуется здесь и падает там — обычно это и есть объяснение «в просмотрщике работает, а в нашем GitLab нет». У self-managed GitLab есть и третья ловушка: если заголовок Cross-Origin-Resource-Policy выставлен в same-site или same-origin, диаграммы Mermaid молча перестают отображаться — ни ошибки, ни диаграммы.
.mmd, .mermaid и .md
.mmd и .mermaid — одно и то же. Оба содержат только исходник Mermaid, и все известные мне инструменты, принимающие одно, принимают и другое. .mmd короче и распространённее; официальная утилита командной строки использует его по умолчанию. Выберите одно и придерживайтесь его внутри проекта — технических последствий у выбора нет.
.md — это уже другое по существу. Файл Markdown — это документ, который может содержать диаграмму Mermaid, обёрнутую в блок, начинающийся с трёх обратных кавычек и слова mermaid. Диаграмма здесь — фрагмент внутри большего текста.
Именно это различие — самая частая причина, по которой файл не рисуется, и работает оно в обе стороны. Вставьте содержимое .md в просмотрщик Mermaid — и получите ошибку, потому что строка ограждения не является синтаксисом Mermaid. Сохраните голую диаграмму Mermaid в .md без ограждения — и GitHub покажет её как абзац текста. Правило простое: .mmd должен начинаться с ключевого слова диаграммы, а в .md диаграмма должна лежать внутри огороженного блока.
Этот просмотрщик принимает .mmd, .mermaid, .md и .txt, но всё прочитанное трактует как чистый Mermaid. Если вы перетаскиваете Markdown с текстом вокруг диаграммы, сначала уберите всё, кроме самой диаграммы.
Не рисуется — в чём на самом деле дело
Сообщения об ошибках у Mermaid точные, но недружелюбные. Полезный приём — читать самый конец сообщения: после «got» Mermaid называет токен, на котором споткнулся, и этот токен указывает на проблему гораздо лучше, чем номер строки. Каждый случай ниже воспроизведён на mermaid 11.12.2: сломанный вариант действительно падает, а исправленный действительно рисуется.
Что вы видите
No diagram type detected matching given configuration for text: ```mermaid
Почему
Вы скопировали диаграмму из файла Markdown или из переписки вместе с ограждением. Три обратные кавычки — это Markdown, а не Mermaid, поэтому разборщик до диаграммы не добирается.
Решение
Удалите открывающую строку ```mermaid и закрывающую ```. Файл должен начинаться с ключевого слова диаграммы.
```mermaid
flowchart TD
A[Начало] --> B[Конец]
```flowchart TD
A[Начало] --> B[Конец]Что вы видите
Parse error, сообщение заканчивается на: got 'PS'
Ошибка заканчивается на: got 'PS'
Почему
Открывающая круглая скобка внутри подписи узла. В Mermaid круглые скобки — синтаксис формы: A(текст) означает узел со скруглёнными углами, поэтому голая скобка внутри квадратных читается как начало формы.
Решение
Возьмите подпись в двойные кавычки. Внутри кавычек всё считается текстом, включая скобки.
flowchart TD
A[Вызвать списание(заказ)] --> B[Конец]flowchart TD
A["Вызвать списание(заказ)"] --> B[Конец]Что вы видите
Parse error в строке, где вы назвали узел
Почему
В идентификаторе узла есть пробел. По-русски этого легко не заметить, потому что естественные названия — словосочетания: «сервис авторизации», «база пользователей». Идентификатор — токен перед стрелкой, пробел его обрывает, и остаётся лишнее слово, которое некуда деть.
Решение
Дайте узлу идентификатор из одного слова, а читаемый текст поместите в подпись. Кириллица в идентификаторе работает; мешает только пробел.
flowchart TD
сервис авторизации --> база данныхflowchart TD
auth[Сервис авторизации] --> db[База данных]Что вы видите
Parse error, сообщение заканчивается на: got 'STR'
Ошибка заканчивается на: got 'STR'
Почему
Двойная кавычка внутри подписи узла. Разборщик считает её началом строки в кавычках, а затем натыкается на квадратную скобку подписи там, где ждал закрывающую кавычку.
Решение
Возьмите подпись целиком в двойные кавычки, а внутри используйте «ёлочки» или запишите кавычку как HTML-сущность #quot;.
flowchart TD
A[Он сказал "привет"] --> B[Конец]flowchart TD
A["Он сказал «привет»"] --> B[Конец]Что вы видите
Parse error, сообщение заканчивается на: got 'end'
Ошибка заканчивается на: got 'end'
Почему
Вы использовали end как идентификатор узла. В нижнем регистре end закрывает подграф, поэтому разборщик видит конец блока там, где ожидал узел. Случается часто: следуя англоязычным примерам, последний узел по привычке называют end, даже если вся схема на русском.
Решение
Напишите с заглавной буквы или дайте узлу другой идентификатор, а слово перенесите в подпись. `Конец` проблем не создаёт.
flowchart TD
A[Начало] --> endflowchart TD
A[Начало] --> Конец[Завершено]Что вы видите
Рисуется, но в диаграмме состояний одно состояние распалось на два
Почему
Пробел внутри идентификатора состояния. В отличие от блок-схемы, диаграмма состояний не возражает: она создаёт отдельный прямоугольник на каждое слово. Измерено — `[*] --> Ожидает оплаты` даёт два состояния, `Ожидает` и `оплаты`, и только первое висит на стрелке. По-русски почти ни одно состояние не умещается в одно слово, поэтому ошибка встречается постоянно, а сигнала о ней нет.
Решение
Объявите состояние через `state "Подпись" as id` и ссылайтесь на него только по идентификатору.
stateDiagram-v2
[*] --> Ожидает оплаты
Ожидает оплаты --> ЗакрытstateDiagram-v2
state "Ожидает оплаты" as ожидание
[*] --> ожидание
ожидание --> ЗакрытЧто вы видите
No diagram type detected matching given configuration for text: sequencediagram
Почему
Ключевое слово диаграммы написано с ошибкой или не в том регистре. Ключевые слова Mermaid чувствительны к регистру: sequenceDiagram работает, sequencediagram — нет. То же касается stateDiagram-v2 и erDiagram.
Решение
Исправьте регистр. Учтите, что graph по-прежнему принимается как устаревший синоним flowchart, так что этот старый синтаксис проблемой не является.
sequencediagram
Клиент->>API: ПриветsequenceDiagram
Клиент->>API: ПриветЧто вы видите
Parse error в подписи ребра между вертикальными чертами
Почему
Скобки внутри подписи ребра. К подписи |...| применяются те же ограничения, что и к подписи узла: скобки там синтаксис, а не текст.
Решение
Возьмите подпись ребра в кавычки.
flowchart TD
A -->|да (всегда)| Bflowchart TD
A -->|"да (всегда)"| BЧто вы видите
Parse error в ER-диаграмме, сообщение заканчивается на: got 'NEWLINE'
Ошибка заканчивается на: got 'NEWLINE'
Почему
Связь без подписи. В отличие от ребра блок-схемы, связь в ER требует двоеточия и глагола: это не необязательно, и без них строка заканчивается слишком рано.
Решение
Добавьте двоеточие и подпись. Если в подписи есть пробел, возьмите её в кавычки.
erDiagram
КЛИЕНТ ||--o{ ЗАКАЗerDiagram
КЛИЕНТ ||--o{ ЗАКАЗ : оформляетЧто вы видите
Parse error, указывающая на последнюю строку диаграммы
Почему
Блок открыт и не закрыт: alt, opt, loop, par и subgraph требуют своего end. Mermaid сообщает о сбое там, где у него кончается ввод, поэтому номер строки указывает на конец файла, а не на незакрытый блок.
Решение
Посчитайте открытые блоки и написанные end. Если ошибка на последней строке, почти всегда дело в этом.
sequenceDiagram
Клиент->>API: Запрос
alt Всё хорошо
API-->>Клиент: OKsequenceDiagram
Клиент->>API: Запрос
alt Всё хорошо
API-->>Клиент: OK
endЧто вы видите
Lexical error on line 1. Unrecognized text.
Почему
Недопустимое направление после ключевого слова диаграммы. Блок-схемы принимают TB, TD, BT, LR и RL, и больше ничего; опечатка здесь падает на лексическом анализе, до чтения узлов.
Решение
Используйте одно из пяти допустимых направлений. TD и LR закрывают почти все случаи.
flowchart XY
A --> Bflowchart TD
A --> BЧто вы видите
Здесь рисуется, а в GitLab, Confluence или старом инструменте — нет
Почему
Разница версий. Этот просмотрщик работает на Mermaid 11.12.2; GitLab.com документирует версию 10, а корпоративные вики нередко отстают на годы. Синтаксис, появившийся после версии другого инструмента, разбирается здесь и падает там.
Решение
Спросите у другого движка, какая у него версия. Если написать в диаграмме одно слово info, Mermaid нарисует собственный номер версии — это быстрее, чем читать список изменений.
infoОтдельно стоит сказать про кодировку, потому что для русского это по-прежнему живая проблема. Эта страница и редактор читают файл как UTF-8 и снимают метку BOM, если она есть, — так что файл, сохранённый в Блокноте Windows как «UTF-8 с BOM», открывается нормально. А вот файл в Windows-1251 или KOI8-R, которые до сих пор выдают некоторые старые инструменты, придёт с испорченной кириллицей. Если вместо подписей видны бессмысленные символы, пересохраните файл в UTF-8 из своего редактора.
И последнее, что не даёт вообще никакой ошибки: на self-managed GitLab заголовок Cross-Origin-Resource-Policy, выставленный в same-site или same-origin, заставляет диаграммы Mermaid молча не отображаться. Ни сообщения, ни диаграммы, ничего на странице. Если диаграмма рисуется везде, кроме одного self-hosted стенда, смотреть надо туда.
Конвертация в PNG, SVG или PDF
Откройте файл в редакторе и воспользуйтесь кнопками экспорта. SVG сохраняет диаграмму как векторный текст, поэтому она остаётся чёткой при любом размере, а подписи можно выделять и искать: это правильный выбор для документации и для всего, что может понадобиться переэкспортировать позже. PNG — растр, экспортируется здесь в два-три раза крупнее экранного размера, чтобы держаться на плотных дисплеях; используйте его там, где SVG не принимают, то есть на практике в большинстве мессенджеров и в части вики.
Кнопки PDF нет, и я предпочту сказать об этом прямо, а не делать вид. Практический путь — экспортировать SVG и либо вставить его в документ, который вы и так пишете, либо распечатать страницу в PDF из браузера. Векторный SVG, помещённый в PDF, остаётся вектором.
Для всего повторяемого — шага сборки, пакета файлов, pre-commit хука — есть официальный движок командной строки @mermaid-js/mermaid-cli: он берёт тот же файл .mmd и пишет изображение напрямую, без браузера.
Частые вопросы
Как открыть файл .mmd онлайн?
Какой программой открыть файл .mmd?
Файл .mmd — это то же самое, что .mermaid?
Почему мой файл .mmd не рисуется на GitHub?
Можно открыть .mmd, ничего не устанавливая?
Вместо русских подписей — непонятные символы
Здесь работает, а в нашей вики нет. Почему?
Типы диаграмм, которые здесь можно открыть
Автор: Dominik Malsch · Обновлено: