metamagic 3.1.0 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bdbc421bf342a3f37d8b951f46c9af8b84afcb21
4
- data.tar.gz: d05a56ec576418e073965cfefc233cb9fef5fe31
3
+ metadata.gz: 5339c62a7823d6648e9df00ece50ef96c63ae8e8
4
+ data.tar.gz: 2d520fb7ef485717ff88f0a839ca39f010592a73
5
5
  SHA512:
6
- metadata.gz: aad55c49bd9634bc878e0c7491f9d4a222f73daf06a176d5b60537f0b784bfb93f1871467723651d76d9988ebb57f176535011795d8f33d2182728d307daf8c2
7
- data.tar.gz: d600bc8dbe537dbe48fe945f095c0508b30076f042206375af09c5e0d43260680918445dfe698163777f50648128f235e248bb264cae74e36c26b4095ec80e24
6
+ metadata.gz: 6c30629cae86fd8fbeaddfeca49d2ac19c05678541d9bfc75e3ed702cfbd9ca90ff4db26bbbeff3bef5e31d436aad198bd46f8bbbb9d5723322f22ef8c8fe50a
7
+ data.tar.gz: 372ce9d3f776f2fea1dfc42bdee3e9fe85a65d645c4a54ddc4243d392dd1bb06c1b52b1b6aa804b1b1e98cecd679725ab7eaabb5b260a5801d844386615bb341
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## Version 3.1.1
4
+
5
+ * Adds support for specifying templates on all tag types.
6
+ * Add `:separator` option for building meta titles.
7
+
3
8
  ## Version 3.1.0
4
9
 
5
10
  * Adds title templates.
data/README.md CHANGED
@@ -56,7 +56,16 @@ This will generate the following:
56
56
  </head>
57
57
  ```
58
58
 
59
- ### Adding a title template
59
+ ### Using templates
60
+
61
+ Templates can be used to insert meta values from your views into your layouts.
62
+ This is usable for example if you want to add something to your title on all
63
+ pages, or have some default keywords added to all pages. Templates work with
64
+ all tag types, including OpenGraph, Twitter, and others.
65
+
66
+ See below for examples on using templates.
67
+
68
+ #### Title templates
60
69
 
61
70
  Title templates can be used to automatically insert the name of your site into the meta title.
62
71
 
@@ -72,7 +81,7 @@ In your layout:
72
81
 
73
82
  ```erb
74
83
  <%
75
- metamagic site: "My Site", title_template: ":title :site"
84
+ metamagic site: "My Site", title: [:title, :site], separator: " — "
76
85
  %>
77
86
  ```
78
87
 
@@ -85,16 +94,73 @@ This will render the following:
85
94
  </head>
86
95
  ```
87
96
 
97
+ The default separator is ` - `.
98
+
99
+ If you hadn't set the title in your view, it would just display the site name.
100
+
88
101
  You can also use a proc to enable custom processing:
89
102
 
90
103
  ```erb
91
104
  <%
92
- metamagic site: "My Site", title_template: -> { title.include?(site) ? title : "#{title} — #{site}" }
105
+ metamagic site: "My Site", title: -> { title.include?(site) ? title : "#{title} — #{site}" }
93
106
  %>
94
107
  ```
95
108
 
96
109
  This will insert the site name only if it is not already present in the title.
97
110
 
111
+ You could also do this with a view helper:
112
+
113
+ ```ruby
114
+ module ApplicationHelper
115
+ def meta_title_for(title, site)
116
+ title.include?(site) ? title : "#{title} — #{site}"
117
+ end
118
+ end
119
+ ```
120
+
121
+ ```erb
122
+ <%
123
+ metamagic site: "My Site", title: -> { meta_title_for(title, site) }
124
+ %>
125
+ ```
126
+
127
+ The proc is still needed here to ensure the right context for the template.
128
+
129
+ #### Keywords template
130
+
131
+ Keyword templates can be used to add some default keywords to all pages on your site.
132
+
133
+ In your template:
134
+
135
+ ```erb
136
+ <%
137
+ meta keywords: %{one two three}
138
+ %>
139
+ ```
140
+
141
+ In your layout:
142
+
143
+ ```erb
144
+ <%
145
+ metamagic keywords: [:keywords, "four", "five", "six"]
146
+ %>
147
+ ```
148
+
149
+ This will render the following:
150
+
151
+ ```html
152
+ <head>
153
+ <meta content="one, two, three, four, five, six" name="keywords" />
154
+ ...
155
+ </head>
156
+ ```
157
+
158
+ #### Adding templates for other tag types
159
+
160
+ Templates are supported on all tag types. You can access the values set in the
161
+ view by replacing colons (`:`) in your meta keys with underscores (`_`), so for
162
+ example `og:image` can be accessed with `og_image`.
163
+
98
164
  ### Shortcut helpers
99
165
 
100
166
  For easy setting of meta tags, you can use the shortcut helpers like this:
@@ -335,17 +401,12 @@ Requirements
335
401
  * Rails 3.0 or above
336
402
  * Ruby 1.9 or above
337
403
 
338
- Versioning
339
- ----------
340
-
341
- Follows [semantic versioning](http://semver.org/).
342
-
343
404
  Contributing
344
405
  ------------
345
406
 
346
407
  1. Fork the project
347
408
  2. Create your feature branch (`git checkout -b my-new-feature`)
348
- 3. Make your changes and make sure the tests pass (run `rake`)
409
+ 3. Make your changes, including tests, and make sure the tests pass (run `rake`)
349
410
  4. Commit your changes (`git commit -am 'Add new feature'`)
350
411
  5. Push to the branch (`git push origin my-new-feature`)
351
412
  6. Create new pull request
@@ -10,6 +10,8 @@ module Metamagic
10
10
  twitter: TwitterTag
11
11
  }
12
12
 
13
+ DEFAULT_SEPARATOR = " - "
14
+
13
15
  class << self
14
16
  def tag_types
15
17
  @tag_types ||= DEFAULT_TAG_TYPES.dup
@@ -35,20 +37,37 @@ module Metamagic
35
37
  @tags ||= []
36
38
  end
37
39
 
38
- def add(hash = {})
40
+ def add(hash = {}, enable_templates = false)
39
41
  raise ArgumentError, "Defining meta properties via arrays has been removed in Metamagic v3.0 and replaced by some pretty helpers. Please see the readme at https://github.com/lassebunk/metamagic for more info." if hash.is_a?(Array)
40
42
 
41
- transform_hash(hash).each do |k, v|
42
- klass = self.class.tag_type_for_key(k)
43
+ transform_hash(hash).each do |key, value|
44
+ if enable_templates && is_template?(value)
45
+ add_template key, value
46
+ value = nil
47
+ end
48
+
49
+ klass = self.class.tag_type_for_key(key)
43
50
  tag = if klass.is_a?(Proc)
44
- CustomTag.new(self, k, v, klass)
51
+ CustomTag.new(self, key, value, klass)
45
52
  else
46
- klass.new(self, k, v)
53
+ klass.new(self, key, value)
47
54
  end
48
55
  tags << tag unless tags.include?(tag)
49
56
  end
50
57
  end
51
58
 
59
+ def templates
60
+ @templates ||= {}
61
+ end
62
+
63
+ def add_template(key, value)
64
+ templates[key] = value
65
+ end
66
+
67
+ def template_for(key)
68
+ templates[key]
69
+ end
70
+
52
71
  def has_tag_type?(prefix)
53
72
  self.class.tag_types.has_key?(prefix)
54
73
  end
@@ -65,6 +84,12 @@ module Metamagic
65
84
 
66
85
  attr_writer :site
67
86
 
87
+ def separator
88
+ @separator ||= DEFAULT_SEPARATOR
89
+ end
90
+
91
+ attr_writer :separator
92
+
68
93
  def render
69
94
  tags.sort.map(&:to_html).compact.join("\n").html_safe
70
95
  end
@@ -75,6 +100,14 @@ module Metamagic
75
100
 
76
101
  private
77
102
 
103
+ def is_template?(value)
104
+ Array(value).any? do |val|
105
+ val.is_a?(Proc) ||
106
+ val.is_a?(Symbol) ||
107
+ val =~ /:\w+/
108
+ end
109
+ end
110
+
78
111
  # Transforms a nested hash into meta property keys.
79
112
  def transform_hash(hash, path = "")
80
113
  hash.each_with_object({}) do |(k, v), ret|
@@ -19,6 +19,27 @@ module Metamagic
19
19
  true
20
20
  end
21
21
 
22
+ def template
23
+ @template ||= template_for(key) || :value
24
+ end
25
+
26
+ def interpolated_values
27
+ @interpolated_values ||= Array(template).map do |template|
28
+ case template
29
+ when Proc
30
+ instance_exec(&template)
31
+ when Symbol
32
+ send(template)
33
+ when String
34
+ template.gsub(/:\w+/) do |key|
35
+ send(key[1..-1])
36
+ end
37
+ else
38
+ raise "Unknown template type #{template.class}."
39
+ end
40
+ end.flatten.compact.uniq
41
+ end
42
+
22
43
  def ==(other)
23
44
  self.class == other.class && self.key == other.key
24
45
  end
@@ -27,8 +48,9 @@ module Metamagic
27
48
  [sort_order, self.class.name] <=> [other.sort_order, other.class.name]
28
49
  end
29
50
 
30
- def method_missing(*args)
31
- context.send(*args)
51
+ def method_missing(method, *args, &block)
52
+ return value if method.to_s == key.gsub(":", "_") # When calling e.g. `og_image`. Used for interpolating values.
53
+ context.send(method, *args, &block)
32
54
  end
33
55
  end
34
56
  end
@@ -12,7 +12,7 @@ module Metamagic
12
12
  end
13
13
 
14
14
  def to_html
15
- instance_exec key, value, &render_proc
15
+ instance_exec key, interpolated_values, &render_proc
16
16
  end
17
17
  end
18
18
  end
@@ -1,7 +1,7 @@
1
1
  module Metamagic
2
2
  class LinkTag < Tag
3
3
  def to_html
4
- tag(:link, rel: key, href: value)
4
+ interpolated_values.map { |value| tag(:link, rel: key, href: value) }.join("\n").html_safe.presence
5
5
  end
6
6
  end
7
7
  end
@@ -1,8 +1,8 @@
1
1
  module Metamagic
2
2
  class MetaTag < Tag
3
3
  def to_html
4
- return unless values = Array(value).compact.presence
5
- tag(:meta, name: key, content: values.join(", "))
4
+ return if interpolated_values.empty?
5
+ tag(:meta, name: key, content: interpolated_values.join(", "))
6
6
  end
7
7
 
8
8
  def sort_order
@@ -1,7 +1,7 @@
1
1
  module Metamagic
2
2
  class PropertyTag < Tag
3
3
  def to_html
4
- Array(value).compact.map { |value| tag(:meta, property: key, content: value) }.join("\n").html_safe.presence
4
+ interpolated_values.map { |value| tag(:meta, property: key, content: value) }.join("\n").html_safe.presence
5
5
  end
6
6
 
7
7
  def sort_order
@@ -1,22 +1,7 @@
1
1
  module Metamagic
2
2
  class TitleTag < Tag
3
3
  def to_html
4
- interpolated_title = if title_template.is_a?(Proc)
5
- instance_exec(&title_template)
6
- else
7
- title_template.gsub(/:\w+/) do |key|
8
- if key == ":title"
9
- value
10
- else
11
- send(key[1..-1])
12
- end
13
- end
14
- end
15
- content_tag(:title, interpolated_title) if interpolated_title.present?
16
- end
17
-
18
- def title
19
- value
4
+ content_tag(:title, interpolated_values.join(separator)) if interpolated_values.any?
20
5
  end
21
6
 
22
7
  def sort_order
@@ -1,3 +1,3 @@
1
1
  module Metamagic
2
- VERSION = "3.1.0"
2
+ VERSION = "3.1.1"
3
3
  end
@@ -5,13 +5,19 @@ module Metamagic
5
5
  end
6
6
 
7
7
  def metamagic(hash = {})
8
+ if title_template = hash.delete(:title_template)
9
+ # Deprecation warning
10
+ Rails.logger.warn "[Metamagic] Using `metamagic title_template: #{title_template.inspect}` has been deprecated. Please use `metamagic title: #{title_template.inspect}` instead."
11
+ hash[:title] = title_template
12
+ end
13
+
8
14
  # Loop through special options
9
- hash.slice(:title_template, :site).each do |key, value|
15
+ hash.slice(:site, :separator).each do |key, value|
10
16
  metamagic_renderer.send("#{key}=", value)
11
17
  hash.delete key
12
18
  end
13
19
 
14
- metamagic_renderer.add hash
20
+ metamagic_renderer.add hash, true
15
21
  metamagic_renderer.render
16
22
  end
17
23
 
@@ -1,2 +1,5 @@
1
1
  module ApplicationHelper
2
+ def meta_title_for(site, title)
3
+ "From view helper: #{title} - #{site}"
4
+ end
2
5
  end
@@ -57,4 +57,23 @@ class MetaTagTest < ActionView::TestCase
57
57
  assert_equal %{<title>Test Title</title>},
58
58
  metamagic
59
59
  end
60
+
61
+ test "keywords template" do
62
+ keywords %w{added keywords}
63
+
64
+ assert_equal %{<meta content="added, keywords, default, from, layout" name="keywords" />},
65
+ metamagic(keywords: [:keywords, "default", "from", "layout"])
66
+ end
67
+
68
+ test "keywords template with no keywords" do
69
+ assert_equal %{<meta content="default, from, layout" name="keywords" />},
70
+ metamagic(keywords: [:keywords, "default", "from", "layout"])
71
+ end
72
+
73
+ test "unique values using templates" do
74
+ keywords %w{added keywords}
75
+
76
+ assert_equal %{<meta content="added, keywords, default, from, layout" name="keywords" />},
77
+ metamagic(keywords: [:keywords, "added", "default", "keywords", "from", "layout"])
78
+ end
60
79
  end
@@ -52,4 +52,11 @@ class PropertyTagTest < ActionView::TestCase
52
52
  assert_equal %{<meta content="http://test.com/image.png" property="og:image" />\n<meta content="Leif Davidsen" property="og:book:author" />\n<meta content="Anders Mogensen" property="og:book:author" />},
53
53
  metamagic
54
54
  end
55
+
56
+ test "property template" do
57
+ og image: "http://test.com/image.jpg"
58
+
59
+ assert_equal %{<meta content="http://test.com/image.jpg" property="og:image" />\n<meta content="http://test.com/image2.jpg" property="og:image" />},
60
+ metamagic(og: { image: [:og_image, "http://test.com/image2.jpg"] })
61
+ end
55
62
  end
@@ -2,6 +2,7 @@ require 'test_helper'
2
2
 
3
3
  class TitleTagTest < ActionView::TestCase
4
4
  include Metamagic::ViewHelper
5
+ include ApplicationHelper
5
6
 
6
7
  test "title tag" do
7
8
  meta title: "My Title"
@@ -28,27 +29,60 @@ class TitleTagTest < ActionView::TestCase
28
29
  test "title template" do
29
30
  title "Test Title"
30
31
 
31
- assert_equal %{<title>Test Title My Site</title>},
32
- metamagic(site: "My Site", title_template: ":title :site")
32
+ assert_equal %{<title>Test Title - My Site</title>},
33
+ metamagic(site: "My Site", title: ":title - :site")
33
34
  end
34
35
 
35
- test "title template with default title" do
36
- assert_equal %{<title>Test Title My Site</title>},
37
- metamagic(site: "My Site", title: "Test Title", title_template: ":title :site")
36
+ test "title template with no title set" do
37
+ assert_equal %{<title> - My Site</title>},
38
+ metamagic(site: "My Site", title: ":title - :site")
39
+ end
40
+
41
+ test "title separator" do
42
+ title "Test Title"
43
+
44
+ assert_equal %{<title>Test Title - My Site</title>},
45
+ metamagic(site: "My Site", title: [:title, :site])
46
+ end
47
+
48
+ test "custom title separator" do
49
+ title "Test Title"
50
+
51
+ assert_equal %{<title>Test Title | My Site</title>},
52
+ metamagic(site: "My Site", separator: " | ", title: [:title, :site])
53
+ end
54
+
55
+ test "title separator with no title" do
56
+ assert_equal %{<title>My Site</title>},
57
+ metamagic(site: "My Site", title: [:title, :site])
38
58
  end
39
59
 
40
60
  test "title template with nil site" do
41
61
  title "Test Title"
42
62
 
43
63
  assert_raises RuntimeError do
44
- metamagic(title_template: ":title :site")
64
+ metamagic(title: ":title - :site")
45
65
  end
46
66
  end
47
67
 
48
68
  test "title template proc" do
49
69
  title "Test Title"
50
70
 
51
- assert_equal %{<title>Site: My Site Title: Test Title</title>},
52
- metamagic(site: "My Site", title_template: -> { "Site: #{site} Title: #{title}" })
71
+ assert_equal %{<title>Site: My Site - Title: Test Title</title>},
72
+ metamagic(site: "My Site", title: -> { "Site: #{site} - Title: #{title}" })
73
+ end
74
+
75
+ test "title template from view helper" do
76
+ title "Test Title"
77
+
78
+ assert_equal %{<title>From view helper: Test Title - My Site</title>},
79
+ metamagic(site: "My Site", title: -> { meta_title_for(site, title) })
80
+ end
81
+
82
+ test "deprecated title_template option" do
83
+ title "Test Title"
84
+
85
+ assert_equal %{<title>Test Title - My Site</title>},
86
+ metamagic(site: "My Site", title_template: ":title - :site")
53
87
  end
54
88
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metamagic
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lasse Bunk
@@ -134,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
134
  version: '0'
135
135
  requirements: []
136
136
  rubyforge_project:
137
- rubygems_version: 2.2.1
137
+ rubygems_version: 2.2.2
138
138
  signing_key:
139
139
  specification_version: 4
140
140
  summary: Simple Ruby on Rails plugin for creating meta tags.