| @@ -1,52 +1,16 @@ | |||||
| #!/usr/bin/env ruby | #!/usr/bin/env ruby | ||||
| # Generate a static site | |||||
| # https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/ | |||||
| t_start = Process.clock_gettime(Process::CLOCK_MONOTONIC) | |||||
| require 'logger' | |||||
| require 'haml' | |||||
| require 'petrify' | |||||
| require_relative '../models' | require_relative '../models' | ||||
| require_relative '../lib/helpers' | require_relative '../lib/helpers' | ||||
| OUTPUT_DIR = '_site' | |||||
| VIEWS_DIR = File.join('..', 'views') | |||||
| LAYOUT_FN = File.join(VIEWS_DIR, 'layout.haml') | |||||
| def write_page(path_items, template, locals = {}) | |||||
| dir = File.join(path_items) | |||||
| FileUtils.mkdir_p(dir) | |||||
| @log.debug dir | |||||
| fn = File.join(dir, 'index.html') | |||||
| # https://stackoverflow.com/questions/6125265/using-layouts-in-haml-files-independently-of-rails | |||||
| html = Haml::Engine.new(File.read(LAYOUT_FN)).render do | |||||
| Haml::Engine.new(File.read(File.join(VIEWS_DIR, "#{template}.haml"))).render(Object.new, locals) | |||||
| end | |||||
| File.write(fn, html) | |||||
| @log.info fn | |||||
| @pages += 1 | |||||
| # TODO - add page to sitemap.xml or sitemap.txt | |||||
| # https://support.google.com/webmasters/answer/183668?hl=en&ref_topic=4581190 | |||||
| end | |||||
| def gen_info_pages | def gen_info_pages | ||||
| write_page('about', 'about') | |||||
| write_page('guides', 'guides') | |||||
| write_page(%w(guides how-the-parliament-election-works), 'parliament') | |||||
| write_page(%w(guides how-the-council-election-works), 'election') | |||||
| Petrify.page('about', 'about') | |||||
| Petrify.page('guides', 'guides') | |||||
| Petrify.page(%w(guides how-the-parliament-election-works), 'parliament') | |||||
| Petrify.page(%w(guides how-the-council-election-works), 'election') | |||||
| end | end | ||||
| def gen_bodies_pages | def gen_bodies_pages | ||||
| # Bodies index | |||||
| dir = 'bodies' | |||||
| FileUtils.mkdir_p(dir) | |||||
| @log.debug dir | |||||
| fn = File.join(dir, 'index.html') | |||||
| FileUtils.touch(fn) # empty file | |||||
| @log.info fn | |||||
| # Body detail pages | # Body detail pages | ||||
| Body.each do |b| | Body.each do |b| | ||||
| locals = { | locals = { | ||||
| @@ -72,7 +36,7 @@ def gen_bodies_pages | |||||
| ORDER BY e.d DESC | ORDER BY e.d DESC | ||||
| ", b.id) | ", b.id) | ||||
| write_page(['bodies', b.slug], 'body', locals) | |||||
| Petrify.page(['bodies', b.slug], 'body', locals) | |||||
| # Districts for this body | # Districts for this body | ||||
| b.districts.each do |d| | b.districts.each do |d| | ||||
| @@ -80,7 +44,7 @@ def gen_bodies_pages | |||||
| district: d, | district: d, | ||||
| body: b | body: b | ||||
| } | } | ||||
| write_page(['bodies', b.slug, b.districts_name, d.slug], 'district', locals) | |||||
| Petrify.page(['bodies', b.slug, b.districts_name, d.slug], 'district', locals) | |||||
| end | end | ||||
| end | end | ||||
| end | end | ||||
| @@ -88,7 +52,7 @@ end | |||||
| def gen_candidates_pages | def gen_candidates_pages | ||||
| # Candidate index | # Candidate index | ||||
| locals = { candidates: Candidate.all(:order => [ :surname, :forenames ]) } | locals = { candidates: Candidate.all(:order => [ :surname, :forenames ]) } | ||||
| write_page('candidates', 'candidates', locals) | |||||
| Petrify.page('candidates', 'candidates', locals) | |||||
| # Candidate pages | # Candidate pages | ||||
| # FIXME: What do we do about deleted candidates/redirects? | # FIXME: What do we do about deleted candidates/redirects? | ||||
| @@ -128,7 +92,7 @@ def gen_candidates_pages | |||||
| ORDER BY d | ORDER BY d | ||||
| ", c.id) | ", c.id) | ||||
| write_page(['candidates', c.id.to_s], 'candidate', locals) | |||||
| Petrify.page(['candidates', c.id.to_s], 'candidate', locals) | |||||
| end | end | ||||
| end | end | ||||
| @@ -171,8 +135,7 @@ def gen_elections_pages | |||||
| ORDER BY seatz DESC, votez DESC | ORDER BY seatz DESC, votez DESC | ||||
| ", e.id) | ", e.id) | ||||
| write_page(['bodies', e.body.slug, 'elections', e.d.to_s], 'electionsummary', locals) | |||||
| Petrify.page(['bodies', e.body.slug, 'elections', e.d.to_s], 'electionsummary', locals) | |||||
| # District results for this election (resultsdistrict) | # District results for this election (resultsdistrict) | ||||
| # Loop through all districts in this election | # Loop through all districts in this election | ||||
| @@ -225,7 +188,7 @@ def gen_elections_pages | |||||
| ORDER BY total_votes DESC | ORDER BY total_votes DESC | ||||
| ", d.id, e.id) | ", d.id, e.id) | ||||
| write_page(['bodies', e.body.slug, 'elections', e.d.to_s, e.body.districts_name, d.slug], 'resultsdistrict', locals) | |||||
| Petrify.page(['bodies', e.body.slug, 'elections', e.d.to_s, e.body.districts_name, d.slug], 'resultsdistrict', locals) | |||||
| end | end | ||||
| end | end | ||||
| end | end | ||||
| @@ -235,33 +198,12 @@ def gen_homepage | |||||
| future_elections: Election.future, | future_elections: Election.future, | ||||
| past_elections: Election.past | past_elections: Election.past | ||||
| } | } | ||||
| write_page('.', 'index', locals) | |||||
| Petrify.page('.', 'index', locals) | |||||
| end | end | ||||
| def create_output_dir | |||||
| working_dir = File.join(Dir.pwd, OUTPUT_DIR) | |||||
| # Recursively delete working directory to ensure no redundant files are left behind from previous builds. | |||||
| FileUtils.rm_rf(working_dir) | |||||
| Dir.mkdir(working_dir) unless File.directory?(working_dir) | |||||
| Dir.chdir(working_dir) | |||||
| # Copy `public` dir to output dir | |||||
| FileUtils.copy_entry(File.join('..', 'public'), '.') | |||||
| end | |||||
| @log = Logger.new($stdout) | |||||
| @log.level = Logger::INFO | |||||
| @log.info "Build starts." | |||||
| @log.info "Output directory is: #{OUTPUT_DIR}" | |||||
| @pages = 0 # count the number of pages generated | |||||
| create_output_dir | |||||
| Petrify.setup | |||||
| gen_homepage | gen_homepage | ||||
| gen_elections_pages | gen_elections_pages | ||||
| gen_bodies_pages | gen_bodies_pages | ||||
| gen_info_pages | gen_info_pages | ||||
| gen_candidates_pages | gen_candidates_pages | ||||
| @log.info "Build complete. %d pages generated in %0.2f seconds." % [ @pages, Process.clock_gettime(Process::CLOCK_MONOTONIC) - t_start ] | |||||