Как определить текущую страницу в плагине тега Jekyll? - PullRequest
6 голосов
/ 20 сентября 2011

У меня есть плагин Jekyll (Liquid), и я хотел бы определить текущую страницу. Я вижу, что контекст передается в рендер, и что я могу получить текущий объект сайта как context.registers [: site]. Однако попытки получить текущую страницу как context.registers [: page] не удаются.

Проблема, которую я пытаюсь решить, - создать простой блочный плагин, чтобы определить, является ли текущая страница страницей, упомянутой в теге, и выделить ее.

Любые советы будут с благодарностью.

Спасибо!

Ответы [ 3 ]

16 голосов
/ 05 октября 2011

Оказывается, мы можем сделать это так:

  def render(context)
    page_url = context.environments.first["page"]["url"]

Что не очевидно, но не требует исправления кода.

2 голосов
/ 24 декабря 2014

context['page'], похоже, возвращает хеш с большинством свойств текущей страницы, включая url и path

, поэтому объект страницы фактический можно получить с помощью

context.registers[:site].pages.detect { |p| p.path==context['page']['path'] }
1 голос
/ 20 сентября 2011

Я не думаю, что есть хороший способ сделать это с Джекилом как есть. convertible.rb только передает объект site в Liquid, который не содержит специфических для страницы данных.

Я бы предложил просто отредактировать convertible.rb, чтобы передать необходимые данные, отправить запрос на извлечение в основной проект для внесения ваших изменений и использовать ваш форк локально для создания вашего сайта. Ура для открытого кода!

Следующий тривиальный патч работает для меня локально против Jekyll 0.11.0, делая хэш страницы доступным в Liquid как context.registers[:page] (примечание: на данный момент это предварительно преобразованный хеш, поэтому вы получите доступ к context.registers[:page]['url'], не context.registers[:page].url):

diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb
index d33abc5..a674ef5 100644
--- a/lib/jekyll/convertible.rb
+++ b/lib/jekyll/convertible.rb
@@ -69,7 +69,7 @@ module Jekyll
     #
     # Returns nothing.
     def do_layout(payload, layouts)
-      info = { :filters => [Jekyll::Filters], :registers => { :site => self.site } }
+      info = { :filters => [Jekyll::Filters], :registers => { :site => self.site, :page => payload['page'] } }

       # render and transform content (this becomes the final content of the object)
       payload["pygments_prefix"] = converter.pygments_prefix

Надеюсь, это поможет!

...