我知道可以在文件的YAML Front Matter中指定一个变量date
,并使用{{ page.date }}
访问其值。但这样很麻烦,因为当文件更新时,很容易忘记更改日期。那么如何访问文件的修改日期?
从Jekyll 1.x开始,有一个page.path
,它可以给您当前正在处理的文章或页面的文件名。添加以下过滤器(例如放置在_plugins/myfilters.rb
中)以获取给定文件名的修改时间:
module Jekyll
module MyFilters
def file_date(input)
File.mtime(input)
end
end
end
Liquid::Template.register_filter(Jekyll::MyFilters)
现在您可以在帖子和页面上呈现日期,例如:{{ page.path | file_date | date_to_string }}
page.path
的脚本,我会得到Liquid error: can't convert nil into String
。使用它,我会得到'generate': undefined method 'name'
。我正在使用ruby 1.9.3和Jekyll 0.11.2,更新起来并不容易... - Robertpage.path
的路径前加上该目录(它只与源相关),示例如下:{{ page.path | prepend: "/" | prepend: site.source | file_date | date_to_string }}
- tamouse根据krlmlr的帖子,我编写了一个pre-commit脚本,用于更新修改文件的YAML front matter中date:
字段的修改时间。
#!/bin/sh
# Contents of .git/hooks/pre-commit
git diff --cached --name-status | grep "^M" | while read a b; do
cat $b | sed "/---.*/,/---.*/s/^date:.*$/date: $(date -u "+%Y-%m-%d %T %Z")/" > tmp
mv tmp $b
git add $b
done
对我来说它运行得很好。我实际上使用update:
字段来表示修改时间,date:
字段来表示创建时间。
date "+%Y-%m-%d %T %z"
,它与(当前)默认的Jekyll日期格式相匹配。 - Sebastián Barschkis如果你使用Git,你可以安装一个pre-commit hook来自动更新修改文件的front matter中的日期字段。我很惊讶地发现,pre-commit hook确实可以改变提交的内容!你只需要在每个克隆的仓库中手动安装pre-commit hook--以下草稿对于我来说用来更新整个网站的总体修改时间:
#!/bin/sh
# Contents of .git/hooks/pre-commit
set -e
set -x
sed -i "s/^date:.*$/date: $(TZ=UTC date "+%Y-%m-%d %H:%M:%S %Z")/" _config.yml
git add _config.yml
_config.yml
文件中应包含一个名为“date”的字段,其内容将被每个提交替换。然后可以通过{{site.date}}
访问它。例如:date: 2015-04-10 10:51:37 UTC
git diff-index --cached
)-我没有时间实现这一点,但如果最终出现更好的解决方案,我会有兴趣了解。File.mtime
,但这似乎比它值得的麻烦多了。此外,可能会产生一些意想不到的后果。例如,如果您想编辑页面的frontmatter而不更新其修改日期怎么办?我认为自定义变量是最好的选择。 - Andrew Clark