2011-09-20 73 views
6

我有一个Jekyll(液体)块插件,我想检测当前页面是什么。我看到一个上下文被传递给render,并且我可以检索当前网站对象为context.registers [:site]。但是,试图将当前页面作为context.registers [:page]失败。如何检测Jekyll标签插件中的当前页面?

我试图解决的问题是创建一个简单的块插件来检测当前页面是否是标签中提到的页面,并突出显示它。

任何提示将不胜感激。

谢谢!

回答

15

原来我们也可以做到这一点,如:

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

这不是很明显,但它不需要打补丁的代码。

+0

这是辉煌的被检索的返回的哈希值。并且完全不直观。谢谢你解决这个问题。 – cboettig

+2

但是如果你需要在'initialize'处获取'context'对象呢? – jackyalcine

1

我不认为用Jekyll按原样做这件事很好。 convertible.rb仅将site对象传递给Liquid,该对象不包含任何页面特定的数据。

我建议只编辑convertible.rb来传递你需要的数据,向主项目提交一个pull请求来引入你的修改,然后用你的fork在本地生成你的站点。 Hooray开源!

以下琐碎的补丁对我的作品在当地对杰基尔0.11.0,使得液体提供一个页面显示乱码的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 

希望有所帮助!

2

context['page']似乎与大多数当前页面的属性,包括urlpath

所以实际页面对象可以用

context.registers[:site].pages.detect { |p| p.path==context['page']['path'] }