metanol 0.0.4 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +27 -18
- data/.overcommit.yml +73 -0
- data/.overcommit_gems +8 -0
- data/.overcommit_gems.lock +72 -0
- data/.rspec +1 -0
- data/.rubocop.yml +139 -0
- data/.rubocop_todo.yml +0 -0
- data/Gemfile +5 -8
- data/Gemfile.lock +194 -0
- data/README.md +12 -4
- data/Rakefile +1 -1
- data/lib/metanol/engine.rb +1 -1
- data/lib/metanol/engine_controller.rb +46 -72
- data/lib/metanol/helpers.rb +25 -31
- data/lib/metanol/meta/base.rb +82 -57
- data/lib/metanol/meta/main.rb +10 -7
- data/lib/metanol/meta/micro_data.rb +13 -0
- data/lib/metanol/meta/open_graph.rb +19 -9
- data/lib/metanol/meta/webmaster.rb +17 -15
- data/lib/metanol/railtie.rb +5 -5
- data/lib/metanol/support.rb +8 -0
- data/lib/metanol/version.rb +1 -1
- data/lib/metanol.rb +7 -0
- data/metanol.gemspec +36 -18
- metadata +101 -34
- data/spec/controllers/home_controller_spec.rb +0 -32
- data/spec/controllers/tests_controller_spec.rb +0 -187
- data/spec/spec_helper.rb +0 -22
- data/spec/support/application.rb +0 -48
@@ -1,114 +1,88 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'meta/base')
|
2
|
-
require File.join(File.dirname(__FILE__), 'meta/main')
|
3
|
-
require File.join(File.dirname(__FILE__), 'meta/open_graph')
|
4
|
-
require File.join(File.dirname(__FILE__), 'meta/webmaster')
|
5
1
|
require 'active_support/dependencies'
|
6
2
|
|
7
3
|
module Metanol
|
8
|
-
|
9
4
|
# Engine's controller which has all methods for storing and processing meta tag's data
|
10
5
|
module EngineController
|
11
6
|
extend ActiveSupport::Concern
|
12
7
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
def meta(*args)
|
19
|
-
add_meta_tag(:main, *args)
|
20
|
-
end
|
21
|
-
|
22
|
-
def og_meta(*args)
|
23
|
-
add_meta_tag(:og, *args)
|
24
|
-
end
|
25
|
-
|
26
|
-
def wm_meta(*args)
|
27
|
-
add_meta_tag(:wm, *args)
|
28
|
-
end
|
8
|
+
included do
|
9
|
+
before_action :clear_metanols
|
10
|
+
end
|
29
11
|
|
30
|
-
|
31
|
-
|
12
|
+
module ClassMethods
|
13
|
+
def common_metanols
|
14
|
+
@@common_metanols ||= {}
|
32
15
|
end
|
33
16
|
|
34
|
-
|
35
|
-
|
36
|
-
|
17
|
+
SUPPORT_GROUPS.keys.each do |method|
|
18
|
+
method_name = "#{method == :main ? '' : "#{method}_"}meta"
|
19
|
+
define_method method_name do |*args|
|
20
|
+
add_meta_tag(common_metanols, method, *args)
|
21
|
+
end
|
37
22
|
|
38
|
-
|
39
|
-
|
23
|
+
get_method_name = "get_#{method_name}"
|
24
|
+
define_method get_method_name do |name|
|
25
|
+
get_meta_tag(common_metanols, method, name)
|
26
|
+
end
|
40
27
|
end
|
41
28
|
|
42
29
|
private
|
43
30
|
|
44
|
-
def add_meta_tag(type, *args)
|
31
|
+
def add_meta_tag(repo, type, *args)
|
45
32
|
if args[0].is_a? Hash
|
46
33
|
filters = args[1..-1]
|
47
34
|
args[0].each do |name, value|
|
48
|
-
add_meta_by_type type, name, value, filters
|
35
|
+
add_meta_by_type repo, type, name, value, filters
|
49
36
|
end
|
50
37
|
else
|
51
38
|
name = args[0].to_sym
|
52
39
|
value = args[1]
|
53
40
|
filters = args[2..-1]
|
54
|
-
add_meta_by_type type, name, value, filters
|
41
|
+
add_meta_by_type repo, type, name, value, filters
|
55
42
|
end
|
56
43
|
end
|
57
44
|
|
58
|
-
def add_meta_by_type(type, name, value, filters=[])
|
59
|
-
|
60
|
-
key =
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
else
|
65
|
-
metanol_options[key] = data[:type].new(name, value, filters)
|
45
|
+
def add_meta_by_type(repo, type, name, value, filters = [])
|
46
|
+
meta_class = SUPPORT_GROUPS[type]
|
47
|
+
key = get_meta_key(type, name)
|
48
|
+
unless repo.key? key
|
49
|
+
repo[key] = meta_class.new(name, value, filters)
|
50
|
+
return
|
66
51
|
end
|
52
|
+
repo[key].value = value
|
53
|
+
repo[key].filters = filters
|
67
54
|
end
|
68
55
|
|
69
|
-
def
|
70
|
-
|
71
|
-
key
|
72
|
-
metanol_options.key?(key) ? metanol_options[key].value : nil
|
56
|
+
def get_meta_tag(repo, type, name)
|
57
|
+
key = get_meta_key(type, name)
|
58
|
+
repo.key?(key) ? repo[key].value : nil
|
73
59
|
end
|
74
60
|
|
75
|
-
def
|
76
|
-
{
|
77
|
-
main: { key: name, type: Meta::Main },
|
78
|
-
og: { key: "og:#{name}", type: Meta::OpenGraph },
|
79
|
-
wm: { key: "wm:#{name}", type: Meta::Webmaster }
|
80
|
-
}
|
61
|
+
def get_meta_key(type, name)
|
62
|
+
"#{type}:#{name}"
|
81
63
|
end
|
82
64
|
end
|
83
65
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
self.class.og_meta(*args)
|
90
|
-
end
|
91
|
-
|
92
|
-
def wm_meta(*args)
|
93
|
-
self.class.wm_meta(*args)
|
94
|
-
end
|
66
|
+
SUPPORT_GROUPS.keys.each do |method|
|
67
|
+
method_name = "#{method == :main ? '' : "#{method}_"}meta"
|
68
|
+
define_method method_name do |*args|
|
69
|
+
self.class.send 'add_meta_tag', action_metanols, method, *args
|
70
|
+
end
|
95
71
|
|
96
|
-
|
97
|
-
|
72
|
+
get_method_name = "get_#{method_name}"
|
73
|
+
define_method get_method_name do |name|
|
74
|
+
self.class.send 'get_meta_tag', action_metanols, method, name
|
75
|
+
end
|
98
76
|
end
|
99
77
|
|
100
|
-
def
|
101
|
-
|
78
|
+
def action_metanols
|
79
|
+
@action_metanols ||= {}
|
102
80
|
end
|
103
81
|
|
104
|
-
|
105
|
-
self.class.get_og_meta name
|
106
|
-
end
|
82
|
+
private
|
107
83
|
|
108
|
-
def
|
109
|
-
|
84
|
+
def clear_metanols
|
85
|
+
@action_metanols = {}
|
110
86
|
end
|
111
|
-
|
112
87
|
end
|
113
|
-
|
114
|
-
end
|
88
|
+
end
|
data/lib/metanol/helpers.rb
CHANGED
@@ -1,29 +1,34 @@
|
|
1
1
|
module Metanol
|
2
2
|
module Helpers
|
3
|
-
|
4
3
|
# Render all meta tags
|
5
4
|
def metanol_tags
|
6
|
-
result =
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
result = ''
|
6
|
+
SUPPORT_GROUPS.keys.each do |type|
|
7
|
+
result << send("metanol_#{type}_tags")
|
8
|
+
end
|
9
|
+
result.html_safe
|
10
10
|
end
|
11
11
|
|
12
12
|
# Render OpenGraph meta tags
|
13
13
|
def metanol_og_tags
|
14
14
|
result = metanol_render_tags ::Metanol::Meta::OpenGraph
|
15
|
-
result << ::Metanol::Meta::OpenGraph.render_current_url(current_url)
|
16
|
-
result
|
15
|
+
result << ::Metanol::Meta::OpenGraph.render_current_url(current_url)
|
16
|
+
result.html_safe
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
SUPPORT_GROUPS.keys.each do |method|
|
20
|
+
get_method_name = "get_#{method == :main ? '' : "#{method}_"}meta"
|
21
|
+
define_method get_method_name do |name|
|
22
|
+
controller.__send__(get_method_name, name)
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
next if method == :og
|
26
|
+
|
27
|
+
method_name = "metanol_#{method}_tags"
|
28
|
+
class_type = SUPPORT_GROUPS[method]
|
29
|
+
define_method method_name do
|
30
|
+
metanol_render_tags(class_type).html_safe
|
31
|
+
end
|
27
32
|
end
|
28
33
|
|
29
34
|
# Return a current URL
|
@@ -31,28 +36,17 @@ module Metanol
|
|
31
36
|
request.original_url
|
32
37
|
end
|
33
38
|
|
34
|
-
def get_meta(name)
|
35
|
-
self.controller.get_meta(name)
|
36
|
-
end
|
37
|
-
|
38
|
-
def get_og_meta(name)
|
39
|
-
self.controller.get_og_meta(name)
|
40
|
-
end
|
41
|
-
|
42
|
-
def get_wm_meta(name)
|
43
|
-
self.controller.get_wm_meta(name)
|
44
|
-
end
|
45
|
-
|
46
39
|
private
|
47
40
|
|
48
41
|
def metanol_render_tags(type)
|
49
|
-
result =
|
50
|
-
|
42
|
+
result = ''
|
43
|
+
metanols = controller.class.common_metanols.merge(controller.action_metanols)
|
44
|
+
metanols.each_value do |value|
|
51
45
|
next unless value.is_a? type
|
46
|
+
|
52
47
|
result << value.render
|
53
48
|
end
|
54
|
-
result
|
49
|
+
result
|
55
50
|
end
|
56
|
-
|
57
51
|
end
|
58
|
-
end
|
52
|
+
end
|
data/lib/metanol/meta/base.rb
CHANGED
@@ -1,75 +1,100 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module Metanol
|
4
|
+
module Meta
|
5
|
+
class Base
|
6
|
+
ERR_FILTERS_WRONG_TYPE = 'The <filters> parameter must be an Array.'
|
7
|
+
ERR_FILTERS_WRONG_VALUE_TYPE =
|
8
|
+
'The <filters> parameter must include only string or symbol values.'
|
9
|
+
SUPPORTED_FILTERS = %i[html overspaces whitespaces clean].freeze
|
6
10
|
|
7
|
-
|
11
|
+
attr_writer :value
|
12
|
+
attr_reader :name
|
8
13
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@value = value
|
13
|
-
self.filters = filters
|
14
|
-
end
|
14
|
+
def initialize(name, value, filters = [])
|
15
|
+
@name = name.to_sym
|
16
|
+
raise(NameError.new("The meta tag '#{@name}' isn't supported.", @name)) unless valid?(@name)
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
@value = value
|
19
|
+
self.filters = filters
|
20
|
+
end
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
22
|
+
def filters=(value)
|
23
|
+
@filters = validate_filters(value)
|
24
|
+
end
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
26
|
+
def render
|
27
|
+
result = value
|
28
|
+
return '' if result.blank?
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
end
|
30
|
+
"<meta #{attr_name}=\"#{name}\" #{attr_value}=\"#{result}\" />"
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
def value
|
34
|
+
result = @value
|
35
|
+
return result if @filters.blank?
|
36
36
|
|
37
|
-
|
37
|
+
filter_overspaces(filter_whitespaces(filter_html_tags(result)))
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
def self.filter_html(text)
|
41
|
+
text = text.gsub(%r{<br/?>}, ' ')
|
42
|
+
text.gsub(%r{</?\w+/?>}, '')
|
43
|
+
end
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
result = self.class.filter_html(result) if @filters.include?(:html) || @filters.include?(:clean)
|
47
|
-
result = self.class.filter_whitespaces(result) if @filters.include?(:whitespaces) || @filters.include?(:clean)
|
48
|
-
result = self.class.filter_overspaces(result) if @filters.include?(:overspaces) || @filters.include?(:clean)
|
49
|
-
result
|
50
|
-
end
|
45
|
+
def self.filter_overspaces(text)
|
46
|
+
text.gsub(/\ {2,}/, ' ')
|
47
|
+
end
|
51
48
|
|
52
|
-
|
53
|
-
|
54
|
-
|
49
|
+
def self.filter_whitespaces(text)
|
50
|
+
text.gsub(/\s/, ' ')
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
55
54
|
|
56
|
-
|
55
|
+
def valid?(_name)
|
56
|
+
true
|
57
|
+
end
|
58
|
+
|
59
|
+
def attr_name
|
60
|
+
'name'
|
61
|
+
end
|
62
|
+
|
63
|
+
def attr_value
|
64
|
+
'content'
|
65
|
+
end
|
57
66
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
67
|
+
def validate_filters(filters = [])
|
68
|
+
result = []
|
69
|
+
raise StandardError, ERR_FILTERS_WRONG_TYPE unless filters.is_a?(Array)
|
70
|
+
|
71
|
+
begin
|
72
|
+
filters.map(&:to_sym).each do |filter_value|
|
73
|
+
result << validate_filter(filter_value)
|
74
|
+
end
|
75
|
+
rescue NoMethodError
|
76
|
+
raise StandardError, ERR_FILTERS_WRONG_VALUE_TYPE
|
66
77
|
end
|
67
|
-
|
68
|
-
raise StandardError.new("The filters parameter must includes only string or symbol values.")
|
78
|
+
result
|
69
79
|
end
|
70
|
-
result
|
71
|
-
end
|
72
80
|
|
73
|
-
|
81
|
+
def validate_filter(filter_value)
|
82
|
+
return filter_value if SUPPORTED_FILTERS.include? filter_value
|
74
83
|
|
75
|
-
|
84
|
+
raise(StandardError, "Only #{SUPPORTED_FILTERS.join(', ')} filters are supported.")
|
85
|
+
end
|
86
|
+
|
87
|
+
def filter_html_tags(result)
|
88
|
+
(@filters & %i[html clean]).presence ? self.class.filter_html(result) : result
|
89
|
+
end
|
90
|
+
|
91
|
+
def filter_whitespaces(result)
|
92
|
+
(@filters & %i[whitespaces clean]).presence ? self.class.filter_whitespaces(result) : result
|
93
|
+
end
|
94
|
+
|
95
|
+
def filter_overspaces(result)
|
96
|
+
(@filters & %i[overspaces clean]).presence ? self.class.filter_overspaces(result) : result
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/lib/metanol/meta/main.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Metanol
|
4
|
+
module Meta
|
5
|
+
class Main < Base
|
6
|
+
def render
|
7
|
+
return (value.present? ? "<title>#{value}</title>" : '') if @name == :title
|
8
|
+
|
9
|
+
super
|
10
|
+
end
|
7
11
|
end
|
8
12
|
end
|
9
|
-
|
10
|
-
end
|
13
|
+
end
|
@@ -1,13 +1,23 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Metanol
|
4
|
+
module Meta
|
5
|
+
class OpenGraph < Base
|
6
|
+
def self.render_current_url(url)
|
7
|
+
return '' if url.blank?
|
8
|
+
|
9
|
+
"<meta property=\"og:url\" content=\"#{url}\" />"
|
10
|
+
end
|
11
|
+
|
12
|
+
def name
|
13
|
+
"og:#{@name}"
|
14
|
+
end
|
7
15
|
|
8
|
-
|
9
|
-
|
16
|
+
protected
|
17
|
+
|
18
|
+
def attr_name
|
19
|
+
'property'
|
20
|
+
end
|
10
21
|
end
|
11
22
|
end
|
12
|
-
|
13
|
-
end
|
23
|
+
end
|
@@ -1,22 +1,24 @@
|
|
1
|
-
|
2
|
-
class Webmaster < Base
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Metanol
|
4
|
+
module Meta
|
5
|
+
class Webmaster < Base
|
6
|
+
SUPPORT_TAGS = {
|
7
7
|
bing: 'msvalidate.01',
|
8
|
-
alexa: 'alexaVerifyID'
|
9
|
-
|
8
|
+
alexa: 'alexaVerifyID',
|
9
|
+
yandex: 'yandex-verification',
|
10
|
+
google: 'google-site-verification'
|
11
|
+
}.freeze
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
def name
|
14
|
+
SUPPORT_TAGS[@name]
|
15
|
+
end
|
14
16
|
|
15
|
-
|
17
|
+
protected
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
+
def valid?(name)
|
20
|
+
SUPPORT_TAGS[name].present?
|
21
|
+
end
|
19
22
|
end
|
20
|
-
|
21
23
|
end
|
22
|
-
end
|
24
|
+
end
|
data/lib/metanol/railtie.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Metanol
|
2
|
-
class Railtie < ::Rails::Railtie
|
3
|
-
initializer 'metanolize' do |
|
4
|
-
::ActionView::Base.
|
5
|
-
::ActionController::Base.
|
2
|
+
class Railtie < ::Rails::Railtie # :nodoc:
|
3
|
+
initializer 'metanolize' do |_app|
|
4
|
+
::ActionView::Base.include Metanol::Helpers
|
5
|
+
::ActionController::Base.include Metanol::EngineController
|
6
6
|
end
|
7
7
|
end
|
8
|
-
end
|
8
|
+
end
|
data/lib/metanol/version.rb
CHANGED
data/lib/metanol.rb
CHANGED
@@ -2,6 +2,13 @@ require 'metanol/version'
|
|
2
2
|
|
3
3
|
require 'rails'
|
4
4
|
|
5
|
+
require 'metanol/meta/base'
|
6
|
+
require 'metanol/meta/main'
|
7
|
+
require 'metanol/meta/open_graph'
|
8
|
+
require 'metanol/meta/webmaster'
|
9
|
+
require 'metanol/meta/micro_data'
|
10
|
+
|
11
|
+
require 'metanol/support'
|
5
12
|
require 'metanol/helpers'
|
6
13
|
require 'metanol/engine_controller'
|
7
14
|
require 'metanol/railtie'
|
data/metanol.gemspec
CHANGED
@@ -1,26 +1,44 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'metanol/version'
|
5
6
|
|
6
|
-
Gem::Specification.new do |
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
gem.email = ["ekondr@gmail.com"]
|
12
|
-
gem.description = %q{This is a meta tags plugin which helps to manage meta tags in your Rails application. It supports some OpenGraph meta tags, Webmaster's meta tags (such as Google, Bing, Yandex, Alexa verification meta tags) and other standard HTML meta tags (such as a description). It can be used by Rails 3.2+ applications}
|
13
|
-
gem.summary = %q{A meta tags engine plugin for Rails 3.2+ applications}
|
14
|
-
gem.homepage = "https://github.com/ekondr/metanol"
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'metanol'
|
9
|
+
spec.version = Metanol::VERSION
|
10
|
+
spec.authors = ['Yevhen Kondratiuk']
|
11
|
+
spec.email = ['ekondr@gmail.com']
|
15
12
|
|
16
|
-
|
13
|
+
spec.summary = '<META> tags engine plugin for Ruby on Rails applications'
|
14
|
+
spec.description = 'This is a meta tags plugin which helps to manage meta tags in '\
|
15
|
+
'your Rails application. It supports some OpenGraph meta tags, '\
|
16
|
+
"Webmaster's meta tags (such as Google, Bing, Yandex, Alexa "\
|
17
|
+
'verification tags), MicroData meta tags and other standard '\
|
18
|
+
'HTML meta tags (such as a <description>, <title> etc). It can be used by '\
|
19
|
+
'Rails 3.2+ applications.'
|
20
|
+
spec.homepage = 'https://github.com/ekondr/metanol'
|
21
|
+
spec.license = 'MIT'
|
17
22
|
|
18
|
-
gem.
|
19
|
-
|
20
|
-
|
21
|
-
|
23
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
24
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
25
|
+
spec.respond_to?(:metadata) ||
|
26
|
+
raise('RubyGems 2.0 or newer is required to protect against public gem pushes.')
|
22
27
|
|
23
|
-
gem
|
28
|
+
# Specify which files should be added to the gem when it is released.
|
29
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
30
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
31
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
32
|
+
end
|
33
|
+
spec.bindir = 'bin'
|
34
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
35
|
+
spec.require_paths = ['lib']
|
36
|
+
spec.required_ruby_version = '>= 2.3'
|
24
37
|
|
25
|
-
|
38
|
+
spec.add_dependency 'rails', '>= 6.0'
|
39
|
+
spec.add_development_dependency 'capybara', '>= 0'
|
40
|
+
spec.add_development_dependency 'pry-byebug'
|
41
|
+
spec.add_development_dependency 'rspec', '>= 3.0'
|
42
|
+
spec.add_development_dependency 'rspec-rails', '>= 5.0'
|
43
|
+
spec.add_development_dependency 'sqlite3', '>= 0'
|
26
44
|
end
|