jekyll-ical-tag 1.2.4 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/rspec +29 -0
- data/lib/jekyll-ical-tag.rb +25 -56
- data/lib/jekyll-ical-tag/calendar_feed_coordinator.rb +43 -0
- data/lib/jekyll-ical-tag/calendar_fetcher.rb +30 -0
- data/lib/jekyll-ical-tag/calendar_parser.rb +6 -9
- data/lib/jekyll-ical-tag/event.rb +31 -10
- data/lib/jekyll-ical-tag/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91c6e8bb4e6260b727de3f135494c7abe007d6136cb62d959ba142e885727964
|
4
|
+
data.tar.gz: 4f21845ffef36b8004af8d408d65fc4da36f342826032a397564662806388d3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7616ae73da4c128dd77b3538d593f2961f260f06928164ca5b1ffa2c05999f1573203a38cdc065762452466a3e4c70cdcff405fc589d98959495e45d37be79b7
|
7
|
+
data.tar.gz: e2322a1d26c1f695e4e2b7031ff35be8804074f8d0b224f7c35ef81ee4e4c9559982cd7ba373f917fce8dcfe911444841a06916a53676c73aff2f238f3b7e35f
|
data/bin/rspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rspec' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rspec-core", "rspec")
|
data/lib/jekyll-ical-tag.rb
CHANGED
@@ -6,15 +6,18 @@ require "jekyll-ical-tag/version"
|
|
6
6
|
|
7
7
|
module Jekyll
|
8
8
|
class IcalTag < Liquid::Block
|
9
|
-
require_relative "jekyll-ical-tag/
|
10
|
-
require_relative "jekyll-ical-tag/
|
9
|
+
require_relative "jekyll-ical-tag/calendar_feed_coordinator"
|
10
|
+
require_relative "jekyll-ical-tag/calendar_fetcher"
|
11
11
|
require_relative "jekyll-ical-tag/calendar_limiter"
|
12
|
+
require_relative "jekyll-ical-tag/calendar_parser"
|
13
|
+
require_relative "jekyll-ical-tag/event"
|
12
14
|
|
13
15
|
include Convertible
|
14
16
|
|
15
17
|
def initialize(tag_name, markup, parse_context)
|
16
18
|
super
|
17
19
|
@markup = markup
|
20
|
+
@attributes = {}
|
18
21
|
|
19
22
|
scan_attributes!
|
20
23
|
set_limit!
|
@@ -31,22 +34,11 @@ module Jekyll
|
|
31
34
|
result = []
|
32
35
|
|
33
36
|
context.stack do
|
34
|
-
url = get_dereferenced_url(context) ||
|
35
|
-
@url
|
36
|
-
|
37
|
-
raise "No URL provided or in innapropriate form '#{url}'" unless is_valid_url?(url)
|
38
|
-
|
39
|
-
puts "Fetching #{url}"
|
37
|
+
url = get_dereferenced_url(context) || @url
|
40
38
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
parser = CalendarLimiter.new(parser, before_date: @before_date)
|
45
|
-
parser = CalendarLimiter.new(parser, after_date: @after_date)
|
46
|
-
parser = CalendarLimiter.new(parser, limit: @limit)
|
47
|
-
|
48
|
-
events = parser.events
|
49
|
-
length = events.length
|
39
|
+
calendar_feed_coordinator = CalendarFeedCoordinator.new(url: url)
|
40
|
+
events = calendar_feed_coordinator.events
|
41
|
+
event_count = events.length
|
50
42
|
|
51
43
|
events.each_with_index do |event, index|
|
52
44
|
# Init
|
@@ -69,32 +61,15 @@ module Jekyll
|
|
69
61
|
context["event"]["end_time"] = context["event"]["dtend"]
|
70
62
|
context["event"]["start_time"] = context["event"]["dtstart"]
|
71
63
|
|
72
|
-
# Ensure all event values are utf8 encoded strings
|
73
|
-
# Ensure times (from dates)
|
74
|
-
# Ensure present
|
75
|
-
context["event"].transform_values! do |value|
|
76
|
-
v = case value
|
77
|
-
when String, Icalendar::Values::Text
|
78
|
-
value.force_encoding("UTF-8")
|
79
|
-
when Date, Icalendar::Values::DateTime
|
80
|
-
value.to_time
|
81
|
-
when Icalendar::Values::Uri
|
82
|
-
value.to_s
|
83
|
-
else
|
84
|
-
value
|
85
|
-
end
|
86
|
-
v.presence
|
87
|
-
end
|
88
|
-
|
89
64
|
context["forloop"] = {
|
90
65
|
"name" => "ical",
|
91
|
-
"length" =>
|
66
|
+
"length" => event_count,
|
92
67
|
"index" => index + 1,
|
93
68
|
"index0" => index,
|
94
|
-
"rindex" =>
|
95
|
-
"rindex0" =>
|
69
|
+
"rindex" => event_count - index,
|
70
|
+
"rindex0" => event_count - index - 1,
|
96
71
|
"first" => (index == 0),
|
97
|
-
"last" => (index ==
|
72
|
+
"last" => (index == event_count - 1),
|
98
73
|
}
|
99
74
|
|
100
75
|
result << nodelist.map do |n|
|
@@ -112,10 +87,6 @@ module Jekyll
|
|
112
87
|
|
113
88
|
private
|
114
89
|
|
115
|
-
def is_valid_url?(url)
|
116
|
-
!!(url =~ URI::regexp)
|
117
|
-
end
|
118
|
-
|
119
90
|
def get_dereferenced_url(context)
|
120
91
|
return unless context.key?(@url)
|
121
92
|
|
@@ -123,7 +94,6 @@ module Jekyll
|
|
123
94
|
end
|
124
95
|
|
125
96
|
def scan_attributes!
|
126
|
-
@attributes = {}
|
127
97
|
@markup.scan(Liquid::TagAttributes) do |key, value|
|
128
98
|
@attributes[key] = value
|
129
99
|
end
|
@@ -147,10 +117,11 @@ module Jekyll
|
|
147
117
|
only_past = @attributes["only_past"] == "true"
|
148
118
|
|
149
119
|
raise "Set only_future OR only_past, not both" if only_future && only_past
|
150
|
-
|
151
|
-
|
120
|
+
|
121
|
+
@only =
|
122
|
+
if only_future
|
152
123
|
:future
|
153
|
-
|
124
|
+
elsif only_past
|
154
125
|
:past
|
155
126
|
else
|
156
127
|
:all
|
@@ -158,21 +129,19 @@ module Jekyll
|
|
158
129
|
end
|
159
130
|
|
160
131
|
def set_before_date!
|
161
|
-
@before_date =
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
rescue => e
|
132
|
+
@before_date =
|
133
|
+
begin
|
134
|
+
Time.parse(@attributes["before_date"])
|
135
|
+
rescue
|
166
136
|
nil
|
167
137
|
end
|
168
138
|
end
|
169
139
|
|
170
140
|
def set_after_date!
|
171
|
-
@after_date =
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
rescue => e
|
141
|
+
@after_date =
|
142
|
+
begin
|
143
|
+
Time.parse(@attributes["after_date"])
|
144
|
+
rescue
|
176
145
|
nil
|
177
146
|
end
|
178
147
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "cgi"
|
5
|
+
require "api_cache"
|
6
|
+
|
7
|
+
module Jekyll
|
8
|
+
class IcalTag
|
9
|
+
class CalendarFeedCoordinator
|
10
|
+
def initialize(url:, only: nil, reverse: nil, before_date: nil, after_date: nil, limit: nil)
|
11
|
+
@url = url
|
12
|
+
@only = only
|
13
|
+
@reverse = reverse
|
14
|
+
@before_date = before_date
|
15
|
+
@after_date = after_date
|
16
|
+
@limit = limit
|
17
|
+
end
|
18
|
+
|
19
|
+
def events
|
20
|
+
parser.events
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_reader :url, :only, :reverse, :before_date, :after_date, :limit
|
26
|
+
|
27
|
+
def raw_ical
|
28
|
+
@raw_ical ||= CalendarFetcher.new(url).fetch
|
29
|
+
end
|
30
|
+
|
31
|
+
def parser
|
32
|
+
@parser ||= begin
|
33
|
+
parser = CalendarParser.new(raw_ical)
|
34
|
+
parser = CalendarLimiter.new(parser, only: only)
|
35
|
+
parser = CalendarLimiter.new(parser, reverse: reverse)
|
36
|
+
parser = CalendarLimiter.new(parser, before_date: before_date)
|
37
|
+
parser = CalendarLimiter.new(parser, after_date: after_date)
|
38
|
+
CalendarLimiter.new(parser, limit: limit)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "cgi"
|
5
|
+
require "api_cache"
|
6
|
+
|
7
|
+
module Jekyll
|
8
|
+
class IcalTag
|
9
|
+
class CalendarFetcher
|
10
|
+
def initialize(url)
|
11
|
+
@url = CGI.unescape(url)
|
12
|
+
|
13
|
+
raise "No URL provided or in innapropriate form '#{url}'" unless is_valid_url?
|
14
|
+
end
|
15
|
+
|
16
|
+
def fetch
|
17
|
+
puts "Fetching #{url}"
|
18
|
+
@fetch ||= APICache.get(url)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_reader :url
|
24
|
+
|
25
|
+
def is_valid_url?
|
26
|
+
!!(url =~ URI::regexp)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -8,22 +8,19 @@ require "icalendar"
|
|
8
8
|
module Jekyll
|
9
9
|
class IcalTag
|
10
10
|
class CalendarParser
|
11
|
-
def initialize(
|
12
|
-
@
|
11
|
+
def initialize(raw_feed)
|
12
|
+
@raw_feed = raw_feed
|
13
13
|
end
|
14
14
|
|
15
15
|
def events
|
16
|
-
@events ||=
|
17
|
-
|
18
|
-
.sort { |e1, e2| e1.dtstart <=> e2.dtstart }
|
19
|
-
.map { |e| Jekyll::IcalTag::Event.new(e) }
|
20
|
-
end
|
16
|
+
@events ||= parsed_feed.sort { |event1, event2| event1.dtstart <=> event2.dtstart }
|
17
|
+
.map { |event| Jekyll::IcalTag::Event.new(event) }
|
21
18
|
end
|
22
19
|
|
23
20
|
private
|
24
21
|
|
25
|
-
def
|
26
|
-
|
22
|
+
def parsed_feed
|
23
|
+
Icalendar::Event.parse(@raw_feed)
|
27
24
|
end
|
28
25
|
end
|
29
26
|
end
|
@@ -37,25 +37,46 @@ module Jekyll
|
|
37
37
|
|
38
38
|
def all_properties
|
39
39
|
@props ||= begin
|
40
|
-
|
40
|
+
props = {}
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
# RFC 5545 Properties
|
43
|
+
event.class.properties.each do |property|
|
44
|
+
props[property] = event.property(property)
|
45
|
+
end
|
46
|
+
|
47
|
+
# custom properties
|
48
|
+
props = props.merge(event.custom_properties)
|
46
49
|
|
47
|
-
|
48
|
-
|
50
|
+
# Ensure all event values are utf8 encoded strings
|
51
|
+
# Ensure times (from dates)
|
52
|
+
# Ensure present
|
53
|
+
props.transform_values! do |value|
|
54
|
+
new_value =
|
55
|
+
case value
|
56
|
+
when String, Icalendar::Values::Text
|
57
|
+
value.force_encoding("UTF-8")
|
58
|
+
when Date, Icalendar::Values::DateTime
|
59
|
+
value.to_time
|
60
|
+
when Icalendar::Values::Uri
|
61
|
+
value.to_s
|
62
|
+
else
|
63
|
+
value
|
64
|
+
end
|
49
65
|
|
50
|
-
|
66
|
+
new_value.presence
|
51
67
|
end
|
68
|
+
|
69
|
+
props
|
70
|
+
end
|
52
71
|
end
|
53
72
|
|
54
73
|
def simple_html_description
|
55
74
|
@simple_html_description ||= begin
|
56
|
-
description&.clone.tap do |
|
75
|
+
description&.clone.tap do |description|
|
76
|
+
description = description.join("\n") if description.is_a?(Icalendar::Values::Array)
|
77
|
+
|
57
78
|
description_urls.each do |url|
|
58
|
-
|
79
|
+
description.force_encoding("UTF-8").gsub! url, %(<a href='#{url}'>#{url}</a>)
|
59
80
|
end
|
60
81
|
end
|
61
82
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-ical-tag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ricky Chilcott
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-11-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -107,8 +107,11 @@ files:
|
|
107
107
|
- README.md
|
108
108
|
- _plugins/ical_tag.rb
|
109
109
|
- bin/build-and-publish-gem
|
110
|
+
- bin/rspec
|
110
111
|
- jekyll-ical-tag.gemspec
|
111
112
|
- lib/jekyll-ical-tag.rb
|
113
|
+
- lib/jekyll-ical-tag/calendar_feed_coordinator.rb
|
114
|
+
- lib/jekyll-ical-tag/calendar_fetcher.rb
|
112
115
|
- lib/jekyll-ical-tag/calendar_limiter.rb
|
113
116
|
- lib/jekyll-ical-tag/calendar_parser.rb
|
114
117
|
- lib/jekyll-ical-tag/event.rb
|