class Jekyll::AttendeasePlugin::EventLayoutGenerator

Public Instance Methods

generate(site) click to toggle source
# File lib/jekyll/attendease_plugin/event_layout_generator.rb, line 16
def generate(site)
  Jekyll.logger.debug "[Attendease] Generating theme layouts..."

  layouts_path = File.join(site.source, '_layouts')

  cms_layouts = []
  begin
    Dir.glob(File.join(layouts_path, '*.html')).each do |l|
      html = File.read(l, encoding: 'UTF-8')
      
      if html =~ %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m
        data = YAML.load(Regexp.last_match(1))
        if data['cms_layout']
          cms_layouts << File.basename(l).split('.').first
        end
      end
    end
  rescue => e
    puts "Failed retrieviing CMS layouts. Message: #{e.message}"
  end

  cms_layouts.each do |layout|
    site.pages << EventLayoutPage.new(site, site.source, 'attendease_layouts', "cms-#{layout}.html", layout, layout.capitalize)
  end

  return unless site.config.live_mode?

  attendease_precompiled_theme_layouts_path = File.join(site.source, 'attendease_layouts') # These are compiled to the html site.
  attendease_precompiled_theme_email_layouts_path = File.join(site.source, 'attendease_layouts', 'emails') # These are compiled for email.

  FileUtils.mkdir_p(attendease_precompiled_theme_layouts_path)

  # Precompiled layouts for attendease app and jekyll generated pages.
  base_layout = site.config['attendease']['base_layout'] || 'layout'

  base_layout_file = File.join(layouts_path, "#{base_layout}.html")
  unless File.exists?(base_layout_file)
    # Generate an extremely simple base layout if it does not exist.
    File.open(base_layout_file, 'w+') { |f| f.write("{{ content }}") }
  end

  layouts_to_precompile = %w{ layout register surveys } # These are compiled to the html site.
  layouts_to_precompile.each do |layout|
    # create a layout file if it already doesn't exist.
    # the layout file will be used by attendease to wrap /register, /schedule, /presenters, '/surveys'
    # in the look these compiled file define.
    # ensure {{ content }} is in the file so we can render content in there!
    unless File.exists?(File.join(attendease_precompiled_theme_layouts_path, "#{layout}.html"))
      site.pages << EventLayoutPage.new(site, site.source, 'attendease_layouts', "#{layout}.html", base_layout, layout.capitalize)
    end
  end

  # Precompiled layouts for attendease email
  base_email_layout = site.config['attendease']['base_email_layout'] || 'email'
  base_email_layout_file = File.join(layouts_path, "#{base_email_layout}.html")
  unless File.exists?(base_email_layout_file)
    # Generate an extremely simple base email layout if it does not exist.
    File.open(base_email_layout_file, 'w+') { |f| f.write("{{ content }}") }
  end

  layouts_to_precompile = %w{ layout } # These are pre-compiled for email.
  layouts_to_precompile.each do |layout|
    # create a layout file if it already doesn't exist.
    unless File.exists?(File.join(attendease_precompiled_theme_email_layouts_path, "#{layout}.html"))
      site.pages << EventLayoutPage.new(site, site.source, 'attendease_layouts/emails', "#{layout}.html", base_email_layout, layout.capitalize)
    end
  end        
end