mirror of
https://github.com/ada-dmitry/ada-dmitry.github.io.git
synced 2026-09-24 01:10:35 +00:00
43 lines
1.4 KiB
Ruby
43 lines
1.4 KiB
Ruby
# _plugins/wikilinks.rb
|
|
# Автоконвертация [[wikilinks]] -> [label](url) по коллекции _notes (и др. коллекциям, если надо)
|
|
|
|
module Wikilinks
|
|
def self.build_index(site)
|
|
# Возьмём все документы из коллекции notes
|
|
notes = site.collections['notes']&.docs || []
|
|
index = {}
|
|
|
|
notes.each do |d|
|
|
# ключи для поиска: title и basename без расширения
|
|
title = (d.data['title'] || File.basename(d.basename, '.*')).to_s
|
|
slug = File.basename(d.basename, '.*').to_s
|
|
|
|
[title, slug].each do |k|
|
|
next if k.empty?
|
|
index[k.downcase] = d.url
|
|
end
|
|
end
|
|
|
|
index
|
|
end
|
|
|
|
def self.convert(content, site)
|
|
idx = build_index(site)
|
|
|
|
content.gsub(/\[\[([^\]|#]+)(?:\|([^\]]+))?\]\]/) do
|
|
key = Regexp.last_match(1).strip
|
|
label = (Regexp.last_match(2) || key).strip
|
|
url = idx[key.downcase]
|
|
|
|
# если нашли — заменяем, иначе оставляем как есть
|
|
url ? "[#{label}](#{site.baseurl}#{url})" : Regexp.last_match(0)
|
|
end
|
|
end
|
|
end
|
|
|
|
# Прогоним через фильтр все страницы/посты/доки до рендера
|
|
Jekyll::Hooks.register [:pages, :posts, :documents], :pre_render do |doc, payload|
|
|
site = payload['site']
|
|
doc.content = Wikilinks.convert(doc.content, site)
|
|
end
|