require 'haml' require 'csv' require 'logger' class Petrify @@output_dir = '_site' @@working_dir = File.join(Dir.pwd, @@output_dir) @@views_dir = 'views' @@layout_fn = File.join(@@views_dir, 'layout.haml') # https://stackoverflow.com/questions/917566/ruby-share-logger-instance-among-module-classes#6768164 @@log = Logger.new($stdout) @@log.level = Logger::INFO def self.page(path_items, template, locals = {}) dir = create_path(path_items) 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 # TODO - add page to sitemap.xml or sitemap.txt # https://support.google.com/webmasters/answer/183668?hl=en&ref_topic=4581190 end def self.csv(path_items, filename, data) dir = create_path(path_items) fn = File.join(dir, filename + '.csv') csv_string = CSV.generate do |csv| csv << data.first.keys # header row data.each { |row| csv << row.values } end File.write(fn, csv_string) @@log.info fn end def self.setup # 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('public', @@working_dir) end def self.create_path(path_items) dir = File.join(@@output_dir, path_items) FileUtils.mkdir_p(dir) @@log.debug dir dir end end