杰基尔 - 按日期分组

时间:2012-03-30 10:30:49

标签: ruby jekyll

我真的需要帮助Jekyll。 我正在试图生成帖子按日期分组的页面。

我想要的是拥有一个包含当月所有帖子的主页,然后可以浏览每个月。所以我必须生成一个索引页面并生成所有其他月度页面。

我是ruby和Jekyll的新手,所以我真的在探索。 我的主页正在使用一些丑陋的代码,但我的月度页面不起作用:帖子内容没有“编译”并出现在原始纺织品中。

我的生成器类看起来像这样:

class MonthlyGenerator < Generator
safe true

def group_by_month(posts)
  months = []
  posts_by_month = {}
  posts.reverse.each do |post|
    key = Time.utc(post.date.year, post.date.month)
    if posts_by_month.has_key?(key)
      posts_by_month[key] << post
    else
      posts_by_month[key] = [post]
      months << key
    end
  end
  return [months,posts_by_month]
end

def generate(site)
  data = group_by_month(site.posts)
  months = data[0]
  posts_by_month = data[1]
  months.each_with_index do |month, index|
    if index >= 0 && index < months.length
      nextMonth = months[index+1]
    else 
      nextMonth = false
    end
    if index > 0 && index <= months.length
      previousMonth = months[index-1]
    else 
      previousMonth = false
    end 
    posts = posts_by_month[month]

    dir = "/"+month.year.to_s+"-"+month.mon.to_s
    write_monthly_posts(site, dir, month, posts, nextMonth, previousMonth)
  end
end

def write_monthly_posts(site, dir, month, posts, nextMonth, previousMonth)
    monthlypage = MonthlyPage.new(site, dir, month, posts, nextMonth, previousMonth)
    monthlypage.render(site.layouts, site.site_payload)
    monthlypage.write(site.dest)
    site.pages << monthlypage
end
end

我的模板monthly.html:

<div class="span3">
  <h1>{{ page.month }}</h1>
</div>
<div class="span9">
  {% for post in page.posts %}
      <a href="{{ post.url }}">{{ post.title | truncate:65 }}</a>
      {{ post.content }}
  {% endfor %}
</div>

输出就是这个:

<div class="span3">
    <h1>Sat Nov 01 00:00:00 UTC 2008</h1>
</div>
<div class="span9">

      <a href="/cat1/2008/11/19/test2.html">Test2</a>
       h1. test 

p(meta). 1nounmjlkjlktest2

2008 is a leap year. That means that three hundred and sixty six days 


<iframe class="video" src="http://player.vimeo.com/video/?title=0&amp;byline=0&amp;portrait=0" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen>
</iframe>

</div>

内容仍在纺织品中。 任何的想法 ? 非常感谢 ! 亚历山大


更新:

解决方案:

{{ post.content | textilize }}

不起作用,因为它没有考虑我的post.textile文件中设置的值。


解决方案:

我发现了一些东西,如果我强制在循环中渲染一个帖子,它就可以完成这项任务:

def group_by_month(posts, site) 
    months = [] posts_by_month = {} 
    posts.reverse.each do |post| 
        post.render(site.layouts, site.site_payload) 
        key = Time.utc(post.date.year, post.date.month) 
        if posts_by_month.has_key?(key) 
            posts_by_month[key] << post 
        else 
            posts_by_month[key] = [post] 
            months << key 
        end 
    end 
    return [months,posts_by_month] 
end

2 个答案:

答案 0 :(得分:1)

找到解决方案:

我发现了一些东西,如果我强制在循环中渲染一个帖子,它就可以完成这项任务:

def group_by_month(posts, site) 
    months = [] posts_by_month = {} 
    posts.reverse.each do |post| 
        **post.render(site.layouts, site.site_payload)**
        key = Time.utc(post.date.year, post.date.month) 
        if posts_by_month.has_key?(key) 
            posts_by_month[key] << post 
        else 
            posts_by_month[key] = [post] 
            months << key 
        end 
    end 
    return [months,posts_by_month] 
end

答案 1 :(得分:0)

内容仍然在Textile中,因为monthly.html是一个HTML文件,并且jekyll不会在HTML文件上运行任何文本处理器(除了Liquid,它只替换{{1}中的文本},没有转换)。但是,jekyll有一些built-in Liquid filters来帮助解决这个问题,特别是page.content将Textile转换为HTML。你可以这样使用它:

textilize