alacarte 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
4
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in alacarte.gemspec
4
+ gemspec
5
+
6
+ gem "rails", "~> 3.0.3"
@@ -0,0 +1,104 @@
1
+ h1. Alacarte
2
+
3
+ Alacarte allows you to setup menu's and conditions in your Rails app in a router-like DSL way.
4
+
5
+ You can easily;
6
+
7
+ * group menu's by name
8
+ * set conditions on menu items as a group
9
+ * set conditions on menu items with @:if@ and @:unless@
10
+ * nest your menu's
11
+
12
+ h2. Installation
13
+
14
+ Alacarte is being developed against Rails 3.0.3. No other versions have been tested.
15
+
16
+ To install, add Alacarte to your @Gemfile@ and run `bundle install`:
17
+
18
+ <pre>
19
+ gem 'alacarte'
20
+ </pre>
21
+
22
+ After alacarte is installed, you will need to setup a rails initialiser to define your menu.
23
+
24
+ h3. Initialiser
25
+
26
+ Add an initialiser file to your rails application; e.g. @config/initialisers/alacarte.rb@ and add the menus in that file using the draw method.
27
+
28
+ <pre>
29
+ YourApplication::Application.menus.draw do
30
+ menu :main do
31
+ # menu information goes here...
32
+ end
33
+ end
34
+ </pre>
35
+
36
+ h2. How it works
37
+
38
+ h3. Helper environment
39
+
40
+ Alacarte is linked to your helper environment, therefor you can call any helper method that is available to your rails app within your menu definition file;
41
+
42
+ * format helpers
43
+ * url_for, generated paths based on your routes file, ...
44
+ * I18n
45
+ * authentication related calls (e.g. current_user for Devise or Authlogic)
46
+
47
+ h3. options
48
+
49
+ You can pass in options to any level of your menu, including the top level. Here are some examples of options;
50
+
51
+ * @type@ specify what type it is, currently @menu@, @link@ and @span@ are supported
52
+ * @name@ allows you to specify the name of the menu item, a @deep_name@ is derived, based on the parents of that item.
53
+ * @path@ allows you to set the path of that link
54
+ * @label@ sets the label of the menu. By default Alacarte tries to translate the @deep_name@ (with an alacarte.menus namespace)
55
+ * @html@ are options passed in as html options to the given element (e.g. class or id attributes)
56
+ * @group@ are options passed in as html options, when the current element apears to be a group of other elements
57
+ * @if@ allows you to pass in a proc to test if the menu item is valid
58
+ * @unless@ allows you to pass in a proc to test if the menu item is valid, but tests for a false
59
+
60
+ h3. Menu example
61
+
62
+ <pre>
63
+ YourApplication::Application.menus.draw do
64
+
65
+ menu :language do
66
+ link :nl, root_path(:locale => :nl), :html => { :class => 'nl' }
67
+ link :fr, root_path(:locale => :fr), :html => { :class => 'fr' }
68
+ end
69
+
70
+ menu :main, :group => { :class => 'main' } do
71
+ link :home, root_path
72
+ link :recent,
73
+ link :other_site, 'http://someurl.com'
74
+ # ...
75
+
76
+ link :my_account, account_path(:current), :if => { current_user }
77
+
78
+ end
79
+
80
+ end
81
+ </pre>
82
+
83
+ h3. Render the menu
84
+
85
+ Render the menu where you like in your view and pass an optional "current element" selector (in this case the current locale);
86
+
87
+ <pre>
88
+ ...
89
+ <div id="language_selection">
90
+ <%= navigation_for(:language, I18n.locale) %>
91
+ </div>
92
+ ...
93
+ </pre>
94
+
95
+ h3. Output example
96
+
97
+ The output is generated as a ul-li list with anchor elements. If there is an element that can be matched, it will get a class active;
98
+
99
+ <pre>
100
+ <ul>
101
+ <li><a href="/" class="nl active">nl</a></li>
102
+ <li><a href="/" class="nl">fr</a></li>
103
+ </ul>
104
+ </pre>
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "alacarte/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "alacarte"
7
+ s.version = Alacarte::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Stijn Mathysen"]
10
+ s.email = ["stijn@skylight.be"]
11
+ s.homepage = "http://github.com/stijnster/alacarte"
12
+ s.summary = %q{Provides a generic menu system for Rails}
13
+ s.description = %q{This Rails plugin allows you to create a menu system, using a dsl (similar to routes).}
14
+
15
+ s.rubyforge_project = "alacarte"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ end
@@ -0,0 +1,37 @@
1
+ module AlacarteHelper
2
+
3
+ def navigation_for(menu, current_element = nil)
4
+ current_element = controller_name if current_element.blank?
5
+
6
+ if current_menu = Alacarte.menus[menu]
7
+ current_menu.build(self)
8
+
9
+ return elements_for(current_menu, current_element.to_sym)
10
+ end
11
+ end
12
+
13
+ def elements_for(menu, current_element)
14
+ result = ''
15
+
16
+ menu.items.each do |item|
17
+ if item.valid?
18
+ _html_options = item.html_options || {}
19
+ _html_options[:class] = _html_options[:class].to_s.insert(0, 'active ').strip if (current_element == item.as)
20
+
21
+ _item = case item.type
22
+ when :link: link_to(item.label.html_safe, item.path, _html_options)
23
+ else content_tag(item.type, item.label, _html_options)
24
+ end
25
+
26
+ if item.items.size > 0
27
+ _item << elements_for(item, current_element)
28
+ end
29
+
30
+ result << content_tag(:li, _item)
31
+ end
32
+ end
33
+
34
+ result.blank? ? '' : content_tag(:ul, result.html_safe, menu.group_options)
35
+ end
36
+
37
+ end
@@ -0,0 +1,9 @@
1
+ require 'alacarte/engine'
2
+ require 'alacarte/rails'
3
+ require 'alacarte/menus'
4
+ require 'alacarte/menu'
5
+
6
+ module Alacarte
7
+ mattr_reader :menus
8
+ @@menus = Alacarte::Menus.new
9
+ end
@@ -0,0 +1,9 @@
1
+ module Alacarte
2
+ class Engine < ::Rails::Engine
3
+
4
+ config.to_prepare do
5
+ ApplicationController.helper(AlacarteHelper)
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,64 @@
1
+ module Alacarte
2
+
3
+ class Menu
4
+
5
+ VALID_ELEMENTS = [:link, :span]
6
+
7
+ cattr_reader :env
8
+ attr_reader :parent, :type, :name, :deep_name, :path, :as, :label, :options, :items, :block, :html_options, :group_options
9
+
10
+ def initialize(parent, type, *args, &block)
11
+ @options = args.extract_options!.dup
12
+ @parent = parent
13
+ @type = type
14
+ @name = options[:name] || args[0]
15
+ @path = options[:path] || args[1]
16
+ @deep_name = @parent ? "#{@parent.deep_name}.#{@name.to_s}" : @name.to_s
17
+ @label = options[:label] || I18n.t("alacarte.menus.#{@deep_name}", :default => @deep_name.to_s)
18
+ @as = options[:as] || @name
19
+ @block = block if block_given?
20
+ @html_options = options[:html]
21
+ @group_options = options[:group]
22
+
23
+ build
24
+ end
25
+
26
+ def block?
27
+ !!@block
28
+ end
29
+
30
+ def self.env?
31
+ !!@@env
32
+ end
33
+
34
+ def build(env = nil)
35
+ @@env = env if env
36
+ @items = []
37
+
38
+ self.instance_eval(&@block) if Menu.env? && self.block?
39
+ end
40
+
41
+ def valid?
42
+ if options[:if] && options[:if].respond_to?(:call)
43
+ return options[:if].call
44
+ end
45
+
46
+ if options[:unless] && options[:unless].respond_to?(:call)
47
+ return !options[:unless].call
48
+ end
49
+
50
+ return true
51
+ end
52
+
53
+ def method_missing(id, *args, &block)
54
+ if Menu.env? && Menu.env.respond_to?(id)
55
+ @@env.send(id, *args, &block)
56
+ elsif VALID_ELEMENTS.member?(id)
57
+ @items << Menu.new(self, id, *args, &block)
58
+ else
59
+ super
60
+ end
61
+ end
62
+ end
63
+
64
+ end
@@ -0,0 +1,14 @@
1
+ module Alacarte
2
+
3
+ class Menus < Hash
4
+ def draw(&block)
5
+ self.instance_exec(&block)
6
+ end
7
+
8
+ def menu(name, *args, &block)
9
+ self[name] = Menu.new(nil, :menu, name, *args, &block)
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,9 @@
1
+ module Rails
2
+ class Application
3
+
4
+ def menus
5
+ Alacarte.menus
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module Alacarte
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: alacarte
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Stijn Mathysen
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-17 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: This Rails plugin allows you to create a menu system, using a dsl (similar to routes).
23
+ email:
24
+ - stijn@skylight.be
25
+ executables: []
26
+
27
+ extensions: []
28
+
29
+ extra_rdoc_files: []
30
+
31
+ files:
32
+ - .gitignore
33
+ - Gemfile
34
+ - README.textile
35
+ - Rakefile
36
+ - alacarte.gemspec
37
+ - app/helpers/alacarte_helper.rb
38
+ - lib/alacarte.rb
39
+ - lib/alacarte/engine.rb
40
+ - lib/alacarte/menu.rb
41
+ - lib/alacarte/menus.rb
42
+ - lib/alacarte/rails.rb
43
+ - lib/alacarte/version.rb
44
+ has_rdoc: true
45
+ homepage: http://github.com/stijnster/alacarte
46
+ licenses: []
47
+
48
+ post_install_message:
49
+ rdoc_options: []
50
+
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ hash: 3
68
+ segments:
69
+ - 0
70
+ version: "0"
71
+ requirements: []
72
+
73
+ rubyforge_project: alacarte
74
+ rubygems_version: 1.3.7
75
+ signing_key:
76
+ specification_version: 3
77
+ summary: Provides a generic menu system for Rails
78
+ test_files: []
79
+