semantic_navigation 0.0.6 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/Changelog.md +10 -1
  2. data/README.md +33 -4
  3. data/Rakefile +3 -0
  4. data/lib/generators/semantic_navigation/install/install_generator.rb +20 -0
  5. data/lib/generators/semantic_navigation/install/templates/semantic_navigation.en.yml +2 -0
  6. data/lib/generators/semantic_navigation/install/templates/semantic_navigation.rb +25 -0
  7. data/lib/semantic_navigation.rb +2 -0
  8. data/lib/semantic_navigation/configuration.rb +52 -44
  9. data/lib/semantic_navigation/core.rb +4 -0
  10. data/lib/semantic_navigation/core/base.rb +21 -0
  11. data/lib/semantic_navigation/core/leaf.rb +25 -0
  12. data/lib/semantic_navigation/core/navigation.rb +35 -0
  13. data/lib/semantic_navigation/core/node.rb +29 -0
  14. data/lib/semantic_navigation/helper_methods.rb +14 -17
  15. data/lib/semantic_navigation/railtie.rb +14 -6
  16. data/lib/semantic_navigation/renderers.rb +8 -0
  17. data/lib/semantic_navigation/renderers/acts_as_breadcrumb.rb +39 -0
  18. data/lib/semantic_navigation/renderers/acts_as_list.rb +46 -0
  19. data/lib/semantic_navigation/renderers/bread_crumb.rb +50 -0
  20. data/lib/semantic_navigation/renderers/list.rb +44 -0
  21. data/lib/semantic_navigation/renderers/render_helpers.rb +113 -0
  22. data/lib/semantic_navigation/twitter_bootstrap/breadcrumb.rb +58 -0
  23. data/lib/semantic_navigation/twitter_bootstrap/list.rb +76 -0
  24. data/lib/semantic_navigation/twitter_bootstrap/tabs.rb +70 -0
  25. data/lib/semantic_navigation/version.rb +1 -1
  26. data/semantic_navigation.gemspec +3 -3
  27. data/spec/lib/semantic_navigation/configuration_spec.rb +55 -0
  28. data/spec/lib/semantic_navigation/custom_renderer.rb +3 -0
  29. data/spec/lib/semantic_navigation/helper_methods_spec.rb +1 -0
  30. data/spec/lib/semantic_navigation_spec.rb +1 -0
  31. data/spec/spec_helper.rb +8 -0
  32. metadata +32 -14
  33. data/lib/semantic_navigation/core/procs.rb +0 -15
  34. data/lib/semantic_navigation/core/render.rb +0 -94
  35. data/lib/semantic_navigation/item.rb +0 -118
  36. data/lib/tasks/semantic_navigation.rake +0 -8
  37. data/lib/tasks/templates/semantic_navigation.rb +0 -53
@@ -0,0 +1,46 @@
1
+ module SemanticNavigation
2
+ module Renderers
3
+ module ActsAsList
4
+
5
+ def render_navigation(object)
6
+ navigation(object) do
7
+ while !object.class.in?(SemanticNavigation::Core::Leaf, NilClass) &&
8
+ from_level.to_i > object.level
9
+ object = object.sub_elements.find{|e| e.active}
10
+ end
11
+ show = !until_level.nil? && !object.nil? ? object.level <= until_level : true
12
+ if !object.class.in?(SemanticNavigation::Core::Leaf, NilClass) && show
13
+ object.sub_elements.map{|element| element.render(self)}.compact.sum
14
+ end
15
+ end
16
+ end
17
+
18
+ def render_node(object)
19
+ if !object.id.in?([except_for].flatten)
20
+ content = render_node_content(object)
21
+ if content
22
+ node(object) do
23
+ content
24
+ end
25
+ else
26
+ render_leaf(object)
27
+ end
28
+ end
29
+ end
30
+
31
+ def render_node_content(object)
32
+ if (!until_level.nil? && until_level >= object.level) || until_level.nil?
33
+ node_content(object) do
34
+ object.sub_elements.map{|element| element.render(self)}.compact.sum
35
+ end
36
+ end
37
+ end
38
+
39
+ def render_leaf(object)
40
+ if !object.id.in?([except_for].flatten)
41
+ leaf(object)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,50 @@
1
+ module SemanticNavigation
2
+ module Renderers
3
+ class BreadCrumb
4
+ include RenderHelpers
5
+ include ActsAsBreadcrumb
6
+
7
+ style_accessor :last_as_link => false,
8
+ :breadcrumb_separator => '/'
9
+
10
+ navigation_default_classes [:breadcrumb]
11
+ show_navigation_active_class false
12
+ show_node_active_class false
13
+ show_leaf_active_class false
14
+ show_link_active_class false
15
+
16
+ private
17
+
18
+ def navigation(object)
19
+ content_tag :ul, nil, :id => show_id(:navigation, object.id),
20
+ :class => merge_classes(:navigation, object.active, object.classes) do
21
+ yield
22
+ end
23
+ end
24
+
25
+ def node(object)
26
+ content_tag(:li, nil, :id => show_id(:leaf, object.id),
27
+ :class => merge_classes(:leaf, object.active, object.classes)) do
28
+ link_to(object.name, object.url, :id => show_id(:link, object.id),
29
+ :class => merge_classes(:link, object.active, object.link_classes))
30
+ end +
31
+ content_tag(:li) do
32
+ breadcrumb_separator
33
+ end +
34
+ yield
35
+ end
36
+
37
+ def leaf(object)
38
+ content_tag :li, nil, :id => show_id(:leaf, object.id),
39
+ :class => merge_classes(:leaf, object.active, object.classes) do
40
+ if last_as_link
41
+ link_to object.name, object.url, :id => show_id(:link, object.id),
42
+ :class => merge_classes(:link, object.active, object.link_classes)
43
+ else
44
+ object.name
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,44 @@
1
+ module SemanticNavigation
2
+ module Renderers
3
+ class List
4
+ include RenderHelpers
5
+ include ActsAsList
6
+
7
+ navigation_default_classes [:list]
8
+
9
+ private
10
+
11
+ def navigation(object)
12
+ content_tag :ul, nil, :id => show_id(:navigation, object.id),
13
+ :class => merge_classes(:navigation, object.active, object.classes) do
14
+ yield
15
+ end
16
+ end
17
+
18
+ def node(object)
19
+ content_tag :li, nil, :id => show_id(:leaf, object.id),
20
+ :class => merge_classes(:leaf, object.active, object.classes) do
21
+ link_to(object.name, object.url, :id => show_id(:link, object.id),
22
+ :class => merge_classes(:link, object.active, object.link_classes))+
23
+ yield
24
+ end
25
+ end
26
+
27
+ def node_content(object)
28
+ content_tag(:ul, nil, :id => show_id(:node, object.id),
29
+ :class => merge_classes(:node, object.active, object.node_classes)) do
30
+ yield
31
+ end
32
+ end
33
+
34
+ def leaf(object)
35
+ content_tag :li, nil, :id => show_id(:leaf, object.id),
36
+ :class => merge_classes(:leaf, object.active, object.classes) do
37
+ link_to object.name, object.url, :id => show_id(:link, object.id),
38
+ :class => merge_classes(:link, object.active, object.link_classes)
39
+ end
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,113 @@
1
+ module SemanticNavigation
2
+ module Renderers
3
+ module RenderHelpers
4
+
5
+ def self.included(base)
6
+ base.send :include, InstanceMethods
7
+ base.extend(ClassMethods)
8
+ base.class_eval do
9
+ style_accessor :navigation_active_class => [:active],
10
+ :node_active_class => [:active],
11
+ :leaf_active_class => [:active],
12
+ :link_active_class => [:active],
13
+
14
+ :show_navigation_active_class => true,
15
+ :show_node_active_class => true,
16
+ :show_leaf_active_class => true,
17
+ :show_link_active_class => true,
18
+
19
+ :show_navigation_id => true,
20
+ :show_node_id => true,
21
+ :show_leaf_id => true,
22
+ :show_link_id => true,
23
+
24
+ :navigation_default_classes => [],
25
+ :node_default_classes => [],
26
+ :leaf_default_classes => [],
27
+ :link_default_classes => []
28
+ end
29
+ end
30
+
31
+ module ClassMethods
32
+
33
+ def style_accessor(hash)
34
+ hash.keys.each do |key|
35
+ class_eval "
36
+ @@#{key} = nil
37
+ @#{key} = nil
38
+
39
+ def self.#{key}(value)
40
+ @@#{key}= value
41
+ end
42
+
43
+ def #{key}(value = nil)
44
+ @#{key} = value unless value.nil?
45
+ @#{key}.nil? ? @@#{key} : @#{key}
46
+ end
47
+
48
+ def #{key}=(value)
49
+ @#{key} = value
50
+ end
51
+ "
52
+ send key, hash[key]
53
+ end
54
+ end
55
+
56
+ def property_for(class_name,name)
57
+ class_object = "semantic_navigation/core/#{class_name}".classify.constantize
58
+ class_object.class_eval "
59
+ unless defined?(#{name})
60
+ def #{name}
61
+ @#{name}
62
+ end
63
+ end
64
+ "
65
+ end
66
+ end
67
+
68
+ module InstanceMethods
69
+ attr_accessor :from_level, :until_level, :except_for
70
+
71
+ def level=(level)
72
+ @from_level = level
73
+ @until_level = level
74
+ end
75
+
76
+ def levels=(level_range)
77
+ @from_level = level_range.first
78
+ @until_level = level_range.last
79
+ end
80
+
81
+ def initialize(view_object)
82
+ @view_object = view_object
83
+ end
84
+
85
+ private
86
+
87
+ def content_tag(tag_name, content = nil, options={}, &block)
88
+ @view_object.content_tag(tag_name, content, options) {yield if block_given?}
89
+ end
90
+
91
+ def link_to(link_name, url, options={})
92
+ @view_object.link_to(link_name, url, options)
93
+ end
94
+
95
+ def merge_classes(name, active, object_classes = [])
96
+ classes = []
97
+ classes += [send("#{name}_default_classes")].flatten
98
+ if active && send("show_#{name}_active_class")
99
+ classes.push [send("#{name}_active_class")].flatten
100
+ end
101
+ classes += [object_classes].flatten
102
+ classes.compact
103
+ end
104
+
105
+ def show_id(name, id)
106
+ id if send("show_#{name}_id")
107
+ end
108
+
109
+ end
110
+
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,58 @@
1
+ module SemanticNavigation
2
+ module TwitterBootstrap
3
+ class Breadcrumb
4
+ include SemanticNavigation::Renderers::RenderHelpers
5
+ include SemanticNavigation::Renderers::ActsAsBreadcrumb
6
+
7
+ style_accessor :last_as_link => false,
8
+ :breadcrumb_separator => '/'
9
+
10
+ navigation_default_classes [:breadcrumb]
11
+
12
+ show_navigation_active_class false
13
+ show_node_active_class false
14
+ show_leaf_active_class false
15
+ show_link_active_class false
16
+ show_navigation_id false
17
+ show_node_id false
18
+ show_leaf_id false
19
+ show_link_id false
20
+
21
+ property_for :base, :ico
22
+
23
+ private
24
+
25
+ def navigation(object)
26
+ content_tag :ul, nil, :id => show_id(:navigation, object.id),
27
+ :class => merge_classes(:navigation, object.active, object.classes) do
28
+ yield
29
+ end
30
+ end
31
+
32
+ def node(object)
33
+ content_tag(:li, nil, :id => show_id(:leaf, object.id),
34
+ :class => merge_classes(:leaf, object.active, object.classes)) do
35
+ [object.ico ? content_tag(:i,nil,:class => "icon-#{object.ico}") : ''.html_safe,
36
+ link_to(object.name, object.url, :id => show_id(:link, object.id),
37
+ :class => merge_classes(:link, object.active, object.link_classes)),
38
+ content_tag(:span, nil, :class=> [:divider]) {breadcrumb_separator}].sum
39
+ end +
40
+ yield
41
+ end
42
+
43
+ def leaf(object)
44
+ content_tag :li, nil, :id => show_id(:leaf, object.id),
45
+ :class => merge_classes(:leaf, object.active, object.classes) do
46
+ [object.ico ? content_tag(:i,nil,:class => "icon-#{object.ico}") : ''.html_safe,
47
+ if last_as_link
48
+ link_to(object.name, object.url, :id => show_id(:link, object.id),
49
+ :class => merge_classes(:link, object.active, object.link_classes))
50
+ else
51
+ object.name
52
+ end].sum
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,76 @@
1
+ module SemanticNavigation
2
+ module TwitterBootstrap
3
+ class List
4
+ include SemanticNavigation::Renderers::RenderHelpers
5
+ include SemanticNavigation::Renderers::ActsAsList
6
+
7
+ navigation_default_classes [:nav, 'nav-list']
8
+ show_navigation_id false
9
+ show_node_id false
10
+ show_leaf_id false
11
+ show_link_id false
12
+
13
+ property_for :base, :ico
14
+
15
+ private
16
+
17
+ def navigation(object)
18
+ content_tag :ul, nil, :id => show_id(:navigation, object.id),
19
+ :class => merge_classes(:navigation, object.active, object.classes) do
20
+ yield
21
+ end
22
+ end
23
+
24
+ def node(object)
25
+ if object.ico
26
+ name = [content_tag(:i,nil,:class => "icon-#{object.ico}"),
27
+ object.name].sum
28
+ else
29
+ name = object.name
30
+ end
31
+
32
+ content_tag :li, nil, :id => show_id(:leaf, object.id),
33
+ :class => merge_classes(:leaf, object.active, object.classes) do
34
+ link_to(name, object.url, :id => show_id(:link, object.id),
35
+ :class => merge_classes(:link, object.active, object.link_classes)) +
36
+ yield
37
+ end
38
+ end
39
+
40
+ def node_content(object)
41
+ content_tag(:ul, nil, :id => show_id(:node, object.id),
42
+ :class => merge_classes(:node, object.active, object.node_classes)) do
43
+ yield
44
+ end
45
+ end
46
+
47
+ def leaf(object)
48
+ if object.name.empty? && object.url.nil?
49
+ classes = 'divider'
50
+ elsif object.url.nil?
51
+ classes = 'nav-header'
52
+ else
53
+ classes = merge_classes(:leaf, object.active, object.classes)
54
+ end
55
+
56
+ if object.ico
57
+ name = [content_tag(:i,nil,:class => "icon-#{object.ico}"),
58
+ object.name].sum
59
+ else
60
+ name = object.name
61
+ end
62
+
63
+ content_tag :li, nil, :id => show_id(:leaf, object.id),
64
+ :class => classes do
65
+ if object.url.nil?
66
+ name
67
+ else
68
+ link_to name, object.url, :id => show_id(:link, object.id),
69
+ :class => merge_classes(:link, object.active, object.link_classes)
70
+ end
71
+ end
72
+ end
73
+
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,70 @@
1
+ module SemanticNavigation
2
+ module TwitterBootstrap
3
+ class Tabs
4
+ include SemanticNavigation::Renderers::RenderHelpers
5
+ include SemanticNavigation::Renderers::ActsAsList
6
+
7
+ style_accessor :direction => 'left'
8
+
9
+ navigation_default_classes [:nav, 'nav-tabs']
10
+ show_navigation_id false
11
+ show_node_id false
12
+ show_leaf_id false
13
+ show_link_id false
14
+
15
+ property_for :base, :ico
16
+
17
+ private
18
+
19
+ def navigation(object)
20
+ content_tag :ul, nil, :id => show_id(:navigation, object.id),
21
+ :class => merge_classes(:navigation, object.active, object.classes).push("pull-#{direction}") do
22
+ yield
23
+ end
24
+ end
25
+
26
+ def node(object)
27
+ content_tag :li, nil, :id => show_id(:leaf, object.id),
28
+ :class => merge_classes(:leaf, object.active, object.classes).push(:dropdown) do
29
+ content_tag(:a, :href => '#',
30
+ :id => show_id(:link, object.id),
31
+ :class => merge_classes(:link, object.active, object.link_classes).push('dropdown-toggle'),
32
+ 'data-toggle'=> :dropdown) do
33
+ [object.ico ? content_tag(:i,nil,:class => "icon-#{object.ico}") : '',
34
+ object.name,
35
+ content_tag(:b,nil,:class => :caret)
36
+ ].sum.html_safe
37
+ end +
38
+ yield
39
+ end
40
+ end
41
+
42
+ def node_content(object)
43
+ content_tag(:ul, nil, :id => show_id(:node, object.id),
44
+ :class => merge_classes(:node, false, object.node_classes).push('dropdown-menu')) do
45
+ yield
46
+ end
47
+ end
48
+
49
+ def leaf(object)
50
+ if object.ico
51
+ name = [content_tag(:i,nil,:class => "icon-#{object.ico}"),
52
+ object.name].sum
53
+ else
54
+ name = object.name
55
+ end
56
+
57
+ content_tag :li, nil, :id => show_id(:leaf, object.id),
58
+ :class => merge_classes(:leaf, object.active, object.classes) do
59
+ if object.url.nil?
60
+ name
61
+ else
62
+ link_to name, object.url, :id => show_id(:link, object.id),
63
+ :class => merge_classes(:link, object.active, object.link_classes)
64
+ end
65
+ end
66
+ end
67
+
68
+ end
69
+ end
70
+ end