jekyll-attendease 0.4.0 → 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/README.md +21 -5
- data/lib/jekyll-attendease.rb +418 -127
- data/templates/_includes/attendease/presenters/index.html +25 -0
- data/templates/_includes/attendease/presenters/presenter.html +71 -0
- data/templates/_includes/attendease/schedule/day.html +65 -0
- data/templates/_includes/attendease/schedule/index.html +24 -0
- data/templates/_includes/attendease/schedule/session.html +93 -0
- data/templates/_includes/attendease/schedule/sessions.html +23 -0
- data/templates/_includes/attendease/venues/index.html +44 -0
- data/templates/_includes/attendease/venues/venue.html +51 -0
- data/templates/layout.html +5 -0
- metadata +11 -3
- data/assets/auth_check.js +0 -133
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 75b3ac6437c60cf1f0e8ff306bbe434f5579a0ed
|
4
|
+
data.tar.gz: 3332793ac437f20cb1410d4a6b0e137159704459
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0574338faeb230b0e75c5d0819fa230a50cb046a35333cedc12db1f9979ab21fb6a767cb7d58ad83080a092938b01ba2c4718d49a67f359eff3a88a87edd6a6c
|
7
|
+
data.tar.gz: 141efa54efae2155d2ca03a8a8720152e5e8efd571ef14dec857023d85cd251b7cb561ae8db418cede98c0f5fa477af34d6d3a2ffb07ee58a5167feb8498dfd8
|
data/README.md
CHANGED
@@ -32,16 +32,18 @@ You will need to configure by editing your `_config.yml`:
|
|
32
32
|
# Plugin: jekyll-attendease
|
33
33
|
#
|
34
34
|
attendease:
|
35
|
+
# Required
|
35
36
|
api_host: https://your-event-subdomain.attendease.com/
|
36
|
-
|
37
|
+
|
38
|
+
# Optional
|
39
|
+
access_token: secret_access_token_for_access_to_private_events # Delete this if you don't have one or need one.
|
40
|
+
cache_expiry: 3600 # The number of seconds until we regerenate the data from the api. Otherwise data will be cached for speed.
|
41
|
+
generate_schedule_pages: false # Set to true if you want to generate static schedule pages.
|
42
|
+
schedule_path_name: 'schedule' # Set to the path your want your schedule pages to live at.
|
37
43
|
```
|
38
44
|
|
39
45
|
Remember to replace `https://your-event-subdomain.attendease.com/` with your actual event url, or crazy things will happen!
|
40
46
|
|
41
|
-
Setting `test_mode` will create pages for /register, /schedule and
|
42
|
-
/presenters. You may style these pages, but they are non-functional.
|
43
|
-
When the site is deployed to Attendease these will function.
|
44
|
-
|
45
47
|
## Usage
|
46
48
|
|
47
49
|
Now the event name can easily be used in your site like so:
|
@@ -92,6 +94,20 @@ JekyllAttendease.onLoginCheck(function(e)
|
|
92
94
|
});
|
93
95
|
```
|
94
96
|
|
97
|
+
|
98
|
+
## Static Schedule Pages
|
99
|
+
|
100
|
+
In your `_config.yml` if you add the `generate_schedule_pages` set to `true` under `attendease` it will generate static schedule pages from the Attendease public API.
|
101
|
+
|
102
|
+
You can customize the look/structure of each page as well as widgets within the pages. These pages will be automatically generated for you when you build your site.
|
103
|
+
|
104
|
+
For Session Day pages:
|
105
|
+
|
106
|
+
- `_layouts/attendease_schedule_day_sessions.html` - The layout for the generate session day page. It will list all instances on that day
|
107
|
+
- `_includes/attendease/session_instance_item.html` - The instance item on the page
|
108
|
+
- `_includes/attendease/filter.html` - A filter and its items in the instance
|
109
|
+
- `_includes/attendease/presenter_item.html` - A presenter item in the instance
|
110
|
+
|
95
111
|
## Contributing
|
96
112
|
|
97
113
|
1. Fork it
|
data/lib/jekyll-attendease.rb
CHANGED
@@ -7,6 +7,8 @@ module Jekyll
|
|
7
7
|
class EventData < Generator
|
8
8
|
safe true
|
9
9
|
|
10
|
+
priority :highest
|
11
|
+
|
10
12
|
include HTTParty
|
11
13
|
|
12
14
|
def get(url, options = {})
|
@@ -29,220 +31,515 @@ module Jekyll
|
|
29
31
|
@attendease_config['api_host'] += '/'
|
30
32
|
end
|
31
33
|
|
32
|
-
@attendease_data_path = "#{site.
|
34
|
+
@attendease_data_path = "#{site.source}/_attendease_data"
|
33
35
|
|
34
36
|
FileUtils.mkdir_p(@attendease_data_path)
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
-
if File.exists?("#{@attendease_data_path}/site.json")
|
39
|
-
if (Time.now.to_i - File.mtime("#{@attendease_data_path}/site.json").to_i) <= (@attendease_config['cache_expiry'].nil? ? 30 : @attendease_config['cache_expiry']) # file is less than 30 seconds old
|
40
|
-
update_data = false
|
38
|
+
data_files = ['site.json', 'event.json', 'sessions.json', 'presenters.json', 'rooms.json', 'filters.json', 'venues.json']
|
41
39
|
|
42
|
-
|
40
|
+
data_files.each do |file_name|
|
41
|
+
update_data = true
|
43
42
|
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
if File.exists?("#{@attendease_data_path}/#{file_name}")
|
44
|
+
if (Time.now.to_i - File.mtime("#{@attendease_data_path}/#{file_name}").to_i) <= (@attendease_config['cache_expiry'].nil? ? 30 : @attendease_config['cache_expiry']) # file is less than 30 seconds old
|
45
|
+
update_data = false
|
47
46
|
|
48
|
-
|
49
|
-
event_data = get("#{@attendease_config['api_host']}api/site.json")
|
47
|
+
json = File.read("#{@attendease_data_path}/#{file_name}")
|
50
48
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
File.open("#{@attendease_data_path}/site.json", 'w+') { |file| file.write(event_data.parsed_response.to_json) }
|
55
|
-
else
|
56
|
-
raise "Event data not found, is your Attendease api_host site properly in _config.yml?"
|
49
|
+
data = JSON.parse(json)
|
50
|
+
end
|
57
51
|
end
|
58
52
|
|
59
|
-
if
|
53
|
+
if update_data
|
54
|
+
options = {}
|
55
|
+
options.merge!(:headers => {'X-Event-Token' => @attendease_config['access_token']}) if @attendease_config['access_token']
|
56
|
+
|
57
|
+
data = get("#{@attendease_config['api_host']}api/#{file_name}", options)
|
60
58
|
|
61
|
-
|
59
|
+
if (data.is_a?(Hash) && !data['error']) || data.is_a?(Array)
|
60
|
+
puts "" if file_name == 'site.json' # leading space, that's all.
|
61
|
+
puts " [Attendease] Saving #{file_name} data..."
|
62
62
|
|
63
|
-
|
64
|
-
|
63
|
+
File.open("#{@attendease_data_path}/#{file_name}", 'w+') { |file| file.write(data.parsed_response.to_json) }
|
64
|
+
else
|
65
|
+
raise "Event data not found, is your Attendease api_host site properly in _config.yml?"
|
66
|
+
end
|
67
|
+
end
|
65
68
|
|
66
|
-
|
67
|
-
|
69
|
+
if file_name == 'site.json'
|
70
|
+
# Adding to site config so we can access these variables globally wihtout using a Liquid Tag so we can use if/else
|
71
|
+
site.config['attendease']['data'] = {}
|
68
72
|
|
69
|
-
|
70
|
-
|
73
|
+
data.keys.each do |tag|
|
74
|
+
site.config['attendease']['data'][tag] = data[tag]
|
75
|
+
end
|
71
76
|
end
|
72
77
|
end
|
73
|
-
|
74
|
-
# Adding to site config so we can access these variables globally wihtout using a Liquid Tag so we can use if/else
|
75
|
-
site.config['attendease']['data'] = {} if site.config['attendease']['data'].nil?
|
76
|
-
site.config['attendease']['data'].merge!(event_data)
|
77
78
|
end
|
78
79
|
|
79
80
|
else
|
80
81
|
raise "Please set the Attendease event data in your _config.yml"
|
81
82
|
end
|
82
83
|
end
|
83
|
-
|
84
|
-
private
|
85
|
-
|
86
|
-
def fetch_pages(pages_to_fetch, prefix = nil)
|
87
|
-
|
88
|
-
pages_to_fetch.each do |page|
|
89
|
-
url = "#{@attendease_config['api_host']}attendease/preview/#{page}.html"
|
90
|
-
page_data = get(url)
|
91
|
-
|
92
|
-
if page_data.response.code.to_i == 200
|
93
|
-
puts " [Attendease] Saving test data for #{page} page..."
|
94
|
-
|
95
|
-
filename = []
|
96
|
-
filename << prefix unless prefix.nil?
|
97
|
-
filename << page
|
98
|
-
|
99
|
-
File.open("#{@attendease_data_path}/attendease_test_#{filename.join('_')}.html", 'w') { |file| file.write(page_data.parsed_response) }
|
100
|
-
else
|
101
|
-
raise "Could not retrieve #{url}. Is your Attendease api_host site properly in _config.yml?"
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
84
|
end
|
107
85
|
|
108
|
-
|
109
86
|
class EventThemes < Generator
|
110
87
|
safe true
|
111
88
|
|
89
|
+
priority :high
|
90
|
+
|
112
91
|
def generate(site)
|
113
92
|
puts " [Attendease] Generating theme layouts..."
|
114
93
|
|
115
|
-
attendease_precompiled_theme_layouts_path = "#{site.
|
94
|
+
attendease_precompiled_theme_layouts_path = "#{site.source}/attendease_layouts"
|
116
95
|
|
117
96
|
FileUtils.mkdir_p(attendease_precompiled_theme_layouts_path)
|
118
97
|
|
98
|
+
base_layout = (site.config['attendease'] && site.config['attendease']['base_layout']) ? site.config['attendease']['base_layout'] : 'layout'
|
99
|
+
|
119
100
|
layouts_to_precompile = ['layout', 'register', 'schedule', 'presenters']
|
120
101
|
|
121
102
|
# Precompiled layout for website sections.
|
122
103
|
layouts_to_precompile.each do |layout|
|
123
|
-
if File.exists?("#{site.
|
104
|
+
if File.exists?("#{site.source}/_layouts/#{base_layout}.html")
|
124
105
|
|
125
|
-
# create a layout file if
|
106
|
+
# create a layout file if it already doesn't exist.
|
126
107
|
# the layout file will be used by attendease to wrap /register, /schedule, /presnters in the
|
127
108
|
# look the compiled file defines.
|
128
109
|
# ensure {{ content }} is in the file so we can render content in there!
|
129
|
-
if !File.exists?("#{
|
130
|
-
|
131
|
-
---
|
132
|
-
layout: layout
|
133
|
-
---
|
134
|
-
|
135
|
-
{% attendease_content %}
|
136
|
-
eos
|
137
|
-
|
138
|
-
File.open("#{site.config['source']}/attendease_layouts/#{layout}.html", 'w+') { |file| file.write(theme_layout_content) }
|
139
|
-
|
110
|
+
if !File.exists?("#{attendease_precompiled_theme_layouts_path}/#{layout}.html")
|
111
|
+
site.pages << AttendeaseLayoutPage.new(site, site.source, 'attendease_layouts', "#{layout}.html", base_layout)
|
140
112
|
end
|
141
113
|
end
|
142
114
|
end
|
143
115
|
end
|
144
116
|
end
|
145
117
|
|
118
|
+
class AttendeaseLayoutPage < Page
|
119
|
+
def initialize(site, base, dir, name, base_layout)
|
120
|
+
@site = site
|
121
|
+
@base = base
|
122
|
+
@dir = dir
|
123
|
+
@name = name
|
146
124
|
|
147
|
-
|
148
|
-
safe true
|
125
|
+
self.process(name)
|
149
126
|
|
150
|
-
|
151
|
-
|
127
|
+
self.read_yaml(File.dirname(__FILE__) + "/../templates", 'layout') # a template for the layout.
|
128
|
+
|
129
|
+
self.data['layout'] = base_layout
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
class AttendeaseAuthScriptTag < Liquid::Tag
|
134
|
+
def render(context)
|
135
|
+
api_host = context.registers[:site].config['attendease']['api_host']
|
136
|
+
'<script type="text/javascript" src="' + api_host + 'assets/attendease_event/auth.js"></script>'
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
class AttendeaseSchedulerScriptTag < Liquid::Tag
|
141
|
+
def render(context)
|
142
|
+
api_host = context.registers[:site].config['attendease']['api_host']
|
143
|
+
'<script type="text/javascript" src="' + api_host + 'assets/attendease_event/schedule.js"></script>'
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
class AttendeaseLocalesScriptTag < Liquid::Tag
|
148
|
+
def render(context)
|
149
|
+
'<script type="text/javascript">String.locale="en";String.toLocaleString("/api/lingo.json");</script>'
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
class AttendeaseAuthAccountTag < Liquid::Tag
|
154
|
+
def render(context)
|
155
|
+
'<div id="attendease-auth-account"></div>'
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
class AttendeaseAuthActionTag < Liquid::Tag
|
160
|
+
def render(context)
|
161
|
+
'<div id="attendease-auth-action"></div>'
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
class AttendeaseContent < Liquid::Tag
|
166
|
+
def render(context)
|
167
|
+
"{{ content }}"
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
class ScheduleIndexPage < Page
|
173
|
+
def initialize(site, base, dir, dates)
|
174
|
+
@site = site
|
175
|
+
@base = base
|
176
|
+
@dir = dir
|
177
|
+
@name = 'index.html'
|
178
|
+
|
179
|
+
self.process(@name)
|
180
|
+
|
181
|
+
self.read_yaml(File.join(base, 'attendease_layouts'), 'schedule.html')
|
182
|
+
|
183
|
+
self.data['title'] = site.config['schedule_index_title_prefix'] || 'Schedule'
|
184
|
+
|
185
|
+
self.data['dates'] = dates
|
152
186
|
|
153
|
-
|
154
|
-
|
187
|
+
if File.exists?(File.join(base, '_includes', 'attendease', 'schedule', 'index.html'))
|
188
|
+
self.content = File.read(File.join(base, '_includes', 'attendease', 'schedule', 'index.html')) # Use theme specific layout
|
189
|
+
else
|
190
|
+
self.content = File.read(File.join(File.dirname(__FILE__), '..', '/templates/_includes/attendease/', 'schedule/index.html')) # Use template
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
155
194
|
|
156
|
-
|
157
|
-
|
195
|
+
class ScheduleDayPage < Page
|
196
|
+
def initialize(site, base, dir, day, sessions, dates)
|
197
|
+
@site = site
|
198
|
+
@base = base
|
199
|
+
@dir = dir
|
200
|
+
@name = 'index.html'
|
158
201
|
|
159
|
-
|
160
|
-
site.pages << RegisterTestPage.new(site, site.source, File.join('register'), {:name => 'checkout.html', :liquid_tag => 'attendease_test_register_checkout'})
|
202
|
+
self.process(@name)
|
161
203
|
|
162
|
-
|
163
|
-
site.pages << RegisterTestPage.new(site, site.source, File.join('register'), {:name => 'dashboard.html', :liquid_tag => 'attendease_test_register_dashboard'})
|
204
|
+
self.read_yaml(File.join(base, 'attendease_layouts'), 'schedule.html')
|
164
205
|
|
165
|
-
|
166
|
-
|
206
|
+
session_day_title_prefix = site.config['schedule_day_title_prefix'] || 'Schedule: '
|
207
|
+
self.data['title'] = "#{session_day_title_prefix}#{day['date_formatted']}"
|
167
208
|
|
168
|
-
|
169
|
-
|
209
|
+
self.data['day'] = day
|
210
|
+
self.data['dates'] = dates
|
170
211
|
|
171
|
-
|
172
|
-
site.pages << RegisterTestPage.new(site, site.source, File.join('schedule'), {:name => 'index.html', :liquid_tag => 'attendease_test_schedule'})
|
212
|
+
instances = []
|
173
213
|
|
174
|
-
|
175
|
-
|
214
|
+
sessions.each do |s|
|
215
|
+
s['instances'].each do |instance|
|
216
|
+
if instance['date'] == day['date']
|
217
|
+
instance['session'] = s
|
176
218
|
|
177
|
-
|
178
|
-
|
219
|
+
instances << instance
|
220
|
+
end
|
179
221
|
end
|
222
|
+
end
|
180
223
|
|
224
|
+
self.data['instances'] = instances.sort{|x,y| x['time'] <=> y['time'] }
|
225
|
+
|
226
|
+
if File.exists?(File.join(base, '_includes', 'attendease', 'schedule', 'day.html'))
|
227
|
+
self.content = File.read(File.join(base, '_includes', 'attendease', 'schedule', 'day.html')) # Use theme specific layout
|
228
|
+
else
|
229
|
+
self.content = File.read(File.join(File.dirname(__FILE__), '..', '/templates/_includes/attendease/', 'schedule/day.html')) # Use template
|
181
230
|
end
|
182
231
|
end
|
183
232
|
end
|
184
233
|
|
185
|
-
class
|
186
|
-
def initialize(site, base, dir,
|
234
|
+
class ScheduleSessionsPage < Page
|
235
|
+
def initialize(site, base, dir, sessions)
|
187
236
|
@site = site
|
188
237
|
@base = base
|
189
238
|
@dir = dir
|
190
|
-
@name =
|
239
|
+
@name = 'index.html'
|
191
240
|
|
192
241
|
self.process(@name)
|
193
242
|
|
194
|
-
|
195
|
-
|
243
|
+
self.read_yaml(File.join(base, 'attendease_layouts'), 'schedule.html')
|
244
|
+
|
245
|
+
self.data['title'] = site.config['schedule_sessions_title_prefix'] || 'Schedule: Sessions'
|
246
|
+
|
247
|
+
sessionsData = []
|
248
|
+
|
249
|
+
self.data['sessions'] = sessions
|
250
|
+
|
251
|
+
if File.exists?(File.join(base, '_includes', 'attendease', 'schedule', 'sessions.html'))
|
252
|
+
self.content = File.read(File.join(base, '_includes', 'attendease', 'schedule', 'sessions.html')) # Use theme specific layout
|
196
253
|
else
|
197
|
-
self.
|
254
|
+
self.content = File.read(File.join(File.dirname(__FILE__), '..', '/templates/_includes/attendease/', 'schedule/sessions.html')) # Use template
|
198
255
|
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
class ScheduleSessionPage < Page
|
260
|
+
def initialize(site, base, dir, session)
|
261
|
+
@site = site
|
262
|
+
@base = base
|
263
|
+
@dir = dir
|
264
|
+
@name = 'index.html'
|
265
|
+
|
266
|
+
self.process(@name)
|
267
|
+
|
268
|
+
self.read_yaml(File.join(base, 'attendease_layouts'), 'schedule.html')
|
199
269
|
|
200
|
-
|
270
|
+
schedule_session_title_prefix = site.config['schedule_session_title_prefix'] || 'Schedule: '
|
271
|
+
self.data['title'] = "#{schedule_session_title_prefix}#{session['name']}"
|
272
|
+
|
273
|
+
self.data['session'] = session
|
274
|
+
|
275
|
+
if File.exists?(File.join(base, '_includes', 'attendease', 'schedule', 'session.html'))
|
276
|
+
self.content = File.read(File.join(base, '_includes', 'attendease', 'schedule', 'session.html')) # Use theme specific layout
|
277
|
+
else
|
278
|
+
self.content = File.read(File.join(File.dirname(__FILE__), '..', '/templates/_includes/attendease/', 'schedule/session.html')) # Use template
|
279
|
+
end
|
201
280
|
end
|
202
281
|
end
|
203
282
|
|
283
|
+
class PresentersIndexPage < Page
|
284
|
+
def initialize(site, base, dir, presenters)
|
285
|
+
@site = site
|
286
|
+
@base = base
|
287
|
+
@dir = dir
|
288
|
+
@name = 'index.html'
|
204
289
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
290
|
+
self.process(@name)
|
291
|
+
|
292
|
+
self.read_yaml(File.join(base, 'attendease_layouts'), 'presenters.html')
|
293
|
+
|
294
|
+
self.data['title'] = site.config['presenters_index_title_prefix'] || 'Presenters'
|
295
|
+
|
296
|
+
self.data['presenters'] = presenters
|
297
|
+
|
298
|
+
if File.exists?(File.join(base, '_includes', 'attendease', 'presenters', 'index.html'))
|
299
|
+
self.content = File.read(File.join(base, '_includes', 'attendease', 'presenters', 'index.html')) # Use theme specific layout
|
300
|
+
else
|
301
|
+
self.content = File.read(File.join(File.dirname(__FILE__), '..', '/templates/_includes/attendease/', 'presenters/index.html')) # Use template
|
302
|
+
end
|
209
303
|
end
|
304
|
+
end
|
210
305
|
|
211
|
-
|
212
|
-
|
306
|
+
class PresenterPage < Page
|
307
|
+
def initialize(site, base, dir, presenter, sessions)
|
308
|
+
@site = site
|
309
|
+
@base = base
|
310
|
+
@dir = dir
|
311
|
+
@name = 'index.html'
|
312
|
+
|
313
|
+
self.process(@name)
|
314
|
+
|
315
|
+
self.read_yaml(File.join(base, 'attendease_layouts'), 'presenters.html')
|
316
|
+
|
317
|
+
self.data['title'] = site.config['presenter_title_prefix'] || presenter['first_name'] + ' ' + presenter['last_name']
|
318
|
+
|
319
|
+
presenter['sessions'] = []
|
320
|
+
|
321
|
+
sessions.each do |session|
|
322
|
+
if session['speaker_ids'].include?(presenter['id'])
|
323
|
+
presenter['sessions'] << session
|
324
|
+
end
|
325
|
+
end
|
213
326
|
|
214
|
-
|
215
|
-
|
327
|
+
self.data['presenter'] = presenter
|
328
|
+
|
329
|
+
if File.exists?(File.join(base, '_includes', 'attendease', 'presenters', 'presenter.html'))
|
330
|
+
self.content = File.read(File.join(base, '_includes', 'attendease', 'presenters', 'presenter.html')) # Use theme specific layout
|
216
331
|
else
|
217
|
-
|
332
|
+
self.content = File.read(File.join(File.dirname(__FILE__), '..', '/templates/_includes/attendease/', 'presenters/presenter.html')) # Use template
|
218
333
|
end
|
219
334
|
end
|
220
335
|
end
|
221
336
|
|
222
|
-
class AttendeaseAuthScriptTag < Liquid::Tag
|
223
|
-
def render(context)
|
224
|
-
@attendease_data_path = "#{context['site']['source']}/_attendease_data"
|
225
337
|
|
226
|
-
|
338
|
+
class VenuesIndexPage < Page
|
339
|
+
def initialize(site, base, dir, venues)
|
340
|
+
@site = site
|
341
|
+
@base = base
|
342
|
+
@dir = dir
|
343
|
+
@name = 'index.html'
|
344
|
+
|
345
|
+
self.process(@name)
|
346
|
+
|
347
|
+
self.read_yaml(File.join(base, 'attendease_layouts'), 'schedule.html')
|
348
|
+
|
349
|
+
self.data['title'] = site.config['venues_index_title_prefix'] || 'Venues'
|
350
|
+
|
351
|
+
self.data['venues'] = venues
|
352
|
+
|
353
|
+
if File.exists?(File.join(base, '_includes', 'attendease', 'venues', 'index.html'))
|
354
|
+
self.content = File.read(File.join(base, '_includes', 'attendease', 'venues', 'index.html')) # Use theme specific layout
|
355
|
+
else
|
356
|
+
self.content = File.read(File.join(File.dirname(__FILE__), '..', '/templates/_includes/attendease/', 'venues/index.html')) # Use template
|
357
|
+
end
|
227
358
|
end
|
228
359
|
end
|
229
360
|
|
230
|
-
class
|
231
|
-
def
|
232
|
-
|
361
|
+
class VenuePage < Page
|
362
|
+
def initialize(site, base, dir, venue)
|
363
|
+
@site = site
|
364
|
+
@base = base
|
365
|
+
@dir = dir
|
366
|
+
@name = 'index.html'
|
367
|
+
|
368
|
+
self.process(@name)
|
369
|
+
|
370
|
+
self.read_yaml(File.join(base, 'attendease_layouts'), 'schedule.html')
|
371
|
+
|
372
|
+
self.data['title'] = site.config['venue_title_prefix'] || 'Venue'
|
373
|
+
|
374
|
+
self.data['venue'] = venue
|
375
|
+
|
376
|
+
if File.exists?(File.join(base, '_includes', 'attendease', 'venues', 'venue.html'))
|
377
|
+
self.content = File.read(File.join(base, '_includes', 'attendease', 'venues', 'venue.html')) # Use theme specific layout
|
378
|
+
else
|
379
|
+
self.content = File.read(File.join(File.dirname(__FILE__), '..', '/templates/_includes/attendease/', 'venues/venue.html')) # Use template
|
380
|
+
end
|
233
381
|
end
|
234
382
|
end
|
235
383
|
|
236
|
-
class
|
237
|
-
|
238
|
-
|
384
|
+
class AttendeaseScheduleGenerator < Generator
|
385
|
+
safe true
|
386
|
+
|
387
|
+
def generate(site)
|
388
|
+
if site.config['attendease'] && site.config['attendease']['api_host'] && site.config['attendease']['generate_schedule_pages']
|
389
|
+
|
390
|
+
# Fetch all the session data!
|
391
|
+
attendease_api_host = site.config['attendease']['api_host']
|
392
|
+
attendease_access_token = site.config['attendease']['access_token']
|
393
|
+
|
394
|
+
attendease_data_path = "#{site.source}/_attendease_data"
|
395
|
+
|
396
|
+
event = JSON.parse(File.read("#{attendease_data_path}/event.json"))
|
397
|
+
sessions = JSON.parse(File.read("#{attendease_data_path}/sessions.json"))
|
398
|
+
presenters = JSON.parse(File.read("#{attendease_data_path}/presenters.json"))
|
399
|
+
rooms = JSON.parse(File.read("#{attendease_data_path}/rooms.json"))
|
400
|
+
filters = JSON.parse(File.read("#{attendease_data_path}/filters.json"))
|
401
|
+
venues = JSON.parse(File.read("#{attendease_data_path}/venues.json"))
|
402
|
+
|
403
|
+
# Generate the template files if they don't yet exist.
|
404
|
+
files_to_create_if_they_dont_exist = [
|
405
|
+
'schedule/index.html', 'schedule/day.html', 'schedule/sessions.html', 'schedule/session.html',
|
406
|
+
'presenters/index.html', 'presenters/presenter.html',
|
407
|
+
'venues/index.html', 'venues/venue.html',
|
408
|
+
]
|
409
|
+
|
410
|
+
files_to_create_if_they_dont_exist.each do |file|
|
411
|
+
FileUtils.mkdir_p("#{site.source}/_includes/attendease/schedule")
|
412
|
+
FileUtils.mkdir_p("#{site.source}/_includes/attendease/presenters")
|
413
|
+
FileUtils.mkdir_p("#{site.source}/_includes/attendease/venues")
|
414
|
+
|
415
|
+
if !File.exists?(File.join(site.source, '_includes/attendease/', file))
|
416
|
+
include_file = File.read(File.join(File.dirname(__FILE__), '..', '/templates/_includes/attendease/', file))
|
417
|
+
File.open(File.join(site.source, '_includes/attendease/', file), 'w+') { |out_file| out_file.write(include_file) }
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
sessions = Jekyll::Attendease::sessions_with_all_data(sessions, presenters, rooms, venues, filters)
|
422
|
+
|
423
|
+
# /schedule pages.
|
424
|
+
dir = (site.config['attendease'] && site.config['attendease']['schedule_path_name']) ? site.config['attendease']['schedule_path_name'] : 'schedule'
|
425
|
+
|
426
|
+
if (site.config['attendease'] && site.config['attendease']['show_day_index'])
|
427
|
+
site.pages << ScheduleIndexPage.new(site, site.source, File.join(dir), event['dates'])
|
428
|
+
else
|
429
|
+
site.pages << ScheduleDayPage.new(site, site.source, File.join(dir), event['dates'].first, sessions, event['dates'])
|
430
|
+
end
|
431
|
+
|
432
|
+
site.pages << ScheduleSessionsPage.new(site, site.source, File.join(dir, 'sessions'), sessions)
|
433
|
+
|
434
|
+
event['dates'].each do |day|
|
435
|
+
site.pages << ScheduleDayPage.new(site, site.source, File.join(dir, day['date']), day, sessions, event['dates'])
|
436
|
+
end
|
437
|
+
|
438
|
+
sessions.each do |session|
|
439
|
+
site.pages << ScheduleSessionPage.new(site, site.source, File.join(dir, session['code']), session)
|
440
|
+
end
|
441
|
+
|
442
|
+
# /presenters pages.
|
443
|
+
dir = (site.config['attendease'] && site.config['attendease']['presenters_path_name']) ? site.config['attendease']['presenters_path_name'] : 'presenters'
|
444
|
+
|
445
|
+
site.pages << PresentersIndexPage.new(site, site.source, File.join(dir), presenters)
|
446
|
+
|
447
|
+
presenters.each do |presenter|
|
448
|
+
site.pages << PresenterPage.new(site, site.source, File.join(dir, presenter['id']), presenter, sessions)
|
449
|
+
end
|
450
|
+
|
451
|
+
# /venue pages.
|
452
|
+
dir = (site.config['attendease'] && site.config['attendease']['venues_path_name']) ? site.config['attendease']['venues_path_name'] : 'venues'
|
453
|
+
|
454
|
+
site.pages << VenuesIndexPage.new(site, site.source, File.join(dir), venues)
|
455
|
+
|
456
|
+
venues.each do |venue|
|
457
|
+
site.pages << VenuePage.new(site, site.source, File.join(dir, venue['id']), venue)
|
458
|
+
end
|
459
|
+
end
|
239
460
|
end
|
461
|
+
|
240
462
|
end
|
241
463
|
|
242
|
-
|
243
|
-
|
244
|
-
|
464
|
+
def self.sessions_with_all_data(sessions, presenters, rooms, venues, filters)
|
465
|
+
sessionsData = []
|
466
|
+
|
467
|
+
sessions.each do |s|
|
468
|
+
session = {
|
469
|
+
'id' => s['id'],
|
470
|
+
'name' => s['name'],
|
471
|
+
'description' => s['description'],
|
472
|
+
'code' => s['code'],
|
473
|
+
'speaker_ids' => s['speaker_ids']
|
474
|
+
}
|
475
|
+
|
476
|
+
session['presenters'] = []
|
477
|
+
presenters.select{|presenter| s['speaker_ids'].include?(presenter['id'])}.each do |presenter|
|
478
|
+
session['presenters'] << {
|
479
|
+
'id' => presenter['id'],
|
480
|
+
'first_name' => presenter['first_name'],
|
481
|
+
'last_name' => presenter['last_name'],
|
482
|
+
'company' => presenter['company'],
|
483
|
+
'title' => presenter['title'],
|
484
|
+
'profile_url' => presenter['profile_url'],
|
485
|
+
}
|
486
|
+
end
|
487
|
+
|
488
|
+
filters_for_session_hash = {}
|
489
|
+
filters.each do |filter|
|
490
|
+
filter['filter_items'].each do |filter_item|
|
491
|
+
if s['filters'].include?(filter_item['id'])
|
492
|
+
filters_for_session_hash[filter['name']] = [] unless filters_for_session_hash[filter['name']]
|
493
|
+
filters_for_session_hash[filter['name']] << {
|
494
|
+
'name' => filter_item['name']
|
495
|
+
}
|
496
|
+
end
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
filters_for_session = filters_for_session_hash.map do |key, value|
|
501
|
+
{
|
502
|
+
'name' => key,
|
503
|
+
'items' => value
|
504
|
+
}
|
505
|
+
end
|
506
|
+
|
507
|
+
session['filters'] = filters_for_session
|
508
|
+
|
509
|
+
if s['instances']
|
510
|
+
instances = []
|
511
|
+
s['instances'].each do |i|
|
512
|
+
instance = {
|
513
|
+
'id' => i['id'],
|
514
|
+
'time' => i['time'],
|
515
|
+
'date' => i['date'],
|
516
|
+
'time_formatted' => i['time_formatted'],
|
517
|
+
'date_formatted' => i['date_formatted'],
|
518
|
+
'duration' => i['duration'],
|
519
|
+
'room_id' => i['room_id'],
|
520
|
+
}
|
521
|
+
|
522
|
+
room = rooms.select{|room| room['id'] == i['room_id'] }.first
|
523
|
+
venue = venues.select{|venue| venue['id'] == room['venue_id'] }.first
|
524
|
+
|
525
|
+
instance['room'] = {
|
526
|
+
'name' => room['name'],
|
527
|
+
'venue_id' => room['venue_id'],
|
528
|
+
'venue_name' => venue['name'],
|
529
|
+
'capacity' => room['capacity']
|
530
|
+
}
|
531
|
+
|
532
|
+
instances << instance
|
533
|
+
end
|
534
|
+
session['instances'] = instances
|
535
|
+
else
|
536
|
+
session['instances'] = []
|
537
|
+
end
|
538
|
+
|
539
|
+
sessionsData << session
|
245
540
|
end
|
541
|
+
|
542
|
+
sessionsData
|
246
543
|
end
|
247
544
|
|
248
545
|
end
|
@@ -250,13 +547,7 @@ end
|
|
250
547
|
|
251
548
|
Liquid::Template.register_tag('attendease_content', Jekyll::Attendease::AttendeaseContent)
|
252
549
|
Liquid::Template.register_tag('attendease_auth_script', Jekyll::Attendease::AttendeaseAuthScriptTag)
|
550
|
+
Liquid::Template.register_tag('attendease_scheduler_script', Jekyll::Attendease::AttendeaseSchedulerScriptTag)
|
551
|
+
Liquid::Template.register_tag('attendease_locales_script', Jekyll::Attendease::AttendeaseLocalesScriptTag)
|
253
552
|
Liquid::Template.register_tag('attendease_auth_account', Jekyll::Attendease::AttendeaseAuthAccountTag)
|
254
553
|
Liquid::Template.register_tag('attendease_auth_action', Jekyll::Attendease::AttendeaseAuthActionTag)
|
255
|
-
Liquid::Template.register_tag('attendease_test_register_choose_pass', Jekyll::Attendease::AttendeaseTest)
|
256
|
-
Liquid::Template.register_tag('attendease_test_register_checkout', Jekyll::Attendease::AttendeaseTest)
|
257
|
-
Liquid::Template.register_tag('attendease_test_register_dashboard', Jekyll::Attendease::AttendeaseTest)
|
258
|
-
Liquid::Template.register_tag('attendease_test_schedule', Jekyll::Attendease::AttendeaseTest)
|
259
|
-
Liquid::Template.register_tag('attendease_test_session', Jekyll::Attendease::AttendeaseTest)
|
260
|
-
Liquid::Template.register_tag('attendease_test_session_instance', Jekyll::Attendease::AttendeaseTest)
|
261
|
-
Liquid::Template.register_tag('attendease_test_presenters', Jekyll::Attendease::AttendeaseTest)
|
262
|
-
Liquid::Template.register_tag('attendease_test_presenter', Jekyll::Attendease::AttendeaseTest)
|