milk-it-sitemapper 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +119 -4
- data/Rakefile +2 -1
- data/init.rb +1 -0
- data/lib/sitemapper/helpers.rb +19 -16
- data/lib/sitemapper.rb +30 -2
- metadata +1 -1
data/README.rdoc
CHANGED
@@ -7,17 +7,132 @@ auto generation.
|
|
7
7
|
|
8
8
|
You can install the development version with
|
9
9
|
|
10
|
-
% sudo gem
|
11
|
-
% sudo gem install milk-it-sitemapper
|
10
|
+
% sudo gem install milk-it-sitemapper -s http://gems.github.com
|
12
11
|
|
13
12
|
Or the release version with
|
14
13
|
|
15
14
|
% sudo gem install sitemapper
|
16
15
|
|
17
16
|
|
18
|
-
==
|
17
|
+
== Examples
|
19
18
|
|
20
|
-
|
19
|
+
=== Ruby On Rails
|
20
|
+
|
21
|
+
Sitemapper will automagically generate a sitemap.xml file for you when
|
22
|
+
your rails application start, this sitemap.xml will include all your
|
23
|
+
URLs that Sitemapper consider 'static', for example:
|
24
|
+
|
25
|
+
map.todo '/to-do' # Sitemapper will consider this as static
|
26
|
+
map.articles '/articles/:year/:month' # Will be considered this dynamic
|
27
|
+
map.connect '*path' # Will be considered dynamic
|
28
|
+
|
29
|
+
The generation of your sitemap.xml will happen on your application boot,
|
30
|
+
but it won't delete any URL previous added (we hope to be able to do so
|
31
|
+
very soon - a merge).
|
32
|
+
|
33
|
+
In your application, you can use the accessors provided by Sitemapper to
|
34
|
+
dynamically add URLs, for example, supose a blog app:
|
35
|
+
|
36
|
+
class ArticlesController < ApplicationController
|
37
|
+
...
|
38
|
+
def create
|
39
|
+
# do all the creation stuff
|
40
|
+
map_url(article_url(@article)) # add the URL to your sitemap
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy
|
44
|
+
# do all the deletion stuff
|
45
|
+
unmap_url(article_url(@article))
|
46
|
+
end
|
47
|
+
...
|
48
|
+
end
|
49
|
+
|
50
|
+
You can also do it on your sweepers (which is a better choice)
|
51
|
+
|
52
|
+
class ArticleSweeper < ActionController::Caching::Sweeper
|
53
|
+
observe Article, Account
|
54
|
+
|
55
|
+
def after_create(record)
|
56
|
+
# expire everything you need
|
57
|
+
map_url(polymorphic_url(record))
|
58
|
+
end
|
59
|
+
|
60
|
+
def after_destroy(record)
|
61
|
+
# expire everything you need
|
62
|
+
map_url(polymorphic_url(record))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
=== Merb
|
67
|
+
|
68
|
+
Sorry, we do not support Merb yet. (Actually, it will depend on the
|
69
|
+
demand)
|
70
|
+
|
71
|
+
=== Other SEO techniques
|
72
|
+
|
73
|
+
With SEO, you'll have some view helpers to easily apply some SEO
|
74
|
+
techniques to your website/webapp.
|
75
|
+
|
76
|
+
In your application layout, just do it:
|
77
|
+
|
78
|
+
<head>
|
79
|
+
<%= title('My Personal Blog') %>
|
80
|
+
<%= page_meta %>
|
81
|
+
</head>
|
82
|
+
|
83
|
+
And in your action views, you put this:
|
84
|
+
|
85
|
+
<% page(:title => 'Contact',
|
86
|
+
:desc => 'Here you'll can contact our customer support ...',
|
87
|
+
:keywords => 'contact, support, customer') %>
|
88
|
+
|
89
|
+
In this case, the view will be rendered in this way:
|
90
|
+
|
91
|
+
<head>
|
92
|
+
<title>Contact :: My Personal Blog</title>
|
93
|
+
<meta name="description" content="Here you'll can contact our customer support ..." />
|
94
|
+
<meta name="keywords" content="contact, support, customer" />
|
95
|
+
</head>
|
96
|
+
|
97
|
+
If you want to change the title separator, just do:
|
98
|
+
|
99
|
+
...
|
100
|
+
<%= title('My Personal Blog', :separator => ' - ') %>
|
101
|
+
...
|
102
|
+
|
103
|
+
Or, you can als use any object that respond to title or name (for
|
104
|
+
page title), short_description or description, tag_list or keywords.
|
105
|
+
|
106
|
+
<% page(@event) %>
|
107
|
+
|
108
|
+
If you need to change the default method lookup for page, you have two ways:
|
109
|
+
|
110
|
+
==== Add an initializer with the following content (that will change the default method lookup sequence):
|
111
|
+
|
112
|
+
Sitemapper.meta_lookup = {:title => [:my_default_title_method, :my_second_default_title_method]
|
113
|
+
:desc => [:my_default_description_method, :my_second_default_description_method],
|
114
|
+
:keywords => [:my_default_keywords_method, :my_second_default_keywords_methods]
|
115
|
+
}
|
116
|
+
|
117
|
+
==== Configure per object (yes, object, not just ActiveRecord descendents) lookups:
|
118
|
+
|
119
|
+
class MyObject
|
120
|
+
map_fields :title => :weird_title, :desc => :weird_description, :keywords => :weird_keywords
|
121
|
+
...
|
122
|
+
end
|
123
|
+
|
124
|
+
If you want to suggest any other SEO technique, suggest it on
|
125
|
+
carlos@milk-it.net
|
126
|
+
|
127
|
+
=== Hope you enjoy!
|
128
|
+
|
129
|
+
== To do:
|
130
|
+
|
131
|
+
* Add sitemap options to routes
|
132
|
+
* Create separate files for dynamic and static routes (then, we'll can
|
133
|
+
delete all the static on startup)
|
134
|
+
* Write test code (sorry, I really didn't it)
|
135
|
+
* Write the Sitemapper::Map#map_urls method
|
21
136
|
|
22
137
|
Copyright (c) 2008 Carlos Júnior, released under the MIT license
|
23
138
|
Copyright (c) 2008 Milk-it Software House, released under the MIT license
|
data/Rakefile
CHANGED
@@ -17,6 +17,7 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
17
17
|
rdoc.rdoc_dir = 'rdoc'
|
18
18
|
rdoc.title = 'Sitemaper'
|
19
19
|
rdoc.options << '--line-numbers' << '--inline-source'
|
20
|
-
rdoc.rdoc_files.include('README')
|
20
|
+
rdoc.rdoc_files.include('README.rdoc')
|
21
21
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
|
+
rdoc.main = 'README.rdoc'
|
22
23
|
end
|
data/init.rb
CHANGED
data/lib/sitemapper/helpers.rb
CHANGED
@@ -18,27 +18,30 @@ module Sitemapper
|
|
18
18
|
@_title = defs.delete(:title)
|
19
19
|
@_desc = defs.delete(:desc)
|
20
20
|
@_keys = defs.delete(:keywords)
|
21
|
+
return nil # dummies safe!
|
21
22
|
end
|
22
23
|
|
23
24
|
def page_with_object(defs) # :nodoc:
|
24
25
|
return page_without_object(defs) if defs.is_a?(Hash)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
26
|
+
|
27
|
+
lookup_method = lambda do |obj, key|
|
28
|
+
methods = obj.class.respond_to?(:sitemapper_config)? obj.class.sitemapper_config : Sitemapper.meta_lookup
|
29
|
+
methods = methods[key]
|
30
|
+
method = if methods.is_a?(Array)
|
31
|
+
methods.find {|m| obj.respond_to?(m)}
|
32
|
+
elsif methods.is_a?(String) || methods.is_a?(Symbol)
|
33
|
+
methods
|
34
|
+
end
|
35
|
+
logger.debug(">>> #{method}")
|
36
|
+
return method.nil?? nil : obj.send(method)
|
37
|
+
end # Do you think it's ugly? You have to see my grandma in underwear
|
38
|
+
|
39
|
+
@_title = lookup_method.call(defs, :title)
|
40
|
+
@_desc = lookup_method.call(defs, :desc)
|
41
|
+
@_keys = lookup_method.call(defs, :keywords)
|
40
42
|
end
|
41
|
-
|
43
|
+
alias_method :page_without_object, :page
|
44
|
+
alias_method :page, :page_with_object
|
42
45
|
|
43
46
|
# Returns the title of the page with the website title
|
44
47
|
#
|
data/lib/sitemapper.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
1
2
|
require 'sitemapper/helpers'
|
2
3
|
require 'sitemapper/map'
|
3
4
|
require 'sitemapper/accessors'
|
5
|
+
require 'sitemapper/object_mapper'
|
4
6
|
|
5
7
|
module Sitemapper
|
6
|
-
MAJOR, MINOR, TINY = 0,
|
8
|
+
MAJOR, MINOR, TINY = 0, 3, 0 #:nodoc:
|
7
9
|
|
8
10
|
# Get the running version of Sitemapper
|
9
|
-
def version
|
11
|
+
def self.version
|
10
12
|
[MAJOR, MINOR, TINY].join('.')
|
11
13
|
end
|
12
14
|
|
@@ -17,4 +19,30 @@ module Sitemapper
|
|
17
19
|
def self.map
|
18
20
|
@map or raise 'Uninitialized Sitemapper.map'
|
19
21
|
end
|
22
|
+
|
23
|
+
# Define the default meta lookup for objects on <tt>page</tt> helper
|
24
|
+
#
|
25
|
+
# <tt>lookup</tt> is a hash with the following options:
|
26
|
+
#
|
27
|
+
# * <tt>:desc</tt> method to look for page description
|
28
|
+
# * <tt>:keywords</tt> method to look for page keywords
|
29
|
+
# * <tt>:title</tt> method to look for page title
|
30
|
+
#
|
31
|
+
# All these arguments can be an Array, String or Symbol and will
|
32
|
+
# be used to lookup a valid method when you call <tt>page</tt> using
|
33
|
+
# something different of a Hash as argument. For example:
|
34
|
+
#
|
35
|
+
# <% page(@contact) %>
|
36
|
+
#
|
37
|
+
def self.meta_lookup=(lookup)
|
38
|
+
@meta_lookup = lookup
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.meta_lookup
|
42
|
+
@meta_lookup || {
|
43
|
+
:desc => [:short_description, :description],
|
44
|
+
:keywords => [:tag_list, :keywords],
|
45
|
+
:title => [:title, :name]
|
46
|
+
}
|
47
|
+
end
|
20
48
|
end
|