alacarte 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+