Jekyll: vypsání interních zpětných odkazů

Hlavně kvůli digitálnímu zahradnictví jsem chtěl na ALES.NET začít vypisovat interní zpětné odkazy. Hodnotnější jsou pro návštěvníky samozřejmě ty kontextové přímo v textu, ale svůj účel najdou i odkazy vedoucí opačným směrem.

Jediný rozumně jednoduchý systém mi sice nefungoval, ale povedlo se ho zohýbat. Celé se to skládá jen ze dvou prvků.

Snippet do _layout/

Obalující podmínka s page.path zajistí akorát to, aby se nevypisovaly příchozí odkazy na rozcestnících a hlavně homepage, kam vede odkaz skoro odevšad. Druhá část page.backlinks pojistí, že pokud stránka zpětné odkazy nemá, nevypíše se nic.

{%- unless page.path contains "index.md" or page.backlinks.size == 0 %}
<ul>
  {%- for backlink in page.backlinks %}
  <li><a href="{{ backlink.url }}">{{ backlink.title }}</a></li>
  {%- endfor %}
</ul>
{%- endunless %}

Plugin do _plugins/

Celý kód backlinks.rb pak vypadá takto:

class BackLinksGenerator < Jekyll::Generator
  def generate(site)
    all_posts = site.posts.docs
    all_pages = site.pages

    all_docs = all_posts + all_pages
    all_docs.delete_if{|doc| doc.path.include? 'index.md'}

    all_docs.each do |current_note|
      filename = current_note.path.gsub(/.*\/(.*)/, '\1')

      notes_linking_to_current_note = all_docs.filter do |e|
        e.content.include?(filename)
      end

      current_note.data['backlinks'] = notes_linking_to_current_note
    end
  end
end

Ve zkratce jsem oproti zdroji upravil dvě místa. delete_if{} z odkazů k vypsání odstraní ty přicházející z rozcestníků. Nemá smysl je ve zpětných odkazech mít, navíc cesta k nim vede z drobečkovky.

Proměnná filename nahrazuje původně použitou current_note.url. Potřebuji totiž v odkazech hledat přímo název .md souboru. Z cesty k souboru si tedy RegExem v gsub beru text za posledním lomítkem. Logičtější by bylo použít Jekyllu nativní page.name, ale to nefunguje pro příspěvky, kde se vrátí prázdné.