tophat 1.5.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011 Steve Agalloco
1
+ Copyright (c) 2012 Steve Agalloco
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -124,9 +124,9 @@ A lot of browsers are supported, check the code for the full listing.
124
124
 
125
125
  TopHat can also generate Facebook OpenGraph tags. In your views, you can assign any number of attributes by passing a block to the opengraph helper. This will store the attributes for that page.
126
126
 
127
- opengraph do |graph|
128
- graph.title 'Rain Man'
129
- graph.type 'Movie'
127
+ opengraph do
128
+ title 'Rain Man'
129
+ type 'Movie'
130
130
  end
131
131
 
132
132
  To embed OpenGraph tags on your page, you'll need to reference opengraph in your layout.
@@ -146,11 +146,48 @@ When used in combination, TopHat will render:
146
146
 
147
147
  There's also a helper for the html tag along with the opengraph namespaces:
148
148
 
149
- html_with_opengraph => <html xmlns:fb...>
150
-
149
+ opengraph_html => <html xmlns:fb...>
151
150
 
152
151
  Note: TopHat does not include a "Like" button helper. TopHat's focus is inside the `<head>` tag.
153
152
 
153
+ TopHat previously supported a different syntax for defining the opengraph which has been deprecated:
154
+
155
+ opengraph do |graph|
156
+ graph.title 'Rain Man'
157
+ graph.type 'Movie'
158
+ end
159
+
160
+ ## Twitter Card Helpers
161
+
162
+ TopHat has support for [Twitter Cards](https://dev.twitter.com/docs/cards).
163
+
164
+ twitter_card('summary') do
165
+ url 'http://mysite.com/page'
166
+ title 'this is my page title'
167
+ description 'some interesting info about my page'
168
+ image 'http://mysite.com/animage.jpg'
169
+ end
170
+
171
+ You can nest attributes inside a twitter card:
172
+
173
+ twitter_card('player') do
174
+ player 'https://example.com/embed/a' do
175
+ height '251'
176
+ width '435'
177
+ end
178
+ end
179
+
180
+ Which will render a twitter card like so:
181
+
182
+ <meta name="twitter:card" value="player">
183
+ <meta name="twitter:player" value="https://example.com/embed/a">
184
+ <meta name="twitter:player:width" value="435">
185
+ <meta name="twitter:player:height" value="251">
186
+
187
+ To render the twitter card in your layout, simply call the twitter_card helper with no arguments:
188
+
189
+ <%= twitter_card %>
190
+
154
191
  ## <a name="build"></a>Build Status
155
192
  [![Build Status](https://secure.travis-ci.org/spagalloco/tophat.png?branch=master)][travis]
156
193
 
@@ -173,4 +210,4 @@ Note: TopHat does not include a "Like" button helper. TopHat's focus is inside t
173
210
 
174
211
  ## Copyright
175
212
 
176
- Copyright (c) 2011 Steve Agalloco. See [LICENSE](https://github.com/spagalloco/tophat/blob/master/LICENSE.md) for details.
213
+ Copyright (c) 2012 Steve Agalloco. See [LICENSE](https://github.com/spagalloco/tophat/blob/master/LICENSE.md) for details.
data/lib/tophat.rb CHANGED
@@ -15,12 +15,10 @@ module TopHat
15
15
 
16
16
  end
17
17
 
18
+ require 'tophat/html'
18
19
  require 'tophat/title'
19
20
  require 'tophat/meta'
20
21
  require 'tophat/stylesheet'
21
22
  require 'tophat/robots'
22
23
  require 'tophat/opengraph'
23
-
24
-
25
-
26
-
24
+ require 'tophat/twitter_card'
@@ -0,0 +1,28 @@
1
+ module TopHat
2
+ module HtmlHelper
3
+
4
+ def html_tag(options={})
5
+ output = '<html'
6
+ if options[:version]
7
+ output << " version=\"#{options[:version]}\""
8
+ end
9
+ if options[:xmlns]
10
+ if options[:xmlns].kind_of?(String)
11
+ output << " xmlns=\"#{options[:xmlns]}\""
12
+ elsif options[:xmlns].kind_of?(Array)
13
+ output = options[:xmlns].inject(output) do |html, xmlns|
14
+ if xmlns.kind_of?(Hash)
15
+ html << " xmlns:#{xmlns[:prefix]}=\"#{xmlns[:url]}\""
16
+ else
17
+ html << " xmlns=\"#{xmlns}\""
18
+ end
19
+ end
20
+ end
21
+ end
22
+ output << '>'
23
+ end
24
+
25
+ end
26
+ end
27
+
28
+ ActionView::Base.send :include, TopHat::HtmlHelper
@@ -5,57 +5,77 @@ module TopHat
5
5
  include ActionView::Helpers
6
6
 
7
7
  def initialize(options={})
8
- TopHat.current['app_id'] = options.delete(:app_id) if options && options.has_key?(:app_id)
9
- TopHat.current['admins'] = options.delete(:admins) if options && options.has_key?(:admins)
10
- TopHat.current['graph_data'] = {}
8
+ @app_id = options.delete(:app_id) if options && options.has_key?(:app_id)
9
+ @admins = options.delete(:admins) if options && options.has_key?(:admins)
10
+ @graph_data = {}
11
11
  end
12
12
 
13
13
  def merge(options={})
14
- TopHat.current['app_id'] = options.delete(:app_id) if options && options.has_key?(:app_id)
15
- TopHat.current['admins'] = options.delete(:admins) if options && options.has_key?(:admins)
14
+ @app_id = options.delete(:app_id) if options && options.has_key?(:app_id)
15
+ @admins = options.delete(:admins) if options && options.has_key?(:admins)
16
16
  end
17
17
 
18
18
  def app_id
19
- output = TopHat.current['app_id'] ? tag(:meta, :property => 'fb:app_id', :content => TopHat.current['app_id']) : ""
19
+ output = @app_id ? tag(:meta, :property => 'fb:app_id', :content => @app_id) : ""
20
20
  output << '\n' unless output.blank?
21
21
  output
22
22
  end
23
23
 
24
24
  def admins
25
- output = TopHat.current['admins'] ? tag(:meta, :property => 'fb:admins', :content => [*TopHat.current['admins']].join(',')) : ""
25
+ output = @admins ? tag(:meta, :property => 'fb:admins', :content => [*@admins].join(',')) : ""
26
26
  output << '\n' unless output.blank?
27
27
  output
28
28
  end
29
29
 
30
30
  def render_graph_data
31
31
  output = ""
32
- TopHat.current['graph_data'].each_pair do |key, value|
32
+ @graph_data.each do |key, value|
33
33
  output << tag(:meta, :property => "og:#{key}", :content => value)
34
- output << '\n' if TopHat.current['graph_data'].size > 1
34
+ output << '\n' if @graph_data.size > 1
35
35
  end
36
36
  output
37
37
  end
38
38
 
39
39
  def type(t)
40
- TopHat.current['graph_data'] ||= {}
41
- TopHat.current['graph_data'][:type] = t
40
+ @graph_data ||= {}
41
+ @graph_data[:type] = t
42
42
  end
43
43
 
44
44
  def has_graph_data?
45
- TopHat.current['graph_data']
45
+ !!@graph_data
46
46
  end
47
47
 
48
48
  def method_missing(method, *args, &block) #:nodoc
49
- TopHat.current['graph_data'] ||= {}
50
- TopHat.current['graph_data'][method] = args.shift
49
+ @graph_data ||= {}
50
+ @graph_data[method] = args.shift
51
51
  end
52
52
 
53
53
  end
54
54
 
55
- def html_with_opengraph
56
- '<html xmlns="http://www.w3.org/1999/xhtml"
57
- xmlns:og="http://ogp.me/ns#"
58
- xmlns:fb="https://www.facebook.com/2008/fbml">'
55
+ HTML4_XMLNS = [
56
+ 'http://www.w3.org/1999/xhtml',
57
+ { :prefix => 'og', :url => 'http://ogp.me/ns#' },
58
+ { :prefix => 'fb', :url => 'https://www.facebook.com/2008/fbml' }
59
+ ]
60
+
61
+ HTML5_XMLNS = [
62
+ { :prefix => 'og', :url => 'http://opengraphprotocol.org/schema/' },
63
+ { :prefix => 'fb', :url => 'http://developers.facebook.com/schema/' }
64
+ ]
65
+
66
+ def html_with_opengraph(style='html4')
67
+ Kernel.warn("html_with_opengraph has been deprecated, use opengraph_html instead.")
68
+ opengraph_html(style)
69
+ end
70
+
71
+ def opengraph_html(style='html4')
72
+ if style == 'html4'
73
+ html_tag(:xmlns => HTML4_XMLNS)
74
+ elsif style == 'html5'
75
+ html_tag(:version => 'HTML+RDFa 1.0', :xmlns => HTML5_XMLNS)
76
+ else
77
+ html_tag
78
+ end
59
79
  end
60
80
 
61
81
  def opengraph(options=nil, &block)
@@ -63,8 +83,16 @@ module TopHat
63
83
  TopHat.current['open_graph_defaults'] = options
64
84
  end
65
85
  if block_given?
66
- TopHat.current['open_graph_generator'] = OpenGraphGenerator.new(TopHat.current['open_graph_defaults'])
67
- yield(TopHat.current['open_graph_generator'])
86
+ if block.arity == 1
87
+ Kernel.warn("passing the graph object into the opengraph method has been deprecated, see README for details.")
88
+
89
+ TopHat.current['open_graph_generator'] = OpenGraphGenerator.new(TopHat.current['open_graph_defaults'])
90
+ yield(TopHat.current['open_graph_generator'])
91
+ else
92
+ opengraph_generator = OpenGraphGenerator.new(TopHat.current['open_graph_defaults'])
93
+ opengraph_generator.instance_eval(&block)
94
+ TopHat.current['open_graph_generator'] = opengraph_generator
95
+ end
68
96
  else
69
97
  TopHat.current['open_graph_generator'] ||= OpenGraphGenerator.new
70
98
  TopHat.current['open_graph_generator'].merge(TopHat.current['open_graph_defaults'])
@@ -0,0 +1,55 @@
1
+ module TopHat
2
+ module TwitterCardHelper
3
+
4
+ class TwitterCardGenerator
5
+ include ActionView::Helpers
6
+
7
+ attr_reader :card_data
8
+
9
+ def initialize(type)
10
+ @type = type
11
+ @card_data = {}
12
+ end
13
+
14
+ def render
15
+ output = ""
16
+ output << tag(:meta, :name => 'twitter:card', :value => @type)
17
+ @card_data.each do |key, value|
18
+ output << '\n'
19
+ output << tag(:meta, :name => "twitter:#{key}", :value => value)
20
+ end
21
+ output << '\n' unless @card_data.empty?
22
+ output
23
+ end
24
+
25
+ def add_nested_attributes(method, &block)
26
+ image_generator = TwitterCardGenerator.new(method)
27
+ image_generator.instance_eval(&block) if block_given?
28
+ image_generator.card_data.each do |key, value|
29
+ @card_data["#{method}:#{key}"] = value
30
+ end
31
+ end
32
+
33
+ def method_missing(method, *args, &block) #:nodoc
34
+ @card_data ||= {}
35
+ @card_data[method] = args.shift
36
+ add_nested_attributes(method, &block) if block_given?
37
+ end
38
+ end
39
+
40
+ def twitter_card(type=nil, &block)
41
+ if type.nil?
42
+ if TopHat.current['twitter_card']
43
+ TopHat.current['twitter_card'].render
44
+ end
45
+ else
46
+ card_generator = TwitterCardGenerator.new(type)
47
+ card_generator.instance_eval(&block) if block_given?
48
+
49
+ TopHat.current['twitter_card'] = card_generator
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ ActionView::Base.send :include, TopHat::TwitterCardHelper
@@ -1,3 +1,3 @@
1
1
  module TopHat
2
- VERSION = '1.5.0'
2
+ VERSION = '1.6.0'
3
3
  end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe TopHat::HtmlHelper do
4
+ before(:each) do
5
+ @template = ActionView::Base.new
6
+ end
7
+
8
+ describe 'html_tag' do
9
+ it 'returns a simple tag by default' do
10
+ @template.html_tag.should eq('<html>')
11
+ end
12
+
13
+ it 'accepts a version in an options hash' do
14
+ output = @template.html_tag(:version => '123')
15
+ output.should eq('<html version="123">')
16
+ end
17
+
18
+ it 'accepts xmlns in an options hash' do
19
+ output = @template.html_tag(:xmlns => 'http://someurl.com')
20
+ output.should eq('<html xmlns="http://someurl.com">')
21
+ end
22
+
23
+ it 'accepts and array of xmlns in an options hash' do
24
+ output = @template.html_tag(:xmlns => ['http://someurl.com', 'http://otherurl.com'])
25
+ output.should eq('<html xmlns="http://someurl.com" xmlns="http://otherurl.com">')
26
+ end
27
+
28
+ it 'accepts an array of xmlns including prefixes' do
29
+ xmlns = { :prefix => 'fb', :url => 'http://developers.facebook.com/schema/' }
30
+ output = @template.html_tag(:xmlns => [xmlns])
31
+ output.should eq('<html xmlns:fb="http://developers.facebook.com/schema/">')
32
+ end
33
+
34
+ end
35
+ end
@@ -12,11 +12,11 @@ describe TopHat::MetaHelper do
12
12
  @keywords = %w{ John Paul George Ringo }
13
13
  end
14
14
 
15
- it "should save keywords" do
15
+ it "saves keywords" do
16
16
  @template.keywords(@keywords).should == @keywords.join(', ')
17
17
  end
18
18
 
19
- it "should use default keywords if keywords is empty" do
19
+ it "uses default keywords if keywords is empty" do
20
20
  @template.keywords(:default => @keywords).should == "<meta content=\"#{@keywords.join(', ')}\" name=\"keywords\" />"
21
21
  end
22
22
  end
@@ -26,45 +26,45 @@ describe TopHat::MetaHelper do
26
26
  @keywords = "John, Paul, George, Ringo"
27
27
  end
28
28
 
29
- it "should save keywords" do
29
+ it "saves keywords" do
30
30
  @template.keywords(@keywords).should == @keywords
31
31
  end
32
32
 
33
- it "should use default keywords passed as a string if keywords is empty" do
33
+ it "uses default keywords passed as a string if keywords is empty" do
34
34
  @template.keywords(:default => @keywords).should == "<meta content=\"#{@keywords}\" name=\"keywords\" />"
35
35
  end
36
36
  end
37
37
 
38
- it "should not return a tag if no default is configured and no keywords are defined" do
38
+ it "return nil when no default is configured and no keywords are defined" do
39
39
  @template.keywords.should be_nil
40
40
  end
41
41
 
42
- it "doesn't blow up on nil" do
42
+ it "returns nil when passed nil" do
43
43
  @template.keywords(nil).should be_nil
44
44
  end
45
45
 
46
- it "should merge default tags with page tags, when merge_default is set to true" do
46
+ it "merges default tags with page tags, when merge_default is set to true" do
47
47
  @template.keywords("Stu, Pete")
48
48
  @template.keywords(:default => "John, Paul, George, Ringo", :merge_default => true).should == "<meta content=\"Stu, Pete, John, Paul, George, Ringo\" name=\"keywords\" />"
49
49
  end
50
50
  end
51
51
 
52
52
  describe ".description" do
53
- it "should save the description" do
53
+ it "saves the description" do
54
54
  desc = "Cinderella story. Outta nowhere. A former greenskeeper, now, about to become the Masters champion."
55
55
  @template.description(desc).should == desc
56
56
  end
57
57
 
58
- it "should use the default description if no description is defined" do
58
+ it "uses the default description if no description is defined" do
59
59
  desc = "A flute without holes, is not a flute. A donut without a hole, is a Danish."
60
60
  @template.description(:default => desc).should == "<meta content=\"#{desc}\" name=\"description\" />"
61
61
  end
62
62
 
63
- it "doesn't blow up on nil" do
63
+ it "returns nil when passed nil" do
64
64
  @template.description(nil).should be_nil
65
65
  end
66
66
 
67
- it "should not return a tag if no default is configured and no description is defined" do
67
+ it "returns nil when no default is configured and no description is defined" do
68
68
  @template.description.should be_nil
69
69
  end
70
70
  end
@@ -6,24 +6,46 @@ describe TopHat::OpenGraphHelper do
6
6
  @template = ActionView::Base.new
7
7
  end
8
8
 
9
- context 'html_with_opengraph' do
10
- it 'should render an html tag with namespace' do
11
- @template.html_with_opengraph.should =~ /<html/
12
- @template.html_with_opengraph.should =~ /xmlns\:og/
13
- @template.html_with_opengraph.should =~ /xmlns\:fb/
9
+ describe 'opengraph_html' do
10
+ context 'default style' do
11
+ it 'renders an html tag with namespace' do
12
+ output = @template.opengraph_html
13
+ output.should =~ /<html/
14
+ output.should =~ /xmlns\:og/
15
+ output.should =~ /xmlns\:fb/
16
+ end
17
+ end
18
+
19
+ context 'html5 style' do
20
+ it 'renders an html tag with namespace' do
21
+ output = @template.opengraph_html('html5')
22
+ output.should =~ /<html/
23
+ output.should =~ /xmlns\:og/
24
+ output.should =~ /xmlns\:fb/
25
+ end
26
+ end
27
+
28
+ context 'unknown style' do
29
+ it 'returns an empty html tag' do
30
+ @template.opengraph_html('funny').should eq('<html>')
31
+ end
32
+ end
33
+
34
+ it 'it supports deprecated html_with_opengraph' do
35
+ @template.opengraph_html.should eq(@template.html_with_opengraph)
14
36
  end
15
37
  end
16
38
 
17
39
  context "site admins when configured" do
18
40
  context "as a string" do
19
- it "should generate a site admin tag" do
41
+ it "generates a site admin tag" do
20
42
  @template.opengraph(:admins => '123,124')
21
43
  @template.opengraph.should be_dom_equivalent_to('<meta content="123,124" property="fb:admins" />\n')
22
44
  end
23
45
  end
24
46
 
25
47
  context "as an array" do
26
- it "should generate a site admin tag" do
48
+ it "generates a site admin tag" do
27
49
  @template.opengraph(:admins => [123, 124])
28
50
  @template.opengraph.should be_dom_equivalent_to('<meta content="123,124" property="fb:admins" />\n')
29
51
  end
@@ -31,27 +53,27 @@ describe TopHat::OpenGraphHelper do
31
53
  end
32
54
 
33
55
  context "app_id when configured" do
34
- it "should generate an app_id meta tag" do
56
+ it "generates an app_id meta tag" do
35
57
  @template.opengraph(:app_id => 'MyApp')
36
58
  @template.opengraph.should be_dom_equivalent_to('<meta content="MyApp" property="fb:app_id" />\n')
37
59
  end
38
60
  end
39
61
 
40
62
  context "additional open graph properties" do
41
- it "should generate tags" do
42
- @template.opengraph { |graph| graph.title 'The Great Gatsby' }
63
+ it "generates opengraph meta tags" do
64
+ @template.opengraph { title 'The Great Gatsby' }
43
65
  @template.opengraph.should be_dom_equivalent_to('<meta content="The Great Gatsby" property="og:title" />')
44
66
  end
45
67
 
46
- it "should allow use of the tag 'type'" do
47
- @template.opengraph { |graph| graph.type 'sports_team' }
68
+ it "allows use of the tag 'type'" do
69
+ @template.opengraph { type 'sports_team' }
48
70
  @template.opengraph.should be_dom_equivalent_to('<meta content="sports_team" property="og:type" />')
49
71
  end
50
72
 
51
- it "should support multiple tags" do
52
- @template.opengraph { |graph|
53
- graph.title 'Austin Powers: International Man of Mystery'
54
- graph.type 'movie'
73
+ it "supports multiple tags" do
74
+ @template.opengraph {
75
+ title 'Austin Powers: International Man of Mystery'
76
+ type 'movie'
55
77
  }
56
78
  @template.opengraph.should be_dom_equivalent_to('<meta content="movie" property="og:type" />\n<meta content="Austin Powers: International Man of Mystery" property="og:title" />\n')
57
79
  end
@@ -59,20 +81,31 @@ describe TopHat::OpenGraphHelper do
59
81
  end
60
82
 
61
83
  context "combined usage" do
62
- it "should generate all tags" do
63
- @template.opengraph(:app_id => 'MyApp', :admins => [123, 1234]) { |graph|
64
- graph.title 'Rain Man'
65
- graph.type 'movie'
84
+ it "generates all tags when app_id and admins passed as part of definition" do
85
+ @template.opengraph(:app_id => 'MyApp', :admins => [123, 1234]) {
86
+ title 'Rain Man'
87
+ type 'movie'
66
88
  }
67
89
  @template.opengraph.should be_dom_equivalent_to('<meta content="MyApp" property="fb:app_id" />\n<meta content="123,1234" property="fb:admins" />\n<meta content="movie" property="og:type" />\n<meta content="Rain Man" property="og:title" />\n')
68
90
  end
69
91
 
70
- it "should generate all tags - alternative usage" do
92
+ it "generates all tags when app_id and admins passed as part of rendering" do
93
+ @template.opengraph {
94
+ title 'Rain Man'
95
+ type 'movie'
96
+ }
97
+ @template.opengraph(:app_id => 'MyApp', :admins => [123, 1234]).should be_dom_equivalent_to('<meta content="MyApp" property="fb:app_id" />\n<meta content="123,1234" property="fb:admins" />\n<meta content="movie" property="og:type" />\n<meta content="Rain Man" property="og:title" />\n')
98
+ end
99
+ end
100
+
101
+ context 'deprecated support' do
102
+ it 'generates multiple tags' do
71
103
  @template.opengraph { |graph|
72
104
  graph.title 'Rain Man'
73
105
  graph.type 'movie'
74
106
  }
75
- @template.opengraph(:app_id => 'MyApp', :admins => [123, 1234]).should be_dom_equivalent_to('<meta content="MyApp" property="fb:app_id" />\n<meta content="123,1234" property="fb:admins" />\n<meta content="movie" property="og:type" />\n<meta content="Rain Man" property="og:title" />\n')
107
+
108
+ @template.opengraph.should be_dom_equivalent_to('<meta content="movie" property="og:type" />\n<meta content="Rain Man" property="og:title" />\n')
76
109
  end
77
110
  end
78
111
 
@@ -7,43 +7,43 @@ describe TopHat::RobotsHelper do
7
7
  end
8
8
 
9
9
  describe ".nofollow" do
10
- it "should default to all robots" do
10
+ it "defaults to all robots" do
11
11
  @template.nofollow.should == "<meta content=\"nofollow\" name=\"robots\" />"
12
12
  end
13
13
 
14
- it "should use a descriptor if one is provided" do
14
+ it "uses a descriptor if one is provided" do
15
15
  @template.nofollow('googlebot').should == "<meta content=\"nofollow\" name=\"googlebot\" />"
16
16
  end
17
17
 
18
- it "doesn't blow up on nil" do
18
+ it "generates a default tag when passed nil" do
19
19
  @template.nofollow(nil).should == "<meta content=\"nofollow\" name=\"robots\" />"
20
20
  end
21
21
  end
22
22
 
23
23
  describe ".noindex" do
24
- it "should default to all robots" do
24
+ it "defaults to all robots" do
25
25
  @template.noindex.should == "<meta content=\"noindex\" name=\"robots\" />"
26
26
  end
27
27
 
28
- it "should use a descriptor if one is provided" do
28
+ it "uses a descriptor if one is provided" do
29
29
  @template.noindex('googlebot').should == "<meta content=\"noindex\" name=\"googlebot\" />"
30
30
  end
31
31
 
32
- it "doesn't blow up on nil" do
32
+ it "generates a default tag when passed nil" do
33
33
  @template.noindex(nil).should == "<meta content=\"noindex\" name=\"robots\" />"
34
34
  end
35
35
  end
36
36
 
37
37
  describe ".canonical" do
38
- it "should not render when not passed a path" do
38
+ it "returns nil when not passed a path" do
39
39
  @template.canonical.should be_nil
40
40
  end
41
41
 
42
- it "should render a tag when passed a path" do
42
+ it "renders a tag when passed a path" do
43
43
  @template.canonical('http://mysite.com/somepath/').should == "<link href=\"http://mysite.com/somepath/\" rel=\"canonical\" />"
44
44
  end
45
45
 
46
- it "doesn't blow up on nil" do
46
+ it "returns nil when passed nil" do
47
47
  @template.canonical(nil).should be_nil
48
48
  end
49
49
  end
@@ -16,7 +16,7 @@ describe TopHat::StylesheetHelper do
16
16
  @stylesheet = "ie.css"
17
17
  end
18
18
 
19
- it "should define IE conditionals" do
19
+ it "defines IE conditionals" do
20
20
  @template.ie_5_conditional {
21
21
  @template.stylesheet_link_tag(@stylesheet)
22
22
  }.should == "<!--[if IE 5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
@@ -42,7 +42,7 @@ describe TopHat::StylesheetHelper do
42
42
  }.should == "<!--[if IE 9]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
43
43
  end
44
44
 
45
- it "should render defined IE conditional with greater than operator" do
45
+ it "renders defined IE conditional with greater than operator" do
46
46
  @template.ie_5_conditional(:gt) {
47
47
  @template.stylesheet_link_tag(@stylesheet)
48
48
  }.should == "<!--[if gt IE 5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
@@ -52,7 +52,7 @@ describe TopHat::StylesheetHelper do
52
52
  }.should == "<!--[if gt IE 5.5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
53
53
  end
54
54
 
55
- it "should render defined IE conditional with greater than or equal to operator" do
55
+ it "renders defined IE conditional with greater than or equal to operator" do
56
56
  @template.ie_5_conditional(:gte) {
57
57
  @template.stylesheet_link_tag(@stylesheet)
58
58
  }.should == "<!--[if gte IE 5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
@@ -62,7 +62,7 @@ describe TopHat::StylesheetHelper do
62
62
  }.should == "<!--[if gte IE 5.5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
63
63
  end
64
64
 
65
- it "should render defined IE conditional with ! operator" do
65
+ it "renders defined IE conditional with ! operator" do
66
66
  @template.ie_5_conditional(:not) {
67
67
  @template.stylesheet_link_tag(@stylesheet)
68
68
  }.should == "<!--[if !IE 5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
@@ -72,7 +72,7 @@ describe TopHat::StylesheetHelper do
72
72
  }.should == "<!--[if !IE 5.5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
73
73
  end
74
74
 
75
- it "should render defined IE conditional with less than operator" do
75
+ it "renders defined IE conditional with less than operator" do
76
76
  @template.ie_5_conditional(:lt) {
77
77
  @template.stylesheet_link_tag(@stylesheet)
78
78
  }.should == "<!--[if lt IE 5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
@@ -82,7 +82,7 @@ describe TopHat::StylesheetHelper do
82
82
  }.should == "<!--[if lt IE 5.5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
83
83
  end
84
84
 
85
- it "should render defined IE conditional with less than or equal to operator" do
85
+ it "renders defined IE conditional with less than or equal to operator" do
86
86
  @template.ie_5_conditional(:lte) {
87
87
  @template.stylesheet_link_tag(@stylesheet)
88
88
  }.should == "<!--[if lte IE 5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
@@ -92,7 +92,7 @@ describe TopHat::StylesheetHelper do
92
92
  }.should == "<!--[if lte IE 5.5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
93
93
  end
94
94
 
95
- it "should render defined IE conditional with equal to operator" do
95
+ it "renders defined IE conditional with equal to operator" do
96
96
  @template.ie_5_conditional(:eq) {
97
97
  @template.stylesheet_link_tag(@stylesheet)
98
98
  }.should == "<!--[if eq IE 5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
@@ -102,7 +102,7 @@ describe TopHat::StylesheetHelper do
102
102
  }.should == "<!--[if eq IE 5.5]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
103
103
  end
104
104
 
105
- it "should render defined conditionals for other browsers" do
105
+ it "renders defined conditionals for other browsers" do
106
106
  @template.opera_conditional {
107
107
  @template.stylesheet_link_tag(@stylesheet)
108
108
  }.should == "<!--[if Opera]>\n<link href=\"/stylesheets/ie.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n<![endif]-->"
@@ -13,83 +13,83 @@ describe TopHat::TitleHelper do
13
13
  end
14
14
 
15
15
  context "displaying a title" do
16
- it "should use the website name if title is empty" do
16
+ it "uses the website name if title is empty" do
17
17
  @template.title(:site => "Miles Davis").should == "<title>Miles Davis</title>"
18
18
  end
19
19
 
20
- it "should display the title if no website was specified" do
20
+ it "displays the title if no website was specified" do
21
21
  save_basic_title
22
22
  @template.title().should == '<title>Kind of Blue</title>'
23
23
  end
24
24
 
25
- it "should use website before page by default" do
25
+ it "uses website before page by default" do
26
26
  save_basic_title
27
27
  @template.title(:site => "Miles Davis", :separator => '|').should == "<title>Miles Davis | Kind of Blue</title>"
28
28
  end
29
29
 
30
- it "should only use markup in titles in the view" do
30
+ it "only uses markup in titles in the view" do
31
31
  save_basic_title("<b>Kind of Blue</b>").should == "<b>Kind of Blue</b>"
32
32
  @template.title(:site => "Miles Davis", :separator => '|').should == "<title>Miles Davis | Kind of Blue</title>"
33
33
  end
34
34
 
35
- it "should use page before website if :reverse" do
35
+ it "uses page before website if :reverse" do
36
36
  save_basic_title
37
37
  @template.title(:site => "Miles Davis", :reverse => true, :separator => '|').should == "<title>Kind of Blue | Miles Davis</title>"
38
38
  end
39
39
 
40
- it "should use website before page if :reverse and :reverse_on_default" do
40
+ it "uses website before page if :reverse and :reverse_on_default" do
41
41
  @template.title(:site => "John Coltrane", :default => "My Favorite Things", :reverse => true, :reverse_on_default => false, :separator => '|').should == "<title>John Coltrane | My Favorite Things</title>"
42
42
  end
43
43
 
44
- it "should be lowercase if :lowercase" do
44
+ it "lowercases the title if :lowercase" do
45
45
  save_basic_title
46
46
  @template.title(:site => "Miles Davis", :lowercase => true, :separator => '|').should == "<title>miles davis | kind of blue</title>"
47
47
  end
48
48
 
49
- it "should be uppercase if :uppercase" do
49
+ it "uppercases the title if :uppercase" do
50
50
  save_basic_title
51
51
  @template.title(:site => "Miles Davis", :uppercase => true, :separator => '|').should == "<title>MILES DAVIS | KIND OF BLUE</title>"
52
52
  end
53
53
 
54
- it "should use custom separator if :separator" do
54
+ it "uses a custom separator if :separator" do
55
55
  save_basic_title
56
56
  @template.title(:site => "Miles Davis", :separator => "-").should == "<title>Miles Davis - Kind of Blue</title>"
57
57
  @template.title(:site => "Miles Davis", :separator => ":").should == "<title>Miles Davis : Kind of Blue</title>"
58
58
  @template.title(:site => "Miles Davis", :separator => "&mdash;").should == "<title>Miles Davis &amp;mdash; Kind of Blue</title>"
59
59
  end
60
60
 
61
- it "should use custom prefix and suffix if available" do
61
+ it "uses custom prefix and suffix if available" do
62
62
  save_basic_title
63
63
  @template.title(:site => "Miles Davis", :prefix => " |", :suffix => "| ", :separator => '|').should == "<title>Miles Davis ||| Kind of Blue</title>"
64
64
  end
65
65
 
66
- it "should collapse prefix if false" do
66
+ it "collapses prefix if false" do
67
67
  save_basic_title
68
68
  @template.title(:site => "Miles Davis", :prefix => false, :separator => ":").should == "<title>Miles Davis: Kind of Blue</title>"
69
69
  end
70
70
 
71
- it "should collapse suffix if false" do
71
+ it "collapses suffix if false" do
72
72
  save_basic_title
73
73
  @template.title(:site => "Miles Davis", :suffix => false, :separator => "~").should == "<title>Miles Davis ~Kind of Blue</title>"
74
74
  end
75
75
 
76
- it "should use all custom options if available" do
76
+ it "uses all custom options if available" do
77
77
  save_basic_title
78
78
  custom_options = { :site => "Miles Davis", :prefix => " ", :suffix => " ", :separator => "-", :lowercase => true, :reverse => true }
79
79
  @template.title(custom_options).should == "<title>kind of blue - miles davis</title>"
80
80
  end
81
81
 
82
- it "should use default one if title is not present or blank" do
82
+ it "uses the default title if title is not present or blank" do
83
83
  save_basic_title("")
84
84
  @template.title(:site => "Miles Davis", :default => "Round About Midnight", :separator => '|').should == "<title>Miles Davis | Round About Midnight</title>"
85
85
  end
86
86
 
87
- it "should allow custom options per title" do
87
+ it "allows custom options per title" do
88
88
  save_custom_title
89
89
  @template.title(:site => "Freddie Freeloader", :separator => '|').should == "<title>Kind of Blue | Freddie Freeloader</title>"
90
90
  end
91
91
 
92
- it "should accept an array of strings as the title" do
92
+ it "accepts an array of strings as the title" do
93
93
  @template.title(['My', 'Favorite', 'Things'])
94
94
  @template.title(:site => "Freddie Freeloader", :separator => '|').should == "<title>Freddie Freeloader | My | Favorite | Things</title>"
95
95
  end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe TopHat::TwitterCardHelper do
4
+
5
+ before(:each) do
6
+ @template = ActionView::Base.new
7
+ end
8
+
9
+ it 'generates a twitter:card meta tag' do
10
+ @template.twitter_card('summary')
11
+ output = @template.twitter_card
12
+ output.should eq('<meta name="twitter:card" value="summary" />')
13
+ end
14
+
15
+ it 'generates twitter:card meta tags' do
16
+ @template.twitter_card('summary') do
17
+ url 'http://someurl.com'
18
+ title 'a title'
19
+ description 'blah blah'
20
+ image 'http://someurl.com/animage.jpg'
21
+ end
22
+
23
+ output = @template.twitter_card
24
+ output.should include('twitter:title')
25
+ output.should include('twitter:url')
26
+ end
27
+
28
+ it 'generates nested twitter:card meta tags' do
29
+ @template.twitter_card('player') do
30
+ image 'http://someurl.com/image.jpg' do
31
+ height '123'
32
+ width '456'
33
+ end
34
+ end
35
+ output = @template.twitter_card
36
+ output.should include('twitter:image')
37
+ output.should include('twitter:image:height')
38
+ output.should include('twitter:image:width')
39
+ end
40
+
41
+
42
+ it 'generates multiple nested twitter:card meta tags' do
43
+ @template.twitter_card('player') do
44
+ player 'https://example.com/embed/a' do
45
+ stream 'http://example.com/raw-stream/a.mp4' do
46
+ content_type '123'
47
+ end
48
+ end
49
+ end
50
+ output = @template.twitter_card
51
+ output.should include('twitter:player:stream:content_type')
52
+ end
53
+
54
+ end
data/spec/tophat_spec.rb CHANGED
@@ -68,6 +68,14 @@ describe TopHat do
68
68
  it "should respond to the 'canonical' helper" do
69
69
  @template.respond_to?(:canonical).should be_true
70
70
  end
71
+
72
+ it "should respond to the 'twitter_card' helper" do
73
+ @template.respond_to?(:twitter_card).should be_true
74
+ end
75
+
76
+ it "should respond to the 'html_tag' helper" do
77
+ @template.respond_to?(:html_tag).should be_true
78
+ end
71
79
  end
72
80
 
73
81
  describe '.current' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tophat
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-14 00:00:00.000000000Z
12
+ date: 2012-06-18 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
16
- requirement: &70226951969300 !ruby/object:Gem::Requirement
16
+ requirement: &70176171567820 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70226951969300
24
+ version_requirements: *70176171567820
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &70226951967240 !ruby/object:Gem::Requirement
27
+ requirement: &70176171565740 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0.9'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70226951967240
35
+ version_requirements: *70176171565740
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70226951956180 !ruby/object:Gem::Requirement
38
+ requirement: &70176171564300 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '2.7'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70226951956180
46
+ version_requirements: *70176171564300
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: yard
49
- requirement: &70226951954820 !ruby/object:Gem::Requirement
49
+ requirement: &70176171563140 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0.7'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70226951954820
57
+ version_requirements: *70176171563140
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rdiscount
60
- requirement: &70226951953100 !ruby/object:Gem::Requirement
60
+ requirement: &70176171559300 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '1.6'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70226951953100
68
+ version_requirements: *70176171559300
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
- requirement: &70226951951360 !ruby/object:Gem::Requirement
71
+ requirement: &70176171558300 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0.5'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70226951951360
79
+ version_requirements: *70176171558300
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rails
82
- requirement: &70226951950300 !ruby/object:Gem::Requirement
82
+ requirement: &70176171557480 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 3.0.0
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70226951950300
90
+ version_requirements: *70176171557480
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: guard-rspec
93
- requirement: &70226951949340 !ruby/object:Gem::Requirement
93
+ requirement: &70176171556620 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: '0.5'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70226951949340
101
+ version_requirements: *70176171556620
102
102
  description: Simple view helpers for your layouts
103
103
  email:
104
104
  - steve.agalloco@gmail.com
@@ -116,18 +116,22 @@ files:
116
116
  - README.md
117
117
  - Rakefile
118
118
  - lib/tophat.rb
119
+ - lib/tophat/html.rb
119
120
  - lib/tophat/meta.rb
120
121
  - lib/tophat/opengraph.rb
121
122
  - lib/tophat/robots.rb
122
123
  - lib/tophat/stylesheet.rb
123
124
  - lib/tophat/title.rb
125
+ - lib/tophat/twitter_card.rb
124
126
  - lib/tophat/version.rb
125
127
  - spec/spec_helper.rb
128
+ - spec/tophat/html_helper_spec.rb
126
129
  - spec/tophat/meta_helper_spec.rb
127
130
  - spec/tophat/opengraph_helper_spec.rb
128
131
  - spec/tophat/robots_helper_spec.rb
129
132
  - spec/tophat/stylesheet_helper_spec.rb
130
133
  - spec/tophat/title_helper_spec.rb
134
+ - spec/tophat/twitter_card_helper_spec.rb
131
135
  - spec/tophat_spec.rb
132
136
  - tophat.gemspec
133
137
  homepage: https://github.com/spagalloco/tophat
@@ -156,10 +160,12 @@ specification_version: 3
156
160
  summary: Simple view helpers for your layouts
157
161
  test_files:
158
162
  - spec/spec_helper.rb
163
+ - spec/tophat/html_helper_spec.rb
159
164
  - spec/tophat/meta_helper_spec.rb
160
165
  - spec/tophat/opengraph_helper_spec.rb
161
166
  - spec/tophat/robots_helper_spec.rb
162
167
  - spec/tophat/stylesheet_helper_spec.rb
163
168
  - spec/tophat/title_helper_spec.rb
169
+ - spec/tophat/twitter_card_helper_spec.rb
164
170
  - spec/tophat_spec.rb
165
171
  has_rdoc: