Každý diagram, který tento web publikuje, kreslí jeden prohlížeč a každý graf jedna komponenta. Žádné se nenastavuje po stránkách. Diagram je blok ```mermaid v jediném dokumentu, který vztah uvádí, nebo zdroj Mermaid, který šablona zapíše z generovaných dat; graf je tabulka, kterou stránka už vykresluje. To, co je činí interaktivními, adresovatelnými a propojenými, se odvozuje při buildu z toho, co repozitář už ví. Rozhodnutím je ADR 0152; pravidlem, že diagram se kreslí a nikdy nepíše, je project.a-diagram-is-drawn-not-typed.
Cesta jednoho diagramu
flowchart LR
fence["a mermaid fence<br/><small>docs, a decision, a rule</small>"]
data["site/data/generated<br/><small>diagrams.json, plan.json</small>"]
zola["Zola<br/><small>pre class=mermaid</small>"]
pass["scripts/lib/diagrams.mjs<br/><small>name, nodes, toolbar, links</small>"]
check["scripts/ci/link-check<br/><small>every link and every address</small>"]
viewer["site/diagrams.js<br/><small>draw, zoom, pan, trace, address</small>"]
fence --> zola
data --> zola
zola --> pass
data -- "identities and routes" --> pass
pass --> check
pass --> viewer
Nic v té cestě se nepíše dvakrát. Plot je jediné místo, kde je vztah zapsán; identity, na které může uzel odkazovat, jsou ty, které scripts/generate-site-data již zapsal; a prohlížeč čte to, co build připravil, ne vlastní konfiguraci.
Co build přidává k diagramu
scripts/site-build spouští scripts/lib/diagrams.mjs nad stránkami, které napsala Zola. Pro každé <pre class="mermaid"> přidává čtyři věci:
| Přidáno | Od | Proč |
|---|---|---|
id="diagram-<name>" | jméno data-diagram, které šablona deklarovala, jinak id nadpisu, pod kterým diagram sedí, jinak jeho pořadí na stránce; druhý diagram pod jedním nadpisem je <name>-2 | adresa, na kterou lze přistát, s JavaScriptem i bez něj |
data-nodes | id uzlů, které zdroj deklaruje (vývojové diagramy a stavové diagramy) | odkaz na jeden uzel může být odmítnut, když diagram takový uzel nemá |
panel nástrojů, zapisovaný hidden | samotný průchod | ovládací prvek, který markup deklaruje, je ten, který scripts/ci/interaction-check dokáže vázat na chování; prohlížeč jej odhalí, až když je co ovládat |
| seznam odkazů vedle něj | identity v site/data/generated | odkazy fungují bez JavaScriptu a kontrolují se jako každý jiný odkaz |
Stránka, která by nesla dva diagramy pod jedním deklarovaným jménem, se odmítne a sestavení se zastaví (exit 10). Zdroj diagramu se nikdy nemění.
Odkazy se odvozují
Uzel se stane odkazem, když jeho id, jeho štítek nebo jeden řádek jeho štítku je identitou objektu, pro který tento build napsal stránku:
| Identita v diagramu | Odkazuje na | Čteno z |
|---|---|---|
I2653, M003 | úkol nebo milník v plánu | plan.json |
ADR 0152, adr-0152 | rozhodnutí | entities.json |
| id pravidla, s verzí nebo bez ní | pravidlo | entities.json |
majordomus doctor, majordomus plan next | příkaz | commands.json |
id schopnosti, například mesh.claim | schopnost | executable.json |
| id doktríny | doktrína | doctrines.json |
docs/DESIGN.md | dokument | docs.json |
Identita uvnitř delšího popisku se rozřeší také, ale jen když popisek jmenuje jeden objekt. Popisek, který jmenuje dva, nebo objekt, pro který tento web nemá stránku, se neodkazuje na žádný: odkaz, který by vybral ten, jejž dokáže rozřešit, by byl hádáním. Holý název souboru ve větě není identita. Identita, jejíž stránku build nezapsal, se nenabízí vůbec.
Nikdo nezapisuje href do diagramu. Direktiva click v Mermaidu se nepoužívá: odkaz existuje, protože se v diagramu objevuje identita, a při dalším sestavení zmizí, když zmizí objekt.
Prohlížeč
site/diagrams.js načítají jen stránky, které nesou diagram, a stahuje vendorovaný build Mermaid poté, co byla stránka zpracována. Každý diagram kreslí ve vlastních barvách stránky, čtených z design tokenů, a při změně motivu je vykreslí znovu.
| Do | Dělat |
|---|---|
| přiblížení | − a + na liště nástrojů; + a - na klávesnici; Ctrl nebo Cmd s kolečkem; stisk dvěma prsty |
| pan | tažení; šipky |
| zobrazit celý diagram | Fit; 0; dvojklik na prázdné místo |
| vyplnit obrazovku | Expand; F; Escape listů |
| ponechat výkres | SVG ukládá <name>.svg |
| sledovat uzel | klikněte na něj, nebo na něj přesuňte fokus a stiskněte Enter, když ho sestavení propojilo |
| trasovat uzel | najeďte na něj nebo na něj přesuňte fokus: jeho hrany a sousedé zůstanou, ostatní ustoupí |
| vyberte uzel | klikněte na uzel, který není odkazem; Alt a klik, nebo S se zaměřením na něj, pro ten, který jím je |
| zkopírovat adresu | Link zkopíruje adresu diagramu, nebo vybraného uzlu |
Diagram příliš velký na přečtení vcelku, například graf závislostí všech úkolů, se otevře v čitelné velikosti z levého horního rohu a odtud se posouvá. Obyčejné kolečko vždy posouvá stránku.
Rámec je vlastní <pre> diagramu: zachovává své id a místo v pořadí tabulátoru. Diagram, který se nepodaří nakreslit, ponechá svůj zdroj viditelný, nedostane žádné ovládací prvky a ohlásí chybu v konzoli prohlížeče, kterou scripts/interaction-probe považuje za nález.
Adresy
| Adresa | Otevírá |
|---|---|
#diagram-<name> | stránka u tohoto diagramu |
#diagram-<name>:<node> | ten diagram s vybraným, vycentrovaným a vysledovaným uzlem |
scripts/ci/link-check rozhoduje obojí offline. První je běžný fragment: id musí na stránce existovat. Druhý se vyřeší, jen když stránka nese diagram a diagram deklaruje uzel, takže odkaz na uzel, který byl přejmenován, shodí build, který jej přejmenoval.
Grafy
Graf je tabulka, kterou stránka už vykresluje, deklarovaná jako taková:
<figure id="chart-milestones" data-chart="bar" data-chart-stack data-chart-horizontal data-chart-unit="issues">
<table>
<thead><tr><th>milestone</th><th data-series="done">…</th></tr></thead>
<tbody><tr id="chart-milestones:m000"><td><a href="…">M000</a></td><td>15</td></tr></tbody>
</table>
</figure>
site/charts.js vykreslí tabulku pomocí Apache ECharts: první sloupec je kategorie a každý sloupec, jehož záhlaví nese data-series, je řada. Čísla se čtou z buněk, které stránka ukazuje, takže graf nemůže být v rozporu se svou tabulkou a neexistuje druhá kopie dat. Tabulka na stránce zůstává; dostane ji čtenář bez JavaScriptu, čtečka obrazovky i tisk.
| Deklarace | Význam |
|---|---|
data-chart="bar" nebo "line" | co nakreslit |
data-chart-stack | řady jsou částmi jednoho celku |
data-chart-horizontal | kategorie běží po straně |
data-chart-unit | jednotka, na ose i v tooltipu |
data-chart-label | čeho je obrázek, pro čtenáře, který ho nevidí |
data-series na buňce záhlaví | tento sloupec je nakreslen |
data-value na buňce | nezaokrouhlené číslo, když buňka ukazuje zaokrouhlené |
| odkaz v první buňce řádku | značka řádku otevírá tutéž stránku |
id="chart-<name>:<row>" na řádku | adresa řádku, která také zvýrazní jeho značku |
Řada dostane barvu, v níž je kreslena její hlavička, když hlavička nese odznak stavu, takže stav se kreslí v barvě, kterou pro něj design deklaruje; jakákoli jiná řada dostane další z barev řad designu. ECharts se vendoruje při sestavení z připnutého balíčku npm a stáhne se poprvé, když se graf přiblíží k viewportu.
Takto se dnes kreslí dva grafy:
| Graf | Stránka | Tabulka, kterou čte | Data |
|---|---|---|---|
#chart-milestones | /plan/ | úkoly každého milníku podle odvozeného stavu | plan.json |
#chart-context-history | /economics/ | poměr redukce kontextu při každém zaznamenaném běhu | economics.json |
Co se kontroluje a čím
| Tvrzení | Kontrola |
|---|---|
| co zdroj deklaruje a na co se uzel vyřeší | node --test scripts/lib/diagrams.test.mjs |
názvy, uzly, panel nástrojů, odkazy, idempotence, odmítnutí duplicitního názvu a oba druhy adres přes link-check | bash test/run.sh 3006_diagrams_are_interactive_and_linkable |
| každý odkaz, který průchod zapsal, se rozeznává | scripts/ci/link-check, při každém sestavení |
| panel nástrojů, klávesy, adresa a propojené uzly se chovají v prohlížeči | specifikace diagram pro scripts/interaction-probe |
| žádný vztah není typován jako ozdobný obrázek | scripts/ci/diagram-check |
Grafy zatím nemají specifikaci chování: nedeklarují žádný ovládací prvek, takže sonda nemá co tvrdit a to, co graf čte ze své tabulky, nepotvrzuje žádná kontrola. To je úkol I2654.
Omezení
- Odkazy na uzly a adresy uzlů existují pro vývojové diagramy a stavové diagramy. Sekvenční diagram nebo jakýkoli jiný druh se pojmenuje, kreslí, zvětšuje a adresuje jako celek a nemá uzly, na které by se odkazovalo.
- Hrany se trasují jen ve vývojových diagramech.
- Domovská stránka nenese žádný diagram ani graf. Její sekce a rozpočet bajtů jsou deklarovány v
site/data/homepage.tomla přidání kteréhokoli je změnou této deklarace (úkol I2655). - Cockpit a
majordomus uikreslí vlastní grafy a tento prohlížeč nepoužívají (úkol I2656).