#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

# A few helpful tips about the Rules file:
#
# * The string given to #compile and #route are matching patterns for
#   identifiers--not for paths. Therefore, you can’t match on extension.
#
# * The order of rules is important: for each item, only the first matching
#   rule is applied.
#
# * Item identifiers start and end with a slash (e.g. “/about/” for the file
#   “content/about.html”). To select all children, grandchildren, … of an
#   item, use the pattern “/about/*/”; “/about/*” will also select the parent,
#   because “*” matches zero or more characters.

preprocess do
  def reference_links
    # find reference items
    references = @items.select{|item| item.identifier.start_with? '/references/'}

    # load references
    ref_content = references.map{|r| File.open(r[:filename]).readlines}.join("\n\n")

    # add references to every markdown item
    unless references.nil?
      @site.printed_items.each do |item|
        if item[:extension] == "mkd"
          item.add_references ref_content
        end
      end
    end
  end

  def hide_pages
    @items.each do |item|
      if item.identifier.match %r{^/(styles|references)/}
        item[:is_hidden] = true
      end
    end
  end

  hide_pages # must be first
  @site.initialize_items
  reference_links
end

compile '/styles/*' do
  if @item.binary?
    # pass images used for styling
  else
    filter :sass, :syntax => :scss
  end
end

compile '/stuff/*' do
  # pass
end

compile '/references/*' do
  # link references are only added to other files
end

compile '/feed/' do
  filter :erb
end

compile '/feed-merged/' do
  filter :erb
end

compile '*' do
  if @item.binary?
    # don't filter binary items
  else
    # little sanity check
    unless @item[:is_category] or @item[:non_cognitive]
      [:techne, :episteme, :date, :title].each do |header|
        if @item[header].nil?
          puts "#{@item.identifier} is missing #{header}."
        end
      end
    end

    # file-specific changes
    case @item[:extension]
    when "mkd" # normal pages
      filter :erb
      filter :kramdown, :toc_levels => [1,2]
      filter :markdown_link_check unless @item.draft?
      filter :colorize_syntax, :default_colorizer => :pygmentize
    when "org" # org-mode pages
      filter :org
    when "erb" # general erb files
      filter :erb
    end

    # layout
    unless @item[:is_hidden]
      if @site.blog?
        layout 'blog'
      else
        layout 'default'
      end

      # clean up
      filter :tidy
    end
  end
end

compile '/log/*', :rep => :wordcount do
  if @item[:extension] == "mkd"
    filter :erb
    filter :kramdown
    filter :tidy
  end
end

route '*', :rep => :wordcount do
  # pass
end

route '/feed/' do
  '/rss.xml'
end

route '/feed-merged/' do
  '/rss-merged.xml'
end

route '/htaccess/' do
  '/.htaccess'
end

route '/robots/' do
  '/robots.txt'
end

route '/sitemap/' do
  '/sitemap.xml'
end

route '/styles/*' do
  if @item.binary?
    route_unchanged
  else
    route_with_new_extension "css"
  end
end

route '/references/*' do
  # pass
end

# never change /stuff
route '/stuff/*' do
  route_unchanged
end

route '/pigs/*' do
  route_unchanged
end

route '*' do
  if item.binary?
    route_unchanged
  else
    # Write item with identifier /foo/ to /foo/index.html
    item.identifier + 'index.html'
  end
end

layout '*', :erb
