从 Jekyll 插件向页面添加属性

IQA*_*eas 5 ruby liquid jekyll octopress

假设我想要一个包含如下内容的页面:

<h1>{{page.comment_count}} Comment(s)</h1>
{% for c in page.comment_list %}
<div>
    <strong>{{c.title}}</strong><br/>
    {{c.content}}
</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

页面上没有命名comment_countcomment_list默认的变量;相反,我希望将这些变量从 Jekyll 插件添加到页面。哪里是一个安全的地方,我可以在不干扰 Jekyll 现有代码的情况下填充这些字段?

或者有没有更好的方法来实现这样的评论列表?

小智 3

不幸的是,目前无法在不与 Jekyll 内部内容发生混乱的情况下添加这些属性。我们正在为 等添加挂钩#after_initialize,但目前还没有。

我最好的建议是添加这些属性,就像我在博客上使用Octopress Date 插件所做的那样。它使用 Jekyll v1.2.0 的Jekyll::Post#to_liquid方法添加这些属性,这些属性是通过send(attr)以下方式收集的Post

class Jekyll::Post

  def comment_count
    comment_list.size
  end

  def comment_list
    YAML.safe_load_file("_comments/#{self.id}.yml")
  end

  # Convert this post into a Hash for use in Liquid templates.
  #
  # Returns <Hash>
  def to_liquid(attrs = ATTRIBUTES_FOR_LIQUID)
    super(attrs + %w[
      comment_count
      comment_list
    ])
  end
end
Run Code Online (Sandbox Code Playgroud)

super(attrs + %w[ ... ])将确保仍然包含所有旧属性,然后收集与数组中的条目对应的方法的返回值String

这是迄今为止扩展帖子和页面的最佳方法。