lib/plate/site.rb in plate-0.6.0 vs lib/plate/site.rb in plate-0.6.1

- old
+ new

@@ -1,138 +1,144 @@ module Plate require 'tilt' - + # This class contains everything you'll want to know about a site. It contains all data # about the site, including blog posts, content pages, static files, assets and anything else. class Site include Callbacks - - attr_accessor :assets, :build_destination, :cache_location, :destination, + + attr_accessor :assets, :build_destination, :cache_location, :destination, :layouts, :logger, :metadata, :options, :pages, :posts, :source - + def initialize(source, destination, options = {}) # Setup source and destination for the site files self.source = source self.destination = destination - + # By default, the build goes into the destination folder. # Override this to output to a different folder by default self.build_destination = destination - + # Sanitize options self.options = Hash === options ? options.clone : {} self.options.symbolize_keys! - + clear end - + %w( assets layouts pages posts ).each do |group| class_eval "def #{group}; load!; @#{group}; end" end - + def all_files @all_files ||= self.assets + self.layouts + self.pages + self.posts.to_a end - + # All extensions that are registered, as strings. def asset_engine_extensions @asset_engine_extensions ||= self.registered_asset_engines.keys.collect { |e| ".#{e}" } end - + # Alphabetical list of all blog post categories used. def categories @categories ||= self.posts.collect(&:category).uniq.sort end - + # Clear out all data related to this site. Prepare for a reload, or first time load. def clear @loaded = false @tags_counts = nil @default_layout = nil - + self.assets = [] self.layouts = [] self.pages = [] self.posts = PostCollection.new - + @metadata = {} end - + # The default blog post category def default_category options[:default_category] || 'Posts' end - + # The default layout for all pages that do not specifically name their own def default_layout return nil if self.layouts.size == 0 return @default_layout if @default_layout - + layout ||= self.layouts.reject { |l| !l.default? } layout = self.layouts if layout.size == 0 - + if Array === layout and layout.size > 0 layout = layout[0] end - + @default_layout = layout end - + # Find a page, asset or layout by source relative file path def find(search_path) self.all_files.find { |file| file == search_path } end - + + # Find all registered files by the given file extension + def find_by_extension(extension) + extension = extension.to_s.downcase.gsub(/^\./, '') + self.all_files.select { |file| file.extension.to_s.downcase.gsub(/^\./, '') == extension } + end + # Find all pages and posts with this layout def find_by_layout(layout_name) result = [] - + result += self.pages.find_all { |page| page.layout == layout_name } result += self.posts.find_all { |post| post.layout == layout_name } - + result end - - # Find a specific layout by its file name. Any extensions are removed. + + # Find a specific layout by its file name. Any extensions are removed. def find_layout(layout_name) search_name = layout_name.to_s.downcase.strip.split('.')[0] matches = self.layouts.reject { |l| l.name != search_name } matches.empty? ? self.default_layout : matches[0] end - + def inspect "#<#{self.class}:0x#{object_id.to_s(16)} source=#{source.to_s.inspect}>" end - + # Load all data from the various source directories. def load! return if @loaded - + log("Loading site from source [#{source}]") - + run_callback :before_load - + self.load_pages! self.load_layouts! self.load_posts! - + run_callback :after_load - + @loaded = true end - + # Returns true if the site has been loaded from the source directories. def loaded? !!@loaded end - + # Write to the log if enable_logging is enabled def log(message, style = :indent) logger.send(:log, message, style) if logger and logger.respond_to?(:log) end - - # Access to read all meta data for this site. Meta data can be set on the + + # Access to read all meta data for this site. Meta data can be set on the # site instance by passing in the `metadata` hash, or it can be pulled # from the config file under the heading of `meta`. # # All keys within the hash can be accessed directly by calling the key # as a method name: @@ -147,85 +153,85 @@ # # Return the title value # @site.meta.title # => 'My Site 'Title' def meta @meta ||= HashProxy.new(self.metadata) end - + # Set the meta data hash object for this site. def meta=(hash) # Reset the meta hash proxy @meta = nil - - self.metadata = hash + + self.metadata = hash end - + def page_engine_extensions @page_engine_extensions ||= self.registered_page_engines.keys.collect { |e| ".#{e}" } end - + def relative_path(file_or_directory) file_or_directory.to_s.gsub(/^#{Regexp.quote(source)}(.*)$/, '\1') end - + def reload! clear load! end - + # Returns the asset engines that are available for use. def registered_asset_engines Plate.asset_engines end - + # Returns the engines available for use in page and layout formatting. def registered_page_engines - Plate.template_engines + Plate.template_engines end - + # All tags used on this site def tags @tags ||= self.posts.tag_list end - + def to_url(str) result = str.to_s.strip.downcase result = result.gsub(/[^-a-z0-9~\s\.:;+=_]/, '') result = result.gsub(/[\.:;=+-]+/, '') result = result.gsub(/[\s]/, '-') result end alias_method :sanitize_slug, :to_url - + # The base URL for this site. The url can be set using the config option named `:base_url`. # # The base URL will not have any trailing slashes. def url return '' unless self.options[:base_url] @url ||= self.options[:base_url].to_s.gsub(/(.*?)\/?$/, '\1') end - + protected # Load all layouts from layouts/ def load_layouts!(log = true) @layouts = [] - + Dir.glob(File.join(source, "layouts/**/*")).each do |file| # If this 'file' is a directory, just skip it. We only care about files. - unless File.directory?(file) + unless File.directory?(file) @layouts << Layout.new(self, file) end end log("#{@layouts.size} layouts loaded") if log - + @layouts end - + def load_pages!(log = true) @assets = [] @pages = [] - + # Load all pages, static pages and assets from content/ Dir.glob(File.join(source, "content/**/*")).each do |file| # If this 'file' is a directory, just skip it. We only care about files. unless File.directory?(file) # Check for assets that need to be compiled. Currently only looks to see if the file @@ -250,34 +256,34 @@ end end log("#{@assets.size} assets loaded") if log log("#{@pages.size} pages and other files loaded") if log - + @pages end - + # Load blog posts from posts/ def load_posts!(log = true) @posts = PostCollection.new - + Dir.glob(File.join(source, "posts/**/*")).each do |file| # If this 'file' is a directory, just skip it. We only care about files. unless File.directory?(file) # Check for YAML meta header. If it starts with ---, then process it as a page intro = File.open(file) { |f| f.read(3) } # If file contents start with ---, then it is something we should process as a page. if intro == "---" @posts.add(Post.new(self, file)) end - end + end end - + @posts.sort! - - log("#{@posts.size} posts loaded") if log - + + log("#{@posts.size} posts loaded") if log + @posts end end end \ No newline at end of file