Module SimpleNavigation
In: lib/simple_navigation/rails_controller_methods.rb
lib/simple_navigation/core/item_adapter.rb
lib/simple_navigation/core/item_container.rb
lib/simple_navigation/core/configuration.rb
lib/simple_navigation/core/item.rb
lib/simple_navigation/core/items_provider.rb
lib/simple_navigation/rendering/helpers.rb
lib/simple_navigation/rendering/renderer/list.rb
lib/simple_navigation/rendering/renderer/breadcrumbs.rb
lib/simple_navigation/rendering/renderer/links.rb
lib/simple_navigation/rendering/renderer/base.rb
lib/simple_navigation/rendering.rb
lib/simple_navigation/adapters.rb
lib/simple_navigation/adapters/padrino.rb
lib/simple_navigation/adapters/rails.rb
lib/simple_navigation/adapters/base.rb
lib/simple_navigation/adapters/sinatra.rb
lib/simple_navigation.rb

A plugin for generating a simple navigation. See README for resources on usage instructions.

Methods

Classes and Modules

Module SimpleNavigation::Adapters
Module SimpleNavigation::ControllerMethods
Module SimpleNavigation::Helpers
Module SimpleNavigation::Renderer
Class SimpleNavigation::Configuration
Class SimpleNavigation::Item
Class SimpleNavigation::ItemAdapter
Class SimpleNavigation::ItemContainer
Class SimpleNavigation::ItemsProvider
Class SimpleNavigation::Railtie

Public Class methods

Returns the active item container for the specified level. Valid levels are

  • :all - in this case the primary_navigation is returned.
  • a specific level - the active item_container for the specified level will be returned
  • a range of levels - the active item_container for the range‘s minimum will be returned

Returns nil if there is no active item_container for the specified level.

[Source]

# 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

[Source]

# 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.

[Source]

# 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.

[Source]

# File lib/simple_navigation.rb, line 73
    def config_file?(navigation_context = :default)
      !!config_file(navigation_context)
    end

Returns the name of the config file for the given navigation_context

[Source]

# File lib/simple_navigation.rb, line 84
    def config_file_name(navigation_context = :default)
      prefix = navigation_context == :default ? '' : "#{navigation_context.to_s.underscore}_"
      "#{prefix}navigation.rb"      
    end

Resets the list of config_file_paths to the specified path

[Source]

# 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.

[Source]

# 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

[Source]

# File lib/simple_navigation.rb, line 68
    def default_config_file_path
      File.join(SimpleNavigation.root, 'config')
    end

[Source]

# 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.

[Source]

# 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.

[Source]

# 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.

[Source]

# 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

[Source]

# 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.

[Source]

# 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

[Source]

# 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

[Source]

# File lib/simple_navigation.rb, line 110
    def primary_navigation
      config.primary_navigation
    end

Registers a renderer.

Example

To register your own renderer:

  SimpleNavigation.register_renderer :my_renderer => My::RendererClass

Then in the view you can call:

  render_navigation(:renderer => :my_renderer)

[Source]

# File lib/simple_navigation.rb, line 143
    def register_renderer(renderer_hash)
      self.registered_renderers.merge!(renderer_hash)
    end

Sets the root path and current environment as specified. Also sets the default config_file_path.

[Source]

# File lib/simple_navigation.rb, line 37
    def set_env(root, environment)
      self.root = root
      self.environment = environment
      self.config_file_paths << SimpleNavigation.default_config_file_path
    end

[Validate]