Я неустанно искал это в Google, но, к сожалению, каждый поиск сталкивается с тем фактом, что Jekyll является генератором сайтов, и результаты не помогают.
Я ищу небольшой пример того, как читать файл ICS из плагина/генератора, который затем доступен с помощью жидкости из шаблонов.
Я пробовал создавать коллекции и дополнять их в плагинах, пробовал создавать site.data
массивы. Кажется, ничего не работает. Есть ли небольшой пример плагина jekyll, который читает файл или URL-адрес и создает данные, которые затем сохраняются в переменной сайта и могут быть доступны через жидкость? В частности, я буду читать ленту ICS и создавать календарь.
Файлы данных могут не соответствовать вашим требованиям. Вам нужен плагин Jekyll.
Вот специальное решение, которое я бы реализовал для чтения файлов ics
и предоставления событий календаря жидким переменным в Jekyll:
Добавьте icalendar в свой Gemfile
и установите его:
bundle add icalendar
bundle install
Поместите этот файл в _plugins/calendar_reader.rb
require "jekyll"
require "icalendar"
module Jekyll
module ICSReader
def read_calendar(input)
begin
calendar_file = File.open(input)
events = Icalendar::Event.parse(calendar_file)
hash = {}
counter = 0
# loop through the events in the calendars
# and map the values you want into a variable and then return it:
events.each do |event|
hash[counter] = {
"summary" => event.summary,
"dtstart" => event.dtstart,
"dtend" => event.dtend,
"description" => event.description
}
counter += 1
end
return hash
rescue
# Handle errors
Jekyll.logger.error "Calendar Reader:", "An error occurred!"
return {}
end
end
end
end
Liquid::Template.register_filter(Jekyll::ICSReader)
Документы README.md от icalendar
помогут вам понять, как данные считываются из файла. По сути, мы анализируем события в файле, сопоставляем их со словарем и возвращаем его.
Теперь возьмите файл ics и поместите его в папку _data
.
_data/my_calendar.ics
BEGIN:VEVENT
DTSTAMP:20050118T211523Z
UID:bsuidfortestabc123
DTSTART;TZID=US-Mountain:20050120T170000
DTEND;TZID=US-Mountain:20050120T184500
CLASS:PRIVATE
GEO:37.386013;-122.0829322
ORGANIZER:mailto:[email protected]
PRIORITY:2
SUMMARY:This is a really long summary to test the method of unfolding lines
\, so I'm just going to make it a whole bunch of lines.
ATTACH:http://bush.sucks.org/impeach/him.rhtml
ATTACH:http://corporations-dominate.existence.net/why.rhtml
RDATE;TZID=US-Mountain:20050121T170000,20050122T170000
X-TEST-COMPONENT;QTEST = "Hello, World":Shouldn't double double quotes
END:VEVENT
BEGIN:VEVENT
DTSTAMP:20110118T211523Z
UID:uid-1234-uid-4321
DTSTART;TZID=US-Mountain:20110120T170000
DTEND;TZID=US-Mountain:20110120T184500
CLASS:PRIVATE
GEO:37.386013;-122.0829322
ORGANIZER:mailto:[email protected]
PRIORITY:2
SUMMARY:This is a very short summary.
RDATE;TZID=US-Mountain:20110121T170000,20110122T170000
END:VEVENT
Этот пример файла ics взят из репозитория icalendar.
Теперь вы можете использовать фильтр плагинов из вашего markdown/html:
{% assign events = "_data/my_calendar.ics" | read_calendar %}
Здесь read_calendar
— это функция, определенная в _plugins/calendar_reader.rb
, а _data/my_calendar.ics
— это файл, из которого вы хотите получить данные. Плагин получает input
как _data/my_calendar.ics
, читает его и возвращает hash
, который хранится в самой переменной events
.
Теперь вы можете использовать {{ events }}
для доступа к хешу данных, которые вы возвращаете из функции в файле плагина.
// {{ events }}
{0=>{“summary”=>”This is a really long summary to test the method of unfolding lines, so I’m just going to make it a whole bunch of lines.”, “dtstart”=>#<DateTime: 2005-01-20T17:00:00+00:00 ((2453391j,61200s,0n),+0s,2299161j)>, “dtend”=>#<DateTime: 2005-01-20T18:45:00+00:00 ((2453391j,67500s,0n),+0s,2299161j)>, “description”=>nil}, 1=>{“summary”=>”This is a very short summary.”, “dtstart”=>#<DateTime: 2011-01-20T17:00:00+00:00 ((2455582j,61200s,0n),+0s,2299161j)>, “dtend”=>#<DateTime: 2011-01-20T18:45:00+00:00 ((2455582j,67500s,0n),+0s,2299161j)>, “description”=>nil}}
// {{ events[0] }}
{“summary”=>”This is a really long summary to test the method of unfolding lines, so I’m just going to make it a whole bunch of lines.”, “dtstart”=>#<DateTime: 2005-01-20T17:00:00+00:00 ((2453391j,61200s,0n),+0s,2299161j)>, “dtend”=>#<DateTime: 2005-01-20T18:45:00+00:00 ((2453391j,67500s,0n),+0s,2299161j)>, “description”=>nil}
// {{ events[1] }}
{“summary”=>”This is a very short summary.”, “dtstart”=>#<DateTime: 2011-01-20T17:00:00+00:00 ((2455582j,61200s,0n),+0s,2299161j)>, “dtend”=>#<DateTime: 2011-01-20T18:45:00+00:00 ((2455582j,67500s,0n),+0s,2299161j)>, “description”=>nil}
Это была основа того, как работает Джекил Filter
. Вы можете глубже изучить другие типы плагинов Jekyll, как описано в документации.
@ChrisValentine Генераторы Jekyll — это типы плагинов, которые используются для создания страниц сайта с использованием пользовательского кода и директив. Например, мой плагин jekyll-auto-authors создает автоматизированные авторские страницы с разбивкой на страницы для блогов jekyll, переопределяя Jekyll::Generator
. В этом случае вы хотите прочитать и предоставить данные из файла, вы можете использовать фильтр или хук. Фильтры проще реализовать и использовать.
Так что это не работает с текущей версией Jekyll и текущей версией Ruby. Ошибка недопустимого аргумента. Я немного покопался, и все рекомендовали понизить версию, чтобы обойти ошибку, но это не сработало для меня.
@ChrisValentine Я обновил ответ. Было 2 проблемы: Во-первых, мы установили icalendar
с помощью gem
, но не добавили его в Gemfile
. Таким образом, Джекил не мог определить, где искать драгоценный камень. Во-вторых, фильтр read_calendar
использовался неправильно. Я обновил ответ и добавил пример, который работает для меня. Дайте мне знать, если это работает для вас :)
Создан ics-reader-plugin-example.gouravkhunger.me и github.com/gouravkhunger/ics-reader-plugin-example для справки.
Большое спасибо! Теперь это работает для меня, и я могу видеть жизненный цикл данных от начала до конца!! Оценил!
Потрясающе, поздравляю!
Спасибо, это очень полезно. Я сосредоточился на использовании генератора для создания данных и их сохранения в коллекциях или наборах данных, но это работает так же хорошо.