hierarchical_page_titles 0.1.0.pre
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/.gitignore +2 -0
- data/.rvmrc +1 -0
- data/Gemfile +3 -0
- data/README.md +126 -0
- data/README.textile +69 -0
- data/Rakefile +2 -0
- data/hierarchical_page_titles.gemspec +21 -0
- data/lib/hierarchical_page_titles/controller_helpers.rb +46 -0
- data/lib/hierarchical_page_titles/railtie.rb +14 -0
- data/lib/hierarchical_page_titles/shared_methods.rb +40 -0
- data/lib/hierarchical_page_titles/version.rb +3 -0
- data/lib/hierarchical_page_titles/view_helpers.rb +53 -0
- data/lib/hierarchical_page_titles.rb +1 -0
- metadata +83 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.8.7@hierarchical_page_titles
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
## hierarchical_page_titles
|
2
|
+
|
3
|
+
### What is this?
|
4
|
+
|
5
|
+
This is a little gem that provides controller and view methods to make displaying of window/page titles DRYer.
|
6
|
+
|
7
|
+
### Why did you make it?
|
8
|
+
|
9
|
+
I made it because I found that I was doing the same thing over and over in my Rails apps. Setting the window or page title is a very common thing, and usually you'd handle this by simply setting a `@title` variable in your view and using it in your layout. However, I kept running into the case where I wanted to set the window title separate from the page title, or I wanted to set part of the window title globally for a controller, or I wanted to set the window title but hide the page title, and so on. So I decided to come up with a way to satisfy these requirements and yet keep things simple.
|
10
|
+
|
11
|
+
### How do I use it?
|
12
|
+
|
13
|
+
I'm going to walk through a few use cases and hopefully you'll get the idea.
|
14
|
+
|
15
|
+
#### Window and page title are the same
|
16
|
+
|
17
|
+
Here's what your layout might look like:
|
18
|
+
|
19
|
+
<html>
|
20
|
+
<head><title><%= window_title %></title></head>
|
21
|
+
<body>
|
22
|
+
<h1><%= page_title %></h1>
|
23
|
+
<%= yield %>
|
24
|
+
</body>
|
25
|
+
</html>
|
26
|
+
|
27
|
+
So in your view, you'd do this:
|
28
|
+
|
29
|
+
<% title "Some Page" %>
|
30
|
+
<p>Some content</p>
|
31
|
+
|
32
|
+
And now when your layout is rendered, it will be this:
|
33
|
+
|
34
|
+
<html>
|
35
|
+
<head><title>Some Page</title></head>
|
36
|
+
<body>
|
37
|
+
<h1>Some Page</h1>
|
38
|
+
<p>Some content</p>
|
39
|
+
</body>
|
40
|
+
</html>
|
41
|
+
|
42
|
+
#### Window title with prefix
|
43
|
+
|
44
|
+
Nothing special required here, just put it in your layout:
|
45
|
+
|
46
|
+
<html>
|
47
|
+
<head><title>My Site - <%= window_title %></title></head>
|
48
|
+
<body>
|
49
|
+
<h1><%= page_title %></h1>
|
50
|
+
<%= yield %>
|
51
|
+
</body>
|
52
|
+
</html>
|
53
|
+
|
54
|
+
And when the page is rendered:
|
55
|
+
|
56
|
+
<html>
|
57
|
+
<head><title>My Site - Some Page</title></head>
|
58
|
+
<body>
|
59
|
+
<h1>Some Page</h1>
|
60
|
+
<p>Some content</p>
|
61
|
+
</body>
|
62
|
+
</html>
|
63
|
+
|
64
|
+
#### Hiding page title for certain pages
|
65
|
+
|
66
|
+
#### A page hierarchy
|
67
|
+
|
68
|
+
Controllers:
|
69
|
+
|
70
|
+
<pre>
|
71
|
+
<code>
|
72
|
+
class ApplicationController < ActionController::Base
|
73
|
+
window_title "My Site Name"
|
74
|
+
end
|
75
|
+
class SupportController < ApplicationController
|
76
|
+
window_title "Support"
|
77
|
+
def billing; end
|
78
|
+
end
|
79
|
+
</code>
|
80
|
+
</pre>
|
81
|
+
|
82
|
+
Views:
|
83
|
+
|
84
|
+
<pre>
|
85
|
+
<code>
|
86
|
+
#==== app/views/layouts/application.html.erb ====
|
87
|
+
<html>
|
88
|
+
<head><title><%= window_title %></title></head>
|
89
|
+
<body>
|
90
|
+
<h2><%= page_title %></h2>
|
91
|
+
</body>
|
92
|
+
</html>
|
93
|
+
#==== app/views/support/billing.html.erb ====
|
94
|
+
# this adds to the window title and the page title at the same time
|
95
|
+
<% title "Billing FAQs" %>
|
96
|
+
</code>
|
97
|
+
</pre>
|
98
|
+
|
99
|
+
When the billing view is rendered:
|
100
|
+
|
101
|
+
* The window title will be "My Site Name - Support - Billing FAQs"
|
102
|
+
* The page title (in the <h2> tag) will be "Billing FAQs"
|
103
|
+
|
104
|
+
### How is it different from XYZ?
|
105
|
+
|
106
|
+
There are several related gems/plugins:
|
107
|
+
|
108
|
+
* **dynamic-page-title**: Provides options to `title` which are unnecessary. No support for hierarchical (controller-level) titles. Isn't compatible with Rails 3.
|
109
|
+
* **entitled**: Interesting, but has totally different requirements.
|
110
|
+
* **happy-titles**: The idea here is that you specify a template which I think is inflexible. No support for hierarchical titles, only supports two levels.
|
111
|
+
* **headliner**: A good design for simple requirements, and compatible with Rails 3. Again, no support for hierarchy, though. Plus, the `t` shortcut conflicts with i18n, which is bad. Not a gem.
|
112
|
+
* **page_title_helper**: Good if you need i18n, otherwise is a bit overkill. Again, no support for hierarchy, though.
|
113
|
+
* **smart_titles**: Stupid simple, and provides i18n. Again, no support for hierarchy, though.
|
114
|
+
* **title_helper**: Not sure, Github project seems to be missing.
|
115
|
+
* [**title_helpers**](https://github.com/henrik/title_helpers): Supports a page prefix, but doesn't support full hierarchy. Plus, I don't really like the API, and it isn't a gem.
|
116
|
+
|
117
|
+
### How do I install it?
|
118
|
+
|
119
|
+
gem install hierarchical_page_titles
|
120
|
+
|
121
|
+
### How do I contribute?
|
122
|
+
|
123
|
+
### Who wrote this?
|
124
|
+
|
125
|
+
(c) 2009 Elliot Winkler (elliot dot winkler at gmail dot com).
|
126
|
+
Released under the MIT license.
|
data/README.textile
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
h2. title_helpers
|
2
|
+
|
3
|
+
h3. Summary
|
4
|
+
|
5
|
+
Rails plugin that provides controller and view methods to make displaying of
|
6
|
+
window/page titles DRYer.
|
7
|
+
|
8
|
+
h3. Rationale
|
9
|
+
|
10
|
+
Most web sites you'll build have some sort of hierarchy. And most times this
|
11
|
+
hierarchy will correspond to your controllers. For instance, let's say you have a
|
12
|
+
support section on your website (@SupportController@), and under that you have FAQs
|
13
|
+
about billing (the @billing@ action). Now, I think it's important for the window
|
14
|
+
title to be informative -- in fact, it should come directly from the page hierarchy.
|
15
|
+
So, going back to our billing FAQs page, you might want the window title to be
|
16
|
+
"Foo.com - Support - Billing FAQs". But that's going to be a pattern, isn't it?
|
17
|
+
"Foo.com - #{some controller} - #{some action}". You're not really going to define
|
18
|
+
the full window title for every action in your code, are you? I'm certainly not going
|
19
|
+
to. Wouldn't it be better if you could set the window title on a controller basis,
|
20
|
+
and then, in your view, set the window title for just the action?
|
21
|
+
|
22
|
+
h3. Example
|
23
|
+
|
24
|
+
Controllers:
|
25
|
+
|
26
|
+
<pre>
|
27
|
+
<code>
|
28
|
+
class ApplicationController < ActionController::Base
|
29
|
+
window_title "My Site Name"
|
30
|
+
end
|
31
|
+
class SupportController < ApplicationController
|
32
|
+
window_title "Support"
|
33
|
+
def billing; end
|
34
|
+
end
|
35
|
+
</code>
|
36
|
+
</pre>
|
37
|
+
|
38
|
+
Views:
|
39
|
+
|
40
|
+
<pre>
|
41
|
+
<code>
|
42
|
+
#==== app/views/layouts/application.html.erb ====
|
43
|
+
<html>
|
44
|
+
<head><title><%= window_title %></title></head>
|
45
|
+
<body>
|
46
|
+
<h2><%= page_title %></h2>
|
47
|
+
</body>
|
48
|
+
</html>
|
49
|
+
#==== app/views/support/billing.html.erb ====
|
50
|
+
# this adds to the window title and the page title at the same time
|
51
|
+
<% title "Billing FAQs" %>
|
52
|
+
</code>
|
53
|
+
</pre>
|
54
|
+
|
55
|
+
When the billing view is rendered:
|
56
|
+
|
57
|
+
* The window title will be "My Site Name - Support - Billing FAQs"
|
58
|
+
* The page title (in the <h2> tag) will be "Billing FAQs"
|
59
|
+
|
60
|
+
h3. Installation
|
61
|
+
|
62
|
+
<pre>
|
63
|
+
script/plugin install git://github.com/mcmire/title_helpers.git
|
64
|
+
</pre>
|
65
|
+
|
66
|
+
h3. Author
|
67
|
+
|
68
|
+
(c) 2009 Elliot Winkler (elliot dot winkler at gmail dot com).
|
69
|
+
Released under the MIT license.
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "hierarchical_page_titles/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "hierarchical_page_titles"
|
7
|
+
s.version = HierarchicalPageTitles::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Elliot Winkler"]
|
10
|
+
s.email = ["elliot.winkler@gmail.com"]
|
11
|
+
s.homepage = "http://github.com/mcmire/hierarchical_page_titles"
|
12
|
+
s.summary = %q{A gem that provides controller and view methods to make displaying of window/page titles DRYer.}
|
13
|
+
s.description = %q{A gem that provides controller and view methods to make displaying of window/page titles DRYer.}
|
14
|
+
|
15
|
+
#s.rubyforge_project = "title_helpers"
|
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,46 @@
|
|
1
|
+
require 'hierarchical_page_titles/shared_methods'
|
2
|
+
|
3
|
+
module HierarchicalPageTitles
|
4
|
+
module ControllerHelpers
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
include SharedMethods
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
# Call this in the body of your controller with a string to add the string to
|
11
|
+
# the window title before each action in your controller. This will work
|
12
|
+
# for subcontrollers too -- so if you call window_title in a supercontroller
|
13
|
+
# and also in a subcontroller, there will be two strings when you go to output
|
14
|
+
# the window title. You can pass :only and :except to limit this to certain actions.
|
15
|
+
def window_title(*args, &block)
|
16
|
+
options = Hash === args.last ? args.last : {}
|
17
|
+
before_filter(options) {|c| c.window_title(*args, &block) }
|
18
|
+
end
|
19
|
+
|
20
|
+
# Call this in the body of your controller with a string to set the page title
|
21
|
+
# globally for each action in your controller. Unlike window_title, this will not
|
22
|
+
# work for subcontrollers -- so if you call page_title in a supercontroller and
|
23
|
+
# also in a subcontroller, the subcontroller's title will override the supercontroller's.
|
24
|
+
# You can pass :only and :except to limit this to certain actions.
|
25
|
+
def page_title(*args, &block)
|
26
|
+
options = Hash === args.last ? args.last : {}
|
27
|
+
before_filter(options) {|c| c.page_title(*args, &block) }
|
28
|
+
end
|
29
|
+
|
30
|
+
# Call this in the body of your controller with a string to add it to the
|
31
|
+
# window title AND set the page title at the same time.
|
32
|
+
# See +window_title+ and +page_title+ for more.
|
33
|
+
# You can pass :only and :except to limit this to certain actions.
|
34
|
+
def title(*args, &block)
|
35
|
+
options = Hash === args.last ? args.last : {}
|
36
|
+
before_filter(options) {|c| c.title(*args, &block) }
|
37
|
+
end
|
38
|
+
|
39
|
+
# Call this in the body of your controller to tell page_title to not show anything.
|
40
|
+
# You can pass :only and :except to limit this to certain actions.
|
41
|
+
def hide_page_title(options={})
|
42
|
+
before_filter(options) {|c| c.page_title(nil) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rails'
|
2
|
+
|
3
|
+
require 'hierarchical_page_titles/controller_helpers'
|
4
|
+
require 'hierarchical_page_titles/view_helpers'
|
5
|
+
|
6
|
+
module HierarchicalPageTitles
|
7
|
+
class Railtie < Rails::Railtie
|
8
|
+
# copied from formtastic
|
9
|
+
initializer "title-helpers.initialize", :after => :after_initialize do
|
10
|
+
ActionController::Base.class_eval { include HierarchicalPageTitles::ControllerHelpers }
|
11
|
+
ActionView::Base.class_eval { include HierarchicalPageTitles::ViewHelpers }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module HierarchicalPageTitles
|
2
|
+
module SharedMethods
|
3
|
+
# Call this in your view with a string to add the string to the array of window titles.
|
4
|
+
# Call this in your layout to output the window title. You can specify a separator
|
5
|
+
# that should be put between the titles by passing <tt>:separator => " - "</tt>.
|
6
|
+
def window_title(*args, &block)
|
7
|
+
options = args.extract_options!
|
8
|
+
titles = args.flatten
|
9
|
+
@_window_titles ||= []
|
10
|
+
if block_given?
|
11
|
+
@_window_titles << block.call
|
12
|
+
else
|
13
|
+
@_window_titles += titles
|
14
|
+
end
|
15
|
+
@_window_title_set = true
|
16
|
+
end
|
17
|
+
|
18
|
+
# Call this in your view with a string to set the page title to that string.
|
19
|
+
# Call this in your layout with no arguments to output the page title.
|
20
|
+
def page_title(*args, &block)
|
21
|
+
options = args.extract_options!
|
22
|
+
title = args.first
|
23
|
+
@_page_title = (block_given? ? block.call : title)
|
24
|
+
@_page_title_set = true
|
25
|
+
end
|
26
|
+
|
27
|
+
# Call this in your view to set the window title and the page title at the same time.
|
28
|
+
# See +window_title+ and +page_title+ for more.
|
29
|
+
def title(*args, &block)
|
30
|
+
options = args.extract_options!
|
31
|
+
window_title(*args, &block)
|
32
|
+
page_title(args.last, &block)
|
33
|
+
@_title_set = true
|
34
|
+
end
|
35
|
+
|
36
|
+
def titles
|
37
|
+
@_window_titles
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'hierarchical_page_titles/shared_methods'
|
2
|
+
|
3
|
+
module HierarchicalPageTitles
|
4
|
+
module ViewHelpers
|
5
|
+
include SharedMethods
|
6
|
+
|
7
|
+
# Call this in your view with a string to add the string to the array of window titles.
|
8
|
+
# Call this in your layout to output the window title. You can specify a separator
|
9
|
+
# that should be put between the titles by passing <tt>:separator => " - "</tt>.
|
10
|
+
def window_title(*args, &block)
|
11
|
+
options = args.extract_options!
|
12
|
+
if args.empty?
|
13
|
+
options[:separator] ||= " - "
|
14
|
+
@_window_titles ||= []
|
15
|
+
prefix = Array(options[:prefix]) || []
|
16
|
+
(prefix + @_window_titles).join(options[:separator])
|
17
|
+
else
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Call this in your view with a string to set the page title to that string.
|
23
|
+
# Call this in your layout with no arguments to output the page title.
|
24
|
+
def page_title(*args)
|
25
|
+
options = args.extract_options!
|
26
|
+
if args.empty?
|
27
|
+
@_page_title
|
28
|
+
else
|
29
|
+
super
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# TODO: Document
|
34
|
+
def page_title?
|
35
|
+
@_page_title.present?
|
36
|
+
end
|
37
|
+
|
38
|
+
# TODO: Document
|
39
|
+
def window_title_set?
|
40
|
+
@_window_title_set
|
41
|
+
end
|
42
|
+
|
43
|
+
# TODO: Document
|
44
|
+
def page_title_set?
|
45
|
+
@_window_title_set
|
46
|
+
end
|
47
|
+
|
48
|
+
# TODO: Document
|
49
|
+
def title_set?
|
50
|
+
@_title_set
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'hierarchical_page_titles/railtie'
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hierarchical_page_titles
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 961915980
|
5
|
+
prerelease: true
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
- pre
|
11
|
+
version: 0.1.0.pre
|
12
|
+
platform: ruby
|
13
|
+
authors:
|
14
|
+
- Elliot Winkler
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2010-12-08 00:00:00 -07:00
|
20
|
+
default_executable:
|
21
|
+
dependencies: []
|
22
|
+
|
23
|
+
description: A gem that provides controller and view methods to make displaying of window/page titles DRYer.
|
24
|
+
email:
|
25
|
+
- elliot.winkler@gmail.com
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files: []
|
31
|
+
|
32
|
+
files:
|
33
|
+
- .gitignore
|
34
|
+
- .rvmrc
|
35
|
+
- Gemfile
|
36
|
+
- README.md
|
37
|
+
- README.textile
|
38
|
+
- Rakefile
|
39
|
+
- hierarchical_page_titles.gemspec
|
40
|
+
- lib/hierarchical_page_titles.rb
|
41
|
+
- lib/hierarchical_page_titles/controller_helpers.rb
|
42
|
+
- lib/hierarchical_page_titles/railtie.rb
|
43
|
+
- lib/hierarchical_page_titles/shared_methods.rb
|
44
|
+
- lib/hierarchical_page_titles/version.rb
|
45
|
+
- lib/hierarchical_page_titles/view_helpers.rb
|
46
|
+
has_rdoc: true
|
47
|
+
homepage: http://github.com/mcmire/hierarchical_page_titles
|
48
|
+
licenses: []
|
49
|
+
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 3
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
version: "0"
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ">"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
hash: 25
|
70
|
+
segments:
|
71
|
+
- 1
|
72
|
+
- 3
|
73
|
+
- 1
|
74
|
+
version: 1.3.1
|
75
|
+
requirements: []
|
76
|
+
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 1.3.7
|
79
|
+
signing_key:
|
80
|
+
specification_version: 3
|
81
|
+
summary: A gem that provides controller and view methods to make displaying of window/page titles DRYer.
|
82
|
+
test_files: []
|
83
|
+
|