# # File 'resourcemanager.rb' created on 06 feb 2008 at 21:44:10. # # See 'dokkit.rb' or +LICENSE+ for licence information. # # (C) 2006, 2007 Andrea Fazzi (and contributors). # require 'dokkit' require 'dokkit/hash' require 'dokkit/cachemanager' require 'dokkit/fileselection' DOCUMENT_DIR = 'doc/pages/' OUTPUT_DIR = 'output/' LAYOUT_DIR = 'doc/layouts/' CONFIG_DIR = 'doc/configs/' DATA_DIR = 'doc/data/' module Dokkit module DocumentManager attr_accessor :document_dir attr_accessor :documents def documentmanager_defaults @document_dir = DOCUMENT_DIR @documents = FileSelection.new(@document_dir) { |fs| fs.include('*') } end end module OutputManager attr_accessor :output_dir attr_accessor :output_ext attr_reader :outputs def outputmanager_defaults @output_dir = OUTPUT_DIR @output_ext = '.html' @outputs = { } end private def collect_outputs @documents.files.each do |document| if(@config[document]['document'].has_key?('render')) output_ext = @config[document]['document']['render']['ext'] if @config[document]['document']['render']['ext'] output_dir = @config[document]['document']['render']['output'] if @config[document]['document']['render']['output'] @outputs[document] = File.join(@output_dir, output_dir, File.basename(document)) + output_ext else @outputs[document] = output_fn_helper(document) end end end def output_fn_helper(fn, output_ext = @output_ext) filename_helper(fn, document_dir, output_dir, output_ext) end end module DataManager attr_accessor :data_dir attr_reader :data def datamanager_defaults @data_dir = DATA_DIR @data = Dokkit::FileSelection.new(@data_dir) { |fs| fs.include('*') } end def data_fn_helper(fn) filename_helper(fn, data_dir, output_dir) end end module ConfigManager attr_accessor :config_dir attr_reader :configs attr_reader :config def configmanager_defaults @config_dir = 'doc/configs/' @configs = { } @config = { } end def resolve_common_configs(document) FileList.new(File.join(document_dir, '**/COMMON.yaml')).exclude(/#{File.dirname(document)}\/.*\/.*/).reverse! end def collect_configs @documents.files.each do |document| @configs[document] = [] @configs[document] << (config_fn_helper(document)) if File.exists?(config_fn_helper(document)) @configs[document].concat(resolve_common_configs(document)) @configs[document] << (document + '.yaml') if File.exists?(document + '.yaml') end @configs end private def load_configs collect_configs.each do |document, configs| @config[document] = { } configs.each do |fn| @config[document].recursive_merge!(YAML::load(File.open(fn))) if @config[document].has_key?('document') if @config[document]['document'].has_key?('config') @configs[document] << @config[document]['document']['config'] + '.yaml' @config[document]['document'].delete('config') end end end end @config end def config_fn_helper(fn) filename_helper(fn, document_dir, config_dir, '.yaml') end end module LayoutManager attr_accessor :layout_dir attr_reader :layouts def layoutmanager_defaults @layout_dir = 'doc/layouts/' @layouts = { } end def collect_layouts @documents.files.each do |document| @layouts[document] = [] @layouts[document] << (layout_fn_helper(document)) if File.exists?(layout_fn_helper(document)) @layouts[document] << (document + '.html') if File.exists?(document + '.html') if @config[document]['document']['layout'] @layouts[document] = (@config[document]['document']['layout'] + '.html') if File.exists?(@config[document]['document']['layout'] + '.html') end end @layouts end private def layout_fn_helper(fn) filename_helper(fn, document_dir, layout_dir, '.html') end end class ResourceManager include DocumentManager, OutputManager, ConfigManager, LayoutManager, DataManager def initialize set_defaults yield self if block_given? load_configs collect_outputs collect_layouts end def set_defaults documentmanager_defaults outputmanager_defaults configmanager_defaults layoutmanager_defaults datamanager_defaults end private # Get a new filename from a given filename substituting the # sub_dir portion of the given file with new_dir and the file # extension with new_ext. # # Example: # # filename_helper('output/subdir/document.output', 'output', 'doc/pages', '.in') # # should return: # # => 'doc/pages/subdir/document.in' # def filename_helper(fn, sub_dir, new_dir, new_ext = '') ext = File.extname(fn).sub(/^\./,'') # strip leading dot new_fn = fn.sub(/#{sub_dir}/, new_dir) new_fn = new_fn << new_ext unless new_ext.empty? #new_fn.sub(/#{ext}$/, new_ext) unless new_ext.empty? new_fn end end end