A plugin for generating a simple navigation. See README for resources on usage instructions.
Returns the active item container for the specified level. Valid levels are
Returns nil if there is no active item_container for the specified level.
# File lib/simple_navigation.rb, line 120 def active_item_container_for(level) case level when :all self.primary_navigation when Integer self.primary_navigation.active_item_container_for(level) when Range self.primary_navigation.active_item_container_for(level.min) else raise ArgumentError, "Invalid navigation level: #{level}" end end
Returns the singleton instance of the SimpleNavigation::Configuration
# File lib/simple_navigation.rb, line 105 def config SimpleNavigation::Configuration.instance end
Returns the path to the config file for the given navigation context or nil if no matching config file can be found. If multiple config_paths are set, it returns the first matching path.
# File lib/simple_navigation.rb, line 79 def config_file(navigation_context = :default) config_file_paths.collect { |path| File.join(path, config_file_name(navigation_context)) }.detect {|full_path| File.exists?(full_path)} end
Returns true if the config_file for specified context does exist.
# File lib/simple_navigation.rb, line 73 def config_file?(navigation_context = :default) !!config_file(navigation_context) end
Resets the list of config_file_paths to the specified path
# File lib/simple_navigation.rb, line 90 def config_file_path=(path) self.config_file_paths = [path] end
Reads the current navigation for the specified level from the controller. Returns nil if there is no current navigation set for level.
# File lib/simple_navigation/rails_controller_methods.rb, line 11 def current_navigation_for(level) self.adapter.controller.instance_variable_get("@sn_current_navigation_#{level}""@sn_current_navigation_#{level}") end
# File lib/simple_navigation.rb, line 68 def default_config_file_path File.join(SimpleNavigation.root, 'config') end
# File lib/simple_navigation/rails_controller_methods.rb, line 5 def explicit_navigation_args self.adapter.controller.instance_variable_get("@sn_current_navigation_args""@sn_current_navigation_args") end
Returns the current framework in which the plugin is running.
# File lib/simple_navigation.rb, line 44 def framework return :rails if defined?(Rails) return :padrino if defined?(Padrino) return :sinatra if defined?(Sinatra) raise 'simple_navigation currently only works for Rails, Sinatra and Padrino apps' end
If any navigation has been explicitely set in the controller this method evaluates the specified args set in the controller and sets the correct instance variable in the controller.
# File lib/simple_navigation/rails_controller_methods.rb, line 17 def handle_explicit_navigation if SimpleNavigation.explicit_navigation_args level, navigation = parse_explicit_navigation_args self.adapter.controller.instance_variable_set("@sn_current_navigation_#{level}""@sn_current_navigation_#{level}", navigation) end end
Creates a new adapter instance based on the context in which render_navigation has been called.
# File lib/simple_navigation.rb, line 64 def init_adapter_from(context) self.adapter = self.adapter_class.new(context) end
Loads the adapter for the current framework
# File lib/simple_navigation.rb, line 52 def load_adapter self.adapter_class = case framework when :rails SimpleNavigation::Adapters::Rails when :sinatra SimpleNavigation::Adapters::Sinatra when :padrino SimpleNavigation::Adapters::Padrino end end
Reads the config_file for the specified navigation_context and stores it for later evaluation.
# File lib/simple_navigation.rb, line 95 def load_config(navigation_context = :default) raise "Config file '#{config_file_name(navigation_context)}' not found in path(s) #{config_file_paths.join(', ')}!" unless config_file?(navigation_context) if self.environment == 'production' self.config_files[navigation_context] ||= IO.read(config_file(navigation_context)) else self.config_files[navigation_context] = IO.read(config_file(navigation_context)) end end
TODO: refactor this ugly thing to make it nice and short
# File lib/simple_navigation/rails_controller_methods.rb, line 25 def parse_explicit_navigation_args args = SimpleNavigation.explicit_navigation_args args = [Hash.new] if args.empty? if args.first.kind_of? Hash options = args.first else # args is a list of current navigation for several levels options = {} if args.size == 1 #only one navi-key has been specified, try to find out level level = SimpleNavigation.primary_navigation.level_for_item(args.first) options["level_#{level}""level_#{level}"] = args.first if level else args.each_with_index {|arg, i| options["level_#{i + 1}""level_#{i + 1}"] = arg} end end #only the deepest level is relevant level = options.inject(0) do |max, kv| kv.first.to_s =~ /level_(\d)/ max = $1.to_i if $1.to_i > max max end raise ArgumentError, "Invalid level specified or item key not found" if level == 0 [level, options["level_#{level}""level_#{level}"]] end
Returns the ItemContainer that contains the items for the primary navigation
# File lib/simple_navigation.rb, line 110 def primary_navigation config.primary_navigation end
Registers a renderer.
To register your own renderer:
SimpleNavigation.register_renderer :my_renderer => My::RendererClass
Then in the view you can call:
render_navigation(:renderer => :my_renderer)
# File lib/simple_navigation.rb, line 143 def register_renderer(renderer_hash) self.registered_renderers.merge!(renderer_hash) end