gemtext
et tekstformat med ét link per linje
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å.
# 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 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. 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 — projektets egen korte gennemgang af alle linjetyper, med noter til dem, der kender Markdown.
- Gemini hypertext format specification
— den normative tekst: linjetyper, parserens tilstand, regler for ombrydning, parameteren
langog en formel grammatik. - Gemini network protocol specification — hvordan en kapsel leverer gemtext: forespørgsler, statuskoder og de TLS-regler, en klient følger.
- Project Gemini FAQ — begrundelserne bag designet, blandt andet hvorfor links står på deres egne linjer.