# gemtext

## Hvad det er

Gemtext er dokumentformatet i Gemini-protokollen: almindelig UTF-8-tekst, hvor de første tegn på
hver linje afgør, hvad linjen er, så en klient kan vise en hel side i ét gennemløb fra top til
bund. Specifikationen kalder det Gemini-hypertekstformatet (the Gemini hypertext format), servere
mærker det med medietypen `text/gemini`, og filerne ender som regel på `.gmi`.

Der findes seks slags linjer. En linje, der begynder med `=>`, er et link: en adresse, absolut
eller relativ, og eventuelt en tekst efter den. En linje med tre backticks slår præformateret
tilstand til eller fra, og alt mellem to af dem vises nøjagtigt som skrevet, i en skrift med fast
bredde. En, to eller tre havelåger giver en overskrift, en stjerne efterfulgt af et mellemrum
giver et punkt i en liste, og et større-end-tegn giver et citat. Alle andre linjer er almindelig
tekst, som klienten ombryder til bredden af den skærm, teksten lander på.

```text
# Feltnoter

En tekstlinje er et afsnit, uanset hvor lang den er. Klienten ombryder den.

=> /arkiv/ Ældre noter
=> gemini://example.org/ En kapsel et andet sted

* Et punkt i en liste
> En citeret linje
```

Specifikationen deler de seks i tre kernetyper, som enhver klient skal kunne håndtere (tekst, links
og skiftet til præformateret tekst), og tre, som en minimal klient må vise som almindelig tekst.
Mere rummer formatet ikke. Det kender hverken fed eller kursiv, tabeller, billeder inde i teksten,
indlejring eller nogen måde at gøre et ord midt i en sætning klikbart på. En parser holder styr på
én eneste bit tilstand: om den står inde i en præformateret blok.

Gemtext bliver oftest sammenlignet med Markdown, som det ligner ved første øjekast. Forskellen
ligger i, hvad de hver især er til. En Markdown-fil er kildetekst, skrevet for at blive omsat til
noget andet; en gemtext-fil er allerede det færdige dokument, og læserens klient er den eneste,
der viser det. Sin ene strukturelle vane, linket på sin egen linje, har formatet arvet fra de ældre
Gopher-menuer.

## Hvorfor det betyder noget

At vælge gemtext er at vælge, hvem der bestemmer over siden. Forfatteren bestemmer strukturen:
hvilke linjer der er overskrifter, hvilke der er links, og hvor koden står. Læserens klient
bestemmer resten, fra skrifttype og linjelængde til farver, luft og om overskrifterne bliver til
en indholdsfortegnelse. Specifikationen siger ligeud, at formatet ikke er beregnet til at give
forfatteren præcis kontrol over udseendet. For nogle udgivere er det en lettelse, for andre lukker
det samtalen, og det er bedre at vide hvilken af delene, før den første side bliver konverteret.

Lettelsen ligger i det, der forsvinder. En gemtext-side har intet stylesheet, intet script, ingen
webskrifttype, intet cookiebanner og ingen sporingspixel, og der er intet i den at holde ved lige
ud over ordene. Siderne er små og hurtige at skrive i hånden. Links henter aldrig noget af sig
selv, for specifikationen forbyder en klient at åbne en netværksforbindelse blot for at vise et
link, så en side kan ikke trække et billede eller en skrifttype ind fra en tredjepart bag
læserens ryg.

Prisen er lige så håndgribelig. Gemtext når kun de mennesker, der bruger en Gemini-klient, og det
er et lille publikum ved siden af webbets. Formatet har ingen formularer; den eneste måde, en
kapsel beder om input på, er en statuskode i protokollen, ikke noget i selve dokumentet. Og teksten
skal fungere uden links inde i sætningerne. En sætning skrevet til HTML, »se prissiden for
detaljer«, beholder sine ord og mister sin henvisning, så god gemtext kræver sætninger, der stadig
giver mening, når linket står på linjen nedenunder.

Derfor lyder det realistiske spørgsmål for de fleste organisationer: gemtext ved siden af et
website, ikke i stedet for et, lavet af den samme kilde i det samme build. Stillet sådan koster
gemtext lidt at tilføje, og det fungerer samtidig som en prøve på teksten. Læses en side stadig
klart som en kolonne af tekstlinjer og linklinjer, så sad strukturen i ordene hele tiden.

## Sådan ser det ud i praksis

Dette site udgives som gemtext ved siden af sin HTML. Siden
[Engineer i en terminal](/da/cli/) giver kapslens adresse, `gemini://engineer.company/`, fortæller,
at hver side på sitet også findes i formatet, og nævner klienter, der læser det: Amfora, Lagrange
og Bombadillo i en terminal, Castor og Kristall i et vindue. Den giver også begrundelsen. Én
udrulning skriver én mappe, som alle indgange læser fra, så gemtext-kopien kan ikke glide væk fra
HTML'en, og en side, der læses godt som gemtext, har en struktur, der er ægte og ikke malet på.

Hvordan det blev bygget, står i
[beskrivelsen af, hvordan sitet blev spejlet til Gemini og Gopher](/da/portfolio/mirrored-the-site-to-gemini-and-gopher-137/).
Gemtext er et outputformat i det samme build, ikke en separat byggepipeline. Sitegeneratoren fik
egne medietyper og outputformater, og hver side, hvert afsnit og hvert taksonomibegreb fik et
Gemini-dokument ved siden af sin HTML og sin Markdown-tvilling: 777 i alt, leveret af en lille dæmon
på den samme vært. De nye formater er markeret som ikke-alternative repræsentationer, så HTML'en
ændrede sig ikke med en eneste byte, og det blev målt frem for antaget. De alternative
repræsentationer fylder omkring tolv procent af HTML'ens egen vægt på disken.

Skabelonerne bag kopien viser, hvad en konvertering til gemtext indebærer. Hvert link i teksten
bliver løftet ud af sin sætning: ordene bliver stående, hvor sætningen har brug for dem, og adressen
flytter ned under teksten som en `=>`-linje for sig. Markeringer af fed skrift forsvinder, punkter
med bindestreg bliver til stjerner, og en kodeblok mellem hegn går uændret igennem, fordi et
Markdown-hegn og et gemtext-skift til præformateret tekst er de samme tre backticks.

## Hvor det går galt

### Halve linjer, der aldrig samles

Teksten når frem til klienten som en takket kolonne af korte linjer, brudt midt i sætningen. Kilden
var ombrudt ved 80 tegn, som Markdown-filer tit er, og specifikationen forbyder en klient at samle
korte tekstlinjer, der følger efter hinanden, til længere. Skriv hvert afsnit som én lang linje,
eller lad konverteren samle de bløde linjeskift, før den skriver filen.

### Links, der forlader kapslen

Det første link, læseren følger, åbner en webbrowser. Konverteren skrev hvert link som en absolut
`https://`-adresse, og en Gemini-klient sender den slags videre til et andet program. Skriv
navigationen som rodrelative stier som `/om/`, der peger ind i kapslen, og behold ét bevidst link
per side til dens webversion.

### Kode, der falder sammen til én linje

Et kodeeksempel vises som én lang linje, klistret til sit åbningshegn. Konverteren behandlede
blokken som brødtekst og flettede dens linjer sammen med alt det andet. Del dokumentet ved hegnene
før alle andre trin, send hver præformateret blok igennem, som den er skrevet, og lad skiftelinjen
højst bære en kort alt-tekst, for eksempel navnet på sproget.

### Markdown, der bliver til bogstavelige tegn

Punkter med bindestreg, dobbelte stjerner, understregede overskrifter, indlejrede lister og links i
firkantede parenteser dukker op i klienten nøjagtigt som skrevet. Gemtext genkender kun en stjerne
og et mellemrum som punkt i en liste og havelåger som overskrift, og formatet har slet ingen
markering inde i linjen. Konvertér de konstruktioner på vej ud, eller skriv kapslen direkte i
gemtext.

### Sætninger, der peger ud i luften

Et afsnit siger »klik her« eller »som linket ovenfor«, og læseren står uden retning. Linket blev
løftet ud af sætningen, og de ord, der blev tilbage, sagde aldrig, hvor det førte hen. Skriv
linktekster, der nævner deres mål, så både sætningen og `=>`-linjen giver mening hver for sig.

## Læs mere

- [A quick introduction to gemtext markup](https://geminiprotocol.net/docs/gemtext.gmi)
  — projektets egen korte gennemgang af alle linjetyper, med noter til dem, der kender Markdown.
- [Gemini hypertext format specification](https://geminiprotocol.net/docs/gemtext-specification.gmi)
  — den normative tekst: linjetyper, parserens tilstand, regler for ombrydning, parameteren `lang`
  og en formel grammatik.
- [Gemini network protocol specification](https://geminiprotocol.net/docs/protocol-specification.gmi)
  — hvordan en kapsel leverer gemtext: forespørgsler, statuskoder og de TLS-regler, en klient
  følger.
- [Project Gemini FAQ](https://geminiprotocol.net/docs/faq.gmi) — begrundelserne bag designet,
  blandt andet hvorfor links står på deres egne linjer.

<https://engineer.company/da/glossary/gemtext/>
