Class: SocialLinker::Subject
- Inherits:
-
Object
- Object
- SocialLinker::Subject
- Defined in:
- lib/social_linker/subject.rb
Constant Summary collapse
- SHARE_TEMPLATES =
Constant defining how the different share-url’s look like and their parameters; the parameters can be set in the options directly, or will be derived from more generic options
{ email: { base: "mailto:emailaddress?", params: [:subject,:body,:cc,:bcc] }, pinterest: { base: "https://pinterest.com/pin/create/button/?", params: {url: :share_url, media: :media, description: :title} }, linkedin: { base: "https://www.linkedin.com/shareArticle?mini=true&", params: {url: :share_url, title: :title, summary: :summary, source: :source} }, google: { base: "https://plus.google.com/share?", params: {url: :share_url} }, twitter: { base: "https://twitter.com/intent/tweet?", params: {text: :twitter_text, via: :via, url: :share_url, hashtags: :hashtags} }, twitter_native: { base: "twitter://post?", params: {message: :twitter_text_with_url_and_hashags} }, facebook: { base: "https://www.facebook.com/sharer/sharer.php?", params: {u: :share_url} }, facebook_native: { base: "fb://publish/profile/me?", params: [:text] }, whatsapp: { base: "whatsapp://send?", params: [:text] } }
Instance Method Summary collapse
-
#body ⇒ Object
Generates a large body of text (typical for email).
-
#camelize_tag_when_needed(tag) ⇒ String
single world tags don’t need any processing, but tags consisting of different words do (before they can use in hashtags following convention).
- #canonical_url ⇒ Object
-
#hashtag_string(tags) ⇒ String
convert an array of strings to a Twitter-like hashtag-string.
- #hashtags ⇒ Object
- #image_url ⇒ Object
-
#initialize(options = {}) ⇒ Subject
constructor
Initialize the SocialLinker::Subject.
-
#media ⇒ Object
default media accessor.
-
#merge!(options) ⇒ Object
(also: #update)
Merges existing SocialLinker::Subject with a (potentially limited set of) new options.
-
#method_missing(m, *args) ⇒ Object
Catches method missing and tries to resolve them in either an appropriate share link or option value.
-
#options ⇒ Object
Returns the given options, extended with the (derived) defaults.
-
#prefix_domain(path, domain) ⇒ Object
It is assumed that paths are relative to the domainname if none is given.
-
#quote_string(string) ⇒ String
puts quotes around a string.
-
#share_link(platform) ⇒ Object
Generates a share link for each of the predefined platforms in the ‘SHARE_TEMPLATES` constant.
-
#strip_string(string, max_length = 100) ⇒ String
strips a string to the max length taking into account quoting.
-
#summary(strip = false) ⇒ Object
default summary accessor.
-
#tags ⇒ Object
default tags accessor.
-
#title ⇒ Object
default title accessor.
-
#twitter_hash_tags ⇒ Object
Turns the first two tags in to tweetable hash tags Conform recommendation never to have more than 2 tags in a twitter message.
-
#twitter_text ⇒ Object
Generatess the text to tweet (Twitter).
-
#twitter_text_with_url_and_hashags ⇒ Object
(also: #status)
Generates a full twitter message includig url and hashtags.
-
#url ⇒ Object
default url accessor.
- #url_encode(v) ⇒ Object
- #utm_parameters ⇒ Object
Constructor Details
#initialize(options = {}) ⇒ Subject
Initialize the SocialLinker::Subject
options accepts:
-
tags
-
url
-
title
-
image_url & image_type(image/jpeg, image/png)
-
description
-
facebook_app_id
-
twitter_username
-
language
-
site_title_postfix
-
… and more often medium specific attributes…
Note by default tracking parameters are added, turn this off by passing ‘utm_parameters: false`
154 155 156 157 158 |
# File 'lib/social_linker/subject.rb', line 154 def initialize(={}) # basic option syncing = {} self.merge!() end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(m, *args) ⇒ Object
Catches method missing and tries to resolve them in either an appropriate share link or option value
321 322 323 324 325 326 327 328 329 330 |
# File 'lib/social_linker/subject.rb', line 321 def method_missing(m,*args) share_link_matcher = m.to_s.match(/([a-z]*)_share_link/) if share_link_matcher return share_link(share_link_matcher[1].to_sym) elsif [m] return [m] else super end end |
Instance Method Details
#body ⇒ Object
Generates a large body of text (typical for email)
234 235 236 237 238 239 240 241 242 243 244 245 |
# File 'lib/social_linker/subject.rb', line 234 def body return [:body] if [:body] rv = "" rv += "#{@options[:summary]}\n" if [:summary] rv += "\n#{@options[:share_url]}\n" if [:share_url] rv += "\n#{@options[:description]}\n" if [:summary] != [:description] and [:description] rv += "\n#{@options[:media]}\n" if [:media] != [:share_url] and [:media] rv += "\n\n#{hashtag_string(@options[:tags])}" if [:tags] rv.strip! rv = nil if rv == "" return rv end |
#camelize_tag_when_needed(tag) ⇒ String
single world tags don’t need any processing, but tags consisting of different words do (before they can use in hashtags following convention)
62 63 64 65 |
# File 'lib/social_linker/subject.rb', line 62 def camelize_tag_when_needed(tag) tag = tag.to_s tag.match(/\s/) ? tag.split(/\s/).collect{|a| a.capitalize}.join("") : tag end |
#canonical_url ⇒ Object
82 83 84 |
# File 'lib/social_linker/subject.rb', line 82 def canonical_url [:canonical_url] end |
#hashtag_string(tags) ⇒ String
convert an array of strings to a Twitter-like hashtag-string
51 52 53 54 55 56 |
# File 'lib/social_linker/subject.rb', line 51 def hashtag_string() if and .count > 0 = .collect{|a| camelize_tag_when_needed(a) } "##{tags.collect{|a| a.to_s.strip.gsub('#','')}.join(" #")}" end end |
#hashtags ⇒ Object
110 111 112 |
# File 'lib/social_linker/subject.rb', line 110 def [:hashtags] end |
#image_url ⇒ Object
74 75 76 |
# File 'lib/social_linker/subject.rb', line 74 def image_url [:image_url] end |
#media ⇒ Object
default media accessor
100 101 102 |
# File 'lib/social_linker/subject.rb', line 100 def media [:media] end |
#merge!(options) ⇒ Object Also known as: update
Merges existing SocialLinker::Subject with a (potentially limited set of) new options
options accepts:
-
tags
-
url
-
title
-
image_url & image_type(image/jpeg, image/png)
-
description
-
facebook_app_id
-
twitter_username
-
render_site_title_postfix
-
… and more often medium specific attributes…
Note by default tracking parameters are added, turn this off by passing ‘utm_parameters: false`
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 |
# File 'lib/social_linker/subject.rb', line 179 def merge!() = . if .is_a? SocialLinker::Subject .merge!() [:render_site_title_postfix] = true if [:render_site_title_postfix].nil? [:u] = [:url] unless [:u] [:media] = [:image_url] unless [:media] [:description] = [:summary] unless [:description] [:summary] = [:description] unless [:summary] [:title] = "#{ strip_string(@options[:summary], 120) }" unless [:title] [:description] = [:title] unless [:description] [:subject] = [:title] unless [:subject] [:via] = [:twitter_username] unless [:via] [:url] = [:media] unless [:url] raise ArgumentError, "#{url} is not a valid url" if [:url] and ![:url].include?('//') [:text] = "#{@options[:title]} #{@options[:url]}" unless [:text] #facebook & whatsapp native [:canonical_url] = [:url] [:share_url] = [:url] [:domain] = [:url].split(/\//)[0..2].join("/") if [:url] and ![:domain] if [:share_url] and utm_parameters unless [:share_url].match /utm_source/ combine_with = [:share_url].match(/\?/) ? "&" : "?" [:share_url] = "#{@options[:share_url]}#{combine_with}utm_source=<%=share_source%>" end unless [:share_url].match /utm_medium/ combine_with = "&" [:share_url] = "#{@options[:share_url]}#{combine_with}utm_medium=share_link" end unless [:share_url].match /utm_campaign/ combine_with = "&" [:share_url] = "#{@options[:share_url]}#{combine_with}utm_campaign=social" end end if [:tags] [:tags].compact! [:hashtags] = [:tags][0..1].collect{|a| camelize_tag_when_needed(a) }.join(",") if [:tags] and ![:hashtags] end # make sure urls are absolute [:url] = prefix_domain([:url],[:domain]) [:share_url] = prefix_domain([:share_url],[:domain]) [:canonical_url] = prefix_domain([:canonical_url],[:domain]) [:image_url] = prefix_domain([:image_url],[:domain]) [:media] = prefix_domain([:media],[:domain]) .each do |k,v| [k] = v.strip if v and v.is_a? String end self end |
#options ⇒ Object
Returns the given options, extended with the (derived) defaults
291 292 293 |
# File 'lib/social_linker/subject.rb', line 291 def end |
#prefix_domain(path, domain) ⇒ Object
It is assumed that paths are relative to the domainname if none is given
278 279 280 281 282 283 284 285 286 |
# File 'lib/social_linker/subject.rb', line 278 def prefix_domain path, domain return_string = path if path and !path.include?("//") path.gsub!(/^\//,'') domain.gsub!(/\/$/,'') return_string = [domain,path].join("/") end return_string end |
#quote_string(string) ⇒ String
puts quotes around a string
116 117 118 |
# File 'lib/social_linker/subject.rb', line 116 def quote_string(string) "“#{string}”" if string and string.to_s.strip != "" end |
#share_link(platform) ⇒ Object
Generates a share link for each of the predefined platforms in the ‘SHARE_TEMPLATES` constant
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 |
# File 'lib/social_linker/subject.rb', line 298 def share_link(platform) = SHARE_TEMPLATES[platform] raise "No share template defined" unless url_params = {} [:params].each do |k,v| value_key = v||k #smartassery; v = nil for arrays value = [value_key] value = self.send(value_key) if self.methods.include?(value_key) if value and value.to_s.strip != "" value = value.gsub('<%=share_source%>', platform.to_s) url_params[k] = value end end return [:base]+url_params.collect{|k,v| "#{k}=#{url_encode(v)}"}.join('&') end |
#strip_string(string, max_length = 100) ⇒ String
strips a string to the max length taking into account quoting
124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/social_linker/subject.rb', line 124 def strip_string(string, max_length=100) if string and string.length > max_length elipsis = "…" if string[-1] == "”" elipsis = "#{elipsis}”" end max_char = max_length-1-elipsis.length string = string[0..max_char]+elipsis end string end |
#summary(strip = false) ⇒ Object
default summary accessor
94 95 96 |
# File 'lib/social_linker/subject.rb', line 94 def summary(strip=false) strip ? strip_string([:summary], 300) : [:summary] end |
#tags ⇒ Object
default tags accessor
106 107 108 |
# File 'lib/social_linker/subject.rb', line 106 def [:tags] ? [:tags] : [] end |
#title ⇒ Object
default title accessor
88 89 90 |
# File 'lib/social_linker/subject.rb', line 88 def title [:title] end |
#twitter_hash_tags ⇒ Object
Turns the first two tags in to tweetable hash tags Conform recommendation never to have more than 2 tags in a twitter message
250 251 252 |
# File 'lib/social_linker/subject.rb', line 250 def [:tags] ? hashtag_string([:tags][0..1]) : "" end |
#twitter_text ⇒ Object
Generatess the text to tweet (Twitter)
256 257 258 259 260 261 262 |
# File 'lib/social_linker/subject.rb', line 256 def twitter_text return [:twitter_text] if [:twitter_text] return [:tweet_text] if [:tweet_text] max_length = 140 - (.length + 12 + 4) #hashstring + url length (shortened) + spaces "#{quote_string(strip_string(@options[:title],max_length))}" end |
#twitter_text_with_url_and_hashags ⇒ Object Also known as: status
Generates a full twitter message includig url and hashtags
266 267 268 269 270 271 |
# File 'lib/social_linker/subject.rb', line 266 def twitter_text_with_url_and_hashags return [:twitter_text_with_url_and_hashags] if [:twitter_text_with_url_and_hashags] return [:message] if [:message] return [:status] if [:status] [twitter_text,,share_url].delete_if{|a| a.nil? or a.empty?}.join(" ") end |
#url ⇒ Object
default url accessor
70 71 72 |
# File 'lib/social_linker/subject.rb', line 70 def url [:url] end |
#url_encode(v) ⇒ Object
316 317 318 |
# File 'lib/social_linker/subject.rb', line 316 def url_encode(v) ERB::Util.url_encode(v) end |
#utm_parameters ⇒ Object
78 79 80 |
# File 'lib/social_linker/subject.rb', line 78 def utm_parameters [nil, true].include?([:utm_parameters]) ? true : false end |