2013-02-20 18 views
23

私は、ファイルのYAMLフロントマターで変数dateを指定し、その値に{{ page.date }}でアクセスできることを知っています。これは、ファイルが更新されたときに日付を変更することを忘れてしまうので、面倒です。どうすればファイルの変更日にアクセスできますか?Jekyllのファイルの変更日を表示する方法は?

答えて

4

YAMLのフロントマターを使用しないとこれを行うことはできません。ただし、フロントマターでdateを指定すると、実際には投稿のファイル名に指定されているdateが上書きされます。

ファイルが2013-02-19-my-post.mdで、フロントマターにdate: 2013-02-20があり、フロントマターが優先され、投稿の日付は2013-02-20です。

投稿が変更された時期を把握したい場合は、フロントマットでカスタムフィールドを使用せずにこれを行う方法はありません。それをmodified-dateなどと呼んでください。はい、ちょっと退屈です。 TextExpanderスニペットを使って現在の日付/時刻を適切な形式で自動的に出力します。これは便利です。

+0

投稿や一般的なことはできませんか?投稿の場合は、ファイル名にエンコードされた日付が綺麗であるため、変更日を取得する必要はありません(投稿はほとんど変更されません)。しかし、Jekyllが処理している他のすべてのMarkdownファイルについて、私はその日付を持っておらず、YAMLのフロントマーカでそれをエンコードしています。これらのファイルは頻繁に変更されるため、自動的に修正日を取得したいと考えています。 – Robert

+1

あなたが描いている機能は、投稿やページのどちらでもJekyllに組み込まれていません。私は理論的にはRubyの 'File.mtime'を利用する[Jekyll plugin](https://github.com/mojombo/jekyll/wiki/Plugins)を書くことができると思うが、それは価値があるよりも面倒なようだ。さらに、意図しない結果が生じる可能性があります。たとえば、修正日を更新せずにページのフロントマットを編集したい場合はどうなりますか?カスタム変数は最善の方法だと思います。 –

14

ジキル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 }} 
+0

残念ながら、 'page.path'が空であるため、これは私にとってはうまくいきません。私はどのようにそれにアクセスするのかを示す[投稿](http://stackoverflow.com/questions/13243469/how-can-a-jekyll-page-access-its-filename)を見つけましたが、これは投稿のみのために働くようです他のページではありません。 – Robert

+0

Hmm ..それは奇妙なことですが、私はこれをページに正確に使用していますが、うまく動作しているようです。重要な場合は、jekyll(1.1.2)とruby(2.0.0p247)を使用しています。 –

+0

'page.path'を設定するスクリプトがなければ' Liquid error:nilをStringに変換できません。 'それを使うと ''生成する ':未定義のメソッド' name''が得られます。私はRuby 1.9.3とJekyll 0.11.2を使用していますので、更新するのは簡単ではありません... – Robert

22

として、例えば、あなたの投稿やページに日付をレンダリングすることができますこれは、あなたが探しているものを行い、比較的新しいプラグインです:

alternatをGoogleの検索中にそれを見つけた

https://github.com/gjtorikian/jekyll-last-modified-at

+6

GitHubがプラグインをホワイトリストに追加するまで、この回答とスタンドをupvoteしましょう。 –

+1

jekyll-last-modified-atのインストールに問題がありました。私はgem update、gem install、bundle execを試してバンドルをインストールし、config.ymlに宝石を入れようとしましたが、この "Dependency Error:Yikes!"は解決できませんでした。あなたはjekyll-last-modified --at .... "私はGithubを使用しているので、これがホワイトリストに登録されていなければ、とにかく私にとっては良いことではありません;-) – Athanassios

4

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: - あなたは手動でのみリポジトリの各クローンにpre-commitフックをインストールする必要があり、次の草稿は、Webサイト全体の全体的な修正時刻を更新するための私の作品フィールド "date"は、その内容は各コミットに置き換えられます。その後、{{ site.date }}でアクセスできます。例:(git diff-index --cached経由クエリ)

date: 2015-04-10 10:51:37 UTC 

スクリプトが変更されたページだけか、記事を更新するように一般化することができる - 私はこれを実装するための時間を持っていないが、私はかどうかを学習に興味があると思い最終的なソリューションが最終的に飛び出す。

6

krlmlrの投稿に基づいて、YAMLの修正されたファイルの先頭の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:フィールドを使用します。

+0

wfm using gh-pages! {%page.nodate%}を追加しなければならなかった{{page.date |日付: "%b%-d、%Y"}} {%endunless%}を_layouts内の私のdocpage.htmlに追加し、日付を各ファイルの先頭に追加します。これは素晴らしいクリスマスプレゼントでした。 – catpaws

+1

魅力的な作品です!私が変更したのは日付形式だけでした。私は(現在の)デフォルトのJekyll日付形式に一致する 'date" +%Y-%m-%d%T%z "'を使用しています。 –

関連する問題