Jak migrowałam blog z Nikola do Hugo
Contents
Przygotowuję migrację do Hugo
Kroki:
Przekonwertowanie plików .rst na markdown
W tym kroku
- dowiedziałam się o istnieniu narzędzia pandoc
- nauczyłam się, jak w fish shellu zmienić rozszerzenie pliku, którego nazwę mam w zmiennej $p (wyrażeniem
(basename $p .rst).md)
mkdir rst
for p in *.rst;
pandoc "$p" -f rst -t markdown -o (basename $p .rst).md;
mv $p rst;
endPrzygotowanie sktyptów
Niestety, pandoc uciął front metadata. Dlatego napisałam skrypty, które
- wypiszą frontmeta
# cat file.rst | python3 extract_meta.py
import sys
for line in sys.stdin:
line = line.strip()
if line.startswith("..") and line[line.index(":") + 1:].strip() != "":
print(line)
else:
break- przekształcą z formatu .rst na .toml
import sys
print("+++")
for line in sys.stdin:
line = line.strip(".. ").strip().replace(":", "=", 1)
key, val = line.split("=")
if key in ["tags", "previewimage"]:
line = key + "=[" + val + "]"
print(line)
print("+++")Przykład
cat posts/rst/advent-of-code.rst | \
python3 ~/bin/extract_meta.py | \
python3 ~/bin/meta_rst_to_meta_toml.pyWygenerowanie plików .md z frontmatter
No to wrzucam do pętli:
for p in rst/*.rst; cat $p | python3 ~/bin/extract_meta.py | python3 ~/bin/meta_rst_to_meta_toml.py; endHm, teraz jednak trzeba połączyć przekształcony frontmatter i zawartość wpisu.
Inne podejście
Piszę program w pythonie, który:
- przejrzy pliki w posts
- wrzuci parę .meta i .md z posts do koleki
- znajdzie .rst, wyjmie meta, wrzuci parę .meta i .rst przekształcony na .md do koleki
- dla każdej pary w kolejce przekształci .rst meta na .toml meta
Oczywiście, trzeba będzie najpierw zrobić backup (jest całość w gicie)
Po dwóch tygodniach
Udało się przemigrować bloga prywatnego! Skrypt migrujący jest wrzucony na githuba
To, co jeszcze muszę sprawdzić, to
- jak odwoływać się do innych wpisów
- jak wrzucić np. projekty napisane w js lub wygenerowane strony html niebędące częścią bloga (bez przetwarzania)
I jeszcze trochę czasu
Okazało się, że i tak trochę rzeczy musiałam zrobić ręcznie (lub przejechać sed-em):
- “shortcodes” do generowania miniatur w Nikoli przekształciłam na “shortcode”
figure - usunęłam
type="text"z frontmeta (atrybut ten w Hugo oznacza, że wpis ma wskazany typ, a nie typ wynikający z położenia w root bundle) - zamieniłam komentarz html-owy oznaczający koniec teasera (
TEASER_ENDnamore) - usunęłam z odnośników do obrazków prefiks
/images - odowłania do inych wpisów to po prostu slug z prefiksem:
posts/<slug>albopages/<slug>
Wydaje się teraz, że praca dobiega końca. Jeszcze dodam projekty i sprawdzę, dlaczego nie działają odwołania do fragmentów svg.