Vimwiki dienoraščio perkėlimas į Github Pages naudojant Hugo

Šita idėja galvoje sukosi jau seniai. Teksto redagavimui naudoju VIM. Ilgai ieškojau įrankio, kuris būtų patogus užrašams. Naudojau Evernote, Synology Notes, vim oultiner, vim notes, kol galiausiai apsistojau prie vimwiki. Vimwiki turiu dvi atskiras kolekcijas - vieną darbui, o kitą asmeniniams užrašams. Tekstą rašau Markdown formatu. Tuo pačiu vimwiki turi dienoraščio funkciją, kuri tiesiog sukuria naują failą, skritą įrašams, su dienos data ir generuoja indeksinį puslapį, kuriame saugomos nuorodos į visus šiuos failus. Paprasta ir patogu.

Man patinka vim-wiki, nes užrašai visada yra “po ranka”, t.y. tame pačiame teksto redaktoriuje kuris pas mane nuolat atidarytas. Idėja apie kurią užsiminiau anksčiau - automatiškai sukelti šią dienoraščio dalį į GitHub pages. Pats teksto rašymas neturi reikalauti kažko daugiau, išskyrus teksto rašymą ir failų išsaugojimą. Duomenų apdorojimas, HTML sugeneravimas, puslapio atnaujinimas ir kiti reikalai turi vykti automatiškai, man net nesukant dėl to galvos.

Mano užrašai labiau yra asmeniniai, ne literatūriniai šedevrai. Man nereikia įrašo išleidimo datos, juodraščio rėžimo ir kitų funkcijų, kurias teikia panašios sistemos kaip Wordpress. Gal tik kartais noriu su kažkuo jais pasidalinti arba turėti po ranka patogiai peržiūrai. Taip pat noriu susižymėti svarbesnius įvykius, pvz. saugoti atliktų prezentacijų sąrašą.

Kurį laiką jau esu susikūręs pawka.notrollsallowed.com domeną ir jį nukreipęs į Github Pages - nemokamą statinių puslapių talpyklą. Reikėjo tik automatizuoti Markdown turinio konvertavimą į HTML. Hugo - vienas iš statinių puslapių generatorių atliekantis šį darbą. Visgi Hugo įrašai reikalauja tam tikros meta informacijos - minimum datos ir pavadinimo:

---
title: "Pranešimo pavadinimas"
date: 2020-10-28
tags: hugo
---
Tekstas čia

Vimwiki įrašo data yra failo pavadinimas. Na o antraštė - mano paties pridedama heading eilutė, dažniausiai pati pirma ir prasidedanti simboliu “#". Visą šią informaciją nesunku ištraukti su keliomis bash eilutėmis, sugeneruoti meta informacijos bloką, pašalinti pirmąją antraštės eilutę iš teksto ir prikabinti patį įrašo tekstą pranešimo apačioje.

#!/bin/bash

# Script copies diary entries from vimwiki and converts to Hugo post format by
# pre-pending post meta information to the post file.
#
# - Post date is read from diary filename
# - Post title is the first heading item.
# - The first heading item is removed from post as it will be displayed as
#   title.

set -euo pipefail

readonly POST_HEADER="---
title: \"{{TITLE}}\"
date: {{DATE}}
---"

generate_post() {
    local content=$1

    date=$(basename "$entry" | sed 's/\.md$//')
    title=$(grep -m 1 "^# " "$content" | sed 's/^# \+//')
    text=$(sed '0,/^# /{/^# /d;}' "$content")

    echo "$POST_HEADER" \
        | sed "s|{{TITLE}}|$title|" \
        | sed "s|{{DATE}}|$date|"
    echo "$text"
}

main() {
    local source_path=$1
    local dest_path=$2

    mkdir -p "$dest_path"

    for entry in $source_path*.md
    do
        filename=$(basename "$entry")
        if [[ "$filename" == "diary.md" ]]; then
            continue
        fi
        generate_post "$entry" > "$dest_path/$filename"
    done

}

main "$@"

Viskas generuojama su Makefile:

.PHONY: diary

VIMWIKI_DIARY_PATH=~/fs/Apps/vimwiki/diary/
POSTS_PATH=./content/posts/

diary:
	bin/diary.sh $(VIMWIKI_DIARY_PATH) $(POSTS_PATH)

Šis skriptas paruošia turinio failus, kad jie tiktų Hugo generatoriui. Liko automatizuoti sukėlimą į Github pages ir automatinį šio proceso iškvietimą pvz. kai išsaugomas dienoraščio įrašas. Tag’ų dar neliečiau, nes nebuvau išsiaiškinęs, kaip Hugo juos naudoja. Čia mano kitas žingsnis - nebus sudėtinga. Man tag’ai yra svarbūs, nes noriu turėti galimybę atsirinkti tam tikros grupės įrašus, pvz. mano hobio - alaus virimo užrašus arba turėti “TIL” (today I learned) sąrašiuką viename puslapyje.