Kategorie i tagi w Jekyll

Jozdowska Edyta · 11 Listopad 2019

Jekyll jest całkiem fajnym narzędziem. Z tego jednak powodu, że przeznaczony jest dla programistów wiele rzeczy musimy napisać sami. W dodatku, jeśli hostujemy nasze stronki na Github Pages pozbawieni jesteśmy niektórych gemów jak np. jekyll-archive, które napisali inni.

Możemy jednak skorzystać z wewnętrznych pluginów, które sami możemy napisać. Tak więc jak dodać automatycznie strony Kategorii i Tagów do naszego Jekyll’a.

1.Prosty przepis na Kategorie i Tagi w Jekyll

Tworzymy plik _blog_by_category.html_ w katalogu ./_layouts. Tutaj moja uwaga, dla daty używam tłumaczenia, dlatego jest inlcude. Więcej na ten temat we wpisie i18ln w Jekyll dla daty.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
---
layout: default
---
<h1>Artykuły według kategorii: {{page.category | upcase}}</h1>
<div>
    {% if site.categories[page.category] %}
        {% for post in site.categories[page.category] %}
        <h3>
          <a href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a> 
          <span class="archive-meta">
            <time datetime="{{ post.date | date: "%Y-%m-%d" }}">
              <!--tutaj można użyć np post.date | date: "%Y-%m-%d 
                by otrzymać datę rok-miesiąc-dzień -->
              {% include date.html date=post.date %}
            </time>
          </span>
        </h3>
        { % endfor %}
    {% else %}
        <p>Brak wpisów w tej kategorii.</p>
    { % endif % }
</div>

Tworzymy plik _blog_by_tags.html_ w katalogu ./_layouts.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
---
layout: default
---
<h1>Artykuły po Tagu: #{{page.tag | upcase}}</h1>
<div class="search_result">
        {% if site.tags[page.tag] %}
            {% for post in site.tags[page.tag] %}
            <h3>
              <a href="{{ post.url | prepend: site.baseurl }}">
                {{ post.title }}
              </a> 
              <span class="archive-meta">
                <time class="archive-date post_date" datetime="{{ post.date | date: "%Y-%m-%d" }}">
                  {% include date.html date=post.date %}
              </time>
              </span>
            </h3>
            {% endfor %}
        {% else %}
            <p>Brak wpisów o tym tagu.</p>
        {% endif %}
    </div>

Tworzymy plik w katalogu _plugins o nazwie np. categories_tags_gen.rb i w nim wklejamy kod:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
module Jekyll
    class TagsGenerator < Generator
      def generate(site)
          tags_dir = Dir.pwd + '/tags'
  
          if !Dir.exists?(tags_dir)
              puts "Creating tags dir"
              Dir.mkdir(tags_dir)
          end
          regenerate_flag = false
  
          site.tags.each do |i|
              tag_name = i[0]
  
               if !File.exists?(tags_dir + '/' + tag_name + '.md')
                  puts "Creating tag page for: " + tag_name
                  tag_file = File.new(tags_dir + '/' + tag_name + '.md', "w")
                  tag_file.puts("---\nlayout: blog_by_tag\ntag: " + 
                  tag_name + "\npermalink: /tags/" + 
                  tag_name + "/\navoid_main_menu: true\n---")
                  tag_file.close
  
                  regenerate_flag = true
              end
          end  
          if regenerate_flag
              FileUtils.touch Dir.pwd+'/_config.yml'
          end
        end
    end
  
    class CategoryGenerator < Generator
  
      def generate(site)
          category_dir = Dir.pwd + '/kategoria'
  
          if !Dir.exists?(category_dir)
              puts "Creating kategoria dir"
              
              Dir.mkdir(category_dir)
          end
          regenerate_flag = false
  
          site.categories.each do |i|
              if !File.exists?(category_dir + '/' + i[0] + '.md')
                  puts "Creating category page for: " + i[0]
                  category_file = File.new(category_dir + '/' + i[0] + '.md', "w")
                  category_file.puts("---\nlayout: blog_by_category\ncategory: " + 
                  i[0] + "\npermalink: /kategoria/" + i[0] + "/\n---")
                  category_file.close  
                  regenerate_flag = true
              end
          end  
          if regenerate_flag
              FileUtils.touch Dir.pwd+'/_config.yml'
          end 
      end
    end
  end

Restartujemy serwer by wdrożyć dodanego plugina categories_tags_generator.

Po uruchomieniu serwera, do naszej instalacji zostały dodane dwa foldery kategoria i tags, a w nich pojedyncze pliki {nazwa_kategorii/tagu}.md.

Podczas generowania strony w folderze _site, w którym to docelowo otrzymujemy nasze wygenerowane przez Jekyll’a pliki html powinny znaleźć się odpowiednie nazwą katalogi tags i kategoria, a w nich nazwa i odpowiedni, wygenerowany plik index.html

Nie wiem tylko czy będzie tutaj działało stronnicowanie. To zobaczę jak dodam więcej artykułów do tego bloga. Póki co, rozwiązanie spełnia swoje zadanie. Mam podział na tagi i kategorie, które co ważne działa z GitHub Pages :).

Powodzenia w waszych instalacjach!

Jozdowska Edyta * FullStack Developer

Pisanie kodu jest moją pasją. Zajmuję się tym od przeszło 10 lat, z większą lub mniejszą intensywnością.
Piszę kod w PHP, JS, SCSS i Python. Nie stronię też od poznawania nowych, lub jak kto woli starych rozwiązań jak Jekyll oraz innych języków np. Java.

więcej o mnie