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é.