lib/sitemap.rb in sitemap-0.1b2 vs lib/sitemap.rb in sitemap-0.1

- old
+ new

@@ -7,10 +7,11 @@ require "singleton" require "builder" require "sitemap/railtie" require "sitemap/ping" +require "sitemap/generator" module Sitemap VERSION = Gem::Specification.load(File.expand_path("../sitemap.gemspec", File.dirname(__FILE__))).version.to_s @@ -20,149 +21,7 @@ :params => {}, :search => { :updated_at => proc { |obj| obj.updated_at.strftime("%Y-%m-%d") if obj.respond_to?(:updated_at) } } } - - class Generator - - include Singleton - - SEARCH_ATTRIBUTES = { - :updated_at => "lastmod", - :change_frequency => "changefreq", - :priority => "priority" - } - - attr_accessor :entries, :host, :routes - - # Instantiates a new object. - # Should never be called directly. - def initialize - self.class.send(:include, Rails.application.routes.url_helpers) - self.entries = [] - end - - # Sets the urls to be indexed. - # - # The +host+, or any other global option can be set here: - # - # Sitemap::Generator.instance.load :host => "mywebsite.com" do - # ... - # end - # - # Simple paths can be added as follows: - # - # Sitemap::Generator.instance.load :host => "mywebsite.com" do - # path :faq - # end - # - # Object collections are supported too: - # - # Sitemap::Generator.instance.load :host => "mywebsite.com" do - # resources :activities - # end - # - # Search options such as frequency and priority can be declared as an options hash: - # - # Sitemap::Generator.instance.load :host => "mywebsite.com" do - # path :root, :priority => 1 - # path :faq, :priority => 0.8, :change_frequency => "daily" - # resources :activities, :change_frequency => "weekly" - # end - # - def load(options = {}, &block) - options.each do |k, v| - self.send("#{k}=", v) - end - self.routes = block - end - - # Adds the specified url or object (such as an ActiveRecord model instance). - # In either case the data is being looked up in the current application routes. - # - # Params can be specified as follows: - # - # # config/routes.rb - # match "/frequent-questions" => "static#faq", :as => "faq" - # - # # config/sitemap.rb - # path :faq, :params => { :filter => "recent" } - # - # The resolved url would be <tt>http://mywebsite.com/frequent-questions?filter=recent</tt>. - # - def path(object, options = {}) - params = Sitemap.defaults[:params].clone.merge!(options[:params] || {}) - params[:host] ||= host # Use global host if none was specified. - params.merge!(params) { |type, value| get_data(object, value) } - - search = Sitemap.defaults[:search].clone.merge!(options.select { |k, v| SEARCH_ATTRIBUTES.keys.include?(k) }) - search.merge!(search) { |type, value| get_data(object, value) } - - self.entries << { - :object => object, - :search => search, - :params => params - } - end - - # Adds the associated object types. - # - # The following will map all Activity entries, as well as the index (<tt>/activities</tt>) page: - # - # resources :activities - # - # You can also specify which entries are being mapped: - # - # resources :articles, :objects => proc { Article.published } - # - # To skip the index action and map only the records: - # - # resources :articles, :skip_index => true - # - # As with the path, you can specify params through the +params+ options hash. - # The params can also be build conditionally by using a +proc+: - # - # resources :activities, :params => { :host => proc { |activity| [activity.location, host].join(".") } }, :skip_index => true - # - # In this case the host will change based the each of the objects associated +location+ attribute. - # Because the index page doesn't have this attribute it's best to skip it. - # - def resources(type, options = {}) - path(type) unless options[:skip_index] - objects = options[:objects] ? options[:objects].call : type.to_s.classify.constantize.all - options.reject! { |k, v| k == :objects } - - objects.each do |object| - path(object, options) - end - end - - # Parses the loaded data and returns the xml entries. - def build - instance_exec(self, &routes) - xml = Builder::XmlMarkup.new(:indent => 2) - file = File.read(File.expand_path("../views/index.xml.builder", __FILE__)) - instance_eval file - end - - # Builds xml entries and saves the data to the specified location. - def save(location) - file = File.new(location, "w") - file.write(build) - file.close - end - - # URL to the <tt>sitemap.xml</tt> file. - def file_url - URI::HTTP.build(:host => host, :path => "/sitemap.xml").to_s - end - - private - - def get_data(object, data) - data.is_a?(Proc) ? data.call(object) : data - end - - end end