如何在 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 中显示文件的修改日期?的主要内容,如果未能解决你的问题,请参考以下文章

Jekyll 日期格式如何工作?

如何在 Jekyll/Pygments 中突出显示 CSHTML

如何更改当前系统时间日期并插入到文本文档中

使用 Liquid 标记在 Jekyll 中获取今天的日期

如何在Jekyll代码中使用unicode突出显示?

在 Jekyll 中使用 Pygments 代码高亮显示文件名