我想以编程方式将单行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?
答案 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