Я знаю, что могу указать переменную date
в передней части файла YAML и получить доступ к ее значению с помощью {{ page.date }}
. Это обременительно, поскольку при обновлении файла легко забыть изменить дату. Итак, как я могу получить доступ к дате изменения файла?
Как показать дату модификации файла в Jekyll?
Ответы (5)
Это относительно новый плагин, который делает то, что вы ищете:
https://github.com/gjtorikian/jekyll-last-modified-at
(нашел его при поиске в Google альтернатив другим ответам в этой теме)
В 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
пуст. Я нашел сообщение, в котором показано, как получить к нему доступ, но это похоже, работает только для сообщений, а не для других страниц.
- person Robert; 19.08.2013
page.path
, я получаю Liquid error: can't convert nil into String
. Используя это, я получаю 'generate': undefined method 'name'
. Я использую Ruby 1.9.3 и Jekyll 0.11.2 и обновить его не так-то просто ...
- person Robert; 21.08.2013
page.path
(он только относительно источника), например: {{ page.path | prepend: "/" | prepend: site.source | file_date | date_to_string }}
- person tamouse; 14.02.2015
<lastmod>{{ page.path | file_date | date_to_xmlschema }}</lastmod>
- person knee-cola; 24.07.2018
Основываясь на сообщении krlmlr, я написал сценарий предварительной фиксации для обновления времени модификации поля date:
в YAML перед измененными файлами.
#!/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 по умолчанию.
- person Sebastián Barschkis; 22.04.2016
Я не думаю, что это возможно сделать без использования фронтматера YAML. Обратите внимание, однако, что указание date
в заголовке фактически переопределяет date
, указанное в имени файла сообщения.
Итак, если у вас есть файл 2013-02-19-my-post.md
, а в его передней части у вас есть date: 2013-02-20
, она имеет приоритет, а дата публикации - 2013-02-20
.
Если вы хотите отслеживать, когда сообщение было изменено, я боюсь, что нет способа сделать это, не используя настраиваемое поле в вашем фронт-матере. Назовите это modified-date
или как-нибудь. Да, это немного утомительно. У меня есть фрагмент TextExpander, который автоматически выводит текущую дату / время в правильном формате, что удобно.
File.mtime
Руби, но это кажется вроде больше хлопот, чем оно того стоит. К тому же могут быть непредвиденные последствия. Что, если, например, вы хотите отредактировать внешний вид страницы, не обновляя дату ее изменения? Я думаю, что настраиваемая переменная - лучший способ.
- person Andrew Clark; 22.02.2013
Если вы используете 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
) - у меня нет времени реализовать это, но мне было бы интересно узнать, появится ли в конечном итоге более аккуратное решение.