Sha256: 8b5de987399f1615c5ebbca7342de6b9fe1170d63a3ba3bd283e63dd605f71c4

Contents?: true

Size: 1.54 KB

Versions: 1

Compression:

Stored size: 1.54 KB

Contents

# frozen_string_literal: true

require "active_support"
require "icalendar"
require "icalendar/recurrence"

module Jekyll
  class IcalTag
    class CalendarParser
      def initialize(raw_feed, recurring_start_date:, recurring_end_date:)
        @raw_feed = raw_feed
        @recurring_start_date = recurring_start_date
        @recurring_end_date = recurring_end_date
      end

      def events
        @events ||=
          parsed_events
            .sort_by(&:dtstart)
            .map { |event| Jekyll::IcalTag::Event.new(event) }
      end

      private

      def parsed_events
        events = Icalendar::Event.parse(@raw_feed)

        recurring_events =
          events
            .select { |event| event.rrule.present? }
            .flat_map do |event|
              event
                .occurrences_between(@recurring_start_date, @recurring_end_date)
                .map { |occurrence| build_occurance_event(event, occurrence) }
            end
            .compact

        events.concat(recurring_events)
      end

      # return a new event with the same attributes, but different start and end times
      def build_occurance_event(event, occurrence)
        return if is_duplicate_event?(event, occurrence)

        event.dup.tap do |e|
          e.dtstart = occurrence.start_time
          e.dtend = occurrence.end_time
        end
      end

      def is_duplicate_event?(event, occurrence)
        event.dtstart.to_time == occurrence.start_time.to_time ||
          event.dtend.to_time == occurrence.end_time.to_time
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
jekyll-ical-tag-1.6.0 lib/jekyll-ical-tag/calendar_parser.rb