require 'sitemap_generator' module SitemapGenerator # Provide a class for evaluating blocks, making the URL helpers from the framework # and API methods available to it. class Interpreter if SitemapGenerator.app.rails3? include ::Rails.application.routes.url_helpers elsif SitemapGenerator.app.rails? require 'action_controller' include ActionController::UrlWriter end # Call with a block to evaluate a dynamic config. The only method exposed for you is # `add` to add a link to the sitemap object attached to this interpreter. # # === Options # * link_set - a LinkSet instance to use. Default is SitemapGenerator::Sitemap. # # All other options are passed to the LinkSet by setting them using accessor methods. def initialize(opts={}, &block) opts = SitemapGenerator::Utilities.reverse_merge(opts, :link_set => SitemapGenerator::Sitemap) @linkset = opts.delete :link_set @linkset.send(:set_options, opts) eval(&block) if block_given? end def add(*args) @linkset.add(*args) end def add_to_index(*args) @linkset.add_to_index(*args) end # Start a new group of sitemaps. Any of the options to SitemapGenerator.new may # be passed. Pass a block with calls to +add+ to add links to the sitemaps. # # All groups use the same sitemap index. def group(*args, &block) @linkset.group(*args, &block) end # Return the LinkSet instance so that you can access it from within the `create` block # without having to use the yield_sitemap option. def sitemap @linkset end # Evaluate the block in the interpreter. Pass :yield_sitemap => true to # yield the Interpreter instance to the block...for old-style calling. def eval(opts={}, &block) if block_given? if opts[:yield_sitemap] yield @linkset else instance_eval(&block) end end end # Run the interpreter on a config file using # the default SitemapGenerator::Sitemap sitemap object. # # === Options # * :config_file - full path to the config file to evaluate. # Default is config/sitemap.rb in your application's root directory. # All other options are passed to +new+. def self.run(opts={}, &block) opts = opts.dup config_file = opts.delete(:config_file) config_file ||= SitemapGenerator.app.root + 'config/sitemap.rb' interpreter = self.new(opts) interpreter.instance_eval(File.read(config_file), config_file.to_s) interpreter end end end