【问题标题】:Can't get page data from Jekyll plugin无法从 Jekyll 插件获取页面数据
【发布时间】:2012-05-03 02:27:58
【问题描述】:

我正在尝试为 Jekyll 编写一个自定义标签插件,它将输出站点上所有页面(不是帖子)的分层导航树。我基本上想要一堆嵌套的<ul>,带有链接(以页面标题作为链接文本)到当前页面由某个 CSS 类记录的页面。

我对红宝石非常缺乏经验。我是 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)。

我做错了什么?

旁注:我已经尝试过使用纯 Liquid 标记来执行此操作,但最终我放弃了。我可以使用 Liquid 轻松地遍历 site.pages,但我无法找到适当嵌套列表的方法。

【问题讨论】:

  • 我创建了an issue on GitHub 看看是否有人知道答案。
  • 你有没有设法让嵌套工作?如果是这样,我很乐意看到最终代码
  • @Brand 不幸的是,我一直没有时间完成它。
  • 我设法一起破解了分层页面树。它不漂亮,但我已将其发布在这里:gist.github.com/3536551 以防其他人偶然发现这个问题

标签: ruby jekyll liquid


【解决方案1】:

试试:

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)

【讨论】:

  • 有了这段代码,我得到了Liquid error: can't convert nil into String
  • 您可能有一个没有标题的页面,因此 page.data['title'] 为 nil。替换 w/ 例如(page.data['title'] || page.url) .
  • 抱歉延迟回复。你是对的。我有一个没有标题的页面。您的解决方案有效。
【解决方案2】:

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

【讨论】:

  • 将其缩短,除非..结束一点到:t = page.data['title'] || page.name
【解决方案3】:

最近我遇到了一个类似的问题,错误“无法将 nill 转换为字符串”让我大吃一惊。我的 config.yml 文件包含类似这样的行“ baseurl: /paradocs/jekyll/out/ ” 现在这是我本地的服务器我需要将该 beseurl 设为空并且错误开始出现在构建时间,所以最后我必须制作“ baseurl: / ” .. 这就是我的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 2011-09-11
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多