Как показать дату модификации файла в Jekyll?

Я знаю, что могу указать переменную date в передней части файла YAML и получить доступ к ее значению с помощью {{ page.date }}. Это обременительно, поскольку при обновлении файла легко забыть изменить дату. Итак, как я могу получить доступ к дате изменения файла?


person Robert    schedule 20.02.2013    source источник


Ответы (5)


Это относительно новый плагин, который делает то, что вы ищете:

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

(нашел его при поиске в Google альтернатив другим ответам в этой теме)

person Case    schedule 15.01.2014
comment
Давайте проголосуем за этот ответ и отметим этот проект, пока GitHub не добавит этот плагин в белый список. - person Ciro Santilli 新疆再教育营六四事件ۍ 26.11.2014
comment
У меня возникли проблемы с установкой jekyll-last-modified-at. Я попробовал обновить гем, установить гем, выполнить пакет, установить пакет и попытался включить гем в свой config.yml, но не смог решить эту ошибку зависимости: Ура! Похоже, у вас нет jekyll-last-modified-at .... Я использую Github, поэтому, если он не включен в белый список, мне это все равно не подходит ;-) - person Athanassios; 30.07.2016

В 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 }}
person Juan A. Navarro    schedule 14.08.2013
comment
К сожалению, у меня это не работает, потому что page.path пуст. Я нашел сообщение, в котором показано, как получить к нему доступ, но это похоже, работает только для сообщений, а не для других страниц. - person Robert; 19.08.2013
comment
Хм .. странно, я именно на страницах использую, и вроде нормально работает. Если это важно, я использую jekyll (1.1.2) и ruby ​​(2.0.0p247). - person Juan A. Navarro; 19.08.2013
comment
Без скрипта, который устанавливает 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
comment
Ну да, это будет сложно, если вы не обновитесь до Jekyll 1.x. Извините. - person Juan A. Navarro; 22.08.2013
comment
Просто чтобы добавить: если вы, как и я, переместите исходный код своего сайта в подкаталог, вам нужно добавить этот каталог к ​​пути, который идет от page.path (он только относительно источника), например: {{ page.path | prepend: "/" | prepend: site.source | file_date | date_to_string }} - person tamouse; 14.02.2015
comment
У меня возникли проблемы с установкой jekyll-last-modified-at. Я попробовал обновить гем, установить гем, выполнить пакет, установить пакет и попытался включить гем в свой config.yml, но не смог решить эту ошибку зависимости: Ура! Похоже, у вас нет jekyll-last-modified-at .... Добавить фильтр было намного проще, и он отлично работает, спасибо, Хуан - person Athanassios; 30.07.2016
comment
Не будет работать на страницах GitHub, потому что они отключают настраиваемые плагины по соображениям безопасности. - person SeanFromIT; 08.07.2018
comment
Спасибо за этот плагин! Я использую его в карте сайта как <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: для указания времени создания.

person seki    schedule 15.11.2015
comment
wfm с использованием gh-страниц! Пришлось добавить {%, если page.nodate%} {{page.date | date:% b% -d,% Y}} {% endunless%} в мой docpage.html в _layouts и добавить дату: в начало каждого файла. Какой хороший рождественский подарок было найти это. - person catpaws; 25.12.2015
comment
Работает как шарм! Единственное, что я изменил, - это формат даты. Я использую 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, который автоматически выводит текущую дату / время в правильном формате, что удобно.

person Andrew Clark    schedule 20.02.2013
comment
Разве это невозможно для постов или вообще? Для сообщений я не вижу необходимости получать дату их изменения, поскольку дата, указанная в имени файла, подходит (я редко меняю сообщения). Однако для всех других файлов Markdown, которые обрабатывает Jekyll, у меня нет этой даты, и я кодирую ее во фронтматоре YAML. Поскольку эти файлы часто меняются, я хотел бы получать дату их изменения автоматически. - person Robert; 21.02.2013
comment
Описываемая вами функция не встроена в Jekyll ни для сообщений, ни для страниц. Я полагаю, что теоретически вы могли бы написать плагин Jekyll, который использует 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) - у меня нет времени реализовать это, но мне было бы интересно узнать, появится ли в конечном итоге более аккуратное решение.

person krlmlr    schedule 10.04.2015