Spis treści

Jak migrowałam blog z Nikola do Hugo

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)
1
2
3
4
5
mkdir rst
for p in  *.rst;
pandoc "$p" -f rst -t  markdown -o (basename $p .rst).md;
mv $p rst;
end

Przygotowanie sktyptów

Niestety, pandoc uciął front metadata. Dlatego napisałam skrypty, które

  • wypiszą frontmeta
1
2
3
4
5
6
7
8
9

# 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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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

1
2
3
cat posts/rst/advent-of-code.rst | \
python3 ~/bin/extract_meta.py | \
python3 ~/bin/meta_rst_to_meta_toml.py

Wygenerowanie plików .md z frontmatter

No to wrzucam do pętli:

1
for p in  rst/*.rst;  cat $p | python3 ~/bin/extract_meta.py | python3 ~/bin/meta_rst_to_meta_toml.py; end

Hm, 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_END na more)
  • 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> albo pages/<slug>

Wydaje się teraz, że praca dobiega końca. Jeszcze dodam projekty i sprawdzę, dlaczego nie działają odwołania do fragmentów svg.