onebox 2.2.9 → 2.2.14

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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +0 -4
  3. data/lib/onebox/engine.rb +1 -1
  4. data/lib/onebox/engine/allowlisted_generic_onebox.rb +11 -9
  5. data/lib/onebox/engine/amazon_onebox.rb +25 -13
  6. data/lib/onebox/engine/asciinema_onebox.rb +0 -1
  7. data/lib/onebox/engine/audioboom_onebox.rb +5 -2
  8. data/lib/onebox/engine/bandcamp_onebox.rb +8 -8
  9. data/lib/onebox/engine/cloudapp_onebox.rb +12 -12
  10. data/lib/onebox/engine/coub_onebox.rb +0 -1
  11. data/lib/onebox/engine/facebook_media_onebox.rb +8 -7
  12. data/lib/onebox/engine/five_hundred_px_onebox.rb +0 -1
  13. data/lib/onebox/engine/flickr_onebox.rb +14 -15
  14. data/lib/onebox/engine/giphy_onebox.rb +0 -1
  15. data/lib/onebox/engine/github_blob_onebox.rb +4 -0
  16. data/lib/onebox/engine/github_commit_onebox.rb +12 -15
  17. data/lib/onebox/engine/github_gist_onebox.rb +1 -2
  18. data/lib/onebox/engine/github_issue_onebox.rb +16 -18
  19. data/lib/onebox/engine/github_pullrequest_onebox.rb +9 -1
  20. data/lib/onebox/engine/gitlab_blob_onebox.rb +4 -0
  21. data/lib/onebox/engine/google_calendar_onebox.rb +1 -1
  22. data/lib/onebox/engine/google_docs_onebox.rb +7 -7
  23. data/lib/onebox/engine/google_drive_onebox.rb +7 -7
  24. data/lib/onebox/engine/google_maps_onebox.rb +0 -2
  25. data/lib/onebox/engine/google_photos_onebox.rb +14 -14
  26. data/lib/onebox/engine/google_play_app_onebox.rb +3 -7
  27. data/lib/onebox/engine/html.rb +4 -1
  28. data/lib/onebox/engine/instagram_onebox.rb +2 -2
  29. data/lib/onebox/engine/kaltura_onebox.rb +8 -6
  30. data/lib/onebox/engine/opengraph_image.rb +0 -1
  31. data/lib/onebox/engine/pubmed_onebox.rb +3 -2
  32. data/lib/onebox/engine/replit_onebox.rb +0 -1
  33. data/lib/onebox/engine/sketchfab_onebox.rb +8 -8
  34. data/lib/onebox/engine/slides_onebox.rb +10 -10
  35. data/lib/onebox/engine/soundcloud_onebox.rb +0 -1
  36. data/lib/onebox/engine/stack_exchange_onebox.rb +2 -1
  37. data/lib/onebox/engine/standard_embed.rb +2 -2
  38. data/lib/onebox/engine/steam_store_onebox.rb +6 -5
  39. data/lib/onebox/engine/trello_onebox.rb +2 -2
  40. data/lib/onebox/engine/twitch_clips_onebox.rb +1 -3
  41. data/lib/onebox/engine/twitch_stream_onebox.rb +1 -2
  42. data/lib/onebox/engine/twitch_video_onebox.rb +0 -2
  43. data/lib/onebox/engine/typeform_onebox.rb +7 -6
  44. data/lib/onebox/engine/vimeo_onebox.rb +9 -7
  45. data/lib/onebox/engine/wikimedia_onebox.rb +1 -2
  46. data/lib/onebox/engine/wikipedia_onebox.rb +12 -8
  47. data/lib/onebox/engine/youku_onebox.rb +7 -7
  48. data/lib/onebox/engine/youtube_onebox.rb +46 -17
  49. data/lib/onebox/file_type_finder.rb +0 -1
  50. data/lib/onebox/helpers.rb +3 -3
  51. data/lib/onebox/mixins/git_blob_onebox.rb +5 -3
  52. data/lib/onebox/mixins/github_body.rb +30 -0
  53. data/lib/onebox/mixins/twitch_onebox.rb +0 -1
  54. data/lib/onebox/preview.rb +1 -2
  55. data/lib/onebox/sanitize_config.rb +1 -1
  56. data/lib/onebox/version.rb +1 -1
  57. data/templates/github/github_body.mustache +5 -0
  58. data/templates/githubcommit.mustache +2 -8
  59. data/templates/githubissue.mustache +7 -9
  60. data/templates/githubpullrequest.mustache +2 -1
  61. metadata +4 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 541807b758c73492e2868271a63b8f05ef4d94aad316be86fb5c42c3c3f0e2ce
4
- data.tar.gz: 10f460d3d6a1b09a6087a38ad0692c9f652e027beb65b22845536480055b4a48
3
+ metadata.gz: 0b9626bc9bec1d423e617a946df2e4be0334cf6f7693056dc79865b50f127e26
4
+ data.tar.gz: 9fc7c684bc99a33d356cfbf0c1a085e5dc1531aa6a6a3028670afb05406c4448
5
5
  SHA512:
6
- metadata.gz: d13068e9dbb437388ee689581bc64bb08bf4c5ae898755680c3c978a00fc4a4ee13004f0f2a3071f40d226d15e84f799a949d0d07572c6537ddd92950416d56b
7
- data.tar.gz: 1efacb58ff5d24daff63cdd855a32ae80826f3585eee0305ba032269ee4431f1541848582bd5587aacffdcd6cb9c5bb35c650706c6028ed5e115e17daf362621
6
+ metadata.gz: 2a3f999936fbfe289e07b58b424e735d13c2e3132beffb16c41a6094fa42aa0dd1018d544175eba1f1ad7552b26cade7096d72ff286268a097230835d8f9c99d
7
+ data.tar.gz: 1effdda4c94dc9dbded959fc3acf0a51d6efd09629cccd2e9c2c1df74d637c9b8cb577be7fb79dc90b3ba42125af6dfde0c56e33cb8b31f6d4a72d0090a0fded
data/.rspec CHANGED
@@ -1,5 +1 @@
1
1
  --color
2
- --format documentation
3
- --fail-fast
4
- --backtrace
5
-
data/lib/onebox/engine.rb CHANGED
@@ -136,7 +136,7 @@ module Onebox
136
136
  end
137
137
 
138
138
  def always_https?
139
- @https
139
+ defined?(@https) ? @https : false
140
140
  end
141
141
  end
142
142
  end
@@ -374,15 +374,17 @@ module Onebox
374
374
  escaped_image_src = ::Onebox::Helpers.normalize_url_for_output(data[:image])
375
375
 
376
376
  <<-HTML
377
- <video title='#{data[:title]}'
378
- width='#{data[:video_width]}'
379
- height='#{data[:video_height]}'
380
- style='max-width:100%'
381
- poster='#{escaped_image_src}'
382
- controls=''>
383
- <source src='#{escaped_video_src}'>
384
- </video>
385
- HTML
377
+ <video
378
+ title='#{data[:title]}'
379
+ width='#{data[:video_width]}'
380
+ height='#{data[:video_height]}'
381
+ style='max-width:100%'
382
+ poster='#{escaped_image_src}'
383
+ controls=''
384
+ >
385
+ <source src='#{escaped_video_src}'>
386
+ </video>
387
+ HTML
386
388
  end
387
389
 
388
390
  def embedded_html
@@ -14,17 +14,22 @@ module Onebox
14
14
  matches_regexp(/^https?:\/\/(?:www\.)?(?:smile\.)?(amazon|amzn)\.(?<tld>com|ca|de|it|es|fr|co\.jp|co\.uk|cn|in|com\.br|com\.mx|nl|pl|sa|sg|se|com\.tr|ae)\//)
15
15
 
16
16
  def url
17
- # Have we cached the HTML body of the requested URL?
18
- # If so, try to grab the canonical URL from that document,
17
+ @raw ||= nil
18
+
19
+ # If possible, fetch the cached HTML body immediately so we can
20
+ # try to grab the canonical URL from that document,
19
21
  # rather than guess at the best URL structure to use
20
- if @body_cacher && @body_cacher.respond_to?('cache_response_body?')
21
- if @body_cacher.cached_response_body_exists?(uri.to_s)
22
- @raw ||= Onebox::Helpers.fetch_html_doc(@url, http_params, @body_cacher)
23
- canonical_link = @raw.at('//link[@rel="canonical"]/@href')
24
- return canonical_link.to_s if canonical_link
22
+ if body_cacher&.respond_to?('cache_response_body?')
23
+ if body_cacher.cache_response_body?(uri.to_s) && body_cacher.cached_response_body_exists?(uri.to_s)
24
+ @raw ||= Onebox::Helpers.fetch_html_doc(@url, http_params, body_cacher)
25
25
  end
26
26
  end
27
27
 
28
+ if @raw
29
+ canonical_link = @raw.at('//link[@rel="canonical"]/@href')
30
+ return canonical_link.to_s if canonical_link
31
+ end
32
+
28
33
  if match && match[:id]
29
34
  return "https://www.amazon.#{tld}/dp/#{Onebox::Helpers.uri_encode(match[:id])}"
30
35
  end
@@ -33,7 +38,7 @@ module Onebox
33
38
  end
34
39
 
35
40
  def tld
36
- @tld || @@matcher.match(@url)["tld"]
41
+ @tld ||= @@matcher.match(@url)["tld"]
37
42
  end
38
43
 
39
44
  def http_params
@@ -45,7 +50,7 @@ module Onebox
45
50
  private
46
51
 
47
52
  def match
48
- @match ||= @url.match(/(?:d|g)p\/(?:product\/|video\/detail\/)?(?<id>[^\/]+)(?:\/|$)/mi)
53
+ @match ||= @url.match(/(?:d|g)p\/(?:product\/|video\/detail\/)?(?<id>[A-Z0-9]+)(?:\/|\?|$)/mi)
49
54
  end
50
55
 
51
56
  def image
@@ -60,6 +65,10 @@ module Onebox
60
65
  end
61
66
 
62
67
  if (landing_image = raw.css("#landingImage")) && landing_image.any?
68
+ attributes = landing_image.first.attributes
69
+
70
+ return attributes["data-old-hires"].to_s if attributes["data-old-hires"]
71
+
63
72
  landing_image.first["src"].to_s
64
73
  end
65
74
 
@@ -110,7 +119,7 @@ module Onebox
110
119
  end
111
120
 
112
121
  result = {
113
- link: link,
122
+ link: url,
114
123
  title: title,
115
124
  by_info: authors,
116
125
  image: og.image || image,
@@ -141,7 +150,7 @@ module Onebox
141
150
  end
142
151
 
143
152
  result = {
144
- link: link,
153
+ link: url,
145
154
  title: title,
146
155
  by_info: authors,
147
156
  image: og.image || image,
@@ -157,7 +166,7 @@ module Onebox
157
166
  else
158
167
  title = og.title || CGI.unescapeHTML(raw.css("title").inner_text)
159
168
  result = {
160
- link: link,
169
+ link: url,
161
170
  title: title,
162
171
  image: og.image || image,
163
172
  price: price
@@ -167,7 +176,10 @@ module Onebox
167
176
  result[:by_info] = Onebox::Helpers.clean(result[:by_info].inner_html) if result[:by_info]
168
177
 
169
178
  summary = raw.at("#productDescription")
170
- result[:description] = og.description || (summary && summary.inner_text) || CGI.unescapeHTML(Onebox::Helpers.truncate(raw.css("meta[name=description]").first["content"], 250))
179
+
180
+ description = og.description || summary&.inner_text
181
+ description ||= raw.css("meta[name=description]").first&.[]("content")
182
+ result[:description] = CGI.unescapeHTML(Onebox::Helpers.truncate(description, 250)) if description
171
183
  end
172
184
 
173
185
  result[:price] = nil if result[:price].start_with?("$0") || result[:price] == 0
@@ -7,7 +7,6 @@ module Onebox
7
7
  include StandardEmbed
8
8
 
9
9
  always_https
10
-
11
10
  matches_regexp(/^https?:\/\/asciinema\.org\/a\/[\p{Alnum}_\-]+$/)
12
11
 
13
12
  def to_html
@@ -13,14 +13,17 @@ module Onebox
13
13
  oembed = get_oembed
14
14
 
15
15
  <<-HTML
16
- <img src="#{oembed.thumbnail_url}" style="max-width: #{oembed.width}px; max-height: #{oembed.height}px;" #{oembed.title_attr}>
16
+ <img
17
+ src="#{oembed.thumbnail_url}"
18
+ style="max-width: #{oembed.width}px; max-height: #{oembed.height}px;"
19
+ #{oembed.title_attr}
20
+ >
17
21
  HTML
18
22
  end
19
23
 
20
24
  def to_html
21
25
  get_oembed.html
22
26
  end
23
-
24
27
  end
25
28
  end
26
29
  end
@@ -20,16 +20,16 @@ module Onebox
20
20
  escaped_src = og.video_secure_url || og.video
21
21
 
22
22
  <<-HTML
23
- <iframe src="#{escaped_src}"
24
- width="#{og.video_width}"
25
- height="#{og.video_height}"
26
- scrolling="no"
27
- frameborder="0"
28
- allowfullscreen>
29
- </iframe>
23
+ <iframe
24
+ src="#{escaped_src}"
25
+ width="#{og.video_width}"
26
+ height="#{og.video_height}"
27
+ scrolling="no"
28
+ frameborder="0"
29
+ allowfullscreen
30
+ ></iframe>
30
31
  HTML
31
32
  end
32
-
33
33
  end
34
34
  end
35
35
  end
@@ -25,28 +25,28 @@ module Onebox
25
25
 
26
26
  def link_html(og)
27
27
  <<-HTML
28
- <a href='#{og.url}' target='_blank' rel='noopener'>
29
- #{og.title}
30
- </a>
31
- HTML
28
+ <a href='#{og.url}' target='_blank' rel='noopener'>
29
+ #{og.title}
30
+ </a>
31
+ HTML
32
32
  end
33
33
 
34
34
  def video_html(og)
35
35
  direct_src = ::Onebox::Helpers.normalize_url_for_output("#{og.get(:url)}/#{og.title}")
36
36
 
37
37
  <<-HTML
38
- <video width='480' height='360' #{og.title_attr} controls loop>
39
- <source src='#{direct_src}' type='video/mp4'>
40
- </video>
41
- HTML
38
+ <video width='480' height='360' #{og.title_attr} controls loop>
39
+ <source src='#{direct_src}' type='video/mp4'>
40
+ </video>
41
+ HTML
42
42
  end
43
43
 
44
44
  def image_html(og)
45
45
  <<-HTML
46
- <a href='#{og.url}' target='_blank' class='onebox' rel='noopener'>
47
- <img src='#{og.image}' #{og.title_attr} alt='CloudApp' width='480'>
48
- </a>
49
- HTML
46
+ <a href='#{og.url}' target='_blank' class='onebox' rel='noopener'>
47
+ <img src='#{og.image}' #{og.title_attr} alt='CloudApp' width='480'>
48
+ </a>
49
+ HTML
50
50
  end
51
51
  end
52
52
  end
@@ -17,7 +17,6 @@ module Onebox
17
17
  def to_html
18
18
  get_oembed.html
19
19
  end
20
-
21
20
  end
22
21
  end
23
22
  end
@@ -14,13 +14,14 @@ module Onebox
14
14
  metadata = get_twitter
15
15
  if metadata.present? && metadata[:card] == "player" && metadata[:player].present?
16
16
  <<-HTML
17
- <iframe src="#{metadata[:player]}"
18
- width="#{metadata[:player_width]}"
19
- height="#{metadata[:player_height]}"
20
- scrolling="no"
21
- frameborder="0"
22
- allowfullscreen>
23
- </iframe>
17
+ <iframe
18
+ src="#{metadata[:player]}"
19
+ width="#{metadata[:player_width]}"
20
+ height="#{metadata[:player_height]}"
21
+ scrolling="no"
22
+ frameborder="0"
23
+ allowfullscreen
24
+ ></iframe>
24
25
  HTML
25
26
  else
26
27
  html = Onebox::Engine::AllowlistedGenericOnebox.new(@url, @timeout).to_html
@@ -13,7 +13,6 @@ module Onebox
13
13
  og = get_opengraph
14
14
  "<img src='#{og.image}' width='#{og.image_width}' height='#{og.image_height}' class='onebox' #{og.title_attr}>"
15
15
  end
16
-
17
16
  end
18
17
  end
19
18
  end
@@ -25,29 +25,28 @@ module Onebox
25
25
  album_title = "[Album] #{og.title}"
26
26
 
27
27
  <<-HTML
28
- <div class='onebox flickr-album'>
29
- <a href='#{escaped_url}' target='_blank' rel='noopener'>
30
- <span class='outer-box' style='max-width:#{og.image_width}px'>
31
- <span class='inner-box'>
32
- <span class='album-title'>#{album_title}</span>
33
- </span>
28
+ <div class='onebox flickr-album'>
29
+ <a href='#{escaped_url}' target='_blank' rel='noopener'>
30
+ <span class='outer-box' style='max-width:#{og.image_width}px'>
31
+ <span class='inner-box'>
32
+ <span class='album-title'>#{album_title}</span>
34
33
  </span>
35
- <img src='#{og.get_secure_image}' #{og.title_attr} height='#{og.image_height}' width='#{og.image_width}'>
36
- </a>
37
- </div>
38
- HTML
34
+ </span>
35
+ <img src='#{og.get_secure_image}' #{og.title_attr} height='#{og.image_height}' width='#{og.image_width}'>
36
+ </a>
37
+ </div>
38
+ HTML
39
39
  end
40
40
 
41
41
  def image_html(og)
42
42
  escaped_url = ::Onebox::Helpers.normalize_url_for_output(url)
43
43
 
44
44
  <<-HTML
45
- <a href='#{escaped_url}' target='_blank' rel='noopener' class="onebox">
46
- <img src='#{og.get_secure_image}' #{og.title_attr} alt='Imgur' height='#{og.image_height}' width='#{og.image_width}'>
47
- </a>
48
- HTML
45
+ <a href='#{escaped_url}' target='_blank' rel='noopener' class="onebox">
46
+ <img src='#{og.get_secure_image}' #{og.title_attr} alt='Imgur' height='#{og.image_height}' width='#{og.image_width}'>
47
+ </a>
48
+ HTML
49
49
  end
50
-
51
50
  end
52
51
  end
53
52
  end
@@ -18,7 +18,6 @@ module Onebox
18
18
  </a>
19
19
  HTML
20
20
  end
21
-
22
21
  end
23
22
  end
24
23
  end
@@ -8,17 +8,21 @@ module Onebox
8
8
  def self.git_regexp
9
9
  /^https?:\/\/(www\.)?github\.com.*\/blob\//
10
10
  end
11
+
11
12
  def self.onebox_name
12
13
  "githubblob"
13
14
  end
14
15
 
15
16
  include Onebox::Mixins::GitBlobOnebox
17
+
16
18
  def raw_regexp
17
19
  /github\.com\/(?<user>[^\/]+)\/(?<repo>[^\/]+)\/blob\/(?<sha1>[^\/]+)\/(?<file>[^#]+)(#(L(?<from>[^-]*)(-L(?<to>.*))?))?/mi
18
20
  end
21
+
19
22
  def raw_template(m)
20
23
  "https://raw.githubusercontent.com/#{m[:user]}/#{m[:repo]}/#{m[:sha1]}/#{m[:file]}"
21
24
  end
25
+
22
26
  def title
23
27
  Sanitize.fragment(Onebox::Helpers.uri_unencode(link).sub(/^https?\:\/\/github\.com\//, ''))
24
28
  end
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../mixins/github_body'
4
+
3
5
  module Onebox
4
6
  module Engine
5
7
  class GithubCommitOnebox
6
8
  include Engine
7
9
  include LayoutSupport
8
10
  include JSON
11
+ include Onebox::Mixins::GithubBody
9
12
 
10
13
  matches_regexp Regexp.new("^https?://(?:www\.)?(?:(?:\w)+\.)?(github)\.com(?:/)?(?:.)*/commit/")
11
14
  always_https
@@ -17,36 +20,30 @@ module Onebox
17
20
  private
18
21
 
19
22
  def match
20
- return @match if @match
23
+ return @match if defined?(@match)
21
24
 
22
25
  @match = @url.match(%{github\.com/(?<owner>[^/]+)/(?<repository>[^/]+)/commit/(?<sha>[^/]+)})
23
-
24
- @match = @url.match(%{github\.com/(?<owner>[^/]+)/(?<repository>[^/]+)/pull/(?<pr>[^/]+)/commit/(?<sha>[^/]+)}) if @match.nil?
26
+ @match ||= @url.match(%{github\.com/(?<owner>[^/]+)/(?<repository>[^/]+)/pull/(?<pr>[^/]+)/commit/(?<sha>[^/]+)})
25
27
 
26
28
  @match
27
29
  end
28
30
 
29
31
  def data
30
32
  result = raw.clone
31
- result['link'] = link
32
- result['title'] = result['commit']['message'].split("\n").first
33
33
 
34
- if result['commit']['message'].lines.count > 1
35
- message = result['commit']['message'].split("\n", 2).last.strip
34
+ lines = result['commit']['message'].split("\n")
35
+ result['title'] = lines.first
36
+ result['body'], result['excerpt'] = compute_body(lines[1..lines.length].join("\n"))
36
37
 
37
- message_words = message.gsub("\n\n", "\n").gsub("\n", "<br>").split(" ")
38
- max_words = 20
39
- result['message'] = message_words[0..max_words].join(" ")
40
- result['message'] += "..." if message_words.length > max_words
41
- result['message'] = result['message'].gsub("<br>", "\n")
42
- end
43
-
44
- ulink = URI(link)
45
38
  committed_at = Time.parse(result['commit']['author']['date'])
46
39
  result['committed_at'] = committed_at.strftime("%I:%M%p - %d %b %y %Z")
47
40
  result['committed_at_date'] = committed_at.strftime("%F")
48
41
  result['committed_at_time'] = committed_at.strftime("%T")
42
+
43
+ result['link'] = link
44
+ ulink = URI(link)
49
45
  result['domain'] = "#{ulink.host}/#{ulink.path.split('/')[1]}/#{ulink.path.split('/')[2]}"
46
+
50
47
  result
51
48
  end
52
49
  end
@@ -9,7 +9,7 @@ module Onebox
9
9
 
10
10
  MAX_FILES = 3
11
11
 
12
- matches_regexp Regexp.new("^http(?:s)?://gist\\.(?:(?:\\w)+\\.)?(github)\\.com(?:/)?")
12
+ matches_regexp(/^http(?:s)?:\/\/gist\.(?:(?:\w)+\.)?(github)\.com(?:\/)?/)
13
13
  always_https
14
14
 
15
15
  def url
@@ -76,7 +76,6 @@ module Onebox
76
76
  @lines ||= @json["content"].split("\n")
77
77
  end
78
78
  end
79
-
80
79
  end
81
80
  end
82
81
  end