dash-docs/_plugins/events.rb
David A. Harding b9e114efe8
Build: allow repeated rebuilding in Jekyll Preview mode
The events and contributor plugins both monkey patched the `site`
object.  This worked fine when they were loaded once per site build, but
with Jekyll 3.0 automatic site rebuilding in preview and watch modes,
this applied the monkey patch recursively, causing the program to halt.

With this commit, the monkey patching should only occur once per run.
2017-06-23 11:46:20 -04:00

102 lines
3.3 KiB
Ruby

# This file is licensed under the MIT License (MIT) available on
# http://opensource.org/licenses/MIT.
#events.rb sets the site.conferences array based
#on events in _events/
#This is later used to populate the events map and display the
#list in chronological order, in the RSS file and events pages.
require 'open-uri'
require 'json'
require 'date'
require 'yaml'
require 'cgi'
module Jekyll
class EventPageGenerator < Generator
def conferences
conferences = []
# Loop in _events.yml
YAML.load_file('_events.yml').each do |data|
# Skip event if it has started more than five days ago
date = data['date'].to_s.split('-')
next if Time.new.to_i > (Time.new(date[0].to_i,date[1].to_i,date[2].to_i).to_i + 432000)
# Get geolocalisation data from Google Maps
if data.has_key?('address')
begin
geoloc = JSON.parse(open("https://maps.googleapis.com/maps/api/geocode/json?address=" + CGI::escape(data['address'] + ', ' + data['city'] + ', ' + data['country']) + "&sensor=false","User-Agent"=>"Ruby/#{RUBY_VERSION}").read)
if geoloc['status'] == 'OK'
data['geoloc'] = {'lat' => geoloc['results'][0]['geometry']['location']['lat'].to_s, 'lon' => geoloc['results'][0]['geometry']['location']['lng'].to_s}
end
rescue
print 'Google Maps API Call Failed!'
end
end
# Populate conferences array
conferences.push(data)
end
return conferences
end
def generate(site)
# Set site.meetups and site.conferences global variables for liquid/jekyll
if ! site.respond_to?('conferences')
class << site
attr_accessor :meetups, :conferences
alias event_site_payload site_payload
def site_payload
h = event_site_payload
payload = h["site"]
payload["conferences"] = self.conferences
h["site"] = payload
h
end
end
end
# Set site.conferences array
site.conferences = {}
#Do nothing if plugin is disabled
if !ENV['ENABLED_PLUGINS'].nil? and ENV['ENABLED_PLUGINS'].index('events').nil?
print 'Events disabled' + "\n"
return
end
## Create cache directory if it doesn't exist
if !File.exists?('_cache')
Dir.mkdir('_cache')
end
## Populate site.conferences with conferences from _events.yml
## plus geodata from Google. Store data in the cache and only
## re-retrieve the geodata if _events.yml is edited or the cache
## file is deleted.
conferences_cache = '_cache/conferences.marshall'
events_file = '_events.yml'
events_file_unix_time = File.stat(events_file).mtime.to_i
if File.exists?(conferences_cache)
conferences_cache_unix_time = File.stat(conferences_cache).mtime.to_i
else
conferences_cache_unix_time = 0
end
if events_file_unix_time >= conferences_cache_unix_time
site.conferences = conferences()
File.open(conferences_cache,'w') do |file|
Marshal.dump(site.conferences, file)
end
else
File.open(conferences_cache,'r') do |file|
site.conferences = Marshal.load(file)
end
end
end
end
end