onebox 2.1.5 → 2.2.0
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.
- checksums.yaml +4 -4
- data/lib/onebox/engine.rb +3 -0
- data/lib/onebox/engine/allowlisted_generic_onebox.rb +11 -1
- data/lib/onebox/engine/github_folder_onebox.rb +78 -0
- data/lib/onebox/engine/instagram_onebox.rb +17 -20
- data/lib/onebox/engine/standard_embed.rb +1 -1
- data/lib/onebox/helpers.rb +5 -3
- data/lib/onebox/preview.rb +10 -0
- data/lib/onebox/version.rb +1 -1
- data/templates/githubfolder.mustache +11 -0
- data/templates/instagram.mustache +3 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 354e358f2909b92f1efa00092d3c82cc451760d9f8a0ee6628bb8b950f45ca2a
|
4
|
+
data.tar.gz: 86bcb44cc263203075a8b0e972b7899a6942fb4b0e4fad4917089ecbbed2fd32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 254b44103190d101795ccce8a736dacc7e3e5d3159b0512b7539f39e4968dd750800455c9867abbafd8387ef1ae870974c581965d7b53e699187af532dda1961
|
7
|
+
data.tar.gz: eff1b7f8c6add5760f5f7e6be3c1790a170e92a08ad6eb289b5a240702cfd40d681c2d3d437722dad20efe18a7a23ea154e67b60623f7f1e4a5aa651b00126e4
|
data/lib/onebox/engine.rb
CHANGED
@@ -30,6 +30,7 @@ module Onebox
|
|
30
30
|
|
31
31
|
attr_reader :url, :uri
|
32
32
|
attr_reader :timeout
|
33
|
+
attr :errors
|
33
34
|
|
34
35
|
DEFAULT = {}
|
35
36
|
def options
|
@@ -44,6 +45,7 @@ module Onebox
|
|
44
45
|
end
|
45
46
|
|
46
47
|
def initialize(link, timeout = nil)
|
48
|
+
@errors = {}
|
47
49
|
@options = DEFAULT
|
48
50
|
class_name = self.class.name.split("::").last.to_s
|
49
51
|
|
@@ -150,6 +152,7 @@ require_relative "engine/amazon_onebox"
|
|
150
152
|
require_relative "engine/github_issue_onebox"
|
151
153
|
require_relative "engine/github_blob_onebox"
|
152
154
|
require_relative "engine/github_commit_onebox"
|
155
|
+
require_relative "engine/github_folder_onebox"
|
153
156
|
require_relative "engine/github_gist_onebox"
|
154
157
|
require_relative "engine/github_pullrequest_onebox"
|
155
158
|
require_relative "engine/google_calendar_onebox"
|
@@ -256,6 +256,15 @@ module Onebox
|
|
256
256
|
d[:data_1] = Onebox::Helpers.truncate("#{d[:price_currency].strip} #{d[:price_amount].strip}")
|
257
257
|
end
|
258
258
|
|
259
|
+
skip_missing_tags = [:video]
|
260
|
+
d.each do |k, v|
|
261
|
+
next if skip_missing_tags.include?(k)
|
262
|
+
if v == nil || v == ''
|
263
|
+
errors[k] ||= []
|
264
|
+
errors[k] << 'is blank'
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
259
268
|
d
|
260
269
|
end
|
261
270
|
end
|
@@ -292,7 +301,8 @@ module Onebox
|
|
292
301
|
end
|
293
302
|
|
294
303
|
def has_text?
|
295
|
-
!Onebox::Helpers.blank?(data[:title])
|
304
|
+
!Onebox::Helpers.blank?(data[:title]) &&
|
305
|
+
!Onebox::Helpers.blank?(data[:description])
|
296
306
|
end
|
297
307
|
|
298
308
|
def is_image?
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Onebox
|
4
|
+
module Engine
|
5
|
+
class GithubFolderOnebox
|
6
|
+
include Engine
|
7
|
+
include StandardEmbed
|
8
|
+
include LayoutSupport
|
9
|
+
|
10
|
+
matches_regexp Regexp.new(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?(github)\.com[\:\d]*(\/[^\/]+){2}/)
|
11
|
+
always_https
|
12
|
+
|
13
|
+
def self.priority
|
14
|
+
# This engine should have lower priority than the other Github engines
|
15
|
+
150
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def data
|
21
|
+
og = get_opengraph
|
22
|
+
|
23
|
+
max_length = 250
|
24
|
+
|
25
|
+
display_path = extract_path(og.url, max_length)
|
26
|
+
display_description = clean_description(og.description, og.title, max_length)
|
27
|
+
|
28
|
+
title = og.title
|
29
|
+
|
30
|
+
fragment = Addressable::URI.parse(url).fragment
|
31
|
+
if fragment
|
32
|
+
fragment = Addressable::URI.unencode(fragment)
|
33
|
+
|
34
|
+
if html_doc.css('.Box.md')
|
35
|
+
# For links to markdown docs
|
36
|
+
node = html_doc.css('a.anchor').find { |n| n['href'] == "##{fragment}" }
|
37
|
+
subtitle = node&.parent&.text
|
38
|
+
elsif html_doc.css('.Box.rdoc')
|
39
|
+
# For links to rdoc docs
|
40
|
+
node = html_doc.css('h3').find { |n| n['id'] == "user-content-#{fragment.downcase}" }
|
41
|
+
subtitle = node&.css('text()')&.first&.text
|
42
|
+
end
|
43
|
+
|
44
|
+
title = "#{title} - #{subtitle}" if subtitle
|
45
|
+
end
|
46
|
+
|
47
|
+
{
|
48
|
+
link: url,
|
49
|
+
image: og.image,
|
50
|
+
title: Onebox::Helpers.truncate(title, 250),
|
51
|
+
path: display_path,
|
52
|
+
description: display_description,
|
53
|
+
favicon: get_favicon
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def extract_path(root, max_length)
|
58
|
+
path = url.split('#')[0].split('?')[0]
|
59
|
+
path = path["#{root}/tree/".length..-1]
|
60
|
+
|
61
|
+
return unless path
|
62
|
+
|
63
|
+
path.length > max_length ? path[-max_length..-1] : path
|
64
|
+
end
|
65
|
+
|
66
|
+
def clean_description(description, title, max_length)
|
67
|
+
return unless description
|
68
|
+
|
69
|
+
desc_end = " - #{title}"
|
70
|
+
if description[-desc_end.length..-1] == desc_end
|
71
|
+
description = description[0...-desc_end.length]
|
72
|
+
end
|
73
|
+
|
74
|
+
Onebox::Helpers.truncate(description, max_length)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -15,35 +15,32 @@ module Onebox
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def data
|
18
|
-
|
18
|
+
oembed = get_oembed
|
19
|
+
raise "No oEmbed data found. Ensure 'facebook_app_access_token' is valid" if oembed.data.empty?
|
19
20
|
|
20
|
-
|
21
|
-
# - "3,227 Likes, 88 Comments - An Account (@user.name) on Instagram: “Look at my picture!”"
|
22
|
-
# - "@user.name posted on their Instagram profile: “Look at my picture!”"
|
23
|
-
|
24
|
-
m = og.description.match(/\(@([\w\.]+)\) on Instagram/)
|
25
|
-
author_name = m[1] if m
|
26
|
-
|
27
|
-
author_name ||= begin
|
28
|
-
m = og.description.match(/^\@([\w\.]+)\ posted/)
|
29
|
-
m[1] if m
|
30
|
-
end
|
31
|
-
|
32
|
-
raise "Author username not found for post #{clean_url}" unless author_name
|
33
|
-
|
34
|
-
permalink = clean_url.gsub("/#{author_name}/", "/")
|
21
|
+
permalink = clean_url.gsub("/#{oembed.author_name}/", "/")
|
35
22
|
|
36
23
|
{ link: permalink,
|
37
|
-
title: "@#{author_name}",
|
38
|
-
image:
|
39
|
-
description: Onebox::Helpers.truncate(
|
24
|
+
title: "@#{oembed.author_name}",
|
25
|
+
image: oembed.thumbnail_url,
|
26
|
+
description: Onebox::Helpers.truncate(oembed.title, 250),
|
40
27
|
}
|
28
|
+
|
41
29
|
end
|
42
30
|
|
43
31
|
protected
|
44
32
|
|
33
|
+
def access_token
|
34
|
+
(options[:facebook_app_access_token] || Onebox.options.facebook_app_access_token).to_s
|
35
|
+
end
|
36
|
+
|
45
37
|
def get_oembed_url
|
46
|
-
|
38
|
+
if access_token != ''
|
39
|
+
oembed_url = "https://graph.facebook.com/v9.0/instagram_oembed?url=#{clean_url}&access_token=#{access_token}"
|
40
|
+
else
|
41
|
+
# The following is officially deprecated by Instagram, but works in some limited circumstances.
|
42
|
+
oembed_url = "https://api.instagram.com/oembed/?url=#{clean_url}"
|
43
|
+
end
|
47
44
|
end
|
48
45
|
end
|
49
46
|
end
|
@@ -91,7 +91,7 @@ module Onebox
|
|
91
91
|
html_doc.css('meta').each do |m|
|
92
92
|
if (m["property"] && m["property"][/^twitter:(.+)$/i]) || (m["name"] && m["name"][/^twitter:(.+)$/i])
|
93
93
|
value = (m["content"] || m["value"]).to_s
|
94
|
-
twitter[$1.tr('-:' , '_').to_sym] ||= value unless Onebox::Helpers::blank?(value)
|
94
|
+
twitter[$1.tr('-:' , '_').to_sym] ||= value unless (Onebox::Helpers::blank?(value) || value == "0 minutes")
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
data/lib/onebox/helpers.rb
CHANGED
@@ -27,7 +27,7 @@ module Onebox
|
|
27
27
|
def self.fetch_html_doc(url, headers = nil)
|
28
28
|
response = (fetch_response(url, nil, nil, headers) rescue nil)
|
29
29
|
doc = Nokogiri::HTML(response)
|
30
|
-
uri = URI(url)
|
30
|
+
uri = Addressable::URI.parse(url)
|
31
31
|
|
32
32
|
ignore_canonical_tag = doc.at('meta[property="og:ignore_canonical"]')
|
33
33
|
should_ignore_canonical = IGNORE_CANONICAL_DOMAINS.map { |hostname| uri.hostname.match?(hostname) }.any?
|
@@ -35,8 +35,9 @@ module Onebox
|
|
35
35
|
unless (ignore_canonical_tag && ignore_canonical_tag['content'].to_s == 'true') || should_ignore_canonical
|
36
36
|
# prefer canonical link
|
37
37
|
canonical_link = doc.at('//link[@rel="canonical"]/@href')
|
38
|
-
|
39
|
-
|
38
|
+
canonical_uri = Addressable::URI.parse(canonical_link)
|
39
|
+
if canonical_link && "#{canonical_uri.host}#{canonical_uri.path}" != "#{uri.host}#{uri.path}"
|
40
|
+
response = (fetch_response(canonical_uri.to_s, nil, nil, headers) rescue nil)
|
40
41
|
doc = Nokogiri::HTML(response) if response
|
41
42
|
end
|
42
43
|
end
|
@@ -156,6 +157,7 @@ module Onebox
|
|
156
157
|
end
|
157
158
|
|
158
159
|
def self.truncate(string, length = 50)
|
160
|
+
return string if string.nil?
|
159
161
|
string.size > length ? string[0...(string.rindex(" ", length) || length)] + "..." : string
|
160
162
|
end
|
161
163
|
|
data/lib/onebox/preview.rb
CHANGED
data/lib/onebox/version.rb
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
{{#image}}<img src="{{image}}" class="thumbnail"/>{{/image}}
|
2
|
+
|
3
|
+
<h3><a href='{{link}}' target="_blank" rel="noopener">{{title}}</a></h3>
|
4
|
+
|
5
|
+
{{#path}}
|
6
|
+
<p><a href='{{link}}' target="_blank" rel="noopener">{{path}}</a></p>
|
7
|
+
{{/path}}
|
8
|
+
|
9
|
+
{{#description}}
|
10
|
+
<p><span class="label1">{{description}}</span></p>
|
11
|
+
{{/description}}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: onebox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joanna Zeta
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2020-
|
13
|
+
date: 2020-12-23 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: addressable
|
@@ -316,6 +316,7 @@ files:
|
|
316
316
|
- lib/onebox/engine/giphy_onebox.rb
|
317
317
|
- lib/onebox/engine/github_blob_onebox.rb
|
318
318
|
- lib/onebox/engine/github_commit_onebox.rb
|
319
|
+
- lib/onebox/engine/github_folder_onebox.rb
|
319
320
|
- lib/onebox/engine/github_gist_onebox.rb
|
320
321
|
- lib/onebox/engine/github_issue_onebox.rb
|
321
322
|
- lib/onebox/engine/github_pullrequest_onebox.rb
|
@@ -383,6 +384,7 @@ files:
|
|
383
384
|
- templates/amazon.mustache
|
384
385
|
- templates/githubblob.mustache
|
385
386
|
- templates/githubcommit.mustache
|
387
|
+
- templates/githubfolder.mustache
|
386
388
|
- templates/githubgist.mustache
|
387
389
|
- templates/githubissue.mustache
|
388
390
|
- templates/githubpullrequest.mustache
|