2012-04-22 33 views
6

我正在嘗試爲Jekyll編寫一個自定義標籤插件,它將輸出網站上所有頁面(不是帖子)的分層導航樹。我基本上想要嵌套<ul>的鏈接(將頁面標題作爲鏈接文本)添加到具有由某個CSS類標記的當前頁面的頁面。無法從Jekyll插件獲取頁面數據

我對ruby沒有經驗。我是一個PHP的傢伙。

我想我只是試圖迭代所有頁面並輸出一維列表來確保我至少可以做到這一點。這是我到目前爲止:

module Jekyll 

    class NavTree < Liquid::Tag 
    def initialize(tag_name, text, tokens) 
     super 
    end 

    def render(context) 
     site = context.registers[:site] 
     output = '<ul>' 
     site.pages.each do |page| 
     output += '<li><a href="'+page.url+'">'+page.title+'</a></li>' 
     end 
     output += '<ul>' 

     output 
    end 
    end 

end 

Liquid::Template.register_tag('nav_tree', Jekyll::NavTree) 

而我通過{% nav_tree %}插入到我的液體模板中。

問題是上述代碼中的page變量沒有您期望的所有數據。 page.title未定義,page.url只是前面帶斜槓的基名(例如/a/b/c.html,它只是給我/c.html)。

我在做什麼錯?

附註:我已經試過用純液體標記做這個,最後我放棄了。我可以輕鬆地通過site.pages迭代Liquid,但我無法找到適當嵌套列表的方法。

+0

我創建了[GitHub上的一個問題](https://github.com/mojombo/jekyll/issues/548),看看有沒有人知道答案。 – jnrbsn 2012-04-30 16:21:35

+0

你有沒有設法讓嵌套工作?我很想看到最終的代碼,如果是這樣的話 – bwest 2012-08-21 19:35:57

+0

@Brand不幸的是,我從來沒有完成它。 – jnrbsn 2012-08-23 23:19:43

回答

4

嘗試:

module Jekyll 

    # Add accessor for directory 
    class Page 
      attr_reader :dir 
    end 


    class NavTree < Liquid::Tag 
    def initialize(tag_name, text, tokens) 
     super 
    end 

    def render(context) 
     site = context.registers[:site] 
     output = '<ul>' 
     site.pages.each do |page| 
     output += '<li><a href="'+page.dir+page.url+'">'+(page.data['title'] || page.url) +'</a></li>' 
     end 
     output += '<ul>' 

     output 
    end 
    end 

end 

Liquid::Template.register_tag('nav_tree', Jekyll::NavTree) 
+0

有了這段代碼,我得到'液體錯誤:不能將nil轉換爲字符串'。 – jnrbsn 2012-05-30 18:11:08

+1

您可能有一個沒有標題的頁面,因此page.data ['title']爲零。替換w /例如(page.data ['title'] || page.url)。 – 2012-06-04 09:37:57

+2

抱歉,延遲響應。你是對的。我有一個沒有標題的頁面。你的解決方案有效 – jnrbsn 2012-06-15 04:32:19

4

page.title並不總是被定義(例如:atom.xml)。你必須檢查它是否被定義。然後,你可以採取page.name或不處理項...

def render(context) 
    site = context.registers[:site] 
    output = '<ul>' 
    site.pages.each do |page| 
    unless page.data['title'].nil? 
     t = page.data['title'] 
    else 
     t = page.name 
    end 
    output += "<li><a href="'+page.dir+page.url+'">'+t+'</a></li>" 
    end 
    output += '<ul>' 
    output 
end 
+0

縮短除非..end有點:'t = page.data ['title'] || page.name' – tamouse 2013-10-15 15:34:36

0

最近,我遇到了類似的問題,其中的錯誤「不能轉換成nill字符串」只是吹我的頭。我的config.yml文件包含這樣的一行:「baseurl:/ paradocs/jekyll/out/」現在這就是我的本地服務器,我需要使這個beseurl爲空,錯誤開始出現在構建時間,所以最後我必須製作「baseurl:/」..這就是我的工作。