Skip to main content

Fire billeder. Og en udgivelsesrutine, der kontrollerer sit eget arbejde

Submitted by Lennart on

Vi satte fotos ind i en allerede udgivet artikel med Nushell og Drupals API. Undervejs fik vi bygget den kontrol, der gør arbejdet værd at gentage.

Jeg havde udgivet en artikel på Folkets om Danmarks faste forbindelser. Storebælt, Øresund, dæmningerne til småøerne og de broer, man kører over uden at tænke nærmere over dem. Den havde et billede øverst. Resten var tekst og tabeller.

Det var oplagt at gøre noget mere med den. Et luftfoto af Øresund viser, hvordan broen møder Peberholm. Et foto af Rømødæmningen gør det lettere at forstå, hvad det vil sige at bygge en vej gennem Vadehavet. Billederne skulle stå ved de afsnit, hvor de gjorde teksten bedre.

Jeg spurgte Codex, om vi kunne udbygge de Nushell-moduler, jeg allerede bruger til at udgive på Drupal. Og om vi kunne gøre det med Drupals core-funktioner.

Det kunne vi. Men det interessante var, hvad der skulle til for at gøre det til en fast arbejdsgang.

Drupal havde allerede den nødvendige funktion

Mit udgivelsesmodul kunne i forvejen hente et valgt billede fra Wikimedia Commons, kontrollere de licensoplysninger, vi understøtter, og oprette det som et medie i Drupal. Billedet blev knyttet til artiklen som topbillede.

Brødteksten blev sendt som Markdown gennem JSON:API. Det manglende led var at angive, hvor yderligere billeder skulle stå, og få Drupal til at vise dem dér.

I tekstformatets indstillinger var Embed media allerede slået til. Det er et filter i Drupal core, der omsætter en mediereference i teksten til et vist medie. Billedtekster var også aktiveret. Vi kontrollerede rækkefølgen af filtrene og prøvede med en upubliceret artikel.

Prøven viste et foto mellem to afsnit, med billedtekst, fotograf og licens. Drupal leverede også billedmål og lazy loading. Der var ikke brug for at installere et ekstra Drupal-modul til indlejringen.

Manuskriptet fik en plads til hvert billede

Vi beholdt artikelteksten i den lokale Markdown-fil. I dens metadata står nu en liste over billeder med filnavnet på Commons, alternativ tekst, billedtekst og kreditering. Hvert billede har et kort navn.

Der, hvor billedet skal stå, skriver vi en markør på sin egen linje:

{{media:romo}}

Det er nok til at angive placeringen. Ved levering bliver markøren erstattet med Drupals medieindlejring. Den lokale fil beholder markøren, så den stadig er til at læse og redigere.

Det krævede også nogle regler. Et navn må ikke være brugt til to forskellige billeder. En markør skal pege på et billede, der findes i listen. Et billede skal have en placering. Og markøren må ikke gemme sig i en kodeblok, hvor den bare ville blive vist som tekst.

De fejl skal findes, før noget bliver uploadet.

En eksisterende artikel skal opdateres

Det gamle udgivelsesforløb oprettede en ny artikel. Det var fint til første udgivelse, men forkert, når opgaven var at sætte billeder ind i noget, der allerede lå på sitet.

Vi tilføjede derfor en opdateringskommando og gemmer nu Drupals node-UUID sammen med manuskriptet. Det er identifikatoren for den konkrete artikel. En opdatering går til den node gennem JSON:API med en PATCH-anmodning.

For min artikel om de faste forbindelser betød det, at vi kunne tilføje fire fotos og bevare samme adresse og publiceringsstatus. En kladde kan på samme måde rettes og senere udgives på den samme node.

Kommandoerne følger den arbejdsgang, jeg har brug for:

use tools/folkets
folkets preview data/stories/2026-10-02-denmark-fixed-links
folkets update data/stories/2026-10-02-denmark-fixed-links
folkets verify data/stories/2026-10-02-denmark-fixed-links

Preview viser, hvad vi vil sende. Update ændrer artiklen. Verify læser, hvad Drupal faktisk har gengivet. Den sidste kontrol bliver også kørt automatisk, når modulet leverer billeder i brødteksten.

Et API-svar er kun halvdelen af kontrollen

Man kan sende en helt korrekt mediereference og stadig ende med en artikel uden et synligt billede. Et tekstfilter kan have behandlet indholdet anderledes end forventet. En medievisning kan have udeladt krediteringen.

Derfor henter modulet artiklens gengivne HTML gennem API'et. Det kontrollerer billedets alternative tekst og billedteksten og ser efter det tilhørende medies gengivne kreditering, licens og Commons-kilde. Det melder også fejl, hvis en markør eller en ubehandlet Drupal-indlejring er sluppet igennem.

Det erstatter ikke et blik på artiklens layout. Men det finder en vigtig klasse af fejl, som en besked om vellykket upload ikke siger noget om.

Commons mindede os om, at nettet også er en del af arbejdet

Undervejs ratebegrænsede Commons nogle af billedhentningerne. Vi havde allerede hentet originalerne for at se dem, men udgivelsesmodulet bad om de samme filer igen.

Modulet bruger nu filadresser uden trackingparametre og en lokal, midlertidig cache. Før en fil fra cachen bruges, kontrolleres dens størrelse mod Commons' metadata. Medier, der allerede er oprettet i Drupal med samme kilde, kreditering og alternativ tekst, kan genbruges ved næste forsøg.

Det er stadig ikke én samlet transaktion. Et afbrudt forløb kan efterlade et uploadet medie, selv om artiklen endnu ikke er ændret. Derfor skal identifikatorerne gemmes, og fejlbeskeden skal gøre det klart, hvad der allerede er sket.

Det, jeg tager med videre

Dagens synlige resultat er fire fotos ned gennem artiklen om Danmarks faste forbindelser. Den gentagelige del er et manuskript med tydelige billedplaceringer og en udgivelsesrutine, der kontrollerer sit eget resultat.

AI hjalp med at udvikle koden og undersøge billederne. Reglerne for placering, levering og kontrol ligger nu i Nushell-modulet. Næste gang behøver vi ikke forklare hele fremgangsmåden igen.

For en virksomhed er det et nyttigt spørgsmål at stille til en AI-opgave: Hvad efterlader arbejdet, som gør den næste opgave lettere? Her blev svaret en konkret funktion, dokumentation og tests, som også blev kørt mod fejltilfælde. Derefter brugte vi funktionen på en rigtig, allerede udgivet artikel.

Det var fire billeder. Men de fik os til at bygge resten af arbejdsgangen ordentligt.

Teknisk kilde

Drupal core: Media embed-filteret beskriver mekanismen bag indlejringen. Afprøvningen og eksemplet ovenfor stammer fra arbejdet på Folkets den 2. oktober 2026.