meta-tags 2.10.0 → 2.11.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c62e4368df6664d294c8a771a4fda243ef66408b017689742f5ceb5434963b6e
4
- data.tar.gz: cfeb9bb181302099866df2d52cf46a9f8b413a0989e66408c987a648564c20a0
3
+ metadata.gz: 827318e8c08dab5cef3d26fb5b3be72c2c181c503d7d3c784c0175b6d0a4d8dd
4
+ data.tar.gz: 57aba518f8fae0222b7a7f88610de04504f9b8c09e617106b7f83856f33bca36
5
5
  SHA512:
6
- metadata.gz: 9aa85cb08c594b6dde4e10e4d304d6336574f9dae2ee8556f129be282ef8bc41fe59ea9c307998eb3e94d3f96f4d5c70d3f779a849ef6a4b7a6199512c269272
7
- data.tar.gz: 6e256b83bdf38ccad564ff572d970912d2feb29eac3097633691e2903b3873fd6841bbd1dff3f7b7c98dbc7fc781019fe5217ad7ab1e27d42a58b8591b4df7eb
6
+ metadata.gz: fd1ce5878ae54cf7b99c2815623a896fe34a03aba1c72f8914a7a617a508baee705cdeb64b8c3d325c5408029681db1c0015b17baf96c081da18161a93658b57
7
+ data.tar.gz: eb609dcf0374e880ff75eb664467f04f80367d605ef7bd84fc4446b3df579bbf6fd5ed5925485b5f39ce400e8328a6ccebf056a047a5bc7f11614694e0dfd9c5
@@ -1 +1 @@
1
- 479��X��Q���+�9"�_r@ ���`jTx{���0U@��Ip ��T槗Q�A�� 3�QіO\�<�_X_֐d ������3VF�+�ݹ�dt����{E:0um��<4�&oFV����@��|��'I�ӹh��f @�GH��Џf��]ނj0��\$�uX��b��SfSe&쵈x<q���Ca��vX�Hb����>88�@ avU!��Z/��720����X֯=U|JnP��B)j���
1
+ g��H���0�Ξ��i�"xi��܄Q��j��/�u���qj)�����,~�8uK7��6��e��0�/͞c�ě��P���jc��g�ՠT7͜�;&��� �~��rY+�0}V���͟?Ꙑ}��i�M�sf��`BA3&P��QҠ���3� R�15wAz5�זW����)�$R6���M���4Jd$�\��Z�EvR��u�2���U#��>���C�<��0fi].�f[��n��
data.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,12 @@
1
+ ## 2.11.0 (November 16, 2018) [☰](https://github.com/kpumuk/meta-tags/compare/v2.10.0...v2.11.0)
2
+
3
+ Features:
4
+ - Added a configuration option `minify_output` to remove new line characters between meta tags ([182](https://github.com/kpumuk/meta-tags/pull/182))
5
+ – Title, description, and keywords can be an object responding to `#to_str` ([183](https://github.com/kpumuk/meta-tags/pull/183))
6
+
7
+ Bugfixes:
8
+ - Truncate title before escaping HTML characters ([180](https://github.com/kpumuk/meta-tags/pull/180))
9
+
1
10
  ## 2.10.0 (June 8, 2018) [☰](https://github.com/kpumuk/meta-tags/compare/v2.9.0...v2.10.0)
2
11
 
3
12
  Features:
data/Gemfile CHANGED
@@ -1,11 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'http://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in meta-tags.gemspec
4
6
  gemspec
5
7
 
6
- gem 'actionpack', "~> #{ENV['RAILS_VERSION']}" if ENV['RAILS_VERSION']
8
+ if ENV['RAILS_VERSION']
9
+ # Install specified version of actionpack if requested
10
+ gem 'actionpack', "~> #{ENV['RAILS_VERSION']}"
11
+ end
7
12
 
8
13
  group :test do
14
+ # Lock rubocop to a specific version we use on CI. If you update this,
15
+ # don't forget to switch rubocop channel in the .codeclimate.yml
16
+ gem 'rubocop', '0.60.0'
17
+ # We use this gem on CI to calculate code coverage.
9
18
  gem 'simplecov'
19
+ # Format RSpec output for CircleCI
10
20
  gem 'rspec_junit_formatter'
11
21
  end
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler'
2
4
  Bundler::GemHelper.install_tasks
3
5
 
@@ -6,3 +8,11 @@ RSpec::Core::RakeTask.new(:spec)
6
8
 
7
9
  task test: :spec
8
10
  task default: :spec
11
+
12
+ desc 'Rebuild Circle CI configuration based on the build matrix template .circleci/config.yml.erb'
13
+ task :circleci do
14
+ require 'erb'
15
+ template_path = File.expand_path('.circleci/config.yml.erb', __dir__)
16
+ config_path = File.expand_path('.circleci/config.yml', __dir__)
17
+ File.write config_path, ERB.new(File.read(template_path)).result
18
+ end
@@ -1,21 +1,20 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQ8wDQYDVQQDDAZrcHVt
3
- dWsxFjAUBgoJkiaJk/IsZAEZFgZrcHVtdWsxFDASBgoJkiaJk/IsZAEZFgRpbmZv
4
- MB4XDTE3MDgyNDE2MDUzOVoXDTE4MDgyNDE2MDUzOVowPzEPMA0GA1UEAwwGa3B1
5
- bXVrMRYwFAYKCZImiZPyLGQBGRYGa3B1bXVrMRQwEgYKCZImiZPyLGQBGRYEaW5m
6
- bzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALw2YroZc+IT+rs8NuPu
7
- c13DelrxrpAgPEu1zuRb3l7WaHRNWA4TyS8Z6Aa1G2O+FdUZNMW1n7IwP/QMJ9Mz
8
- ahRBiTmhik5kasJ9s0h1lq5/hZiycm0o5OtGioUzCkvk+UEMpzMHbLmVSZCzYciy
9
- NDRDbXB0rLLu1eJk+gKgn6Qf5vj93h1w28BdWdaA7YegtbmipZ+pjmzCQAfPActT
10
- 6uXHG4dSo7Lz9jiFRI5dUizFbGXcRqkQ2b5AB8FFmfcvbqERvzQKBICnybjsKP0N
11
- pJ3vGgO2sh5GvJFOPk1Vlur2nX9ZFznPEP1CEAQ+NFrmKRt355Z5sgOkAojSGnIL
12
- /1sCAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFPa4
13
- VFc1YOlV1u/7EGTwMCAk8YE9MB0GA1UdEQQWMBSBEmtwdW11a0BrcHVtdWsuaW5m
14
- bzAdBgNVHRIEFjAUgRJrcHVtdWtAa3B1bXVrLmluZm8wDQYJKoZIhvcNAQEFBQAD
15
- ggEBADVN1hwt6ryAPcL8DBB7wM/cYy3oVpYDO1rLGfrdEOgI/Kz+qYbp+6cx9RCY
16
- DOY6N3GVifGBlFEuyfY3Nubx9mG0FzyBytU7Cb+u+HF3Aw/MnGRoUuY3bzxy3sVE
17
- t9uyKLaSN0e70mipmWWHhzIZg9sXFfNNt1vLipuw8ZScyoJAa1p5AK4syX6ZAL9G
18
- g8psHzMWdefrDNJaB8PG8BI2Nb0sIKs8HdACKZo+qDO6b+oi4Wk0nLbRH7qnJcww
19
- QwaoNrsQi488Dsk54YiNQWVouzfjRqEa4uUxSyKmRfQp7MNILESAOCXM+wZIxanu
20
- C9c9eUxgNTnHhsR3sK0QCIMwtUI=
2
+ MIIDODCCAiCgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhrcHVt
3
+ dWsvREM9a3B1bXVrL0RDPWluZm8wHhcNMTgxMTE2MTgxOTIzWhcNMTkxMTE2MTgx
4
+ OTIzWjAjMSEwHwYDVQQDDBhrcHVtdWsvREM9a3B1bXVrL0RDPWluZm8wggEiMA0G
5
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC8NmK6GXPiE/q7PDbj7nNdw3pa8a6Q
6
+ IDxLtc7kW95e1mh0TVgOE8kvGegGtRtjvhXVGTTFtZ+yMD/0DCfTM2oUQYk5oYpO
7
+ ZGrCfbNIdZauf4WYsnJtKOTrRoqFMwpL5PlBDKczB2y5lUmQs2HIsjQ0Q21wdKyy
8
+ 7tXiZPoCoJ+kH+b4/d4dcNvAXVnWgO2HoLW5oqWfqY5swkAHzwHLU+rlxxuHUqOy
9
+ 8/Y4hUSOXVIsxWxl3EapENm+QAfBRZn3L26hEb80CgSAp8m47Cj9DaSd7xoDtrIe
10
+ RryRTj5NVZbq9p1/WRc5zxD9QhAEPjRa5ikbd+eWebIDpAKI0hpyC/9bAgMBAAGj
11
+ dzB1MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBT2uFRXNWDpVdbv
12
+ +xBk8DAgJPGBPTAdBgNVHREEFjAUgRJrcHVtdWtAa3B1bXVrLmluZm8wHQYDVR0S
13
+ BBYwFIESa3B1bXVrQGtwdW11ay5pbmZvMA0GCSqGSIb3DQEBCwUAA4IBAQB9bd46
14
+ p2C6r49hmuxMrIFRi05MS0Nze6GvlYvF5mb2+KS9YCLWLFb1G+0zttX51qVdO3nc
15
+ uw1O5ku+Up47jv5ClyguHinCntFCA5hupyYkbpnFuURZE3QIY6UZQyJ2xuIPFfnR
16
+ Q8sXb5/btWSNhKXx29TL35SkEH5fzPA90DljUPGp3lLEK0+7FQk0OkRVumdyanEE
17
+ LUchqnAWHnNCdQhEhsnbYhSvG0NE2uzMWeUd6uDONYsRFNRXaRwj8tykWgKZvIod
18
+ j0ZkOZOMk6hzny9+AnYZ7eiUqp/XX7Hn+hqtl/AebKhbFapnTu0n7KcfM0oDaLUr
19
+ Fc+FAHErSClMb7YN
21
20
  -----END CERTIFICATE-----
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MetaTags
2
4
  module Generators
3
5
  class InstallGenerator < Rails::Generators::Base
4
6
  desc "Copy MetaTags default files"
5
- source_root File.expand_path('../templates', __FILE__)
7
+ source_root File.expand_path('templates', __dir__)
6
8
 
7
9
  def copy_config
8
10
  template "config/initializers/meta_tags.rb"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Use this setup block to configure all options available in MetaTags.
2
4
  MetaTags.configure do |config|
3
5
  # How many characters should the title meta tag have at most. Default is 70.
@@ -22,6 +24,10 @@ MetaTags.configure do |config|
22
24
  # appear on the page as is. Default is true.
23
25
  # config.keywords_lowercase = true
24
26
 
27
+ # When true, the output will not include new line characters between meta tags.
28
+ # Default is false.
29
+ # config.minify_output = false
30
+
25
31
  # When false, generated meta tags will be self-closing (<meta ... />) instead
26
32
  # of open (`<meta ...>`). Default is true.
27
33
  # config.open_meta_tags = true
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'meta_tags'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'English'
2
4
  require 'action_controller'
3
5
  require 'action_view'
@@ -7,7 +9,7 @@ module MetaTags
7
9
  # Returns MetaTags gem configuration.
8
10
  #
9
11
  def self.config
10
- @@config ||= Configuration.new
12
+ @config ||= Configuration.new
11
13
  end
12
14
 
13
15
  # Configures MetaTags gem.
@@ -34,5 +36,5 @@ require 'meta_tags/content_tag'
34
36
  require 'meta_tags/text_normalizer'
35
37
  require 'meta_tags/view_helper'
36
38
 
37
- ActionView::Base.send :include, MetaTags::ViewHelper
38
- ActionController::Base.send :include, MetaTags::ControllerHelper
39
+ ActionView::Base.include MetaTags::ViewHelper
40
+ ActionController::Base.include MetaTags::ControllerHelper
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MetaTags
2
4
  # MetaTags configuration.
3
5
  class Configuration
@@ -23,6 +25,10 @@ module MetaTags
23
25
  # Default is true, which means "open".
24
26
  attr_accessor :open_meta_tags
25
27
 
28
+ # When true, the output will not include new line characters between meta tags.
29
+ # Default is false.
30
+ attr_accessor :minify_output
31
+
26
32
  # Custom meta tags that should use `property` attribute instead of `name`
27
33
  # - an array of strings or symbols representing their names or name-prefixes.
28
34
  attr_reader :property_tags
@@ -70,6 +76,7 @@ module MetaTags
70
76
  @keywords_lowercase = true
71
77
  @property_tags = default_property_tags.dup
72
78
  @open_meta_tags = true
79
+ @minify_output = false
73
80
  end
74
81
  end
75
82
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MetaTags
2
4
  # Represents an HTML meta tag with content (<tag></tag>).
3
5
  # Content should be passed as a `:content` attribute.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MetaTags
2
4
  # Contains methods to use in controllers.
3
5
  #
@@ -13,9 +15,9 @@ module MetaTags
13
15
  # Processes the <tt>@page_title</tt>, <tt>@page_keywords</tt>, and
14
16
  # <tt>@page_description</tt> instance variables and calls +render+.
15
17
  def render(*args, &block)
16
- self.meta_tags[:title] = @page_title if @page_title
17
- self.meta_tags[:keywords] = @page_keywords if @page_keywords
18
- self.meta_tags[:description] = @page_description if @page_description
18
+ meta_tags[:title] = @page_title if @page_title
19
+ meta_tags[:keywords] = @page_keywords if @page_keywords
20
+ meta_tags[:description] = @page_description if @page_description
19
21
 
20
22
  super
21
23
  end
@@ -23,7 +25,7 @@ module MetaTags
23
25
  # Set meta tags for the page.
24
26
  #
25
27
  # See <tt>MetaTags::ViewHelper#set_meta_tags</tt> for details.
26
- def set_meta_tags(meta_tags)
28
+ def set_meta_tags(meta_tags) # rubocop:disable Naming/AccessorMethodName
27
29
  self.meta_tags.update(meta_tags)
28
30
  end
29
31
  protected :set_meta_tags
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MetaTags
2
4
  # Class represents a collection of meta tags. Basically a wrapper around
3
5
  # HashWithIndifferentAccess, with some additional helper methods.
@@ -47,7 +49,7 @@ module MetaTags
47
49
  #
48
50
  def with_defaults(defaults = {})
49
51
  old_meta_tags = @meta_tags
50
- @meta_tags = normalize_open_graph(defaults).deep_merge!(self.meta_tags)
52
+ @meta_tags = normalize_open_graph(defaults).deep_merge!(@meta_tags)
51
53
  yield
52
54
  ensure
53
55
  @meta_tags = old_meta_tags
@@ -113,7 +115,8 @@ module MetaTags
113
115
  return unless title
114
116
 
115
117
  title = Array(title)
116
- title.each(&:downcase!) if extract(:lowercase) == true
118
+ return title.map(&:downcase) if extract(:lowercase) == true
119
+
117
120
  title
118
121
  end
119
122
 
@@ -148,9 +151,17 @@ module MetaTags
148
151
 
149
152
  noindex_attributes = if noindex_name == follow_name && (noindex_value || follow_value)
150
153
  # noindex has higher priority than index and follow has higher priority than nofollow
151
- [[noindex_name, noindex_value || index_value], [follow_name, follow_value || nofollow_value]]
154
+ [
155
+ [noindex_name, noindex_value || index_value],
156
+ [follow_name, follow_value || nofollow_value],
157
+ ]
152
158
  else
153
- [[index_name, index_value], [follow_name, follow_value], [noindex_name, noindex_value], [nofollow_name, nofollow_value]]
159
+ [
160
+ [index_name, index_value],
161
+ [follow_name, follow_value],
162
+ [noindex_name, noindex_value],
163
+ [nofollow_name, nofollow_value],
164
+ ]
154
165
  end
155
166
  append_noarchive_attribute group_attributes_by_key noindex_attributes
156
167
  end
@@ -215,7 +226,7 @@ module MetaTags
215
226
  # @return [Hash<String, String>] hash of grouped noindex keys and values
216
227
  #
217
228
  def group_attributes_by_key(attributes)
218
- Hash[attributes.group_by(&:first).map { |k, v| [k, v.map(&:last).compact.join(', ')] }]
229
+ Hash[attributes.group_by(&:first).map { |k, v| [k, v.map(&:last).tap(&:compact!).join(', ')] }]
219
230
  end
220
231
  end
221
232
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MetaTags
2
4
  # This class is used by MetaTags gems to render HTML meta tags into page.
3
5
  class Renderer
@@ -32,7 +34,8 @@ module MetaTags
32
34
  render_hashes(tags)
33
35
  render_custom(tags)
34
36
 
35
- tags.compact.map { |tag| tag.render(view) }.join("\n").html_safe
37
+ tags.tap(&:compact!).map! { |tag| tag.render(view) }
38
+ view.safe_join tags, MetaTags.config.minify_output ? "" : "\n"
36
39
  end
37
40
 
38
41
  protected
@@ -66,14 +69,14 @@ module MetaTags
66
69
  icon = meta_tags.extract(:icon)
67
70
  return unless icon
68
71
 
69
- if icon.kind_of?(String)
70
- tags << Tag.new(:link, rel: 'icon', href: icon, type: 'image/x-icon')
71
- else
72
- icon = [icon] if icon.kind_of?(Hash)
73
- icon.each do |icon_params|
74
- icon_params = { rel: 'icon', type: 'image/x-icon' }.with_indifferent_access.merge(icon_params)
75
- tags << Tag.new(:link, icon_params)
76
- end
72
+ # String? Value is an href
73
+ icon = [{ href: icon }] if icon.kind_of?(String)
74
+ # Hash? Single icon instead of a list of icons
75
+ icon = [icon] if icon.kind_of?(Hash)
76
+
77
+ icon.each do |icon_params|
78
+ icon_params = { rel: 'icon', type: 'image/x-icon' }.with_indifferent_access.merge(icon_params)
79
+ tags << Tag.new(:link, icon_params)
77
80
  end
78
81
  end
79
82
 
@@ -160,9 +163,9 @@ module MetaTags
160
163
  #
161
164
  # @param [Array<Tag>] tags a buffer object to store tag in.
162
165
  #
163
- def render_hashes(tags, options = {})
164
- meta_tags.meta_tags.keys.each do |property|
165
- render_hash(tags, property, options)
166
+ def render_hashes(tags, **opts)
167
+ meta_tags.meta_tags.each_key do |property|
168
+ render_hash(tags, property, **opts)
166
169
  end
167
170
  end
168
171
 
@@ -170,11 +173,11 @@ module MetaTags
170
173
  #
171
174
  # @param [Array<Tag>] tags a buffer object to store tag in.
172
175
  #
173
- def render_hash(tags, key, options = {})
176
+ def render_hash(tags, key, **opts)
174
177
  data = meta_tags.meta_tags[key]
175
178
  return unless data.kind_of?(Hash)
176
179
 
177
- process_hash(tags, key, data, options)
180
+ process_hash(tags, key, data, **opts)
178
181
  meta_tags.extract(key)
179
182
  end
180
183
 
@@ -198,7 +201,7 @@ module MetaTags
198
201
  # @param [Hash, Array, String, Symbol] content text content or a symbol reference to
199
202
  # top-level meta tag.
200
203
  #
201
- def process_tree(tags, property, content, options = {})
204
+ def process_tree(tags, property, content, **opts)
202
205
  method = case content
203
206
  when Hash
204
207
  :process_hash
@@ -207,7 +210,7 @@ module MetaTags
207
210
  else
208
211
  :render_tag
209
212
  end
210
- send(method, tags, property, content, options)
213
+ __send__(method, tags, property, content, **opts)
211
214
  end
212
215
 
213
216
  # Recursive method to process a hash with meta tags
@@ -216,11 +219,11 @@ module MetaTags
216
219
  # @param [String, Symbol] property a Hash or a String to render as meta tag.
217
220
  # @param [Hash] content nested meta tag attributes.
218
221
  #
219
- def process_hash(tags, property, content, options = {})
222
+ def process_hash(tags, property, content, **opts)
220
223
  content.each do |key, value|
221
224
  key = key.to_s == '_' ? property : "#{property}:#{key}"
222
225
  value = normalized_meta_tags[value] if value.kind_of?(Symbol)
223
- process_tree(tags, key, value, options)
226
+ process_tree(tags, key, value, **opts)
224
227
  end
225
228
  end
226
229
 
@@ -230,8 +233,8 @@ module MetaTags
230
233
  # @param [String, Symbol] property a Hash or a String to render as meta tag.
231
234
  # @param [Array] content array of nested meta tag attributes or values.
232
235
  #
233
- def process_array(tags, property, content, options = {})
234
- content.each { |v| process_tree(tags, property, v, options) }
236
+ def process_array(tags, property, content, **opts)
237
+ content.each { |v| process_tree(tags, property, v, **opts) }
235
238
  end
236
239
 
237
240
  # Recursive method to process a hash with meta tags
@@ -241,10 +244,9 @@ module MetaTags
241
244
  # @param [String, Symbol] value text content or a symbol reference to
242
245
  # top-level meta tag.
243
246
  #
244
- def render_tag(tags, name, value, options = {})
245
- name_key = options.fetch(:name_key, configured_name_key(name))
246
- value_key = options.fetch(:value_key, :content)
247
- tags << Tag.new(:meta, name_key => name.to_s, value_key => value) unless value.blank?
247
+ def render_tag(tags, name, value, name_key: nil, value_key: :content)
248
+ name_key ||= configured_name_key(name)
249
+ tags << Tag.new(:meta, name_key => name.to_s, value_key => value) if value.present?
248
250
  end
249
251
 
250
252
  # Returns meta tag property name for a give meta tag based on the
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MetaTags
2
4
  # Represents an HTML meta tag with no content (<tag />).
3
5
  class Tag
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MetaTags
2
4
  # Module contains helpers that normalize text meta tag values.
3
5
  module TextNormalizer
4
- extend self
6
+ extend self # rubocop:disable Style/ModuleFunction
5
7
 
6
8
  # Normalize title value.
7
9
  #
@@ -12,11 +14,11 @@ module MetaTags
12
14
  # @return [Array<String>] array of title parts with tags removed.
13
15
  #
14
16
  def normalize_title(site_title, title, separator, reverse = false)
15
- title = Array(title).flatten.map(&method(:strip_tags)).reject(&:blank?)
17
+ title = cleanup_strings(title)
16
18
  title.reverse! if reverse
17
19
 
18
- site_title = strip_tags(site_title)
19
- separator = strip_tags(separator)
20
+ site_title = cleanup_string(site_title)
21
+ separator = cleanup_string(separator, strip: false)
20
22
 
21
23
  # Truncate title and site title
22
24
  site_title, title = truncate_title(site_title, title, separator)
@@ -38,8 +40,12 @@ module MetaTags
38
40
  # to 200 characters.
39
41
  #
40
42
  def normalize_description(description)
41
- return '' if description.blank?
43
+ # description could be another object not a string, but since it probably
44
+ # serves the same purpose we could just as it to convert itself to str
45
+ # and continue from there
42
46
  description = cleanup_string(description)
47
+ return '' if description.blank?
48
+
43
49
  truncate(description, MetaTags.config.description_limit)
44
50
  end
45
51
 
@@ -49,10 +55,11 @@ module MetaTags
49
55
  # @return [String] list of keywords joined with comma, with tags removed.
50
56
  #
51
57
  def normalize_keywords(keywords)
52
- return '' if keywords.blank?
53
58
  keywords = cleanup_strings(keywords)
59
+ return '' if keywords.blank?
60
+
54
61
  keywords.each(&:downcase!) if MetaTags.config.keywords_lowercase
55
- separator = strip_tags MetaTags.config.keywords_separator
62
+ separator = cleanup_string MetaTags.config.keywords_separator, strip: false
56
63
 
57
64
  keywords = truncate_array(keywords, MetaTags.config.keywords_limit, separator)
58
65
  safe_join(keywords, separator)
@@ -74,10 +81,9 @@ module MetaTags
74
81
  def strip_tags(string)
75
82
  if defined?(Loofah)
76
83
  # Instead of strip_tags we will use Loofah to strip tags from now on
77
- stripped_unescaped = Loofah.fragment(string).text(encode_special_chars: false)
78
- ERB::Util.html_escape stripped_unescaped
84
+ Loofah.fragment(string).text(encode_special_chars: false)
79
85
  else
80
- ERB::Util.html_escape helpers.strip_tags(string)
86
+ helpers.strip_tags(string)
81
87
  end
82
88
  end
83
89
 
@@ -100,8 +106,14 @@ module MetaTags
100
106
  # @return [String] input string with no HTML tags and consequent white
101
107
  # space characters squashed into a single space.
102
108
  #
103
- def cleanup_string(string)
104
- strip_tags(string).gsub(/\s+/, ' ').strip.html_safe
109
+ def cleanup_string(string, strip: true)
110
+ return '' if string.nil?
111
+ raise ArgumentError, 'Expected a string or an object that implements #to_str' unless string.respond_to?(:to_str)
112
+
113
+ strip_tags(string.to_str).tap do |s|
114
+ s.gsub!(/\s+/, ' ')
115
+ s.strip! if strip
116
+ end
105
117
  end
106
118
 
107
119
  # Cleans multiple strings up.
@@ -110,8 +122,10 @@ module MetaTags
110
122
  # @return [Array<String>] clean strings.
111
123
  # @see cleanup_string
112
124
  #
113
- def cleanup_strings(strings)
114
- Array(strings).flatten.map(&method(:cleanup_string))
125
+ def cleanup_strings(strings, strip: true)
126
+ strings = Array(strings).flatten.map! { |s| cleanup_string(s, strip: strip) }
127
+ strings.reject!(&:blank?)
128
+ strings
115
129
  end
116
130
 
117
131
  # Truncates a string to a specific limit. Return string without truncation when limit 0 or nil
@@ -122,8 +136,15 @@ module MetaTags
122
136
  # @return [String] truncated string.
123
137
  #
124
138
  def truncate(string, limit = nil, natural_separator = ' ')
125
- return string if limit.to_i == 0
126
- helpers.truncate(string, length: limit, separator: natural_separator, omission: '', escape: false)
139
+ return string if limit.to_i == 0 # rubocop:disable Lint/NumberConversion
140
+
141
+ helpers.truncate(
142
+ string,
143
+ length: limit,
144
+ separator: natural_separator,
145
+ omission: '',
146
+ escape: true,
147
+ )
127
148
  end
128
149
 
129
150
  # Truncates a string to a specific limit.
@@ -165,7 +186,7 @@ module MetaTags
165
186
  end
166
187
 
167
188
  def truncate_title(site_title, title, separator)
168
- if MetaTags.config.title_limit.to_i > 0
189
+ if MetaTags.config.title_limit.to_i > 0 # rubocop:disable Lint/NumberConversion
169
190
  site_title_limited_length, title_limited_length = calculate_title_limits(site_title, title, separator)
170
191
 
171
192
  title = title_limited_length > 0 ? truncate_array(title, title_limited_length, separator) : []
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MetaTags
2
4
  # Gem version.
3
- VERSION = '2.10.0'.freeze
5
+ VERSION = '2.11.0'
4
6
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MetaTags
2
4
  # Contains methods to use in views and helpers.
3
5
  #
@@ -25,7 +27,7 @@ module MetaTags
25
27
  #
26
28
  # @see #display_meta_tags
27
29
  #
28
- def set_meta_tags(meta_tags = {})
30
+ def set_meta_tags(meta_tags = {}) # rubocop:disable Naming/AccessorMethodName
29
31
  self.meta_tags.update(meta_tags)
30
32
  end
31
33
 
@@ -55,7 +57,7 @@ module MetaTags
55
57
  #
56
58
  def title(title = nil, headline = '')
57
59
  set_meta_tags(title: title) unless title.nil?
58
- headline.blank? ? meta_tags[:title] : headline
60
+ headline.presence || meta_tags[:title]
59
61
  end
60
62
 
61
63
  # Set the page keywords.
@@ -149,13 +151,17 @@ module MetaTags
149
151
  # @option default [String] :title ("") page title;
150
152
  # @option default [String] :description (nil) page description;
151
153
  # @option default [String] :keywords (nil) page keywords;
152
- # @option default [String, Boolean] :prefix (" ") text between site name and separator; when +false+, no prefix will be rendered;
154
+ # @option default [String, Boolean] :prefix (" ") text between site name and separator;
155
+ # when +false+, no prefix will be rendered;
153
156
  # @option default [String] :separator ("|") text used to separate website name from page title;
154
- # @option default [String, Boolean] :suffix (" ") text between separator and page title; when +false+, no suffix will be rendered;
157
+ # @option default [String, Boolean] :suffix (" ") text between separator and page title;
158
+ # when +false+, no suffix will be rendered;
155
159
  # @option default [Boolean] :lowercase (false) when true, the page title will be lowercase;
156
160
  # @option default [Boolean] :reverse (false) when true, the page and site names will be reversed;
157
- # @option default [Boolean, String] :noindex (false) add noindex meta tag; when true, 'robots' will be used, otherwise the string will be used;
158
- # @option default [Boolean, String] :nofollow (false) add nofollow meta tag; when true, 'robots' will be used, otherwise the string will be used;
161
+ # @option default [Boolean, String] :noindex (false) add noindex meta tag; when true, 'robots' will be used,
162
+ # otherwise the string will be used;
163
+ # @option default [Boolean, String] :nofollow (false) add nofollow meta tag; when true, 'robots' will be used,
164
+ # otherwise the string will be used;
159
165
  # @option default [String] :canonical (nil) add canonical link tag.
160
166
  # @option default [Hash] :alternate ({}) add alternate link tag.
161
167
  # @option default [String] :prev (nil) add prev link tag;
@@ -172,7 +178,7 @@ module MetaTags
172
178
  # </head>
173
179
  #
174
180
  def display_meta_tags(defaults = {})
175
- self.meta_tags.with_defaults(defaults) { Renderer.new(meta_tags).render(self) }
181
+ meta_tags.with_defaults(defaults) { Renderer.new(meta_tags).render(self) }
176
182
  end
177
183
 
178
184
  # Returns full page title as a string without surrounding <title> tag.
@@ -185,9 +191,11 @@ module MetaTags
185
191
  # @param [Hash] defaults list of meta tags.
186
192
  # @option default [String] :site (nil) site title;
187
193
  # @option default [String] :title ("") page title;
188
- # @option default [String, Boolean] :prefix (" ") text between site name and separator; when +false+, no prefix will be rendered;
194
+ # @option default [String, Boolean] :prefix (" ") text between site name and separator; when +false+,
195
+ # no prefix will be rendered;
189
196
  # @option default [String] :separator ("|") text used to separate website name from page title;
190
- # @option default [String, Boolean] :suffix (" ") text between separator and page title; when +false+, no suffix will be rendered;
197
+ # @option default [String, Boolean] :suffix (" ") text between separator and page title; when +false+,
198
+ # no suffix will be rendered;
191
199
  # @option default [Boolean] :lowercase (false) when true, the page name will be lowercase;
192
200
  # @option default [Boolean] :reverse (false) when true, the page and site names will be reversed;
193
201
  #
@@ -1,4 +1,6 @@
1
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'meta_tags/version'
4
6
 
@@ -22,7 +24,7 @@ Gem::Specification.new do |spec|
22
24
  spec.add_dependency "actionpack", ">= 3.2.0", "< 5.3"
23
25
 
24
26
  spec.add_development_dependency "rake", "~> 12.0"
25
- spec.add_development_dependency "rspec", "~> 3.6.0"
27
+ spec.add_development_dependency "rspec", "~> 3.8.0"
26
28
  spec.add_development_dependency "rspec-html-matchers", "~> 0.9.1"
27
29
 
28
30
  spec.cert_chain = ["certs/kpumuk.pem"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meta-tags
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.0
4
+ version: 2.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmytro Shteflyuk
@@ -10,27 +10,26 @@ bindir: exe
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQ8wDQYDVQQDDAZrcHVt
14
- dWsxFjAUBgoJkiaJk/IsZAEZFgZrcHVtdWsxFDASBgoJkiaJk/IsZAEZFgRpbmZv
15
- MB4XDTE3MDgyNDE2MDUzOVoXDTE4MDgyNDE2MDUzOVowPzEPMA0GA1UEAwwGa3B1
16
- bXVrMRYwFAYKCZImiZPyLGQBGRYGa3B1bXVrMRQwEgYKCZImiZPyLGQBGRYEaW5m
17
- bzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALw2YroZc+IT+rs8NuPu
18
- c13DelrxrpAgPEu1zuRb3l7WaHRNWA4TyS8Z6Aa1G2O+FdUZNMW1n7IwP/QMJ9Mz
19
- ahRBiTmhik5kasJ9s0h1lq5/hZiycm0o5OtGioUzCkvk+UEMpzMHbLmVSZCzYciy
20
- NDRDbXB0rLLu1eJk+gKgn6Qf5vj93h1w28BdWdaA7YegtbmipZ+pjmzCQAfPActT
21
- 6uXHG4dSo7Lz9jiFRI5dUizFbGXcRqkQ2b5AB8FFmfcvbqERvzQKBICnybjsKP0N
22
- pJ3vGgO2sh5GvJFOPk1Vlur2nX9ZFznPEP1CEAQ+NFrmKRt355Z5sgOkAojSGnIL
23
- /1sCAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFPa4
24
- VFc1YOlV1u/7EGTwMCAk8YE9MB0GA1UdEQQWMBSBEmtwdW11a0BrcHVtdWsuaW5m
25
- bzAdBgNVHRIEFjAUgRJrcHVtdWtAa3B1bXVrLmluZm8wDQYJKoZIhvcNAQEFBQAD
26
- ggEBADVN1hwt6ryAPcL8DBB7wM/cYy3oVpYDO1rLGfrdEOgI/Kz+qYbp+6cx9RCY
27
- DOY6N3GVifGBlFEuyfY3Nubx9mG0FzyBytU7Cb+u+HF3Aw/MnGRoUuY3bzxy3sVE
28
- t9uyKLaSN0e70mipmWWHhzIZg9sXFfNNt1vLipuw8ZScyoJAa1p5AK4syX6ZAL9G
29
- g8psHzMWdefrDNJaB8PG8BI2Nb0sIKs8HdACKZo+qDO6b+oi4Wk0nLbRH7qnJcww
30
- QwaoNrsQi488Dsk54YiNQWVouzfjRqEa4uUxSyKmRfQp7MNILESAOCXM+wZIxanu
31
- C9c9eUxgNTnHhsR3sK0QCIMwtUI=
13
+ MIIDODCCAiCgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhrcHVt
14
+ dWsvREM9a3B1bXVrL0RDPWluZm8wHhcNMTgxMTE2MTgxOTIzWhcNMTkxMTE2MTgx
15
+ OTIzWjAjMSEwHwYDVQQDDBhrcHVtdWsvREM9a3B1bXVrL0RDPWluZm8wggEiMA0G
16
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC8NmK6GXPiE/q7PDbj7nNdw3pa8a6Q
17
+ IDxLtc7kW95e1mh0TVgOE8kvGegGtRtjvhXVGTTFtZ+yMD/0DCfTM2oUQYk5oYpO
18
+ ZGrCfbNIdZauf4WYsnJtKOTrRoqFMwpL5PlBDKczB2y5lUmQs2HIsjQ0Q21wdKyy
19
+ 7tXiZPoCoJ+kH+b4/d4dcNvAXVnWgO2HoLW5oqWfqY5swkAHzwHLU+rlxxuHUqOy
20
+ 8/Y4hUSOXVIsxWxl3EapENm+QAfBRZn3L26hEb80CgSAp8m47Cj9DaSd7xoDtrIe
21
+ RryRTj5NVZbq9p1/WRc5zxD9QhAEPjRa5ikbd+eWebIDpAKI0hpyC/9bAgMBAAGj
22
+ dzB1MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBT2uFRXNWDpVdbv
23
+ +xBk8DAgJPGBPTAdBgNVHREEFjAUgRJrcHVtdWtAa3B1bXVrLmluZm8wHQYDVR0S
24
+ BBYwFIESa3B1bXVrQGtwdW11ay5pbmZvMA0GCSqGSIb3DQEBCwUAA4IBAQB9bd46
25
+ p2C6r49hmuxMrIFRi05MS0Nze6GvlYvF5mb2+KS9YCLWLFb1G+0zttX51qVdO3nc
26
+ uw1O5ku+Up47jv5ClyguHinCntFCA5hupyYkbpnFuURZE3QIY6UZQyJ2xuIPFfnR
27
+ Q8sXb5/btWSNhKXx29TL35SkEH5fzPA90DljUPGp3lLEK0+7FQk0OkRVumdyanEE
28
+ LUchqnAWHnNCdQhEhsnbYhSvG0NE2uzMWeUd6uDONYsRFNRXaRwj8tykWgKZvIod
29
+ j0ZkOZOMk6hzny9+AnYZ7eiUqp/XX7Hn+hqtl/AebKhbFapnTu0n7KcfM0oDaLUr
30
+ Fc+FAHErSClMb7YN
32
31
  -----END CERTIFICATE-----
33
- date: 2018-06-08 00:00:00.000000000 Z
32
+ date: 2018-11-16 00:00:00.000000000 Z
34
33
  dependencies:
35
34
  - !ruby/object:Gem::Dependency
36
35
  name: actionpack
@@ -72,14 +71,14 @@ dependencies:
72
71
  requirements:
73
72
  - - "~>"
74
73
  - !ruby/object:Gem::Version
75
- version: 3.6.0
74
+ version: 3.8.0
76
75
  type: :development
77
76
  prerelease: false
78
77
  version_requirements: !ruby/object:Gem::Requirement
79
78
  requirements:
80
79
  - - "~>"
81
80
  - !ruby/object:Gem::Version
82
- version: 3.6.0
81
+ version: 3.8.0
83
82
  - !ruby/object:Gem::Dependency
84
83
  name: rspec-html-matchers
85
84
  requirement: !ruby/object:Gem::Requirement
metadata.gz.sig CHANGED
Binary file