jekyll-attendease 0.4.0 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a4e8e229431f137cc9a5e5d13e0d1b8d54bd818
4
- data.tar.gz: 8a90821d278b7c5808185b0d0bcf914801f3fe94
3
+ metadata.gz: 75b3ac6437c60cf1f0e8ff306bbe434f5579a0ed
4
+ data.tar.gz: 3332793ac437f20cb1410d4a6b0e137159704459
5
5
  SHA512:
6
- metadata.gz: 6df9c2d6992f2a4c49579c837811fcb149f4131480a28f135e0035dc8ac82bce5647f63c62c442a8dc8463fb8ac4d74237f1a38c34cd6bd0aab8f6c7723aa9ef
7
- data.tar.gz: 98ce3da058b7370ece11ab03b3152a0618554d673f2bddb112b7e447ab635a35ef31d20b7976a918007d5f8306cba07226dab79434e86428596a46e0edf3e942
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
- test_mode: true # this generates pages for /regsister, /schedule, and /presenters for local development and styling.
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
@@ -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.config['source']}/_attendease_data"
34
+ @attendease_data_path = "#{site.source}/_attendease_data"
33
35
 
34
36
  FileUtils.mkdir_p(@attendease_data_path)
35
37
 
36
- update_data = true
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
- site_json = File.read("#{@attendease_data_path}/site.json")
40
+ data_files.each do |file_name|
41
+ update_data = true
43
42
 
44
- event_data = JSON.parse(site_json)
45
- end
46
- end
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
- if update_data
49
- event_data = get("#{@attendease_config['api_host']}api/site.json")
47
+ json = File.read("#{@attendease_data_path}/#{file_name}")
50
48
 
51
- if !event_data['error']
52
- puts "[Attendease] Saving event data..."
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 @attendease_config['test_mode']
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
- #pages_to_fetch = ['choose_pass', 'checkout', 'dashboard']
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
- # Registration test pages, so we can style the forms!
64
- fetch_pages ['choose_pass', 'checkout', 'dashboard'], 'register'
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
- # Schedule test pages, so we can style the forms!
67
- fetch_pages ['schedule', 'session', 'session_instance']
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
- # Presenter test pages, so we can style the forms!
70
- fetch_pages ['presenters', 'presenter']
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.config['source']}/attendease_layouts"
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.config['source']}/_layouts/layout.html")
104
+ if File.exists?("#{site.source}/_layouts/#{base_layout}.html")
124
105
 
125
- # create a layout file if is already doesn't exist.
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?("#{site.config['source']}/attendease_layouts/#{layout}.html")
130
- theme_layout_content = <<-eos
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
- class TestPages < Generator
148
- safe true
125
+ self.process(name)
149
126
 
150
- def generate(site)
151
- if @attendease_config = site.config['attendease']
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
- if @attendease_config['test_mode']
154
- puts " [Attendease] Generating pages to test the layouts..."
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
- puts " [Attendease] Generating /register/index.html"
157
- site.pages << RegisterTestPage.new(site, site.source, File.join('register'), {:name => 'index.html', :liquid_tag => 'attendease_test_register_choose_pass'})
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
- puts " [Attendease] Generating /register/checkout.html"
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
- puts " [Attendease] Generating /register/dashboard.html"
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
- puts " [Attendease] Generating /presenters/index.html"
166
- site.pages << RegisterTestPage.new(site, site.source, File.join('presenters'), {:name => 'index.html', :liquid_tag => 'attendease_test_presenters'})
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
- puts " [Attendease] Generating /presenters/presenter.html"
169
- site.pages << RegisterTestPage.new(site, site.source, File.join('presenters'), {:name => 'presenter.html', :liquid_tag => 'attendease_test_presenter'})
209
+ self.data['day'] = day
210
+ self.data['dates'] = dates
170
211
 
171
- puts " [Attendease] Generating /schedule/index.html"
172
- site.pages << RegisterTestPage.new(site, site.source, File.join('schedule'), {:name => 'index.html', :liquid_tag => 'attendease_test_schedule'})
212
+ instances = []
173
213
 
174
- puts " [Attendease] Generating /schedule/session.html"
175
- site.pages << RegisterTestPage.new(site, site.source, File.join('schedule'), {:name => 'session.html', :liquid_tag => 'attendease_test_session'})
214
+ sessions.each do |s|
215
+ s['instances'].each do |instance|
216
+ if instance['date'] == day['date']
217
+ instance['session'] = s
176
218
 
177
- puts " [Attendease] Generating /schedule/session_instance.html"
178
- site.pages << RegisterTestPage.new(site, site.source, File.join('schedule'), {:name => 'session_instance.html', :liquid_tag => 'attendease_test_session_instance'})
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 RegisterTestPage < Page
186
- def initialize(site, base, dir, page_data)
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 = page_data[:name]
239
+ @name = 'index.html'
191
240
 
192
241
  self.process(@name)
193
242
 
194
- if File.exists?(File.join(base, 'attendease_layouts', 'register.html'))
195
- self.read_yaml(File.join(base, 'attendease_layouts'), 'register.html')
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.read_yaml(File.join(base, 'attendease_layouts'), 'layout.html')
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
- self.content.gsub! /\{\% attendease_content \%\}/, "{% #{page_data[:liquid_tag]} %}"
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
- class AttendeaseTest < Liquid::Tag
206
- def initialize(tag_name, text, tokens)
207
- super
208
- @tag_name = tag_name
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
- def render(context)
212
- @attendease_data_path = "#{context['site']['source']}/_attendease_data"
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
- if File.exists?("#{@attendease_data_path}/#{@tag_name}.html")
215
- File.read("#{@attendease_data_path}/#{@tag_name}.html")
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
- raise "#{@attendease_data_path}/#{@tag_name}.html not found."
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
- "<script type=\"text/javascript\">#{File.open(File.expand_path(File.dirname(__FILE__) + "/../assets/auth_check.js")).read}</script>"
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 AttendeaseAuthAccountTag < Liquid::Tag
231
- def render(context)
232
- '<div id="attendease-auth-account"></div>'
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 AttendeaseAuthActionTag < Liquid::Tag
237
- def render(context)
238
- '<div id="attendease-auth-action"></div>'
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
- class AttendeaseContent < Liquid::Tag
243
- def render(context)
244
- "{{ content }}"
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)