Gitposting
Inhoud
Ook dit is een onderdeel dat ik nog wil automatiseren. Voor nu doe ik het nog maar even met de hand, min of meer zoals hier beschreven.
Inleiding
Ik heb het idee opgevat om de ontwikkeling van deze blog bij te houden in een git repository. Zowel de inhoud van posts en pagina's als de automatisering en andere code die ik eromheen ontwikkel. Die repository heb ik aangemaakt en toegevoegd aan de links die bovenin staan op kekwatikdacht.nl.
De eerste handeling die ik wil automatiseren is het bijhouden van wijzigingen in posts, wanneer ik eraan werk in de ghost-editor. Om te beginnen ga ik bezig met het omzetten van de post-data naar leesbare bestanden. Ghost biedt de mogelijkheid om alle data te exporteren naar een JSON-bestand. Daarin is de inhoud van elke post opgenomen in drie formats, waaronder HTML. Die wilde ik in aparte bestanden zetten om ze op te nemen in de repository. Daartoe ondernam ik
Poging 1: bash && jq
Ik heb het volgende bash-script gemaakt (ik wilde schrijven 'geschreven', maar dat voelt niet helemaal kloppend met de ondersteuning van een LLM) dat de HTML van alle posts uit de JSON van de export in html-bestanden zet. Ik heb nu nog handmatig de backup JSON gedownload, het script gedraaid en de gegenereerde bestanden toegevoegd aan de repository. Mijn plan is om dat allemaal automatisch op de server te laten plaatsvinden. Periodiek of, bij voorkeur, getriggerd door het bewerken en/of publiceren van een post. Ook zou ik er graag op github beter leesbare markdown-bestanden van willen maken.
Het was mijn bedoeling onderstaand codeblok hier binnen de toggle te plaatsen, maar ik zie nog geen mogelijkheid in de ghost editor om dat voor elkaar te krijgen. Hoe ik dat wel kan doen ga ik later uitzoeken.
#!/bin/bash
JSON_DATA=$(cat "test.json")
# Use jq to parse and extract data
jq_output=$(echo "$JSON_DATA" | jq -r '
.db[0].data.posts[] | [{
filename: (if .status == "draft" then (.slug + "_DRAFT") else .slug end + ".html"),
content: .html,
type: .type
}]
')
echo "$jq_output" | jq -c '.[]' | while read item; do
filename=$(echo "$item" | jq -r '.filename')
content=$(echo "$item" | jq -r '.content')
dir=$(echo "$item" | jq -r '.type')s # <- 's' to create plural. Type can be "post" or "page".
mkdir -p "$dir"
echo "$content" > "$dir/$filename"
echo "wrote to $dir/$filename"
donebash
Dit was mijn eerste kennismaking met jq, dat ik alleen nog van naam kende. Mijn eerste indruk: heel nuttig om in de terminal of een script met json data te werken. Het werkte prima voor mijn doeleinden, totdat ik wat verder kwam met deze post, de eerste waarin wat meer gebeurt dan platte tekst en een horizontale lijn. Met name het codeblok met het script hierboven bleek problematisch voor het script. 🤔 Na een aantal probeersels om het script volledig werkend te krijgen met deze post, besloot ik het anders aan te pakken. Het was tijd voor
Poging 2: C# console app
Nu ik niet langer dacht dat het met een bash-script sneller en makkelijker kon, viel ik terug op wat ik het beste ken en waar ik het meest comfortabel in ben: C#.
Enige tijd later
Alles hierboven heb ik meer dan een half jaar geleden geschreven. Misschien wordt het tijd dit maar eens af te ronden. Veel meer valt er momenteel ook niet over te zeggen. Ik heb een eenvoudige CLI gemaakt met Spectre, dat ik een heel prettig bruikbare library vind. Die haalt de html van de posts en pagina's uit de door de backup gegenereerde json, en slaat ze op in aparte bestanden, die ik vervolgens handmatig push naar de repository.
Het zijn dus nog geen makkelijk leesbare teksten, tenzij je ze in een browser laadt. Een mogelijke volgende stap is om er, zoals gezegd, markdown van te maken, zodat ook de drafts eenvoudig leesbaar zijn op github.
Afsluiting
Dit voelde een beetje als een abrupt einde aan dit verhaal, en dat probeer ik met deze opmerking erover te verminderen. Verder is de stijl niet erg consistent, is het niet overal even leesbaar en is er kortom genoeg op aan te merken. Een prima kandidaat dus voor latere revisie, maar deze versie (todo: deze versie linken naar deze versie op github) blijft ook bestaan, en dat is wat ik hier vooral mee wilde bereiken. Om achteraf terug te kunnen zien hoe teksten tot stand gekomen zijn en zich ontwikkeld hebben.
P.S. Nu ben ik vergeten hoe ik aan de links in de inhoudsopgave kwam, dus die ontbreken nog voor de laatste twee kopjes. Maar ik ga dit lekker toch alvast publiceren.