meta_tags 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +102 -0
- data/Rakefile +38 -0
- data/app/models/meta_tags/list.rb +14 -0
- data/db/migrate/20140114154410_create_meta_tags_list.rb +14 -0
- data/lib/generators/meta_tags/config/config_generator.rb +22 -0
- data/lib/generators/meta_tags/config/templates/initializer.rb +25 -0
- data/lib/meta_tags/container.rb +67 -0
- data/lib/meta_tags/controller.rb +130 -0
- data/lib/meta_tags/engine.rb +21 -0
- data/lib/meta_tags/meta_taggable.rb +21 -0
- data/lib/meta_tags/meta_taggable_macro.rb +15 -0
- data/lib/meta_tags/page_data_helper.rb +23 -0
- data/lib/meta_tags/tags/base.rb +50 -0
- data/lib/meta_tags/tags/description.rb +40 -0
- data/lib/meta_tags/tags/image.rb +23 -0
- data/lib/meta_tags/tags/keywords.rb +16 -0
- data/lib/meta_tags/tags/title.rb +44 -0
- data/lib/meta_tags/tags/url.rb +9 -0
- data/lib/meta_tags/version.rb +3 -0
- data/lib/meta_tags.rb +25 -0
- data/lib/tasks/meta_tags_tasks.rake +4 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/images/illustration.jpg +0 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/javascripts/home.js +2 -0
- data/test/dummy/app/assets/javascripts/posts.js +2 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/assets/stylesheets/home.css +4 -0
- data/test/dummy/app/assets/stylesheets/posts.css +4 -0
- data/test/dummy/app/controllers/application_controller.rb +12 -0
- data/test/dummy/app/controllers/home_controller.rb +5 -0
- data/test/dummy/app/controllers/posts_controller.rb +17 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/helpers/home_helper.rb +2 -0
- data/test/dummy/app/helpers/posts_helper.rb +2 -0
- data/test/dummy/app/models/post.rb +4 -0
- data/test/dummy/app/views/home/index.html.erb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +17 -0
- data/test/dummy/app/views/posts/filter.html.erb +2 -0
- data/test/dummy/app/views/posts/index.html.erb +5 -0
- data/test/dummy/app/views/posts/show.html.erb +2 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/meta_tags.rb +13 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +14 -0
- data/test/dummy/config/routes.rb +10 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20130131104614_create_posts.rb +11 -0
- data/test/dummy/db/migrate/20130131104618_add_attachment_image_to_posts.rb +11 -0
- data/test/dummy/db/schema.rb +28 -0
- data/test/dummy/log/development.log +1506 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test/fixtures/posts.yml +11 -0
- data/test/dummy/test/functional/home_controller_test.rb +9 -0
- data/test/dummy/test/functional/posts_controller_test.rb +19 -0
- data/test/dummy/test/unit/helpers/home_helper_test.rb +4 -0
- data/test/dummy/test/unit/helpers/posts_helper_test.rb +4 -0
- data/test/dummy/test/unit/post_test.rb +7 -0
- data/test/dummy/tmp/cache/assets/CC7/220/sprockets%2Fd066c004d1fd26ae76a61303a7a18145 +0 -0
- data/test/dummy/tmp/cache/assets/CD5/B70/sprockets%2F416150dc3ac35079c94273cc46e90aa6 +0 -0
- data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/CDF/870/sprockets%2Fb878faf942403e313a5b103e5d80488e +0 -0
- data/test/dummy/tmp/cache/assets/CF9/7C0/sprockets%2F40fc2f3d2a468a00e463f1d313cb1683 +0 -0
- data/test/dummy/tmp/cache/assets/D05/D40/sprockets%2F1c9faaf28d05409b88ad3113374d613c +0 -0
- data/test/dummy/tmp/cache/assets/D1A/310/sprockets%2F5384ad85f52d3272dbc64d46ef3876a4 +0 -0
- data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/D5A/DB0/sprockets%2F8d018be37aba1bc45344022ac32de7f7 +0 -0
- data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/D98/8B0/sprockets%2Fedbef6e0d0a4742346cf479f2c522eb0 +0 -0
- data/test/dummy/tmp/cache/assets/D9C/CD0/sprockets%2Fc85016e7bbd4f3adbb7635d01f85d39b +0 -0
- data/test/dummy/tmp/cache/assets/DA4/280/sprockets%2Fd35f8ce1156cdff20d6da32835de94d6 +0 -0
- data/test/dummy/tmp/cache/assets/DCF/E80/sprockets%2Fd1c75b2b7b92bf135ea57e2bc4d739ef +0 -0
- data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/E10/A50/sprockets%2F3ceec61ba671c1fc8fec279989fb9d1d +0 -0
- data/test/meta_tags_test.rb +7 -0
- data/test/test_helper.rb +15 -0
- 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,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
|