2013-02-20 11 views
23

Wiem, że mogę określić zmienną date w metodzie YAML pliku i uzyskać dostęp do jego wartości za pomocą {{ page.date }}. Jest to kłopotliwe, ponieważ łatwo zapomina się o zmianie daty aktualizacji pliku. Jak więc uzyskać dostęp do daty modyfikacji pliku?Jak wyświetlić datę modyfikacji pliku w Jekyll?

Odpowiedz

4

Nie sądzę, że można to zrobić bez użycia frontmater YAML. Należy jednak zauważyć, że podanie wartości date w przedniej macierzy powoduje przesłonięcie wartości date podanej w nazwie pliku wpisu.

Więc jeśli masz plik 2013-02-19-my-post.md, a w jego frontmatter masz date: 2013-02-20, frontmatter ma pierwszeństwo, a data wpisu to 2013-02-20.

Jeśli chcesz śledzić, kiedy post został zmodyfikowany, obawiam się, że nie ma możliwości zrobienia tego bez użycia niestandardowego pola w twojej frontmatter. Nazywają to modified-date lub coś podobnego. Tak, to trochę uciążliwe. Mam fragment kodu TextExpander, który automatycznie wyświetla aktualną datę/czas w odpowiednim formacie, co jest przydatne.

+0

Czy nie jest to możliwe w przypadku postów lub ogólnie? W przypadku postów nie widzę potrzeby uzyskania daty modyfikacji, ponieważ data zakodowana w nazwie pliku jest w porządku (rzadko zmieniam posty). Jednak dla wszystkich innych plików Markdown Jekyll przetwarza, nie mam tej daty i koduję ją w przedniej macierzy YAML. Ponieważ te pliki często się zmieniają, chciałbym automatycznie uzyskać ich datę modyfikacji. – Robert

+1

Opisywana funkcja nie jest wbudowana w Jekyll dla postów ani stron. Przypuszczam, że teoretycznie można napisać [wtyczkę Jekyll] (https://github.com/mojombo/jekyll/wiki/Plugins), która wykorzystuje 'File.mtime' Rubiego, ale wydaje się, że jest to więcej kłopotu niż jest warte. Ponadto mogą pojawić się niezamierzone konsekwencje. Co jeśli na przykład chcesz edytować frontmatter strony bez aktualizowania daty modyfikacji? Myślę, że zmienna niestandardowa to najlepsza metoda. –

14

Od Jekyll 1.x jest page.path, który podaje nazwę aktualnie przetwarzanego postu lub strony. Dodaj następujący filtr (miejsce na przykład w _plugins/myfilters.rb), aby uzyskać czas modyfikacji danego pliku:

module Jekyll 
    module MyFilters 
    def file_date(input) 
     File.mtime(input) 
    end 
    end 
end 

Liquid::Template.register_filter(Jekyll::MyFilters) 

Więc teraz można renderować datę w swoich postach i stron, na przykład, jak

{{ page.path | file_date | date_to_string }} 
+0

Niestety, to nie działa, ponieważ 'page.path' jest pusty. Znalazłem [post] (http://stackoverflow.com/questions/13243469/how-can-a-jekyll-page-access-its-filename), które pokazuje, jak uzyskać do niego dostęp, ale to wydaje się działać tylko dla postów i nie dla innych stron. – Robert

+0

Hmm .. to dziwne, używam tego dokładnie na stronach i wygląda na to, że działa dobrze. Jeśli to ma znaczenie, używam jekyll (1.1.2) i ruby ​​(2.0.0p247). –

+0

Bez skryptu, który ustawia 'page.path', otrzymuję komunikat' Liquid error: can not convert nil into String'. Używając go uzyskujemy ''generate': undefined method 'name''. Używam ruby ​​1.9.3 i Jekylla 0.11.2 i aktualizacja nie jest łatwa ... – Robert

22

jest to stosunkowo nowy plugin, który robi to, czego szukasz:

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

(znaleziono go podczas wyszukiwania w Google Alternatywa ives do innych odpowiedzi w tym wątku)

+6

Przeanalizujmy tę odpowiedź i oznaczajmy ten projekt, dopóki GitHub nie doda tej wtyczki do białej listy. –

+1

Miałem problemy z instalacją najnowszej wersji jekyll. Próbowałem aktualizacji gem, instalacji gem, pakietu exec, instalacji pakietu i próbowałem dołączyć klej w moim config.yml, ale nie mogłem rozwiązać tego problemu "Błąd zależności: Yikes! Wygląda na to, że nie masz ostatniej modyfikacji jekyll -at .... "Korzystam z Githuba, więc jeśli to nie jest na białej liście, to i tak nie jest to dobre ;-) – Athanassios

4

Jeśli używasz Git, możesz zainstalować hook przed zatwierdzeniem, który automatycznie aktualizuje pole daty w głównej sprawie zmodyfikowanych plików. Byłem bardzo zaskoczony, gdy dowiedziałem się, że hak przed zatwierdzeniem może rzeczywiście zmienić zawartość commit! Trzeba tylko ręcznie zainstalować pre-commit do każdego klonu repozytorium - dodaje brulion działa na mnie za aktualizowanie całkowity czas modyfikacji całej strony:

#!/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 powinien mieć pole "data", jego zawartość zostanie zastąpiona przez każde zatwierdzenie. Następnie można uzyskać do niego dostęp za pośrednictwem {{ site.date }}. Przykład:

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

Skrypt można uogólnić do aktualizacji tylko tych stron lub wiadomości, które zostały zmienione (zapytanie poprzez git diff-index --cached) - Nie mam czasu, aby realizować to, ale byłbym zainteresowany, aby dowiedzieć się, czy w końcu wyskakuje schludniejsze rozwiązanie.

6

Na podstawie postu krlmlr napisałem skrypt przed zatwierdzeniem, aby zaktualizować czas modyfikacji pola date: w materiale YAML zmodyfikowanych plików.

#!/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 

To działa dobrze dla mnie. W rzeczywistości używam pola update:, aby wskazać zmodyfikowany czas, oraz pola date:, aby wskazać czas utworzenia.

+0

wfm używając stron gh! Musiał dodać {% chyba, że ​​page.nodate%} {{page.date | date: "% b% -d,% Y"}} {% endunless%} do mojego docpage.html w _layouts i dodaj datę: do pierwszej sprawy każdego pliku. Co za miły prezent świąteczny to znaleźć. – catpaws

+1

Działa jak urok! Zmieniłem tylko format daty. Używam "date" +% Y-% m-% d% T% z "', który pasuje do (aktualnego) domyślnego formatu daty Jekyll. –

Powiązane problemy