2012-04-22 78 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:/”..这就是我的工作。