将URL字段添加到Jekyll post yaml数据

时间:2014-08-16 12:35:34

标签: ruby jekyll github-pages

我想以编程方式将单行YAML前端数据附加到所有 _posts文件。

背景:我目前有一个基于Jekyll的网站,使用以下插件生成其网址:

require "Date"

module Jekyll
  class PermalinkRewriter < Generator
    safe true
    priority :low

    def generate(site)
      # Until Jekyll allows me to use :slug, I have to resort to this
      site.posts.each do |item|
        day_of_year = item.date.yday.to_s
        if item.date.yday < 10
          day_of_year = '00'+item.date.yday.to_s
        elsif item.date.yday < 100
          day_of_year = '0'+item.date.yday.to_s
        end

        item.data['permalink'] = '/archives/' + item.date.strftime('%g') + day_of_year + '-' + item.slug + '.html'
        end
      end
    end
  end
end

所有这一切都会生成一个类似/archives/12001-post-title.html的网址,这是两位数的年份(2012年),然后是 这一天写入帖子的年份(在这种情况,1月1日)。

(旁白:我喜欢这个,因为它实际上为每个Jekyll帖子创建了一个UID,然后可以按生成的_site文件夹中的名称对其进行排序,最后按时间顺序排列。)

但是,现在我想更改我编写的新帖子的URL方案,但我不希望这会在生成站点时中断所有现有的URL。所以,我需要一种方法来遍历我的源_posts文件夹,并将插件生成的ULR附加到每个帖子的YAML数据,the URL: front matter

我不知道该怎么做。我知道如何使用Ruby将行附加到文本文件,但是如何为所有_posts文件执行此操作并且该行包含将由插件生成的URL?

1 个答案:

答案 0 :(得分:2)

Etvoilà!在Jekyll 2.2.0上测试

module Jekyll
  class PermalinkRewriter < Generator
    safe true
    priority :low

    def generate(site)

      @site = site
      site.posts.each do |item|
        if not item.data['permalink']

          # complete string from 1 to 999 with leading zeros (0)
          # 1 -> 001 - 20 -> 020
          day_of_year  = item.date.yday.to_s.rjust(3, '0')
          file_name    = item.date.strftime('%g') + day_of_year + '-' + item.slug + '.html'
          permalink    = '/archives/' + file_name

          item.data['permalink'] = permalink

          # get post's datas
          post_path    = item.containing_dir(@site.source, "")
          full_path    = File.join(post_path, item.name)
          file_yaml    = item.data.to_yaml
          file_content = item.content

          # rewrites the original post with the new Yaml Front Matter and content
          # writes 'in stone !'
          File.open(full_path, 'w') do |f|
            f.puts file_yaml
            f.puts '---'
            f.puts "\n\n"
            f.puts file_content
          end

          Jekyll.logger.info "Added permalink " + permalink + " to post " + item.name
        end
      end
    end
  end
end