class Dimples::Site

A class representing a single generated website.

Attributes

config[RW]

Public Class Methods

generate(config = {}) click to toggle source
# File lib/dimples/site.rb, line 13
def self.generate(config = {})
  new(config).generate
end
new(config = {}) click to toggle source
# File lib/dimples/site.rb, line 17
def initialize(config = {})
  @config = Config.new(config)
end

Public Instance Methods

categories() click to toggle source
# File lib/dimples/site.rb, line 49
def categories
  @categories ||= {}.tap do |categories|
    posts.each do |post|
      post.categories.each do |category|
        categories[category] ||= []
        categories[category].append(post)
      end
    end
  end
end
generate() click to toggle source
# File lib/dimples/site.rb, line 21
def generate
  prepare_output_directory

  generate_posts
  generate_categories
  generate_pages

  copy_assets
end
layouts() click to toggle source
# File lib/dimples/site.rb, line 43
def layouts
  @layouts ||= Dir.glob(File.join(@config[:sources][:layouts], '**', '*.erb')).to_h do |path|
    [File.basename(path, '.erb'), Dimples::Sources::Layout.new(self, path)]
  end
end
metadata() click to toggle source
# File lib/dimples/site.rb, line 60
def metadata
  @metadata ||= Metadata.new(posts: posts, categories: categories)
end
pages() click to toggle source
# File lib/dimples/site.rb, line 37
def pages
  @pages ||= Dir.glob(File.join(@config[:sources][:pages], '**', '*.erb')).map do |path|
    Dimples::Sources::Page.new(self, path)
  end
end
posts() click to toggle source
# File lib/dimples/site.rb, line 31
def posts
  @posts ||= Dir.glob(File.join(@config[:sources][:posts], '**', '*.markdown')).map do |path|
    Dimples::Sources::Post.new(self, path)
  end.sort_by!(&:date).reverse!
end

Private Instance Methods

copy_assets() click to toggle source
# File lib/dimples/site.rb, line 99
def copy_assets
  return unless Dir.exist?(@config[:sources][:static])

  FileUtils.cp_r(File.join(@config[:sources][:static], '.'), @config[:output][:root])
end
generate_categories() click to toggle source
# File lib/dimples/site.rb, line 72
def generate_categories
  categories.each do |category, posts|
    metadata = { title: category.capitalize, category: category }
    Pager.paginate(self, "/categories/#{category}/", posts, metadata)
    generate_feed(File.join(@config[:output][:root], 'categories', category), posts)
  end
end
generate_feed(output_path, posts) click to toggle source
# File lib/dimples/site.rb, line 84
def generate_feed(output_path, posts)
  return if layouts['feed'].nil?

  layouts['feed'].write(
    File.join(output_path, 'feed.atom'),
    posts: posts.slice(0, 10)
  )
end
generate_pages() click to toggle source
# File lib/dimples/site.rb, line 80
def generate_pages
  pages.each(&:write)
end
generate_posts() click to toggle source
# File lib/dimples/site.rb, line 66
def generate_posts
  posts.each(&:write)
  Pager.paginate(self, @config[:output][:posts].gsub(@config[:output][:root], '').concat('/'), posts)
  generate_feed(@config[:output][:root], posts)
end
prepare_output_directory() click to toggle source
# File lib/dimples/site.rb, line 93
def prepare_output_directory
  raise "The site directory (#{@config[:output][:root]}) already exists." if Dir.exist?(@config[:output][:root])

  Dir.mkdir(@config[:output][:root])
end