2011-09-20 75 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'] }