如何在 Jekyll 中显示文件的修改日期?
Posted
技术标签:
【中文标题】如何在 Jekyll 中显示文件的修改日期?【英文标题】:How to show the modification date of a file in Jekyll? 【发布时间】:2013-02-05 08:57:05 【问题描述】:我知道我可以在文件的 YAML frontmatter 中指定变量 date
并使用 page.date
访问它的值。这很麻烦,因为人们很容易忘记更改文件更新的日期。那么如何获取文件的修改日期呢?
【问题讨论】:
【参考方案1】:根据 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:
字段表示创建时间。
【讨论】:
wfm 使用 gh-pages!必须添加 % unless page.nodate % page.date | date: "%b %-d, %Y" % endunless % 到我的 _layouts 中的 docpage.html 并将 date: 添加到每个文件的开头。找到这个是多么好的圣诞礼物啊。 像魅力一样工作!我唯一改变的是日期格式。我正在使用与(当前)默认 Jekyll 日期格式匹配的date "+%Y-%m-%d %T %z"
。【参考方案2】:
如果您使用的是 Git,您可以安装一个预提交挂钩,该挂钩会自动更新已修改文件前面的日期字段。得知预提交挂钩确实可以更改提交的内容,我感到非常惊讶!您只需要手动将预提交挂钩安装到存储库的每个克隆中——以下粗略的草稿适用于我更新整个网站的整体修改时间:
#!/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
应该有一个“日期”字段,其内容将被每次提交替换。然后可以通过 site.date
访问它。示例:
date: 2015-04-10 10:51:37 UTC
该脚本可以概括为仅更新那些已更改的页面或帖子(通过 git diff-index --cached
查询)——我没有时间实现这一点,但我有兴趣了解是否会出现更简洁的解决方案终于出来了。
【讨论】:
【参考方案3】:这是一个相对较新的插件,可以满足您的需求:
https://github.com/gjtorikian/jekyll-last-modified-at
(在谷歌搜索此线程中其他答案的替代方案时找到它)
【讨论】:
让我们为这个答案投票并为该项目加注星标,直到 GitHub 将该插件添加到白名单中。 我在安装 jekyll-last-modified-at 时遇到问题。我尝试了 gem update、gem install、bundle exec、bundle install 并尝试在我的 config.yml 中包含 gem,但我无法解决这个“依赖错误:哎呀!看起来你没有 jekyll-last-modified -at...." 我使用 Github,所以如果这没有列入白名单,那么它对我来说无论如何都不好;-)【参考方案4】:从 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
是空的。我发现a post 显示了如何访问它,但这似乎仅适用于帖子,不适用于其他页面。
嗯..这很奇怪,我在页面上使用它,它似乎工作正常。万一这很重要,我正在使用 jekyll (1.1.2) 和 ruby (2.0.0p247)。
没有设置page.path
的脚本我得到Liquid error: can't convert nil into String
。使用它我得到'generate': undefined method 'name'
。我正在使用 ruby 1.9.3 和 Jekyll 0.11.2,而且更新起来并不容易......
嗯,是的,除非你升级到一些 Jekyll 1.x,否则这会很困难。对不起。
只是补充一点:如果像我一样,您将网站的源代码移动到子目录中,您需要将该目录添加到来自 page.path
的路径之前(它只是源相对路径),例如所以: page.path | prepend: "/" | prepend: site.source | file_date | date_to_string
【参考方案5】:
我认为不使用 YAML frontmatter 是不可能做到这一点的。但是请注意,在 frontmatter 中指定 date
实际上会覆盖帖子文件名中给出的 date
。
因此,如果您有一个文件 2013-02-19-my-post.md
并且在它的frontmatter 中有date: 2013-02-20
,那么frontmatter 优先,并且帖子的日期是2013-02-20
。
如果您想跟踪帖子何时被修改,恐怕没有在您的frontmatter 中使用自定义字段的情况下无法做到这一点。称它为modified-date
或其他名称。是的,这有点乏味。我有一个 TextExpander sn-p 可以自动以正确的格式输出当前日期/时间,这很方便。
【讨论】:
不能发帖还是一般情况下?对于帖子,我认为不需要获取其修改日期,因为文件名中编码的日期很好(我很少更改帖子)。但是,对于 Jekyll 正在处理的所有其他 Markdown 文件,我没有该日期并将其编码到 YAML 前端。由于这些文件经常更改,我想自动获取它们的修改日期。 您描述的功能没有内置在 Jekyll 中,无论是帖子还是页面。我想理论上你可以写一个Jekyll plugin 来利用Ruby 的File.mtime
,但这似乎比它的价值更麻烦。另外,可能会有一些意想不到的后果。例如,如果您想在不更新其修改日期的情况下编辑页面的前端内容怎么办?我认为自定义变量是最好的方法。以上是关于如何在 Jekyll 中显示文件的修改日期?的主要内容,如果未能解决你的问题,请参考以下文章