Een .mmd-bestand openen
Een .mmd-bestand is een gewoon tekstbestand met een Mermaid-diagram erin. Het is geen afbeelding en geen binair formaat — je kunt het met elke teksteditor openen en lezen. Om het als diagram te zien, sleep je het op het kader hieronder. Het wordt in je eigen browser getekend en er gaat niets naar een server.
Sleep je .mmd-bestand hierheen
Ook .mermaid, .md en .txt worden geaccepteerd. Het bestand wordt in de browser gelezen en nooit verstuurd.
Wat is een .mmd-bestand
Mermaid is een tekstuele syntaxis voor diagrammen. Je beschrijft het diagram in woorden en de motor tekent het — net zoals Markdown opmaak beschrijft en de motor de pagina oplevert. Een .mmd-bestand bevat die tekst en verder niets: geen opmaak, geen beeldgegevens, geen metadata.
Daar bestaat het formaat volledig voor. Doordat het tekst is, kan het diagram in een Git-repository naast de code staan die het beschrijft, en verschijnt een wijziging als een leesbare diff in plaats van als een vervangen binair bestand. Dit is een compleet, geldig .mmd-bestand:
flowchart LR
Commit[Push naar main] --> Build[Voer de tests uit]
Build -->|geslaagd| Deploy[Uitrollen naar productie]
Build -->|mislukt| Melding[Waarschuw de auteur]
Deploy --> Rook[Rooktest]
Rook --> Klaar[Release afgerond]Waarmee open je een .mmd-bestand
Kort gezegd: vrijwel niets opent een .mmd-bestand met een dubbelklik, want de extensie is aan geen enkele toepassing gekoppeld. Wat je echt nodig hebt is iets dat Mermaid kan tekenen. Hieronder wat ik getoetst heb en de plekken waar het niet werkt.
Deze siteOpent
Tekent het bestand meteen
Sleep het bestand op het kader hierboven en je krijgt het diagram. Er is geen uploadstap: het bestand wordt in de browser gelezen via de File API en lokaal getekend, wat ook werkt voor diagrammen die je niet naar buiten mag brengen.
Wil je het diagram aanpassen in plaats van alleen bekijken, gebruik dan de link onder de weergave om het in de editor te openen.
Elke teksteditorOpent
Toont de broncode, niet het diagram
Kladblok, Notepad++, vim — wat dan ook. Een .mmd-bestand is UTF-8-tekst, dus de broncode zie je meteen. Het diagram zie je niet, en er is niets kapot — er zit eenvoudigweg geen afbeelding in het bestand om te tonen.
Het is de snelste manier om te controleren of een toegestuurd bestand echt Mermaid is: open het en kijk of de eerste niet-lege regel een diagramsleutelwoord is zoals flowchart, sequenceDiagram, classDiagram, stateDiagram-v2, erDiagram of gantt.
GitHubOpent niet
Tekent ```mermaid-blokken in Markdown, maar geen .mmd-bestanden
GitHub tekent Mermaid binnen afgebakende codeblokken. De documentatie noemt precies waar: issues, Discussions, pull requests, wiki's en Markdown-bestanden. Een losstaand .mmd-bestand staat niet in dat rijtje, en het openen ervan in de bestandsbrowser van de repository laat de broncode zien.
Wil je dus dat het diagram op GitHub zichtbaar is, dan moet het in een ```mermaid-blok in een .md-bestand staan en niet in een eigen .mmd. Het .mmd als bron houden en dezelfde inhoud in de README herhalen is een gebruikelijke en redelijke verdubbeling.
GitLabOpent niet
Tekent ```mermaid-blokken, maar geen .mmd-bestanden, en dan nog op een oudere Mermaid
Hetzelfde patroon als bij GitHub: Mermaid tekent in afgebakende blokken in Markdown, issues, merge requests en wiki's, maar nergens staat dat een losstaand .mmd-bestand getekend wordt.
Er is nog iets wat het weten waard is, want het zorgt voor echte verwarring. GitLab.com geeft aan versie 10 van Mermaid te ondersteunen. Deze site draait op 11.12.2. Syntaxis die na versie 10 is toegevoegd tekent hier en valt daar om — en dat verklaart doorgaans het «in de browser werkt het, op onze GitLab niet». Op een zelf gehoste GitLab is er een derde valkuil: staat de header Cross-Origin-Resource-Policy op same-site of same-origin, dan vallen Mermaid-diagrammen stilzwijgend om — geen fout en geen diagram.
.mmd, .mermaid en .md
.mmd en .mermaid zijn hetzelfde. Beide bevatten alleen Mermaid-broncode en alle gereedschappen die ik ken die het ene accepteren, accepteren ook het andere. .mmd is korter en gebruikelijker; het officiële opdrachtregelgereedschap gebruikt het standaard. Kies er één en houd die aan binnen een project — de keuze heeft geen enkel technisch gevolg.
.md is van een andere soort. Een Markdown-bestand is een document dat een Mermaid-diagram kan bevatten, verpakt in een blok dat begint met drie backticks en het woord mermaid. Het diagram is een fragment binnen een groter geheel.
Dat verschil is verreweg de meest voorkomende reden dat een bestand niet tekent, en het werkt beide kanten op. Plak de inhoud van een .md-bestand in een Mermaid-viewer en het valt om, want de afbakeningsregel is geen Mermaid-syntaxis. Bewaar een kaal Mermaid-diagram in een .md-bestand zonder afbakening en GitHub toont het als een alinea tekst. De regel is simpel: een .mmd-bestand moet met een diagramsleutelwoord beginnen, en een .md-bestand moet het diagram binnen een afgebakend blok hebben.
Deze viewer accepteert .mmd, .mermaid, .md en .txt, maar behandelt alles wat hij leest als ruwe Mermaid. Sleep je een Markdown-bestand met tekst rond het diagram, haal dan eerst alles weg wat het diagram niet is.
Het tekent niet — wat er werkelijk mis is
De foutmeldingen van Mermaid zijn nauwkeurig maar niet vriendelijk. Een truc die werkt is om alleen het eind van de melding te lezen: na `got` noemt Mermaid het token waarop het vastliep, en dat token wijst het probleem veel beter aan dan het regelnummer. Elk geval hieronder heb ik nagemaakt op mermaid 11.12.2: de foute versie valt echt om en de goede tekent echt.
Wat je ziet
No diagram type detected matching given configuration for text: ```mermaid
Waarom
Je hebt het diagram uit een Markdown-bestand of uit een chat gekopieerd en de afbakening meegenomen. Drie backticks zijn Markdown en geen Mermaid, dus de parser bereikt het diagram nooit.
Oplossing
Haal de openingsregel ```mermaid en de sluitregel ``` weg. Het bestand moet met een diagramsleutelwoord beginnen.
```mermaid
flowchart TD
A[Start] --> B[Einde]
```flowchart TD
A[Start] --> B[Einde]Wat je ziet
Parse error, de melding eindigt op: got 'PS'
De fout eindigt op: got 'PS'
Waarom
Een openend rond haakje binnen een knooplabel. In Mermaid zijn ronde haakjes vormsyntaxis — A(tekst) is een afgeronde knoop — dus een kaal haakje binnen rechte haken wordt gelezen als het begin van een vorm.
Oplossing
Zet het label tussen aanhalingstekens. Alles daarbinnen wordt als tekst behandeld, haakjes inbegrepen.
flowchart TD
A[Roep incasseer(bestelling) aan] --> B[Einde]flowchart TD
A["Roep incasseer(bestelling) aan"] --> B[Einde]Wat je ziet
Parse error op de regel waar je de knoop een naam gaf
Waarom
De knoop-id bevat een spatie. In het Nederlands komt dat vooral uit los geschreven samenstellingen: «authenticatie dienst» in plaats van «authenticatiedienst». De id is het token vóór de pijl, en de spatie kapt hem af zodat er een woord overblijft dat nergens heen kan.
Oplossing
Geef de knoop een id van één woord en zet de leesbare tekst in het label. Samenstellingen aaneen schrijven lost het meteen op — en dat is toch al de juiste spelling.
flowchart TD
authenticatie dienst --> gebruikers databaseflowchart TD
auth[Authenticatiedienst] --> db[Gebruikersdatabase]Wat je ziet
Parse error, de melding eindigt op: got 'STR'
De fout eindigt op: got 'STR'
Waarom
Een recht dubbel aanhalingsteken binnen een knooplabel. De parser ziet het aan voor het begin van een string en komt daarna de rechte haak van het label tegen waar hij het sluitende aanhalingsteken verwachtte.
Oplossing
Zet het hele label tussen rechte aanhalingstekens en gebruik daarbinnen enkele aanhalingstekens, of schrijf het teken als HTML-entiteit #quot;.
flowchart TD
A[Hij zei "akkoord"] --> B[Einde]flowchart TD
A["Hij zei 'akkoord'"] --> B[Einde]Wat je ziet
Parse error, de melding eindigt op: got 'end'
De fout eindigt op: got 'end'
Waarom
Je hebt end als knoop-id gebruikt. Kleingeschreven end sluit een subgrafiek af, dus de parser ziet een blokeinde waar hij een knoop verwachtte. Het komt vaak voor: wie Engelse voorbeelden volgt noemt de laatste knoop end, ook als de rest Nederlands is.
Oplossing
Schrijf het met een hoofdletter of geef de knoop een andere id en verplaats het woord naar het label. `Einde` geeft geen problemen.
flowchart TD
A[Start] --> endflowchart TD
A[Start] --> Einde[Afgerond]Wat je ziet
Het tekent, maar in een toestandsdiagram is één toestand meerdere vakjes geworden
Waarom
Een spatie in de toestands-id. Anders dan een stroomdiagram protesteert een toestandsdiagram niet: het maakt voor elk woord een apart vakje en tekent dat zonder met de ogen te knipperen. Gemeten — `[*] --> Wacht op betaling` levert drie toestanden op, `Wacht`, `op` en `betaling`, waarvan alleen de eerste aan de pijl hangt. In het Nederlands past bijna geen toestandsnaam in één woord, dus het gebeurt voortdurend en er is geen enkel signaal.
Oplossing
Declareer de toestand met `state "Label" as id` en verwijs er alleen via de id naar.
stateDiagram-v2
[*] --> Wacht op betaling
Wacht op betaling --> GeslotenstateDiagram-v2
state "Wacht op betaling" as wachtBetaling
[*] --> wachtBetaling
wachtBetaling --> GeslotenWat je ziet
Het tekent, maar het ER-diagram heeft entiteiten die je niet geschreven hebt
Waarom
Het relatielabel bevat een spatie en heeft geen aanhalingstekens. Dit is de valkuil die in het Nederlands het meeste dwarszit, want onze relatiewerkwoorden nemen een voorzetsel: «hoort bij», «komt voor in». Mermaid meldt geen fout: het kapt het label af bij de eerste spatie en maakt van elk overgebleven woord een lege entiteit.
Oplossing
Zet elk relatielabel met een spatie tussen aanhalingstekens. In het Nederlands praktisch allemaal.
erDiagram
KLANT ||--o{ BESTELLING : hoort bijerDiagram
KLANT ||--o{ BESTELLING : "hoort bij"Wat je ziet
No diagram type detected matching given configuration for text: sequencediagram
Waarom
Het diagramsleutelwoord is verkeerd gespeld of heeft verkeerde hoofdletters. Mermaid is hoofdlettergevoelig: sequenceDiagram werkt, sequencediagram niet. Hetzelfde geldt voor stateDiagram-v2 en erDiagram.
Oplossing
Corrigeer de hoofdletters. Merk op dat graph nog steeds geaccepteerd wordt als oude alias van flowchart, dus die verouderde syntaxis is niet jouw probleem.
sequencediagram
Client->>API: HallosequenceDiagram
Client->>API: HalloWat je ziet
Parse error in het pijllabel tussen de strepen
Waarom
Haakjes binnen een pijllabel. Het label |...| heeft dezelfde beperking als een knooplabel: ook daar zijn haakjes syntaxis en geen tekst.
Oplossing
Zet het pijllabel tussen aanhalingstekens.
flowchart TD
A -->|ja (altijd)| Bflowchart TD
A -->|"ja (altijd)"| BWat je ziet
Parse error die naar de laatste regel van het diagram wijst
Waarom
Een blok dat geopend is en nooit gesloten: alt, opt, loop, par en subgraph willen elk hun eigen end. Mermaid meldt de fout waar de invoer op is, dus het regelnummer wijst naar het einde van het bestand en niet naar het openstaande blok.
Oplossing
Tel de geopende blokken en de end's die je geschreven hebt. Wijst de fout naar de laatste regel, dan is dit het bijna altijd.
sequenceDiagram
Client->>API: Verzoek
alt Alles in orde
API-->>Client: OKsequenceDiagram
Client->>API: Verzoek
alt Alles in orde
API-->>Client: OK
endWat je ziet
Lexical error on line 1. Unrecognized text.
Waarom
Een ongeldige richting na het diagramsleutelwoord. Stroomdiagrammen accepteren TB, TD, BT, LR en RL, en verder niets; een tikfout sneuvelt in de lexicale analyse voordat er ook maar één knoop gelezen is.
Oplossing
Gebruik een van de vijf geldige richtingen. TD en LR dekken vrijwel alle gevallen.
flowchart XY
A --> Bflowchart TD
A --> BWat je ziet
Hier tekent het, op GitLab, Confluence of een oud gereedschap niet
Waarom
Een versieverschil. Deze viewer draait op Mermaid 11.12.2; GitLab.com documenteert versie 10, en zelf gehoste wiki's kunnen jaren achterlopen. Syntaxis die na de versie van het andere gereedschap is ingevoerd, wordt hier ontleed en valt daar om.
Oplossing
Vraag de andere motor naar zijn versie. Één woord info in een diagram zetten laat Mermaid zijn eigen versienummer tekenen, wat sneller is dan de changelog doorlezen.
infoOver tekencodering valt nog iets te zeggen, want in Nederlandse bestanden kan die nog steeds verrassen. Deze site en de editor lezen het bestand als UTF-8 en halen de BOM-markering weg als die er staat, dus een bestand dat Kladblok als «UTF-8 met BOM» heeft opgeslagen opent zonder problemen. Maar een bestand dat in ISO-8859-1 of Windows-1252 is opgeslagen — wat sommige oudere gereedschappen nog steeds produceren — komt binnen met beschadigde trema's en accenten: coördinatie, ideeën en café zijn precies de woorden waar het misgaat. Zie je op die plekken vreemde tekens, sla het bestand dan opnieuw op als UTF-8 vanuit je editor.
En dan is er nog iets wat helemaal geen fout geeft: op een zelf gehoste GitLab zorgt de header Cross-Origin-Resource-Policy op same-site of same-origin ervoor dat Mermaid-diagrammen stilzwijgend omvallen. Geen melding, geen diagram, niets op de pagina. Tekent een diagram overal behalve op één eigen installatie, dan is dat precies de plek om te kijken.
Omzetten naar PNG, SVG of PDF
Open het bestand in de editor en gebruik de exportknoppen. SVG behoudt het diagram als vectortekst, dus het blijft scherp op elk formaat en de labels zijn te selecteren en te doorzoeken — dat is de juiste keuze voor documentatie en voor alles wat later nog eens geëxporteerd kan worden. PNG is een bitmap, hier geëxporteerd op twee tot drie keer de weergavegrootte zodat het standhoudt op schermen met hoge dichtheid; gebruik het waar SVG niet geaccepteerd wordt, wat in de praktijk de meeste chatprogramma's en sommige wiki's zijn.
Een PDF-knop is er niet, en dat schrijf ik liever op dan dat ik doe alsof. De begaanbare weg is de SVG exporteren en die ofwel in het document plaatsen dat je toch al aan het schrijven bent, ofwel deze pagina vanuit de browser naar PDF afdrukken. Een vector-SVG die in een PDF geplaatst wordt, blijft vector.
Voor alles wat herhaalbaar moet zijn — een bouwstap, een reeks bestanden, een pre-commit hook — is er de officiële opdrachtregelmotor @mermaid-js/mermaid-cli: die neemt hetzelfde .mmd-bestand en schrijft de afbeelding rechtstreeks weg, zonder browser.
Veelgestelde vragen
Hoe open ik een .mmd-bestand online?
Welk programma opent een .mmd-bestand?
Is een .mmd-bestand hetzelfde als een .mermaid?
Waarom tekent mijn .mmd-bestand niet op GitHub?
Kan ik een .mmd openen zonder iets te installeren?
Mijn diagram wordt onhandelbaar breed door één lang woord
Letters met trema's komen als vreemde tekens uit
Hier werkt het, op onze wiki niet. Hoe kan dat?
Diagramtypen die je hier kunt openen
Geschreven door Dominik Malsch · Laatst bijgewerkt: