Spis treści

Tworzenie serii artykułów

Chcę tworzyć na swoim blogu serie artykułów dotyczączych projektu bądź jakiegoś zagadnienia. Mogłabym użyć tagów, ale one co do zasady tylko wspomagają ustalenie semantyki strony, sugerują rodzaj treści, natomiast przynależność do serii jest dla artykułu czymś bardzo konkretnym, wręcz niezmienialnym.

Kiedy widziałam zestawienia typu ten wpis jest częścią serii, to zawsze zastanawiałam się, jak mogę to zrobić “u siebie”. Dziś przyszedł ten moment, że postanowiłam to w końcu zrobić.

Na stronie npf.io znalazłam wpis o tym, jak można utworzyć serię artykułów w Hugo. Postanowiłam pójść tym tropem.

Zdefiniowanie metadanych to za mało

Hugo pozwala użyć dowolnych metadanych we wpisie, zresztą artykuł sugeruje, że to wystarczy. Niestety, samo dodanie

1
series=["java"]

powodowało błędy renderowania:

1
Error: Error building site: failed to render pages: render of "page" failed: execute of template failed: template: posts/single.html:14:12: executing "posts/single.html" at <partial "head/meta.html" .>: error calling partial: execute of template failed: template: _internal/opengraph.html:37:17: executing "_internal/opengraph.html" at <index $siteSeries ($name | urlize)>: error calling index: index of untyped nil

Postanowiłam poczytać o tym, czym są taksonomie.

Taksonomie

Taksonomie są podobne to tagów, z tym, że można mieć różne rodzaje tagów. Taksonomia “tagi” pozwala na użycie tagów “go” albo “programowanie”. Taksonomia “series” pozwala na użycie tagów “Projekt Gabinet” czy “Hugo 101”.

Taksonomie pozwalają na powiązanie ze sobą wielu fragmentów treści, to prawie jak mała baza danych - jeden fragment treści bloga, na przykład wpis, może być częścią różnych taksonomii: może być wpisem, może być stroną, może być odcinkiem serii.

Chcę dodać taksonomię “series”, więc w metadanych wpisu dodaję

1
series=["java"]

a po napotkaniu powyższego błędu odnajduję w dokumentacji Hugo o taksonomiach wzmiankę o tym, że muszę jeszcze zmodyfikować config.toml i dodać definicję taksonomii series:

1
2
3
4
[taxonomies]
  category = 'categories'
  series = 'series'
  tag = 'tags'

Jest to koniecznie przy definiowaniu taksonomii innych niż standardowe (“posts” i “categories”).

Wyświetlanie listy serii

Jak wyświetlić listę wszystkich serii?

Tu trochę strzelałam na oślep. Przeglądając templejty do taksonomii, zauważyłam stronę layout/taxonomy/terms.html, która uwzględnia jedynie taksonomie standardowe (“categories” i “posts”), a nie wyświetlała niczego dla taksonomii “series”.

Spróbowałam więc wyświetlić serie tak samo, jak wyświetlane są kategorie - czyli rozszerzyłam warunek renderowania “kart” tak, aby uwzględniał też nową taksonmię:

1
2
        {{- /* Categories Page */ -}}
        {{- if or (eq $taxonomies "categories") (eq $taxonomies "series") -}}

Wyświetlenie listy artykułów będących częścią serii

Jak teraz dodać listę wpisów z bieżącej serii na końcu wpisu?

Zmodyfikowałam istniejący templejt wpisu, czyli plik themes/LoveIt/layouts/posts/sinde.html i przed sekcją dodającą footer wstawiłam poniższy snippet.

Zakłada on, że artykuł jest częścią nie więcej niż jednej serii - aby określić, do jakiej serii należy bieżący artykuł, pobiera on zerowy element listy .Params.series. Założenie jest raczej rozsądne, ale muszę o nim pamiętać, definiując zmienną series w metadanych wpisu.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        <!-- Początek moich zmian -->
          <hr/>
        <div class="content">
        {{ if .Params.series }}
          {{ $name := index .Params.series 0 }}
          <p>Ten wpis jest częścią <a href="/series" id="series">serii</a> <b>{{$name}}</b>.<br/>
          </p>

            {{ $nameold := $name }}
            {{ $name := $name | urlize }}
            {{ $series := index .Site.Taxonomies.series $nameold }}
            {{ if $series.Pages }}
             Wszystkie wpisy w tej serii:
              <ul class="series">
              {{ range $series.Pages }}
                <li>{{.Date.Format "2006-02-01"}} -
                <a href="{{.Permalink}}">{{.LinkTitle}}</a></li>
              {{end}}
              </ul>
            {{ end }}
          {{end}} 
        </div>
      <!-- koniec moich zmoan -->

Uwaga

Nazwa serii staje się kluczem w mapie i podlega przekształceniu: wg autora artykułu wystarczy dodać filtr urlize, ale w moim przypadku zastępuje on znaki narodowe weeskejpowanymi html-owo znakami

Natomiast bez urlize - tak jak to ostatecznie zrobiłam - nie ma eskejpowania, jednak klucz powstaje przez zamianę liter na małe (tu mogłabym użyć filtra lower) oraz zastąpienie spacji myślnikiem (tu, niestety, nie znalazłam odpowiedniego filtra).

Z tego powodu muszę nazwy serii konstruować po prostu ostrożnie:

  • będą zawierały małe litery (chyna że zrobię $nameold := $name |lower)
  • będą pojedynczym słowem (bez spacji)
  • mogą zawierać polskie znaki

Przynajmniej do czasu, kiedy znajdę lepsze rozwiązanie problemu wypisywania listy wpisów w serii.