seo_meta_builder 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.
@@ -0,0 +1,3 @@
1
+ 0.1.0 (Mar 12, 2010)
2
+
3
+ * Initial release
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Guillaume Luccisano - g-mai|: guillaume.luccisano
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.
@@ -0,0 +1,15 @@
1
+ = SeoMetaBuilder
2
+
3
+ Seo Meta Builder is a plugin for Ruby on Rails that lets you easily manage your meta titles and descriptions.
4
+
5
+ All necessary informations are available on the wiki : http://wiki.github.com/kwi/seo_meta_builder
6
+
7
+ == Functionalities :
8
+
9
+ * Help to eradicate duplicate titles and descriptions (Very good for SEO)
10
+ * Easy to set up
11
+ * Build title/description with multiple parameters
12
+ * Works with multiple languages through the I18n Api.
13
+ * Works with Rails 2 and Rails 3
14
+
15
+ Copyright (c) 2010 Guillaume Luccisano - g-mai|: guillaume.luccisano, released under the MIT license
@@ -0,0 +1,13 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'spec/rake/spectask'
4
+
5
+ spec_files = Rake::FileList["spec/**/*_spec.rb"]
6
+
7
+ desc "Run specs for current Rails version"
8
+ Spec::Rake::SpecTask.new do |t|
9
+ t.spec_files = spec_files
10
+ t.spec_opts = ["-c"]
11
+ end
12
+
13
+ task :default => :spec
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'seo_meta_builder'
@@ -0,0 +1,104 @@
1
+ # encoding: utf-8
2
+ # Build localized titles and description for webpages
3
+ module SeoMetaBuilder
4
+
5
+ # Set title and description at the same time
6
+ def set_page_metas(hash, order = nil)
7
+ set_page_title(hash, order)
8
+ set_page_description(hash, order)
9
+ end
10
+
11
+ # Set the page title with an hash of parameters
12
+ def set_page_title(hash, order = nil, type = :title)
13
+ @page_title = page_meta_string_builder(type, hash, order)
14
+ end
15
+
16
+ # Set the page description with an hash of parameters
17
+ def set_page_description(hash, order = nil, type = :description)
18
+ @page_description = page_meta_string_builder(type, hash, order)
19
+ end
20
+
21
+ private
22
+ def page_meta_auto_hash
23
+ hash = {}
24
+ hash[:id] = params[:id] if !params[:id].blank?
25
+ if !params[:page].blank?
26
+ (hash[:page] = params[:page].to_i) rescue nil
27
+ end
28
+ return hash
29
+ end
30
+
31
+ AutoOrder = [:id, :page]
32
+
33
+ # Return the default action name to use as scope
34
+ def page_meta_action_name
35
+ case params[:action]
36
+ when 'create'
37
+ :new
38
+ when 'update'
39
+ :edit
40
+ when 'destroy'
41
+ :show
42
+ else
43
+ params[:action]
44
+ end
45
+ end
46
+
47
+ # Return an escaped value for building metas
48
+ def page_meta_escape_value(val)
49
+ val.to_s.gsub("<", "&lt;").gsub(">", "&gt;")
50
+ end
51
+
52
+ # Build a meta string for i18n dependings on parameters
53
+ def page_meta_string_builder(type = :title, hash = {}, order = nil)
54
+ pt = "page_#{type}"
55
+
56
+ # Build order table
57
+ order = hash.keys if !order
58
+ order.each do |k|
59
+ pt << " - #{k}: %s" if hash[k]
60
+ end
61
+
62
+ # Build values table ordered and escaped
63
+ values = []
64
+ order.each do |k|
65
+ # Escape value :
66
+ values << page_meta_escape_value(hash[k]) if hash[k]
67
+ end
68
+
69
+ pt = I18n.t(pt, :default => 'no', :scope => :"meta.#{params[:controller]}.#{page_meta_action_name}")
70
+
71
+ # No translation found
72
+ # So use meta/default translation !
73
+ if pt == 'no'
74
+ pt = "page_#{type}"
75
+ pt << (' - %s' * values.size)
76
+ pt = I18n.t(pt, :default => pt, :scope => :'meta.default')
77
+ end
78
+
79
+ begin
80
+ sprintf(pt, *values)
81
+ rescue Exception
82
+ raise 'Mal formed string : ' + pt.to_s + ' | for : ' + values.join(' - ').to_s
83
+ end
84
+ end
85
+
86
+ public
87
+ def page_title
88
+ @page_title ||= page_meta_string_builder(:title, page_meta_auto_hash, AutoOrder)
89
+ end
90
+
91
+ def page_description
92
+ @page_description ||= page_meta_string_builder(:description, page_meta_auto_hash, AutoOrder)
93
+ end
94
+ end
95
+
96
+
97
+ # In order to use with rails :
98
+ if defined? ActionView
99
+ ActionView::Base.send :include, SeoMetaBuilder
100
+ end
101
+
102
+ if defined? ActionController
103
+ ActionController::Base.send :include, SeoMetaBuilder
104
+ end
@@ -0,0 +1,15 @@
1
+ en:
2
+ yo: 'salut'
3
+ meta:
4
+ default:
5
+ page_title: 'Default Title'
6
+ page_description: 'Default description'
7
+ "page_title - %s": 'Default Title %s'
8
+ "page_title - %s - %s": 'Default Title %s - %s'
9
+ users:
10
+ index:
11
+ page_title: 'Members list'
12
+ page_description: 'Members list description'
13
+ show:
14
+ "page_title - login: %s": '%s, member of our site'
15
+ "page_description - login: %s": '%s is member of our website'
@@ -0,0 +1,14 @@
1
+ fr:
2
+ meta:
3
+ default:
4
+ page_title: 'Default Title Fr'
5
+ page_description: 'Default description Fr'
6
+ "page_title - %s": 'Default Title %s Fr'
7
+ "page_title - %s - %s": 'Default Title %s Fr - %s'
8
+ users:
9
+ index:
10
+ page_title: 'Listing des membres'
11
+ page_description: 'La page de la liste des membres'
12
+ show:
13
+ "page_title - login: %s": '%s, membre de notre site'
14
+ "page_description - login: %s": '%s est membre de notre site'
@@ -0,0 +1,100 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe :seo_meat_builder do
4
+ before(:all) do
5
+ I18n.load_path = []
6
+ I18n.reload!
7
+ end
8
+
9
+ before(:each) do
10
+ @o = SeoMetaTester.new
11
+ end
12
+
13
+ it "should show page_title when nothing is translated" do
14
+ @o.page_title.should == 'page_title'
15
+ end
16
+
17
+ it "should show page_description when nothing is translated" do
18
+ @o.page_description.should == 'page_description'
19
+ end
20
+
21
+ it "should just load i18n translations test :p" do
22
+ # Add I18n load_path
23
+ I18n.load_path = (I18n.load_path << Dir[File.join(File.dirname(__FILE__), '../locales', '*.yml')]).uniq
24
+ I18n.reload!
25
+ I18n.locale = :en
26
+ end
27
+
28
+ it "should show correct default for page_title" do
29
+ @o.page_title.should == 'Default Title'
30
+ end
31
+
32
+ it "should show correct default for page_description" do
33
+ @o.page_description.should == 'Default description'
34
+ end
35
+
36
+ it "should show correct default for page_title with auto id parameters" do
37
+ @o.params = {:controller => :u, :action => :a, :id => 1}
38
+ @o.page_title.should == 'Default Title 1'
39
+ end
40
+
41
+ it "should show correct default for page_title with auto id parameters in fr" do
42
+ I18n.locale = :fr
43
+ @o.params = {:controller => :u, :action => :a, :id => 1}
44
+ @o.page_title.should == 'Default Title 1 Fr'
45
+ end
46
+
47
+ it "should show correct default for page_title with auto id and page parameters" do
48
+ I18n.locale = :en
49
+ @o.params = {:controller => :u, :action => :a, :id => 1, :page => 32}
50
+ @o.page_title.should == 'Default Title 1 - 32'
51
+ end
52
+
53
+ it "should show correct default for page_title with auto id and page parameters in fr" do
54
+ I18n.locale = :fr
55
+ @o.params = {:controller => :u, :action => :a, :id => 1, :page => 32}
56
+ @o.page_title.should == 'Default Title 1 Fr - 32'
57
+ end
58
+
59
+ it "should show correct page_title with translation done" do
60
+ I18n.locale = :en
61
+ @o.params = {:controller => :users, :action => :index}
62
+ @o.page_title.should == 'Members list'
63
+ end
64
+
65
+ it "should show correct page_title with parameters" do
66
+ I18n.locale = :en
67
+ @o.params = {:controller => :users, :action => :show}
68
+ @o.set_page_title(:login => 'kwi')
69
+ @o.page_title.should == 'kwi, member of our site'
70
+ end
71
+
72
+ it "should show correct page_title with parameters in fr" do
73
+ I18n.locale = :fr
74
+ @o.params = {:controller => :users, :action => :show}
75
+ @o.set_page_title(:login => 'kwi')
76
+ @o.page_title.should == 'kwi, membre de notre site'
77
+ end
78
+
79
+ it "should show correct ordered parameters" do
80
+ I18n.locale = :en
81
+ @o.params = {:controller => :users, :action => :show}
82
+ @o.set_page_title({:p1 => :p1, :p3 => :p3, :p2 => :p2, :login => 'kwi'}, [:login, :p1, :p2, :p3])
83
+ @o.page_title.should == 'page_title - kwi - p1 - p2 - p3'
84
+ end
85
+
86
+ it "should show not show parameters if no order is specified" do
87
+ I18n.locale = :en
88
+ @o.params = {:controller => :users, :action => :show}
89
+ @o.set_page_title({:p1 => :p1, :p3 => :p3, :p2 => :p2, :login => 'kwi'}, [:login, :p4, :p3])
90
+ @o.page_title.should == 'Default Title kwi - p3'
91
+ end
92
+
93
+ it "should correctly escape parameters" do
94
+ I18n.locale = :fr
95
+ @o.params = {:controller => :users, :action => :show}
96
+ @o.set_page_title(:login => '<script></script>')
97
+ @o.page_title.should == '&lt;script&gt;&lt;/script&gt;, membre de notre site'
98
+ end
99
+
100
+ end
@@ -0,0 +1,19 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+
4
+ require 'i18n'
5
+ require 'active_support'
6
+
7
+ require File.dirname(__FILE__) + '/../init.rb'
8
+
9
+ class SeoMetaTester
10
+ include SeoMetaBuilder
11
+
12
+ def params=(params)
13
+ @params = params
14
+ end
15
+
16
+ def params
17
+ @params || {:controller => :controller, :action => :index}
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: seo_meta_builder
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Guillaume Luccisano
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-04-14 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: Seo Meta Builder is a plugin for Ruby on Rails that lets you easily manage your meta titles and descriptions.
22
+ email: guillaume.luccisano@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - lib/seo_meta_builder.rb
31
+ - spec/locales/en.yml
32
+ - spec/locales/fr.yml
33
+ - spec/seo_meta_builder/seo_meta_builder_spec.rb
34
+ - spec/spec_helper.rb
35
+ - CHANGELOG.rdoc
36
+ - MIT-LICENSE
37
+ - Rakefile
38
+ - README.rdoc
39
+ - init.rb
40
+ has_rdoc: true
41
+ homepage: http://github.com/kwi/seo_meta_builder
42
+ licenses: []
43
+
44
+ post_install_message:
45
+ rdoc_options: []
46
+
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ segments:
61
+ - 1
62
+ - 3
63
+ - 4
64
+ version: 1.3.4
65
+ requirements: []
66
+
67
+ rubyforge_project: seo_meta_builder
68
+ rubygems_version: 1.3.6
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: Manage easily your meta titles and descriptions with Ruby On Rails
72
+ test_files: []
73
+