breadcrumbs_for 0.1.0
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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +78 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/breadcrumbs_for.gemspec +55 -0
- data/init.rb +1 -0
- data/lib/breadcrumbs_for.rb +113 -0
- data/test/helper.rb +10 -0
- data/test/test_breadcrumbs_for.rb +7 -0
- metadata +92 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Dmitry Naumov
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
= breadcrumbs_for
|
2
|
+
|
3
|
+
Breadcrumbs for Rails made right.
|
4
|
+
|
5
|
+
== Installation
|
6
|
+
gem install breadcrumbs_for
|
7
|
+
|
8
|
+
== Requirements
|
9
|
+
Was tested with Rails 3.0.0
|
10
|
+
|
11
|
+
== Usage
|
12
|
+
Let say:
|
13
|
+
* You have a Blog and Post models in your app.
|
14
|
+
* Posts are nested in Blogs.
|
15
|
+
* You have :admin namespace to manage them.
|
16
|
+
* Blog and Post have a 'title' or 'name' methods
|
17
|
+
|
18
|
+
===Examples:
|
19
|
+
breadcrumbs_for :blogs # Home / Blogs
|
20
|
+
breadcrumbs_for :blogs, 'new' # Home / Blogs / New
|
21
|
+
breadcrumbs_for :blogs, @blog # Home / Blogs / My blog
|
22
|
+
breadcrumbs_for :blogs, @blog, 'edit' # Home / Blogs / My blog / Edit
|
23
|
+
breadcrumbs_for @blog # Home / My blog
|
24
|
+
breadcrumbs_for :blogs, @blog, [@blog, @post] # Home / Blogs / My blog / My Post
|
25
|
+
|
26
|
+
breadcrumbs_for [:admin,:blogs], [:admin, @blog]
|
27
|
+
breadcrumbs_for [:admin,:blogs], ['edit', :admin, @blog, @post]
|
28
|
+
breadcrumbs_for [:admin,:blogs], [:admin, @blog], ['edit', :admin, @blog, @post]
|
29
|
+
|
30
|
+
etc.
|
31
|
+
|
32
|
+
Note: There is a shorter alias crumbs_for, so you can do:
|
33
|
+
crumbs_for :blogs, @blog
|
34
|
+
|
35
|
+
|
36
|
+
You can even do the following:
|
37
|
+
breadcrumbs_for {:controller=>'blogs', :action=>'index', :crumb=>'All Blogs'}, @blog
|
38
|
+
Note on :crumb=>'All Blogs'. Here you need to provide the breadcrumb caption text directly via the :crumb key.
|
39
|
+
|
40
|
+
If you have an admin_path in your routes you can do:
|
41
|
+
breadcrumbs_for :admin, [:admin,:blogs], ['new', :admin, @blog], :crumbs_options=>{:root=>false}
|
42
|
+
|
43
|
+
=== Customize
|
44
|
+
* Don't inculde the Home(root) link:
|
45
|
+
breadcrumbs_for :blogs, @blog, :crumbs_options=>{:root=>false}
|
46
|
+
* By default breadcrumbs are rendered as a ul(html unorderd list). You can disable this:
|
47
|
+
breadcrumbs_for :blogs, @blog, :crumbs_options=>{:type=>:plain}
|
48
|
+
* The default separator is /. Chage it:
|
49
|
+
breadcrumbs_for :blogs, @blog, :crumbs_options=>{:sep=>'→'}
|
50
|
+
|
51
|
+
=== Custom captions and i18n
|
52
|
+
Define captions for breadcrumbs in your locale file:
|
53
|
+
en:
|
54
|
+
breadcrumbs:
|
55
|
+
root: 'Home'
|
56
|
+
actions:
|
57
|
+
new: 'Add new'
|
58
|
+
edit: 'Edit one'
|
59
|
+
names:
|
60
|
+
admin: 'Manage'
|
61
|
+
blogs: 'The blogs'
|
62
|
+
posts: 'The posts'
|
63
|
+
|
64
|
+
== Note on Patches/Pull Requests
|
65
|
+
|
66
|
+
((*Patches/Pull Requests are welcome!*))
|
67
|
+
|
68
|
+
* Fork the project.
|
69
|
+
* Make your feature addition or bug fix.
|
70
|
+
* Add tests for it. This is important so I don't break it in a
|
71
|
+
future version unintentionally.
|
72
|
+
* Commit, do not mess with rakefile, version, or history.
|
73
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
74
|
+
* Send me a pull request. Bonus points for topic branches.
|
75
|
+
|
76
|
+
== Copyright
|
77
|
+
|
78
|
+
Copyright (c) 2010 Dmitry Naumov. Released under the MIT license. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "breadcrumbs_for"
|
8
|
+
gem.summary = %Q{Breadcrumbs for Rails made right.}
|
9
|
+
gem.description = %Q{Breadcrumbs for Rails done in a rails way. Built on url_for, your routes and i18n.}
|
10
|
+
gem.email = "naumovmail@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/naumov/breadcrumbs_for"
|
12
|
+
gem.authors = ["Dmitry Naumov"]
|
13
|
+
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'rake/testtask'
|
22
|
+
Rake::TestTask.new(:test) do |test|
|
23
|
+
test.libs << 'lib' << 'test'
|
24
|
+
test.pattern = 'test/**/test_*.rb'
|
25
|
+
test.verbose = true
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'rcov/rcovtask'
|
30
|
+
Rcov::RcovTask.new do |test|
|
31
|
+
test.libs << 'test'
|
32
|
+
test.pattern = 'test/**/test_*.rb'
|
33
|
+
test.verbose = true
|
34
|
+
end
|
35
|
+
rescue LoadError
|
36
|
+
task :rcov do
|
37
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
task :test => :check_dependencies
|
42
|
+
|
43
|
+
task :default => :test
|
44
|
+
|
45
|
+
require 'rake/rdoctask'
|
46
|
+
Rake::RDocTask.new do |rdoc|
|
47
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
48
|
+
|
49
|
+
rdoc.rdoc_dir = 'rdoc'
|
50
|
+
rdoc.title = "breadcrumbs_for #{version}"
|
51
|
+
rdoc.rdoc_files.include('README*')
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{breadcrumbs_for}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Dmitry Naumov"]
|
12
|
+
s.date = %q{2010-09-13}
|
13
|
+
s.description = %q{Breadcrumbs for Rails done in a rails way. Built on url_for, your routes and i18n.}
|
14
|
+
s.email = %q{naumovmail@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"LICENSE",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"breadcrumbs_for.gemspec",
|
27
|
+
"init.rb",
|
28
|
+
"lib/breadcrumbs_for.rb",
|
29
|
+
"test/helper.rb",
|
30
|
+
"test/test_breadcrumbs_for.rb"
|
31
|
+
]
|
32
|
+
s.homepage = %q{http://github.com/naumov/breadcrumbs_for}
|
33
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
34
|
+
s.require_paths = ["lib"]
|
35
|
+
s.rubygems_version = %q{1.3.7}
|
36
|
+
s.summary = %q{Breadcrumbs for Rails made right.}
|
37
|
+
s.test_files = [
|
38
|
+
"test/helper.rb",
|
39
|
+
"test/test_breadcrumbs_for.rb"
|
40
|
+
]
|
41
|
+
|
42
|
+
if s.respond_to? :specification_version then
|
43
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
44
|
+
s.specification_version = 3
|
45
|
+
|
46
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
47
|
+
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
48
|
+
else
|
49
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
50
|
+
end
|
51
|
+
else
|
52
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'breadcrumbs_for'
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module BreadcrumbsFor
|
2
|
+
def breadcrumbs_for *crumbs_list
|
3
|
+
list, options = extract_crumb_params(crumbs_list)
|
4
|
+
crumbs = []
|
5
|
+
crumbs << crumb_html(root_crumb,options,'root') if options[:root]
|
6
|
+
crumbs_count = list.size
|
7
|
+
list.each_with_index do |crumb,index|
|
8
|
+
caption = crumb_to_caption(crumb)
|
9
|
+
is_last_crumb = ((index+1) == crumbs_count)
|
10
|
+
item = is_last_crumb ? caption : crumb_link(caption, url_for(crumb))
|
11
|
+
crumbs << crumb_html(item,options,is_last_crumb ? 'active' : nil)
|
12
|
+
end
|
13
|
+
crumbs_html(crumbs,options)
|
14
|
+
end
|
15
|
+
alias :crumbs_for :breadcrumbs_for
|
16
|
+
|
17
|
+
def extract_crumb_params options
|
18
|
+
defaults = {
|
19
|
+
:root => true,
|
20
|
+
:type => :list,
|
21
|
+
:sep => '/',
|
22
|
+
}
|
23
|
+
last_option = options.last
|
24
|
+
if last_option.is_a?(Hash) && last_option[:crumbs_options]
|
25
|
+
opts = options.pop
|
26
|
+
[options, defaults.merge(opts[:crumbs_options])]
|
27
|
+
else
|
28
|
+
[options, defaults]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def crumb_html(item,options,pos=nil)
|
33
|
+
if options[:type]==:list
|
34
|
+
content_tag(:li, item, :class=>"crumb #{pos}")
|
35
|
+
else
|
36
|
+
item
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def crumbs_html(crumbs,options)
|
41
|
+
if options[:type]==:list
|
42
|
+
sep = "<li class=\"sep\">#{options[:sep]}</li>"
|
43
|
+
raw ['<ul class="breadcrumbs">', crumbs.join(sep), '</ul>'].join
|
44
|
+
else
|
45
|
+
sep = content_tag(:span, options[:sep], :class=>'sep')
|
46
|
+
raw crumbs.join(sep)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def crumb_link caption, path, options={}
|
51
|
+
options[:class] = ['crumb',options[:class]].compact.join(' ')
|
52
|
+
link_to(caption, path, options)
|
53
|
+
end
|
54
|
+
|
55
|
+
def root_crumb
|
56
|
+
crumb_link(root_caption, root_path, :class=>'home_crumb')
|
57
|
+
end
|
58
|
+
|
59
|
+
def root_caption
|
60
|
+
t("breadcrumbs.root", :default => 'Home' )
|
61
|
+
end
|
62
|
+
|
63
|
+
def string_to_caption crumb
|
64
|
+
t("breadcrumbs.actions.#{crumb.to_s}", :default => crumb.to_s.capitalize)
|
65
|
+
end
|
66
|
+
|
67
|
+
def symbol_caption crumb
|
68
|
+
return root_caption if crumb == :root
|
69
|
+
t("breadcrumbs.names.#{crumb.to_s}", :default => crumb.to_s.capitalize)
|
70
|
+
end
|
71
|
+
|
72
|
+
def array_to_caption crumb
|
73
|
+
if crumb.size>1
|
74
|
+
case crumb.first.class.to_s
|
75
|
+
when 'Symbol' # Is a namespace. Skip it
|
76
|
+
cramb_caption(crumb.last)
|
77
|
+
when 'String' # Is an action name. Use it
|
78
|
+
string_to_caption(crumb.first) << ' «' << cramb_caption(crumb.last) << '»'
|
79
|
+
else # Use last item only
|
80
|
+
cramb_caption(crumb.last)
|
81
|
+
end
|
82
|
+
else
|
83
|
+
cramb_caption(crumb[0])
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def crumb_to_caption crumb
|
88
|
+
case crumb.class.to_s
|
89
|
+
when 'Symbol'
|
90
|
+
symbol_caption(crumb)
|
91
|
+
when 'String'
|
92
|
+
string_to_caption(crumb)
|
93
|
+
when 'Array'
|
94
|
+
array_to_caption(crumb)
|
95
|
+
when 'Hash'
|
96
|
+
crumb.delete(:crumb)
|
97
|
+
else
|
98
|
+
cramb_caption(crumb)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def cramb_caption crumb
|
103
|
+
if crumb.respond_to?(:title)
|
104
|
+
crumb.title
|
105
|
+
elsif crumb.respond_to?(:name)
|
106
|
+
crumb.name
|
107
|
+
else
|
108
|
+
crumb.class.to_s.humanize
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
ActionView::Base.send :include, BreadcrumbsFor
|
data/test/helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: breadcrumbs_for
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Dmitry Naumov
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-09-13 00:00:00 +03:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: thoughtbot-shoulda
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
description: Breadcrumbs for Rails done in a rails way. Built on url_for, your routes and i18n.
|
36
|
+
email: naumovmail@gmail.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- LICENSE
|
43
|
+
- README.rdoc
|
44
|
+
files:
|
45
|
+
- .document
|
46
|
+
- .gitignore
|
47
|
+
- LICENSE
|
48
|
+
- README.rdoc
|
49
|
+
- Rakefile
|
50
|
+
- VERSION
|
51
|
+
- breadcrumbs_for.gemspec
|
52
|
+
- init.rb
|
53
|
+
- lib/breadcrumbs_for.rb
|
54
|
+
- test/helper.rb
|
55
|
+
- test/test_breadcrumbs_for.rb
|
56
|
+
has_rdoc: true
|
57
|
+
homepage: http://github.com/naumov/breadcrumbs_for
|
58
|
+
licenses: []
|
59
|
+
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options:
|
62
|
+
- --charset=UTF-8
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
hash: 3
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
version: "0"
|
83
|
+
requirements: []
|
84
|
+
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 1.3.7
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: Breadcrumbs for Rails made right.
|
90
|
+
test_files:
|
91
|
+
- test/helper.rb
|
92
|
+
- test/test_breadcrumbs_for.rb
|