meta_tags 0.2.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.
Files changed (98) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +102 -0
  4. data/Rakefile +38 -0
  5. data/app/models/meta_tags/list.rb +14 -0
  6. data/db/migrate/20140114154410_create_meta_tags_list.rb +14 -0
  7. data/lib/generators/meta_tags/config/config_generator.rb +22 -0
  8. data/lib/generators/meta_tags/config/templates/initializer.rb +25 -0
  9. data/lib/meta_tags/container.rb +67 -0
  10. data/lib/meta_tags/controller.rb +130 -0
  11. data/lib/meta_tags/engine.rb +21 -0
  12. data/lib/meta_tags/meta_taggable.rb +21 -0
  13. data/lib/meta_tags/meta_taggable_macro.rb +15 -0
  14. data/lib/meta_tags/page_data_helper.rb +23 -0
  15. data/lib/meta_tags/tags/base.rb +50 -0
  16. data/lib/meta_tags/tags/description.rb +40 -0
  17. data/lib/meta_tags/tags/image.rb +23 -0
  18. data/lib/meta_tags/tags/keywords.rb +16 -0
  19. data/lib/meta_tags/tags/title.rb +44 -0
  20. data/lib/meta_tags/tags/url.rb +9 -0
  21. data/lib/meta_tags/version.rb +3 -0
  22. data/lib/meta_tags.rb +25 -0
  23. data/lib/tasks/meta_tags_tasks.rake +4 -0
  24. data/test/dummy/README.rdoc +261 -0
  25. data/test/dummy/Rakefile +7 -0
  26. data/test/dummy/app/assets/images/illustration.jpg +0 -0
  27. data/test/dummy/app/assets/javascripts/application.js +15 -0
  28. data/test/dummy/app/assets/javascripts/home.js +2 -0
  29. data/test/dummy/app/assets/javascripts/posts.js +2 -0
  30. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  31. data/test/dummy/app/assets/stylesheets/home.css +4 -0
  32. data/test/dummy/app/assets/stylesheets/posts.css +4 -0
  33. data/test/dummy/app/controllers/application_controller.rb +12 -0
  34. data/test/dummy/app/controllers/home_controller.rb +5 -0
  35. data/test/dummy/app/controllers/posts_controller.rb +17 -0
  36. data/test/dummy/app/helpers/application_helper.rb +2 -0
  37. data/test/dummy/app/helpers/home_helper.rb +2 -0
  38. data/test/dummy/app/helpers/posts_helper.rb +2 -0
  39. data/test/dummy/app/models/post.rb +4 -0
  40. data/test/dummy/app/views/home/index.html.erb +2 -0
  41. data/test/dummy/app/views/layouts/application.html.erb +17 -0
  42. data/test/dummy/app/views/posts/filter.html.erb +2 -0
  43. data/test/dummy/app/views/posts/index.html.erb +5 -0
  44. data/test/dummy/app/views/posts/show.html.erb +2 -0
  45. data/test/dummy/config/application.rb +59 -0
  46. data/test/dummy/config/boot.rb +10 -0
  47. data/test/dummy/config/database.yml +25 -0
  48. data/test/dummy/config/environment.rb +5 -0
  49. data/test/dummy/config/environments/development.rb +37 -0
  50. data/test/dummy/config/environments/production.rb +67 -0
  51. data/test/dummy/config/environments/test.rb +37 -0
  52. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  53. data/test/dummy/config/initializers/inflections.rb +15 -0
  54. data/test/dummy/config/initializers/meta_tags.rb +13 -0
  55. data/test/dummy/config/initializers/mime_types.rb +5 -0
  56. data/test/dummy/config/initializers/secret_token.rb +7 -0
  57. data/test/dummy/config/initializers/session_store.rb +8 -0
  58. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  59. data/test/dummy/config/locales/en.yml +14 -0
  60. data/test/dummy/config/routes.rb +10 -0
  61. data/test/dummy/config.ru +4 -0
  62. data/test/dummy/db/development.sqlite3 +0 -0
  63. data/test/dummy/db/migrate/20130131104614_create_posts.rb +11 -0
  64. data/test/dummy/db/migrate/20130131104618_add_attachment_image_to_posts.rb +11 -0
  65. data/test/dummy/db/schema.rb +28 -0
  66. data/test/dummy/log/development.log +1506 -0
  67. data/test/dummy/public/404.html +26 -0
  68. data/test/dummy/public/422.html +26 -0
  69. data/test/dummy/public/500.html +25 -0
  70. data/test/dummy/public/favicon.ico +0 -0
  71. data/test/dummy/script/rails +6 -0
  72. data/test/dummy/test/fixtures/posts.yml +11 -0
  73. data/test/dummy/test/functional/home_controller_test.rb +9 -0
  74. data/test/dummy/test/functional/posts_controller_test.rb +19 -0
  75. data/test/dummy/test/unit/helpers/home_helper_test.rb +4 -0
  76. data/test/dummy/test/unit/helpers/posts_helper_test.rb +4 -0
  77. data/test/dummy/test/unit/post_test.rb +7 -0
  78. data/test/dummy/tmp/cache/assets/CC7/220/sprockets%2Fd066c004d1fd26ae76a61303a7a18145 +0 -0
  79. data/test/dummy/tmp/cache/assets/CD5/B70/sprockets%2F416150dc3ac35079c94273cc46e90aa6 +0 -0
  80. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  81. data/test/dummy/tmp/cache/assets/CDF/870/sprockets%2Fb878faf942403e313a5b103e5d80488e +0 -0
  82. data/test/dummy/tmp/cache/assets/CF9/7C0/sprockets%2F40fc2f3d2a468a00e463f1d313cb1683 +0 -0
  83. data/test/dummy/tmp/cache/assets/D05/D40/sprockets%2F1c9faaf28d05409b88ad3113374d613c +0 -0
  84. data/test/dummy/tmp/cache/assets/D1A/310/sprockets%2F5384ad85f52d3272dbc64d46ef3876a4 +0 -0
  85. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  86. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  87. data/test/dummy/tmp/cache/assets/D5A/DB0/sprockets%2F8d018be37aba1bc45344022ac32de7f7 +0 -0
  88. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  89. data/test/dummy/tmp/cache/assets/D98/8B0/sprockets%2Fedbef6e0d0a4742346cf479f2c522eb0 +0 -0
  90. data/test/dummy/tmp/cache/assets/D9C/CD0/sprockets%2Fc85016e7bbd4f3adbb7635d01f85d39b +0 -0
  91. data/test/dummy/tmp/cache/assets/DA4/280/sprockets%2Fd35f8ce1156cdff20d6da32835de94d6 +0 -0
  92. data/test/dummy/tmp/cache/assets/DCF/E80/sprockets%2Fd1c75b2b7b92bf135ea57e2bc4d739ef +0 -0
  93. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  94. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  95. data/test/dummy/tmp/cache/assets/E10/A50/sprockets%2F3ceec61ba671c1fc8fec279989fb9d1d +0 -0
  96. data/test/meta_tags_test.rb +7 -0
  97. data/test/test_helper.rb +15 -0
  98. metadata +255 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7d7c3be2f90a4bf1e3a4fd71868bf3f70206077f
4
+ data.tar.gz: e8f7122e74b90b721931040e293afdafcc39a815
5
+ SHA512:
6
+ metadata.gz: 6eb4ae7f68556a5f7ad40b90571b9d2308a5851428f9aa7bce7609e937da80f1f1ac3c26814b83bce09a7a7083ab39f87869af0717ed4e2b089aa35dbdb2e45f
7
+ data.tar.gz: 1e0534967227d8cdca13a676d582864011fbd4b8f4927516dde521d798bc95022e03082fb59b57127f975c977c9d2bfd9980b3f6f9b65c700ba015ca920bd928
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 YOURNAME
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.md ADDED
@@ -0,0 +1,102 @@
1
+ # Meta_tags
2
+
3
+ Meta tags allows a Rails application to include meta tags in HTML, depending on the action. Content can be set by I18n locales, Models or defined in ApplicationController.
4
+
5
+ ## Installing
6
+
7
+ 1. Add this line to your Gemfile
8
+ ```ruby
9
+ gem 'meta_tags', git: "git://github.com/vala/meta_tags.git"
10
+ ```
11
+
12
+ 2. Generate config file :
13
+ ```bash
14
+ rails generate meta_tags:config
15
+ ```
16
+
17
+ ## Defining default values
18
+ ### In your ApplicationController
19
+ ```ruby
20
+ meta_tags_defaults(
21
+ title: "My title",
22
+ description: "My description",
23
+ keywords: Keywords,
24
+ image: "/assets/illustration.jpg"
25
+ # Facebook
26
+ site_name: 'Mysite',
27
+ type: 'website',
28
+ # Twitter
29
+ site: '@Mysite',
30
+ card: 'summary, photo, gallery, product, app, player'
31
+ )
32
+ ```
33
+
34
+ ### In your locales
35
+ ```yaml
36
+ en:
37
+ meta_tags:
38
+ controller:
39
+ posts:
40
+ index:
41
+ title: Test
42
+ description: Test description
43
+ ```
44
+
45
+ ### In a Controller
46
+ You can use the helper meta_tags_from to use data from the associated model
47
+ <tt>app/controllers/posts_controller.rb</tt>
48
+ ```ruby
49
+ class PostsController < ApplicationController
50
+ meta_tags_from :post
51
+
52
+ def index
53
+ @posts = Post.all
54
+ end
55
+
56
+ def show
57
+ @post = Post.find(params[:id])
58
+ end
59
+ end
60
+ ```
61
+
62
+ <tt>app/models/post.rb</tt>
63
+ ```ruby
64
+ class Post < ActiveRecord::Base
65
+ attr_accessible :description, :title, :image
66
+ has_attached_file :image
67
+ end
68
+ ```
69
+
70
+ Used methods can be defined in the initializer <tt>config/initializers/meta_tags.rb</tt>
71
+ ```ruby
72
+ MetaTags.config do |config|
73
+
74
+ # Default title methods to be checked for title
75
+ # config.title_methods = %w(title name)
76
+
77
+ # Default decsription methods to be checked for description
78
+ # config.description_methods = %w(description desc)
79
+
80
+ # Default description methods to be checked for image
81
+ # config.image_methods = %w(image picture avatar)
82
+ end
83
+ ```
84
+
85
+
86
+ ### Overwrite in a controller
87
+ ```ruby
88
+ class HomeController < ApplicationController
89
+ def index
90
+ set_meta_tag(:title, "Accueil")
91
+ end
92
+ end
93
+ ```
94
+
95
+ ## View helper
96
+ ```haml
97
+ !!!
98
+ %html
99
+ %head
100
+ = stylesheet_link_tag "application"
101
+ = meta_tags :open_graph, :twitter
102
+ ```
data/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'MetaTags'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+
24
+
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
28
+ require 'rake/testtask'
29
+
30
+ Rake::TestTask.new(:test) do |t|
31
+ t.libs << 'lib'
32
+ t.libs << 'test'
33
+ t.pattern = 'test/**/*_test.rb'
34
+ t.verbose = false
35
+ end
36
+
37
+
38
+ task :default => :test
@@ -0,0 +1,14 @@
1
+ module MetaTags
2
+ class List < ActiveRecord::Base
3
+ if respond_to?(:protected_attributes)
4
+ attr_accessible :name, :identifier, :meta_taggable_id,
5
+ :meta_taggable_type, :meta_title, :meta_description, :meta_keywords
6
+ end
7
+
8
+ belongs_to :meta_taggable, polymorphic: true
9
+
10
+ validates_presence_of :name, :identifier, unless: :meta_taggable
11
+
12
+ scope :without_meta_taggable, -> { where(meta_taggable_id: nil) }
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class CreateMetaTagsList < ActiveRecord::Migration
2
+ def change
3
+ create_table :meta_tags_lists do |t|
4
+ t.string :name
5
+ t.string :identifier
6
+ t.belongs_to :meta_taggable, polymorphic: true
7
+ t.string :meta_title
8
+ t.text :meta_description
9
+ t.text :meta_keywords
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ module MetaTags
2
+ class ConfigGenerator < Rails::Generators::Base
3
+ # Copied files come from templates folder
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ # Generator desc
7
+ desc "Meta-tags config generator"
8
+
9
+ def welcome
10
+ say "Configuring Meta-tags dependencies and files !"
11
+ end
12
+
13
+ def copy_initializer_file
14
+ say "Installing default initializer template"
15
+ copy_file "initializer.rb", "config/initializers/meta_tags.rb"
16
+ end
17
+
18
+ def copy_migrations
19
+ rake "meta_tags_railtie:install:migrations"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ MetaTags.config do |config|
4
+
5
+ # Default title methods to be checked for title
6
+ #
7
+ # config.title_methods = %w(title name)
8
+
9
+ # Default decsription methods to be checked for description
10
+ #
11
+ # config.description_methods = %w(description desc)
12
+
13
+ # Default image methods to be checked for image
14
+ #
15
+ # config.image_methods = %w(image picture avatar)
16
+
17
+ # When setting a title, keep original title after :
18
+ #
19
+ # Example : If you set the default title to "My Shop" and, on the home page
20
+ # set the title to "Home", you'll end up with a title of : "Home - My Shop"
21
+ #
22
+ # Defaults to true
23
+ #
24
+ # config.keep_default_title_present = false
25
+ end
@@ -0,0 +1,67 @@
1
+ require "sanitize"
2
+
3
+ module MetaTags
4
+ class Container
5
+ attr_accessor :default_title,
6
+ :default_description,
7
+ :default_image,
8
+ :default_url,
9
+ :default_site_name,
10
+ :default_keywords,
11
+ :default_type,
12
+ :default_site,
13
+ :default_card,
14
+ :title_changed,
15
+ :description_changed,
16
+ :image_changed,
17
+ :url_changed,
18
+ :site_name_changed,
19
+ :keywords_changed,
20
+ :type_changed,
21
+ :site_changed,
22
+ :card_changed
23
+
24
+ TAGS_LIST = %w(
25
+ title description image url site_name keywords type site card
26
+ )
27
+
28
+ TAGS_LIST.each do |label|
29
+ define_method(label) do
30
+ Sanitize.clean(
31
+ instance_variable_get(:"@#{ label }") || send(:"default_#{ label }")
32
+ )
33
+ end
34
+
35
+ define_method(:"#{ label }=") do |value|
36
+ instance_variable_set(:"@#{ label }_changed", true)
37
+ instance_variable_set(:"@#{ label }", value)
38
+ end
39
+
40
+ define_method(:"#{ label }_changed?") do
41
+ !!instance_variable_get(:"@#{ label }_changed")
42
+ end
43
+ end
44
+
45
+ def initialize options
46
+ options.each do |label, value|
47
+ self.send(:"default_#{ label }=", value)
48
+ end
49
+ end
50
+
51
+ def title=(value)
52
+ @title_changed = true
53
+ if default_title == value || !MetaTags.keep_default_title_present
54
+ @title = value
55
+ elsif MetaTags.keep_default_title_present
56
+ @title = "#{ value } - #{ default_title }"
57
+ end
58
+ end
59
+
60
+
61
+ def reset_changed_status
62
+ TAGS_LIST.each do |label|
63
+ self.send(:"#{ label }_changed=", false)
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,130 @@
1
+ module MetaTags
2
+ module Controller
3
+ extend ActiveSupport::Concern
4
+ include PageDataHelper
5
+
6
+ module ClassMethods
7
+ attr_accessor :meta_tags, :model_name, :modifier_block
8
+
9
+ def meta_tags_defaults(options)
10
+ @meta_tags = Container.new(options)
11
+ end
12
+
13
+ def meta_tags_from(model_name = nil, &block)
14
+ @model_name = model_name && model_name.to_s
15
+ @modifier_block = block_given? ? block : nil
16
+ end
17
+ end
18
+
19
+ included do
20
+ helper_method :meta_tags, :meta_tags_container, :set_meta_tag,
21
+ :meta_tags_data
22
+
23
+ after_filter do
24
+ meta_tags_container.reset_changed_status if meta_tags_container
25
+ end
26
+ end
27
+
28
+ attr_reader :instance
29
+
30
+ def meta_tags_container
31
+ @_meta_tags_container ||= ::ApplicationController.meta_tags.dup
32
+ end
33
+
34
+ def meta_tags_data
35
+ process_meta_tags
36
+ meta_tags_container
37
+ end
38
+
39
+ def meta_tags_for(identifier)
40
+ if identifier.kind_of?(ActiveRecord::Base)
41
+ @instance = identifier
42
+ elsif (list = MetaTags::List.where(identifier: identifier.to_s).first)
43
+ %w(title description keywords).each do |key|
44
+ if (value = list.send(:"meta_#{ key }").presence)
45
+ meta_tags_container.send(:"#{ key }=", value)
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ def meta_tags(*providers)
52
+ options = providers.pop if providers.last.is_a? Hash
53
+ charset = options[:encoding] rescue 'utf-8'
54
+
55
+ data = meta_tags_data
56
+
57
+ # Required meta tags
58
+ markup = <<-HTML
59
+ <meta charset="#{ charset }">
60
+ <title>#{ data.title }</title>
61
+ HTML
62
+
63
+ if data.keywords.presence
64
+ markup << "<meta name=\"keywords\" content=\"#{ data.keywords }\">"
65
+ end
66
+
67
+ # Default meta tags
68
+ markup << markup_from_provider(:default)
69
+
70
+ # Meta tags by provider
71
+ providers.each do |provider|
72
+ str = markup_from_provider provider
73
+
74
+ # Prevents same meta tags added twice
75
+ markup << str if !markup.include?(str)
76
+ end
77
+
78
+ markup.html_safe
79
+ end
80
+
81
+ def markup_from_provider(provider = :default)
82
+ tags = case provider.to_sym
83
+ when :open_graph
84
+ {
85
+ title: "property=\"og:title\"",
86
+ description: "property=\"og:description\"",
87
+ image: "property=\"og:image\"",
88
+ type: "property=\"og:type\"",
89
+ url: "property=\"og:url\"",
90
+ site_name: "property=\"og:site_name\""
91
+ }
92
+ when :twitter
93
+ {
94
+ title: "name=\"twitter:title\"",
95
+ description: "name=\"twitter:description\"",
96
+ image: "name=\"twitter:image\"",
97
+ url: "name=\"twitter:url\"",
98
+ site: "name=\"twitter:site\"",
99
+ card: "name=\"twitter:card\""
100
+ }
101
+ else
102
+ {
103
+ description: "name=\"description\"",
104
+ }
105
+ end
106
+
107
+ tags.each_with_object("") do |(key, property_string), buffer|
108
+ if (content = meta_tags_container.send(key)).presence
109
+ buffer << "<meta #{ property_string } content=\"#{ content }\">\n"
110
+ end
111
+ end
112
+ end
113
+
114
+ def process_meta_tags
115
+ Container::TAGS_LIST.each do |label|
116
+ next if meta_tags_container.send(:"#{ label }_changed?")
117
+
118
+ if (data = process_meta_tag(label))
119
+ set_meta_tag(label, data)
120
+ end
121
+ end
122
+ end
123
+
124
+ def set_meta_tag(key, value, options = {})
125
+ if value.presence && !options[:force]
126
+ meta_tags_container.send("#{ key }=", value)
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,21 @@
1
+ require "meta_tags/container"
2
+ require "meta_tags/page_data_helper"
3
+ require "meta_tags/controller"
4
+ require "meta_tags/meta_taggable"
5
+ require "meta_tags/meta_taggable_macro"
6
+
7
+ module MetaTags
8
+ class Railtie < Rails::Engine
9
+ initializer "include controller config" do
10
+ ActiveSupport.on_load(:action_controller) do
11
+ include Controller
12
+ end
13
+ end
14
+
15
+ initializer "mix meta_taggable macro in Active Record" do
16
+ ActiveSupport.on_load(:active_record) do
17
+ include MetaTaggableMacro
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module MetaTags
2
+ module MetaTaggable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ has_one :meta_tags_list, class_name: "MetaTags::List",
7
+ as: :meta_taggable, dependent: :destroy
8
+ accepts_nested_attributes_for :meta_tags_list, allow_destroy: true,
9
+ reject_if: :all_blank
10
+
11
+ # Ensure nested form can be handled for Rails < 4
12
+ if respond_to?(:protected_attributes)
13
+ attr_accessible :meta_tags_list_attributes
14
+ end
15
+ end
16
+
17
+ def meta_tagged?
18
+ meta_tags_list.presence
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module MetaTags
2
+ module MetaTaggableMacro
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def acts_as_meta_taggable
7
+ include MetaTaggable
8
+ end
9
+ end
10
+
11
+ def meta_tagged?
12
+ false
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ require "meta_tags/tags/base"
2
+ require "meta_tags/tags/title"
3
+ require "meta_tags/tags/description"
4
+ require "meta_tags/tags/keywords"
5
+ require "meta_tags/tags/image"
6
+ require "meta_tags/tags/url"
7
+
8
+ module MetaTags
9
+ module PageDataHelper
10
+ def process_meta_tag tag
11
+ if (processor = processors[tag])
12
+ processor.new(self).process!
13
+ end
14
+ end
15
+
16
+ def processors
17
+ @processors ||= %w(title description image keywords url).reduce({}) do |hash, tag|
18
+ hash[tag] = MetaTags::Tags.const_get(tag.camelize)
19
+ hash
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,50 @@
1
+ module MetaTags
2
+ module Tags
3
+ class Base
4
+ attr_accessor :controller
5
+
6
+ def initialize controller
7
+ @controller = controller
8
+ end
9
+
10
+ protected
11
+
12
+ def member_action?
13
+ controller.params.key?(:id)
14
+ end
15
+
16
+ def action_i18n label
17
+ options = modifier_options.merge(default: "")
18
+ I18n.t(action_key(label), options).presence
19
+ end
20
+
21
+ def action_key label
22
+ key = %w(meta_tags controller)
23
+ key << controller.params[:controller]
24
+ key << controller.params[:action]
25
+ key << label
26
+ key.join(".")
27
+ end
28
+
29
+ def instance
30
+ return controller.instance if controller.instance
31
+
32
+ @instance ||= if model_name
33
+ controller.instance_variable_get(:"@#{ model_name }")
34
+ end
35
+ end
36
+
37
+ def model_name
38
+ controller.class.model_name.presence
39
+ end
40
+
41
+ def modifier_options
42
+ @modifier_options ||= if controller.class.modifier_block
43
+ instance_eval(&controller.class.modifier_block)
44
+ else
45
+ {}
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,40 @@
1
+ require "truncate_html"
2
+
3
+ module MetaTags
4
+ module Tags
5
+ class Description < Base
6
+ include TruncateHtmlHelper
7
+
8
+ def process!
9
+ meta_taggable_description || instance_description || action_name
10
+ end
11
+
12
+ private
13
+
14
+ def meta_taggable_description
15
+ instance && instance.meta_tagged? &&
16
+ instance.meta_tags_list.meta_description.presence
17
+ end
18
+
19
+ def instance_description
20
+ if instance
21
+ MetaTags.description_methods.each do |method|
22
+ if instance.respond_to?(method)
23
+ if (description = instance.send(method).presence)
24
+ return truncate_html(description, length: 250)
25
+ end
26
+ end
27
+ end
28
+
29
+ return nil
30
+ end
31
+ end
32
+
33
+ def action_name
34
+ if (action_name = action_i18n(:description))
35
+ return action_name
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,23 @@
1
+ module MetaTags
2
+ module Tags
3
+ class Image < Base
4
+ def process!
5
+ instance_image
6
+ end
7
+
8
+ private
9
+
10
+ def instance_image
11
+ if member_action?
12
+ MetaTags.image_methods.each do |method|
13
+ if instance.respond_to?(method) && instance.send(method)
14
+ return instance.send(method).url
15
+ end
16
+ end
17
+
18
+ nil
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ module MetaTags
2
+ module Tags
3
+ class Keywords < Base
4
+ def process!
5
+ meta_taggable_keywords
6
+ end
7
+
8
+ private
9
+
10
+ def meta_taggable_keywords
11
+ instance && instance.meta_tagged? &&
12
+ instance.meta_tags_list.meta_keywords.presence
13
+ end
14
+ end
15
+ end
16
+ end