Blog Jekyll: Statystyki bloga w motywie Chirpy – Liquid
Dodanie panelu statystyk w motywie Chirpy: liczba wpisów, kategorie, tagi oraz łączny czas czytania generowany statycznie przez Jekylla z użyciem Liquid.
Na końcowym etapie tworzenia bloga pojawia się pytanie: co by tu jeszcze dodać.
Dobrze jest nie dodawać za dużo. Tyle, ile w sam raz.
Pomyślałem, że dodam w prawej kolumnie panel ze statystykami bloga:
- liczba wpisów,
- liczba kategorii,
- liczba tagów,
- łączny czas czytania wszystkich wpisów.
Efekt końcowy wygląda tak:
Dodatkowo w jednym z wpisów umieściłem dynamiczną informację:
1
Ten blog ma już **{{ count }} {{ suffix }}**.
Wyświetla się tak: Ten blog ma już 28 wpisów.
Gdzie i jaki kod dodać
Plik:
1
_includes/update-list.html
Kod należy wkleić nad sekcją <section id="access-lastmod">:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!-- MPS: Blog stats panel -->
<section id="access-stats">
<h2 class="panel-heading">Statystyki bloga</h2>
{% assign posts_count = site.posts | size %}
{% assign tags_count = site.tags | size %}
{% assign categories_count = site.categories | size %}
{% assign total_words = 0 %}
{% for post in site.posts %}
{% assign words = post.content | number_of_words %}
{% assign total_words = total_words | plus: words %}
{% endfor %}
{% assign total_minutes = total_words | divided_by: 200 %}
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="lh-lg d-flex justify-content-between">
<span>Wpisy</span>
<span><strong>{{ posts_count }}</strong></span>
</li>
<li class="lh-lg d-flex justify-content-between">
<span>Kategorie</span>
<span><strong>{{ categories_count }}</strong></span>
</li>
<li class="lh-lg d-flex justify-content-between">
<span>Tagi</span>
<span><strong>{{ tags_count }}</strong></span>
</li>
<li class="lh-lg d-flex justify-content-between">
<span>Czas czytania (min)</span>
<span><strong>{{ total_minutes }}</strong></span>
</li>
</ul>
</section>
Łączny czas czytania obliczany jest na podstawie całkowitej liczby słów we wszystkich wpisach (number_of_words) przy założeniu średniej prędkości czytania 200 słów/min (Liquid: {% assign total_minutes = total_words | divided_by: 200 %}).
Wersje językowe można zrealizować albo poprzez wykorzystanie danych z plików, np. data/locales/pl.yml i data/locales/en.yml, albo – prościej (jak w moim przypadku) – przez zakodowanie tych kilku etykiet bezpośrednio w plikach _includes/update-list.html w odpowiednich repozytoriach (blog-pl i blog-en).
Kilka szczegółów technicznych
To rozwiązanie jest w pełni statyczne, więc nie ma wpływu na szybkość otwierania strony w przeglądarce:
- obliczenia wykonywane są przez skrypty Liquid podczas builda (
jekyll servelub GitHub Pages), - wynik trafia do wygenerowanego HTML jako zwykły tekst,
- użytkownik otrzymuje stronę statyczną.
To dla mnie jedna z największych zalet Jekylla: wszystko generowane jest statycznie.
Nie ma zapytań do bazy danych (np. MySQL), nie ma dynamicznych obliczeń po stronie użytkownika (choć można dodawać pluginy JavaScript).
A jak to wpływa na czas generacji strony przez generator Jekyll?
Panel generowany jest podczas budowy strony przez Jekylla poprzez wykonanie kodu Liquid ({% ... %}), więc blog pozostaje w pełni statyczny i nie wpływa to na szybkość jego działania.
Podsumowanie
Rozwiązanie jest proste, czyste i w pełni zgodne z filozofią statycznego generatora stron.
To jest po prostu proste, i to jest super.
