Анализировать данные из файла ICS и предоставлять их жидкой переменной в шаблоне

Я неустанно искал это в Google, но, к сожалению, каждый поиск сталкивается с тем фактом, что Jekyll является генератором сайтов, и результаты не помогают.

Я ищу небольшой пример того, как читать файл ICS из плагина/генератора, который затем доступен с помощью жидкости из шаблонов.

Я пробовал создавать коллекции и дополнять их в плагинах, пробовал создавать site.data массивы. Кажется, ничего не работает. Есть ли небольшой пример плагина jekyll, который читает файл или URL-адрес и создает данные, которые затем сохраняются в переменной сайта и могут быть доступны через жидкость? В частности, я буду читать ленту ICS и создавать календарь.

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Файлы данных могут не соответствовать вашим требованиям. Вам нужен плагин 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, как описано в документации.

Спасибо, это очень полезно. Я сосредоточился на использовании генератора для создания данных и их сохранения в коллекциях или наборах данных, но это работает так же хорошо.

Chris Valentine 11.02.2023 15:56

@ChrisValentine Генераторы Jekyll — это типы плагинов, которые используются для создания страниц сайта с использованием пользовательского кода и директив. Например, мой плагин jekyll-auto-authors создает автоматизированные авторские страницы с разбивкой на страницы для блогов jekyll, переопределяя Jekyll::Generator. В этом случае вы хотите прочитать и предоставить данные из файла, вы можете использовать фильтр или хук. Фильтры проще реализовать и использовать.

Gourav 12.02.2023 06:31

Так что это не работает с текущей версией Jekyll и текущей версией Ruby. Ошибка недопустимого аргумента. Я немного покопался, и все рекомендовали понизить версию, чтобы обойти ошибку, но это не сработало для меня.

Chris Valentine 12.02.2023 20:23

@ChrisValentine Я обновил ответ. Было 2 проблемы: Во-первых, мы установили icalendar с помощью gem, но не добавили его в Gemfile. Таким образом, Джекил не мог определить, где искать драгоценный камень. Во-вторых, фильтр read_calendar использовался неправильно. Я обновил ответ и добавил пример, который работает для меня. Дайте мне знать, если это работает для вас :)

Gourav 13.02.2023 08:37

Создан ics-reader-plugin-example.gouravkhunger.me и github.com/gouravkhunger/ics-reader-plugin-example для справки.

Gourav 13.02.2023 09:51

Большое спасибо! Теперь это работает для меня, и я могу видеть жизненный цикл данных от начала до конца!! Оценил!

Chris Valentine 13.02.2023 12:35

Потрясающе, поздравляю!

Gourav 13.02.2023 15:29

Другие вопросы по теме