require 'haml' require 'csv' require 'logger' require "petrify/version" module 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 # Write an HTML page using a specified template and optional data 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(Object.new, locals) 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 # Write a CSV file from an array of hashes (or an empty array) def self.csv(path_items, filename, data) dir = create_path(path_items) fn = File.join(dir, filename + '.csv') if data.size > 0 csv_string = CSV.generate do |csv| csv << data.first.keys # header row data.each { |row| csv << row.values } end else # There's no data so write an empty file (no header row either) csv_string = '' end File.write(fn, csv_string) @@log.info fn end # Write an arbitrary file to output (eg a JSON file) def self.file(path_items, filename, data) dir = create_path(path_items) fn = File.join(dir, filename) File.write(fn, data) @@log.info fn end def self.setup # Recursively delete working directory to ensure no redundant files are left behind from previous builds. # But preserve dot-files (especially .git directory) FileUtils.rm_r(Dir.glob(File.join(@@working_dir, '*'))) Dir.mkdir(@@working_dir) unless File.directory?(@@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