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:

uitrol.mmd — het hele bestand, zes regels
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.

Fout
```mermaid
flowchart TD
    A[Start] --> B[Einde]
```
Goed
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.

Fout
flowchart TD
    A[Roep incasseer(bestelling) aan] --> B[Einde]
Goed
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.

Fout
flowchart TD
    authenticatie dienst --> gebruikers database
Goed
flowchart 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;.

Fout
flowchart TD
    A[Hij zei "akkoord"] --> B[Einde]
Goed
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.

Fout
flowchart TD
    A[Start] --> end
Goed
flowchart 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.

Fout
stateDiagram-v2
    [*] --> Wacht op betaling
    Wacht op betaling --> Gesloten
Goed
stateDiagram-v2
    state "Wacht op betaling" as wachtBetaling
    [*] --> wachtBetaling
    wachtBetaling --> Gesloten

Wat 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.

Fout
erDiagram
    KLANT ||--o{ BESTELLING : hoort bij
Goed
erDiagram
    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.

Fout
sequencediagram
    Client->>API: Hallo
Goed
sequenceDiagram
    Client->>API: Hallo

Wat 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.

Fout
flowchart TD
    A -->|ja (altijd)| B
Goed
flowchart TD
    A -->|"ja (altijd)"| B

Wat 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.

Fout
sequenceDiagram
    Client->>API: Verzoek
    alt Alles in orde
        API-->>Client: OK
Goed
sequenceDiagram
    Client->>API: Verzoek
    alt Alles in orde
        API-->>Client: OK
    end

Wat 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.

Fout
flowchart XY
    A --> B
Goed
flowchart TD
    A --> B

Wat 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.

Goed
info

Over 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?
Sleep het op het kader boven aan deze pagina. Het wordt in je browser getekend, zonder upload en zonder account. Je kunt ook de editor openen en het bestand op het weergavepaneel slepen.
Welk programma opent een .mmd-bestand?
De broncode toont elke teksteditor, want het bestand is platte tekst. Om het diagram te zien heb je iets nodig dat Mermaid tekent: deze site, de editor hier, of het opdrachtregelgereedschap mermaid-cli. Er is geen desktoptoepassing waar de .mmd-extensie bij hoort.
Is een .mmd-bestand hetzelfde als een .mermaid?
Ja. Beide extensies bevatten identieke inhoud en zijn uitwisselbaar. .mmd komt vaker voor en is wat het officiële opdrachtregelgereedschap standaard gebruikt.
Waarom tekent mijn .mmd-bestand niet op GitHub?
GitHub tekent Mermaid alleen binnen afgebakende ```mermaid-blokken in Markdown-bestanden, issues, Discussions, pull requests en wiki's. Een losstaand .mmd-bestand wordt als broncode getoond. Zet hetzelfde diagram in een afgebakend blok in een .md-bestand om het op GitHub zichtbaar te maken.
Kan ik een .mmd openen zonder iets te installeren?
Ja — daar is deze site voor. Het tekenen gebeurt als JavaScript in je browser, dus er valt niets te installeren en het bestand verlaat je computer nooit.
Mijn diagram wordt onhandelbaar breed door één lang woord
Dat is het Nederlandse probleem bij uitstek. Gemeten: een label breekt pas af op een spatie, dus een samenstelling breekt nooit af. `Klantenbestellingsbevestigingsmailadres` meet 364 pixels op één regel en gaat dwars door de gebruikelijke afbreekgrens van 276 pixels heen, waarmee het de hele tekening scheeftrekt. De oplossing zit niet in het diagram maar in het woord: kies een kortere term voor het label.
Letters met trema's komen als vreemde tekens uit
Het bestand is niet UTF-8. Deze site leest bestanden als UTF-8 en gaat prima om met de BOM-markering, maar een bestand dat in ISO-8859-1 of Windows-1252 is opgeslagen komt binnen met beschadigde tekens in woorden als coördinatie en ideeën. Sla het opnieuw op als UTF-8 vanuit je editor.
Hier werkt het, op onze wiki niet. Hoe kan dat?
Bijna altijd is het een versieverschil. Deze viewer draait op Mermaid 11.12.2, terwijl veel wiki's op iets ouders draaien — GitLab.com documenteert versie 10. Zet het woord info in een diagram op het andere systeem om het zijn versie te laten tonen.

Diagramtypen die je hier kunt openen

Geschreven door Dominik Malsch · Laatst bijgewerkt:

Editor openen →