shareable 0.0.1

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.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 hermango
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,102 @@
1
+ Shareable
2
+ =========
3
+ A simple and unobtrusive gem for adding social link sharing to your Rails app. Supported social sites include:
4
+ - Facebook
5
+ - Twitter
6
+ - Pinterest
7
+ - Reddit
8
+ - Linkedin
9
+ - & Google Plus
10
+
11
+ Install
12
+ --------
13
+ Put this line in your Gemfile:
14
+
15
+ gem 'shareable'
16
+
17
+ Then run the bundle command:
18
+
19
+ bundle
20
+
21
+ Usage
22
+ ------
23
+ ### Views
24
+ To add shareable in views use any of the following methods:
25
+ + render_shareable
26
+ + facebook_button
27
+ + twitter_button
28
+ + pinterest_button
29
+ + reddit_button
30
+ + google_plus_button
31
+ ...
32
+
33
+ For the easiest way to use shareable, add this helper method to your view:
34
+
35
+ ```no-highlight
36
+ <%= render_shareable %>
37
+ ```
38
+
39
+ ### Advanced Usage
40
+ Pass hash values to the render_shareable method to overwrite options locally:
41
+ ```no-highlight
42
+ <%= render_shareable :url=> 'http://github.com/hermango/', :facebook=> {:send=> 'true', :url=> 'http://demo.com'} %>
43
+ ```
44
+
45
+ To render only certain buttons:
46
+ ```no-highlight
47
+ <%= render_shareable :buttons=> ['twitter', 'facebook'] %>
48
+ ```
49
+
50
+ Alternatively, omit the render_shareable method entirely and instead add each social link individually.
51
+ The helper method for each social link, is the site name joined with an underscore to the word 'button'. E.g.:
52
+
53
+ ```no-highlight
54
+ <%= twitter_button %>
55
+ <%= reddit_button :title=> 'Alternate Title' %>
56
+ ```
57
+
58
+ To override the default view for a button, place your own template file in the
59
+ app/views/shareable/ directory and prepend your filename with an underscore.
60
+
61
+ E.g.: facebook_button -> app/views/shareable/_facebook.html.erb
62
+
63
+ #### Facebook compatibility with Internet Explorer
64
+ Add an XML namespace fb='http://ogp.me/ns/fb#' to the <html> tag of your view. Eg:
65
+ ```no-highlight
66
+ <html xmlns:fb="http://ogp.me/ns/fb#">
67
+ ```
68
+
69
+ This is necessary for XFBML to work in earlier versions of Internet Explorer.
70
+
71
+ #### Styling for social buttons
72
+ For horizontally aligned buttons, try this CSS:
73
+
74
+ ```no-highlight
75
+ nav.share {display:inline-block;} /* shareable's nav tag */
76
+ nav.share div {float:left; overflow:hidden;}
77
+ nav.share iframe {max-height:20px; border:0; margin-top:0; padding-top:0;} /* if using medium sized buttons */
78
+ #___plusone_0 {max-width:70px; font-size: default; !important}
79
+ .twitter-share-button, .twitter-count-horizontal {max-width:80px;}
80
+ .fb_iframe_widget span { vertical-align: top; }
81
+ .fb_edge_widget_with_comment { vertical-align: top;}
82
+ .fb-like{display:inline-block}
83
+ * html .fb-like{display:inline}/* ie6 inline block fix*/
84
+ *+html .fb-like{display:inline}/* ie7 inline block fix*/
85
+ ```
86
+
87
+ Configuration
88
+ ------------
89
+ Use shareable's default configuration settings or add your own initializer named 'shareable.rb' to your app's 'config/initializers' directory.
90
+
91
+ A generator is available for generating the default configuration file into the 'config/initializers' directory.
92
+ Run the following generator command, then edit the generated file.
93
+
94
+ rails g shareable:config
95
+
96
+ To Do:
97
+ ---------
98
+ - Add Tests.
99
+ - More buttons.
100
+ - More.
101
+
102
+ This project is based on Akira Matsuda's Kamanari project and uses the MIT-LICENSE. Suggestions, bug reports, criticism and all contributions welcome.
data/README.rdoc ADDED
@@ -0,0 +1,74 @@
1
+ = Shareable
2
+ A simple and unobtrusive gem for adding social link sharing to your Rails app. Social sites include:
3
+ - Facebook
4
+ - Twitter
5
+ - Pinterest
6
+ - Reddit
7
+ - & Google Plus
8
+
9
+ ===Install
10
+ Put this line in your Gemfile:
11
+ gem 'shareable'
12
+
13
+ Then run bundle command:
14
+ bundle
15
+
16
+ ==Usage
17
+ === Views
18
+ To use shareable in views add any of the following methods:
19
+ -render_shareable
20
+ -facebook_button
21
+ -twitter_button
22
+ -pinterest_button
23
+ -reddit_button
24
+ -google_plus_button
25
+ ...
26
+
27
+ For example, add the helper method to your view:
28
+ <%= render_shareable %>
29
+
30
+ ===Advanced Usage
31
+ Overwrite options locally by passing hash values to the render_shareable method like so:
32
+ <%= render_shareable :url=> 'http://github.com/hermango/', :facebook=> {:send=> 'true', :width=> '100', :url=> 'http://demo.com'} %>
33
+ To render only certain buttons:
34
+ <%= render_shareable :buttons=> ['twitter', 'facebook'] %>
35
+
36
+ Alternatively, omit the render_shareable method entirely and instead add each social link individually.
37
+ The helper method for each social link, is the site name joined with an underscore to the word 'button'. E.g.:
38
+ <%= twitter_button %>
39
+ <%= reddit_button :title=> 'Alternate Title' %>
40
+
41
+ To override the default view for a button, place your own template file in the
42
+ app/views/shareable/ directory and prepend your filename with an underscore.
43
+ E.g.: facebook_button -> *app/views/shareable/_facebook.html.erb*
44
+
45
+ *Facebook compatibility with Internet Explorer*
46
+ Add an XML namespace fb="http://ogp.me/ns/fb#" to the <html> tag of your view. Eg: <html xmlns:fb="http://ogp.me/ns/fb#">
47
+ This is necessary for XFBML to work in earlier versions of Internet Explorer for pages on which the like button appears.
48
+
49
+ *Styling for social buttons*
50
+ For horizontally aligned buttons, try this CSS:
51
+ nav.share {display:inline-block;} /* shareable's nav tag */
52
+ nav.share div {float:left; overflow:hidden;}
53
+ nav.share iframe {max-height:20px; border:0; margin-top:0; padding-top:0;} /* if using medium sized buttons */
54
+ #___plusone_0 {max-width:70px; font-size: default; !important}
55
+ .twitter-share-button, .twitter-count-horizontal {max-width:80px;}
56
+ .fb_iframe_widget span { vertical-align: top; }
57
+ .fb_edge_widget_with_comment { vertical-align: top;}
58
+ .fb-like{display:inline-block}
59
+ * html .fb-like{display:inline}/* ie6 inline block fix*/
60
+ *+html .fb-like{display:inline}/* ie7 inline block fix*/
61
+
62
+ ===Configuration
63
+ Use shareable's configuration settings or add your own initializer named 'shareable.rb' to the 'config/initializers' directory.
64
+
65
+ A generator is available for generating the default configuration file into the 'config/initializers' directory.
66
+ Run the following generator command, then edit the generated file.
67
+ % rails g shareable:config
68
+
69
+ ==To Do:
70
+ - Add Tests.
71
+ - More buttons.
72
+ - More.
73
+
74
+ This project is based on Akira Matsuda's Kamanari project and uses the MIT-LICENSE. Suggestions, bug reports, criticism and all contributions welcome.
@@ -0,0 +1,20 @@
1
+ <%= output_once :facebook do %>
2
+ <div id="fb-root"></div>
3
+ <script>(function(d, s, id) {
4
+ var js, fjs = d.getElementsByTagName(s)[0];
5
+ if (d.getElementById(id)) return;
6
+ js = d.createElement(s); js.id = id;
7
+ js.src = "//connect.facebook.net/en_US/all.js#xfbml=1<%= raw('&appId=' + options[:app_id]) unless options[:app_id].empty? %>";
8
+ fjs.parentNode.insertBefore(js, fjs);
9
+ }(document, 'script', 'facebook-jssdk'));</script>
10
+ <% end %>
11
+
12
+ <fb:like href='<%= options[:url] %>'
13
+ send='<%= options[:send] %>'
14
+ layout='<%= options[:layout] %>'
15
+ show_faces='<%= options[:show_faces] %>'
16
+ width='<%= options[:width] %>'
17
+ action='<%= options[:action] %>'
18
+ font='<%= options[:font] %>'
19
+ colorscheme='<%= options[:colorscheme] %>'
20
+ ref='<%= options[:ref] %>' ></fb:like>
@@ -0,0 +1,21 @@
1
+ <div class='g-plusone gplusshare'
2
+ data-href='<%= options[:url] %>'
3
+ data-size='<%= options[:size] %>'
4
+ data-annotation='<%= options[:annotation] %>'
5
+ data-width='<%= options[:width] %>'
6
+ data-align='<%= options[:align] %>'
7
+ data-expandTo='<%= options[:expand_to] %>'
8
+ data-callback='<%= options[:callback] %>'
9
+ data-onstartinteraction='<%= options[:onstartinteraction] %>'
10
+ data-onendinteraction='<%= options[:onendinteraction] %>'
11
+ data-recommendations='<%= options[:recommendations] %>'
12
+ ></div>
13
+ <%= output_once :google_plus do %>
14
+ <script type="text/javascript">
15
+ (function() {
16
+ var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
17
+ po.src = 'https://apis.google.com/js/plusone.js';
18
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
19
+ })();
20
+ </script>
21
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <script src="//platform.linkedin.com/in.js" type="text/javascript"></script>
2
+ <script type="IN/Share"
3
+ data-url='<%= options[:url] %>'
4
+ data-counter='<%= options[:counter] %>'
5
+ data-onerror='<%= options[:onerror]%>'
6
+ data-onsuccess='<%= options[:onsuccess]%>'
7
+ data-showzero='<%= options[:showzero] %>'
8
+ ></script>
@@ -0,0 +1,24 @@
1
+ <a data-pin-config='<%= options[:pin_config] %>'
2
+ href="//pinterest.com/pin/create/button/?url=<%= options[:url] %><%= raw('&media=' + options[:media]) unless options[:media].blank? %><%= raw('&description=' + options[:description]) unless options[:description].blank? %>"
3
+ data-pin-do='<%= options[:pin_do] %>' >
4
+ <img src="//assets.pinterest.com/images/pidgets/pin_it_button.png" title='<%= options[:title]%>' alt='<%= options[:alt] %>' /></a>
5
+
6
+ <%= output_once :pinterest do %>
7
+ <script type="text/javascript">
8
+ (function (d, buildThese) {
9
+ var homeScript, newScript, n = buildThese.length, i;
10
+ for (i = 0; i < n; i = i + 1) {
11
+ newScript = d.createElement('SCRIPT');
12
+ newScript.type = 'text/javascript';
13
+ newScript.async = true;
14
+ newScript.src = buildThese[i];
15
+ homeScript = d.getElementsByTagName('SCRIPT')[0];
16
+ homeScript.parentNode.insertBefore(newScript, homeScript);
17
+ }
18
+ }(document, [
19
+ '//assets.pinterest.com/js/pinit.js'
20
+ /* load more third-party JavaScript here */
21
+ ])
22
+ );
23
+ </script>
24
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <script type="text/javascript">
2
+ reddit_url='<%= options[:url] %>';
3
+ reddit_target='<%= options[:target]%>';
4
+ reddit_title='<%= options[:title] %>';
5
+ reddit_bgcolor='<%= options[:color] %>';
6
+ reddit_bordercolor='<%= options[:bordercolor] %>';
7
+ reddit_newwindow='<%= options[:newwindow] %>';
8
+ </script>
9
+ <script type="text/javascript"
10
+ src="<%= raw((options[:btnsrc].blank? ? ('http://www.reddit.com/static/button/button' + options[:type] + '.js?i=' + options[:points]) : options[:btnsrc]) + '&styled=' + options[:styled]) %>">
11
+ </script>
@@ -0,0 +1,7 @@
1
+ <nav class="share">
2
+ <%= social_buttons.render do -%>
3
+ <% each_button do |button| -%>
4
+ <%= eval button + '_tag' %>
5
+ <% end -%>
6
+ <% end -%>
7
+ </nav>
@@ -0,0 +1,21 @@
1
+ <!--script src='http://platform.twitter.com/widgets.js' type='text/javascript'></script> -->
2
+ <a href='http://twitter.com/share'
3
+ class='twitter-share-button'
4
+ data-url='<%= options[:url] %>'
5
+ data-via='<%= options[:via] %>'
6
+ data-text='<%= options[:text] %>'
7
+ data-related='<%= options[:related] %>'
8
+ data-count='<%= options[:count] %>'
9
+ data-lang='<%= options[:lang] %>'
10
+ data-counturl='<%= options[:counturl] %>'
11
+ data-hashtags='<%= options[:hashtags] %>'
12
+ data-size='<%= options[:size] %>'
13
+ data-dnt='<%= options[:dnt] %>'>Tweet</a>
14
+
15
+ <script>!function(d,s,id){
16
+ var js,fjs=d.getElementsByTagName(s)[0];
17
+ if(!d.getElementById(id)){
18
+ js=d.createElement(s);
19
+ js.id=id;js.src="//platform.twitter.com/widgets.js";
20
+ fjs.parentNode.insertBefore(js,fjs);}} (document,"script","twitter-wjs");
21
+ </script>
data/lib/shareable.rb ADDED
@@ -0,0 +1,27 @@
1
+ module Shareable
2
+ end
3
+
4
+ # load Rails/Railtie
5
+ begin
6
+ require 'rails'
7
+ rescue LoadError
8
+ #do nothing
9
+ end
10
+
11
+ $stderr.puts <<-EOC if !defined?(Rails)
12
+ warning: no rails framework detected.
13
+
14
+ Your Gemfile might not be configured properly.
15
+ ---- e.g. ----
16
+ Rails:
17
+ gem 'shareable'
18
+ EOC
19
+
20
+ require 'shareable/config'
21
+ require 'shareable/helpers/action_view_extension'
22
+ require 'shareable/helpers/social_buttons'
23
+ require 'shareable/hooks'
24
+ if defined? Rails
25
+ require 'shareable/railtie'
26
+ require 'shareable/engine'
27
+ end
@@ -0,0 +1,95 @@
1
+ require 'active_support/configurable'
2
+
3
+ module Shareable
4
+ # Configures global settings for Shareable
5
+ def self.configure(&block)
6
+ yield @config ||= Shareable::Configuration.new
7
+ end
8
+
9
+ # Global settings for Shareable
10
+ def self.config
11
+ @config
12
+ end
13
+
14
+ # need a Class for 3.0
15
+ class Configuration #:nodoc:
16
+ include ActiveSupport::Configurable
17
+ config_accessor :names, :url, :send, :layout, :show_faces, :title, :alt, :target, :app_id,
18
+ :width, :action, :font, :colorscheme, :ref, :annotation, :align, :expand_to, :callback,
19
+ :onstartinteraction, :onendinteraction, :pin_config, :pin_do, :media, :color,
20
+ :bordercolor, :btnsrc, :via, :text, :related, :count, :lang, :counturl, :hashtags, :size, :dnt,
21
+ :type, :styled, :newwindow, :description, :counter, :onsuccess, :onerror, :showzero,
22
+ :recommendations, :points
23
+ end
24
+
25
+ configure do |config|
26
+ config.names = %w[ twitter facebook linkedin pinterest google_plus reddit ]
27
+
28
+ ##############
29
+ #facebook
30
+ ##############
31
+ config.app_id = ''
32
+ config.send= 'false'
33
+ config.layout='button_count'
34
+ config.show_faces=''
35
+ config.width='80'
36
+ config.action=''
37
+ config.font=''
38
+ config.colorscheme=''
39
+ config.ref=''
40
+
41
+ ##############
42
+ #google_plus
43
+ ##############
44
+ config.annotation='bubble'
45
+ config.recommendations='false'
46
+ config.align=''
47
+ config.expand_to=''
48
+ config.callback=''
49
+ config.onstartinteraction=''
50
+ config.onendinteraction=''
51
+
52
+ ##############
53
+ #linkedin
54
+ ##############
55
+ config.counter = 'right'
56
+ config.onsuccess = ''
57
+ config.onerror = ''
58
+ config.showzero = 'true'
59
+
60
+ ##############
61
+ #pinterest
62
+ ##############
63
+ config.pin_config = 'beside'
64
+ config.pin_do = 'buttonPin'
65
+ config.title= '' # title for content, also used by reddit button
66
+ config.alt='' # alternate text for image tag
67
+ config.media=''
68
+ config.description='Pin This'
69
+
70
+ ##############
71
+ #reddit
72
+ ##############
73
+ config.target=''
74
+ config.color=''
75
+ config.bordercolor=''
76
+ config.styled='off'
77
+ config.newwindow='1'
78
+ config.btnsrc='' # alternate reddit button url, eg: 'http://www.reddit.com/buttonlite.js?i=1'
79
+ config.type= '1' # button type, eg: 1 to n
80
+ config.points = '1' # points style, eg: 0 to 5
81
+
82
+ ##############
83
+ #twitter
84
+ ##############
85
+ config.via='tweetbutton'
86
+ config.text=''
87
+ config.related=''
88
+ config.count='horizontal'
89
+ config.lang='en'
90
+ config.counturl=''
91
+ config.hashtags=''
92
+ config.size='medium'
93
+ config.dnt=''
94
+ end
95
+ end
@@ -0,0 +1,4 @@
1
+ module Shareable #:nodoc:
2
+ class Engine < ::Rails::Engine #:nodoc:
3
+ end
4
+ end
@@ -0,0 +1,48 @@
1
+ require 'shareable/helpers/social_buttons'
2
+
3
+ module Shareable
4
+ # = Helpers
5
+ module ActionViewExtension
6
+ # A helper that renders social links
7
+ # <%= render_shareable [options] %>
8
+ def render_shareable(options = {}, &block)
9
+ buttons = Shareable::Helpers::SocialButtons.new self, refine_options(options)
10
+ buttons.to_s
11
+ end
12
+
13
+ Shareable::Helpers::SocialButtons.buttons.each do |button|
14
+ eval <<-DEF
15
+ def #{button}_button(options = {})
16
+ #{button} = Shareable::Helpers::#{button.split('_').collect(&:capitalize).join}.new self, refine_options(options, :#{button})
17
+ #{button}.to_s
18
+ end
19
+ DEF
20
+ end
21
+
22
+ #credit to http://elektronaut.no/
23
+ def output_once(name, &block) #:nodoc:
24
+ @output_once_blocks ||= []
25
+ unless @output_once_blocks.include?(name)
26
+ @output_once_blocks << name
27
+ capture(&block)
28
+ end
29
+ end
30
+
31
+ protected
32
+ def refine_options(options={},button=nil)
33
+ options[:options] ||= {}
34
+ options[:options].merge! options.except(:options)
35
+ if options[:url].blank? then
36
+ options[:options][:url] = request.url
37
+ end
38
+ #only do for button method calls, don't do this render_shareable
39
+ if button
40
+ #add values from configuration to our options for each option that is not passed as part of the button method call
41
+ (Shareable::Helpers::SocialButtons.config_options[button] - options[:options].keys).each do |key|
42
+ options[:options][key] = Shareable.config.config.values_at(key).first
43
+ end
44
+ end
45
+ options
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,85 @@
1
+ require 'active_support/inflector'
2
+ require 'action_view'
3
+ require 'action_view/log_subscriber'
4
+ require 'action_view/context'
5
+ require 'shareable/helpers/tags'
6
+
7
+ module Shareable
8
+ module Helpers
9
+ class SocialButtons < Tag
10
+ include ::ActionView::Context
11
+ cattr_accessor :buttons
12
+ self.buttons = %w[ twitter facebook pinterest reddit google_plus linkedin ]
13
+
14
+ #not very DRY. Refactor.
15
+ cattr_accessor :config_options
16
+ self.config_options = {
17
+ :facebook => [ :app_id, :send, :layout, :show_faces, :width, :action, :font, :colorscheme, :ref ],
18
+ :google_plus => [ :annotation, :recommendations, :align, :expand_to, :callback, :onstartinteraction, :onendinteraction, :size, :width ],
19
+ :linkedin => [ :counter, :onsuccess, :onerror, :showzero ],
20
+ :pinterest => [ :pin_config, :pin_do, :title, :alt, :media, :description ],
21
+ :reddit => [ :title, :target, :color, :bordercolor, :type, :styled, :newwindow, :btnsrc, :points ],
22
+ :twitter => [ :via, :text, :related, :count, :lang, :counturl, :hashtags, :size, :dnt ]}
23
+
24
+ def initialize(template, options) #:nodoc:
25
+ @template, @options = template, options
26
+ @options[:buttons] ||= allowable(Shareable.config.names)
27
+ @options[:options] ||= {}
28
+ Shareable.config.config.each_key do |key|
29
+ @options[:options].merge! key => (options[key].blank? ? Shareable.config.config.values_at(key).first : options[key])
30
+ end
31
+ # initialize @output_bugger i.v. used in ActionView::Context
32
+ @output_buffer = ActionView::OutputBuffer.new
33
+ end
34
+
35
+ # render given block, view template for socialize class
36
+ def render(&block) #:nodoc:
37
+ instance_eval(&block)
38
+ @output_buffer
39
+ end
40
+
41
+ buttons.each do |tag|
42
+ eval <<-DEF
43
+ def #{tag}_tag
44
+ #{tag.split('_').collect(&:capitalize).join}.new @template, @options
45
+ end
46
+ DEF
47
+ end
48
+
49
+ def to_s #:nodoc:
50
+ #from Kamanari for handling log subscriber:
51
+ subscriber = ActionView::LogSubscriber.log_subscribers.detect {|ls| ls.is_a? ActionView::LogSubscriber}
52
+ return super @options.merge :social_buttons => self unless subscriber
53
+
54
+ # dirty hack to suppress logging render_partial
55
+ class << subscriber
56
+ alias_method :render_partial_with_logging, :render_partial
57
+ # do nothing
58
+ def render_partial(event); end
59
+ end
60
+
61
+ ret = super @options.merge :social_buttons => self
62
+
63
+ class << subscriber
64
+ alias_method :render_partial, :render_partial_with_logging
65
+ undef :render_partial_with_logging
66
+ end
67
+ ret
68
+ end
69
+
70
+ def each_relevant_button #:nodoc:
71
+ @options[:buttons].each do |button|
72
+ yield button
73
+ end
74
+ end
75
+
76
+ alias :each_button :each_relevant_button
77
+
78
+ protected
79
+
80
+ def allowable(names)
81
+ names.select { |b| buttons.include? b }
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,61 @@
1
+ module Shareable
2
+ module Helpers
3
+ class Tag
4
+ def initialize(template, options = {}) #:nodoc:
5
+ @template, @options = template, options.dup
6
+ end
7
+
8
+ def to_s(locals = {}) #:nodoc:
9
+ @template.render :partial => "shareable/#{self.class.name.demodulize.underscore}", :locals => @options.merge(locals)
10
+ end
11
+ end
12
+
13
+ class Socialize < Tag
14
+ def to_s(locals={}) #:nodoc:
15
+ locals[:options] ||= {}
16
+ social_site = self.class.name.demodulize.downcase.to_sym
17
+ if @options[:options]
18
+ @options[:filtered] ||= @options[:options].reject {|opt| locals[:options].include?(opt)}
19
+ locals[:options].merge!(@options[:filtered])
20
+ end
21
+ if @options[social_site]
22
+ locals[:options].merge!(@options[social_site])
23
+ end
24
+ super locals
25
+ end
26
+ end
27
+
28
+ class Facebook < Socialize
29
+ end
30
+
31
+ class GooglePlus < Socialize
32
+ end
33
+
34
+ class Linkedin < Socialize
35
+ end
36
+
37
+ class Pinterest < Socialize
38
+ def to_s(locals={}) #:nodoc:
39
+ locals[:options] ||= {}
40
+ unless @options[:options].blank?
41
+ p_opts = {:description => CGI::escape(@options[:options][:description] ? @options[:options][:description] : '' ),
42
+ :url => CGI::escape(@options[:options][:url] ? @options[:options][:url] : ''),
43
+ :media => CGI::escape(@options[:options][:media] ? @options[:options][:media] : '')}
44
+ locals[:options].merge!(@options[:options].merge(p_opts))
45
+ if @options[:pinterest]
46
+ @options[:pinterest][:description] = CGI::escape(@options[:pinterest][:description]) if @options[:pinterest][:description]
47
+ @options[:pinterest][:url] = CGI::escape(@options[:pinterest][:url]) if @options[:pinterest][:url]
48
+ @options[:pinterest][:media] = CGI::escape(@options[:pinterest][:media]) if @options[:pinterest][:media]
49
+ end
50
+ end
51
+ super locals
52
+ end
53
+ end
54
+
55
+ class Reddit < Socialize
56
+ end
57
+
58
+ class Twitter < Socialize
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,9 @@
1
+ module Shareable
2
+ class Hooks
3
+ def self.init
4
+ ActiveSupport.on_load(:action_view) do
5
+ ::ActionView::Base.send :include, Shareable::ActionViewExtension
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Shareable
2
+ class Railtie < ::Rails::Railtie #:nodoc:
3
+ initializer 'shareable' do |_app|
4
+ Shareable::Hooks.init
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Shareable
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,171 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shareable
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Hermango
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2013-03-22 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: activesupport
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 3
29
+ - 0
30
+ - 0
31
+ version: 3.0.0
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: actionpack
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 3
43
+ - 0
44
+ - 0
45
+ version: 3.0.0
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: bundler
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 1
57
+ - 0
58
+ - 0
59
+ version: 1.0.0
60
+ type: :development
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: tzinfo
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ type: :development
73
+ version_requirements: *id004
74
+ - !ruby/object:Gem::Dependency
75
+ name: rspec
76
+ prerelease: false
77
+ requirement: &id005 !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ segments:
82
+ - 0
83
+ version: "0"
84
+ type: :development
85
+ version_requirements: *id005
86
+ - !ruby/object:Gem::Dependency
87
+ name: rr
88
+ prerelease: false
89
+ requirement: &id006 !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ segments:
94
+ - 0
95
+ version: "0"
96
+ type: :development
97
+ version_requirements: *id006
98
+ - !ruby/object:Gem::Dependency
99
+ name: capybara
100
+ prerelease: false
101
+ requirement: &id007 !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ segments:
106
+ - 1
107
+ - 0
108
+ version: "1.0"
109
+ type: :development
110
+ version_requirements: *id007
111
+ description: Add social sharing links to a view in your Rails app with one method call. The configuration options for each social link are customizable. Please see read me doc for more details.
112
+ email:
113
+ executables: []
114
+
115
+ extensions: []
116
+
117
+ extra_rdoc_files: []
118
+
119
+ files:
120
+ - app/views/shareable/_facebook.html.erb
121
+ - app/views/shareable/_google_plus.html.erb
122
+ - app/views/shareable/_linkedin.html.erb
123
+ - app/views/shareable/_pinterest.html.erb
124
+ - app/views/shareable/_reddit.html.erb
125
+ - app/views/shareable/_social_buttons.html.erb
126
+ - app/views/shareable/_twitter.html.erb
127
+ - lib/shareable/helpers/action_view_extension.rb
128
+ - lib/shareable/helpers/social_buttons.rb
129
+ - lib/shareable/helpers/tags.rb
130
+ - lib/shareable/config.rb
131
+ - lib/shareable/engine.rb
132
+ - lib/shareable/hooks.rb
133
+ - lib/shareable/railtie.rb
134
+ - lib/shareable/version.rb
135
+ - lib/shareable.rb
136
+ - MIT-LICENSE
137
+ - Gemfile
138
+ - README.rdoc
139
+ - README.md
140
+ has_rdoc: true
141
+ homepage: http://github.com/hermango/shareable
142
+ licenses:
143
+ - MIT
144
+ post_install_message:
145
+ rdoc_options: []
146
+
147
+ require_paths:
148
+ - lib
149
+ required_ruby_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ segments:
154
+ - 0
155
+ version: "0"
156
+ required_rubygems_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ segments:
161
+ - 0
162
+ version: "0"
163
+ requirements: []
164
+
165
+ rubyforge_project:
166
+ rubygems_version: 1.3.6
167
+ signing_key:
168
+ specification_version: 3
169
+ summary: Simple and unobtrusive gem for adding social links to your Rails app.
170
+ test_files: []
171
+