add_to_calendar_links 0.3.5 → 0.4.3
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/Gemfile +1 -1
- data/Gemfile.lock +1 -1
- data/lib/add_to_calendar_links.rb +82 -26
- data/lib/add_to_calendar_links/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c1fc649c026fad801703de16f4acc9020828623b2cca79bc3b0994d1283b539
|
4
|
+
data.tar.gz: 8e982c9be9dae3e653f2db93e09e164ced68ffe4598d9a53881c34a1ea6a7cef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d3dc98e19a10ef18d984b3e71a4f378ce3e592373e86656b2a09d7aca47616ea2d9f1cc4df56858f3d8fda99092386e1c67fe76b672be38b3e03ecb508f9765
|
7
|
+
data.tar.gz: fe8ff7ed31d64ec73ed7af4afa81a3efdb26934f863190903f7b22cba79a954223846a03de81eb01a1694c9c4f836e1d18972a27d9058f602184f5eafb9bc690
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -12,8 +12,8 @@ module AddToCalendarLinks
|
|
12
12
|
class Error < StandardError; end
|
13
13
|
|
14
14
|
class URLs
|
15
|
-
attr_accessor :start_datetime, :end_datetime, :title, :timezone, :location, :url, :description, :add_url_to_description, :organizer, :strip_html
|
16
|
-
def initialize(start_datetime:, end_datetime: nil, title:, timezone:, location: nil, url: nil, description: nil, add_url_to_description: true, organizer: nil, strip_html: false)
|
15
|
+
attr_accessor :start_datetime, :end_datetime, :title, :timezone, :location, :url, :description, :add_url_to_description, :organizer, :strip_html, :sequence, :last_modified, :uid
|
16
|
+
def initialize(start_datetime:, end_datetime: nil, title:, timezone:, location: nil, url: nil, description: nil, add_url_to_description: true, organizer: nil, strip_html: false, sequence: nil, last_modified: Time.now.utc, uid:)
|
17
17
|
@start_datetime = start_datetime
|
18
18
|
@end_datetime = end_datetime
|
19
19
|
@title = title
|
@@ -24,6 +24,9 @@ module AddToCalendarLinks
|
|
24
24
|
@add_url_to_description = add_url_to_description
|
25
25
|
@organizer = URI.parse(organizer) if organizer
|
26
26
|
@strip_html = strip_html
|
27
|
+
@sequence = sequence
|
28
|
+
@uid = uid
|
29
|
+
@last_modified = last_modified
|
27
30
|
validate_attributes
|
28
31
|
end
|
29
32
|
|
@@ -57,25 +60,28 @@ module AddToCalendarLinks
|
|
57
60
|
|
58
61
|
def yahoo_url
|
59
62
|
# Eg. https://calendar.yahoo.com/?v=60&view=d&type=20&title=Holly%27s%208th%20Birthday!&st=20200615T170000Z&dur=0100&desc=Join%20us%20to%20celebrate%20with%20lots%20of%20games%20and%20cake!&in_loc=7%20Apartments,%20London
|
60
|
-
calendar_url = "https://calendar.yahoo.com/?v=60&
|
63
|
+
calendar_url = "https://calendar.yahoo.com/?v=60&VIEW=d&TYPE=20"
|
61
64
|
params = {}
|
62
|
-
params[:
|
63
|
-
params[:
|
65
|
+
params[:TITLE] = url_encode(title)
|
66
|
+
params[:ST] = utc_datetime(start_datetime)
|
64
67
|
if end_datetime
|
68
|
+
# params[:ET] = utc_datetime(end_datetime)
|
65
69
|
seconds = duration_seconds(start_datetime, end_datetime)
|
66
|
-
params[:
|
70
|
+
params[:DUR] = seconds_to_hours_minutes(seconds)
|
67
71
|
else
|
68
|
-
params[:
|
72
|
+
# params[:ET] = utc_datetime(start_datetime + 60*60)
|
73
|
+
params[:DUR] = "0100"
|
69
74
|
end
|
70
|
-
params[:
|
75
|
+
params[:DESC] = url_encode(strip_html_tags(description)).truncate(3000) if description
|
76
|
+
|
71
77
|
if add_url_to_description && url
|
72
|
-
if params[:
|
73
|
-
params[:
|
78
|
+
if params[:DESC]
|
79
|
+
params[:DESC] << url_encode("\n\n#{url}")
|
74
80
|
else
|
75
|
-
params[:
|
81
|
+
params[:DESC] = url_encode(url)
|
76
82
|
end
|
77
83
|
end
|
78
|
-
params[:
|
84
|
+
params[:IN_LOC] = url_encode(location) if location
|
79
85
|
|
80
86
|
params.each do |key, value|
|
81
87
|
calendar_url << "&#{key}=#{value}"
|
@@ -94,10 +100,52 @@ module AddToCalendarLinks
|
|
94
100
|
microsoft("outlook.com")
|
95
101
|
end
|
96
102
|
|
103
|
+
def ical_file
|
104
|
+
calendar_url = "BEGIN:VCALENDAR\nVERSION:2.0\nMETHOD:REQUEST\nBEGIN:VEVENT"
|
105
|
+
|
106
|
+
params = {}
|
107
|
+
params[:DTSTART] = utc_datetime(start_datetime)
|
108
|
+
if end_datetime
|
109
|
+
params[:DTEND] = utc_datetime(end_datetime)
|
110
|
+
else
|
111
|
+
params[:DTEND] = utc_datetime(start_datetime + 60*60) # 1 hour later
|
112
|
+
end
|
113
|
+
params[:SUMMARY] = strip_html_tags(title) #ical doesnt support html so remove all markup. Optional for other formats
|
114
|
+
params[:URL] = url if url
|
115
|
+
params[:DESCRIPTION] = strip_html_tags(description).strip if description
|
116
|
+
if add_url_to_description && url
|
117
|
+
if params[:DESCRIPTION]
|
118
|
+
params[:DESCRIPTION] << "\\n\\n#{url}"
|
119
|
+
else
|
120
|
+
params[:DESCRIPTION] = url
|
121
|
+
end
|
122
|
+
end
|
123
|
+
params[:LOCATION] = strip_html_tags(location) if location
|
124
|
+
if uid
|
125
|
+
params[:UID] = uid
|
126
|
+
else
|
127
|
+
params[:UID] = "-#{urlc}" if url
|
128
|
+
params[:UID] = "-#{utc_datetime(start_datetime)}-#{title}" unless params[:UID] # set uid based on starttime and title only if url is unavailable
|
129
|
+
end
|
130
|
+
params[:ORGANIZER] = organizer if organizer
|
131
|
+
params[:SEQUENCE] = sequence if sequence
|
132
|
+
params["LAST-MODIFIED"] = format_date_google(last_modified) if last_modified
|
133
|
+
params[:METHOD] = "REQUEST"
|
134
|
+
|
135
|
+
params.each do |key, value|
|
136
|
+
calendar_url << "\n#{key}:#{value}"
|
137
|
+
end
|
138
|
+
|
139
|
+
calendar_url << "\nEND:VEVENT\nEND:VCALENDAR"
|
140
|
+
|
141
|
+
return calendar_url
|
142
|
+
end
|
143
|
+
|
97
144
|
def ical_url
|
98
145
|
# Downloads a *.ics file provided as a data-uri
|
99
146
|
# Eg. "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT%0ADTSTART:20200512T123000Z%0ADTEND:20200512T160000Z%0ASUMMARY:Holly%27s%208th%20Birthday%21%0AURL:https%3A%2F%2Fwww.example.com%2Fevent-details%0ADESCRIPTION:Come%20join%20us%20for%20lots%20of%20fun%20%26%20cake%21\\n\\nhttps%3A%2F%2Fwww.example.com%2Fevent-details%0ALOCATION:Flat%204%5C%2C%20The%20Edge%5C%2C%2038%20Smith-Dorrien%20St%5C%2C%20London%5C%2C%20N1%207GU%0AUID:-https%3A%2F%2Fwww.example.com%2Fevent-details%0AEND:VEVENT%0AEND:VCALENDAR"
|
100
|
-
calendar_url = "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT"
|
147
|
+
calendar_url = "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0AMETHOD:REQUEST%0ABEGIN:VEVENT"
|
148
|
+
|
101
149
|
params = {}
|
102
150
|
params[:DTSTART] = utc_datetime(start_datetime)
|
103
151
|
if end_datetime
|
@@ -107,7 +155,7 @@ module AddToCalendarLinks
|
|
107
155
|
end
|
108
156
|
params[:SUMMARY] = url_encode_ical(title, strip_html: true) #ical doesnt support html so remove all markup. Optional for other formats
|
109
157
|
params[:URL] = url_encode(url) if url
|
110
|
-
params[:DESCRIPTION] = url_encode_ical(description,
|
158
|
+
params[:DESCRIPTION] = url_encode_ical(strip_html_tags(description, line_break_seperator: "\n")) if description
|
111
159
|
if add_url_to_description && url
|
112
160
|
if params[:DESCRIPTION]
|
113
161
|
params[:DESCRIPTION] << "\\n\\n#{url_encode(url)}"
|
@@ -116,9 +164,15 @@ module AddToCalendarLinks
|
|
116
164
|
end
|
117
165
|
end
|
118
166
|
params[:LOCATION] = url_encode_ical(location) if location
|
119
|
-
|
120
|
-
|
121
|
-
|
167
|
+
if uid
|
168
|
+
params[:UID] = uid
|
169
|
+
else
|
170
|
+
params[:UID] = "-#{url_encode(url)}" if url
|
171
|
+
params[:UID] = "-#{utc_datetime(start_datetime)}-#{url_encode_ical(title)}" unless params[:UID] # set uid based on starttime and title only if url is unavailable
|
172
|
+
end
|
173
|
+
params[:ORGANIZER] = organizer if organizer
|
174
|
+
params[:SEQUENCE] = sequence if sequence
|
175
|
+
params["LAST-MODIFIED"] = format_date_google(last_modified) if last_modified
|
122
176
|
|
123
177
|
new_line = "%0A"
|
124
178
|
params.each do |key, value|
|
@@ -253,13 +307,7 @@ module AddToCalendarLinks
|
|
253
307
|
def url_encode_ical(s, strip_html: @strip_html)
|
254
308
|
# per https://tools.ietf.org/html/rfc5545#section-3.3.11
|
255
309
|
string = s.dup # don't modify original input
|
256
|
-
|
257
310
|
if strip_html
|
258
|
-
string.gsub!("<br>", "\n")
|
259
|
-
string.gsub!("<p>", "\n")
|
260
|
-
string.gsub!("</p>", "\n\n")
|
261
|
-
string.gsub!("&", "and")
|
262
|
-
string.gsub!(" ", " ")
|
263
311
|
string = strip_html_tags(string)
|
264
312
|
end
|
265
313
|
string.gsub!("\\", "\\\\\\") # \ >> \\ --yes, really: https://stackoverflow.com/questions/6209480/how-to-replace-backslash-with-double-backslash
|
@@ -270,11 +318,19 @@ module AddToCalendarLinks
|
|
270
318
|
else
|
271
319
|
url_encode(e)
|
272
320
|
end
|
273
|
-
}.join("
|
321
|
+
}.compact.join("\\n").gsub(/(\\n){2,}/, "\\n\\n").strip
|
274
322
|
end
|
275
323
|
|
276
|
-
def strip_html_tags(description)
|
277
|
-
description.dup
|
324
|
+
def strip_html_tags(description, line_break_seperator: "\\n")
|
325
|
+
string = description.dup
|
326
|
+
string.gsub!("<br>", line_break_seperator)
|
327
|
+
string.gsub!("<p>", line_break_seperator)
|
328
|
+
string.gsub!("</p>", line_break_seperator)
|
329
|
+
string.gsub!("&", "and")
|
330
|
+
string.gsub!(" ", " ")
|
331
|
+
string.gsub!(/<\/?[^>]*>/, "")
|
332
|
+
string.gsub!(/(\\n){2,}/, "\\n\\n")
|
333
|
+
string.strip
|
278
334
|
end
|
279
335
|
end
|
280
336
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: add_to_calendar_links
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jared Turner
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-03-
|
12
|
+
date: 2021-03-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: tzinfo
|