Skip to content

Instantly share code, notes, and snippets.

@nfrankel
Created January 6, 2021 09:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nfrankel/52e65c8dbe1da7f8751e1e7bda67fa53 to your computer and use it in GitHub Desktop.
Save nfrankel/52e65c8dbe1da7f8751e1e7bda67fa53 to your computer and use it in GitHub Desktop.
module SpeakingPagePlugin
class TalkPageGenerator < Jekyll::Generator
def generate(site)
events = site.data['talk']
events_by_year = events.group_by do |event|
event['end-date'].strftime('%Y')
end
current_year = Date.today.strftime('%Y')
# Generate the main speaking page if the build occurs when no talks have been done yet
if !events_by_year.has_key?(current_year)
previous_year = (current_year.to_i - 1).to_s
events_by_year.each do |year, events|
generateTalkPage(site, previous_year, year, events_by_year)
end
else
events_by_year.each do |year, events|
generateTalkPage(site, current_year, year, events_by_year)
end
end
end
def generateTalkPage(site, current_year, year, events_by_year)
if year == current_year
site.pages << CurrentTalkPage.new(site, current_year, year, events_by_year)
else
site.pages << TalkPage.new(site, current_year, year, events_by_year)
end
end
end
class AbstractTalkPage < Jekyll::Page
def initialize(site, current_year, year, events_by_year)
@site = site
@base = site.source
@ext = '.html'
self.read_yaml(Jekyll::PathManager.join(@base, '_layouts'), 'talk.html')
years = events_by_year.keys.sort.reverse
link_by_year = years.map do |year|
{ 'year' => year, 'link' => year == current_year ? 'speaking' : "speaking/#{year}" }
end
events = events_by_year[year]
self.data['talks_count'] = events.inject(0) { |count, event| count + event['talks'].size }
self.data['year'] = year
self.data['years'] = link_by_year
self.data['events'] = events
data.default_proc = proc do |_, key|
site.frontmatter_defaults.find(relative_path, type, key)
end
Jekyll::Hooks.trigger :pages, :post_init, self
end
end
class CurrentTalkPage < AbstractTalkPage
def initialize(site, current_year, year, events_by_year)
super
@dir = 'speaking'
self.data['title'] = 'Speaking'
end
end
class TalkPage < AbstractTalkPage
def initialize(site, current_year, year, events_by_year)
super
@dir = Jekyll::PathManager.join('speaking', year)
self.data['title'] = "Speaking in #{year}"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment