onebox 2.2.12 → 2.2.17
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/.rspec +0 -4
- data/lib/onebox/engine.rb +7 -11
- data/lib/onebox/engine/allowlisted_generic_onebox.rb +11 -18
- data/lib/onebox/engine/amazon_onebox.rb +26 -17
- data/lib/onebox/engine/asciinema_onebox.rb +0 -1
- data/lib/onebox/engine/audioboom_onebox.rb +5 -2
- data/lib/onebox/engine/bandcamp_onebox.rb +8 -8
- data/lib/onebox/engine/cloudapp_onebox.rb +12 -12
- data/lib/onebox/engine/coub_onebox.rb +0 -1
- data/lib/onebox/engine/facebook_media_onebox.rb +8 -7
- data/lib/onebox/engine/five_hundred_px_onebox.rb +0 -1
- data/lib/onebox/engine/flickr_onebox.rb +14 -15
- data/lib/onebox/engine/gfycat_onebox.rb +26 -26
- data/lib/onebox/engine/giphy_onebox.rb +0 -1
- data/lib/onebox/engine/github_blob_onebox.rb +4 -0
- data/lib/onebox/engine/github_commit_onebox.rb +13 -16
- data/lib/onebox/engine/github_folder_onebox.rb +1 -1
- data/lib/onebox/engine/github_gist_onebox.rb +1 -2
- data/lib/onebox/engine/github_issue_onebox.rb +16 -18
- data/lib/onebox/engine/github_pullrequest_onebox.rb +7 -4
- data/lib/onebox/engine/gitlab_blob_onebox.rb +4 -0
- data/lib/onebox/engine/google_calendar_onebox.rb +1 -1
- data/lib/onebox/engine/google_docs_onebox.rb +23 -41
- data/lib/onebox/engine/google_drive_onebox.rb +7 -7
- data/lib/onebox/engine/google_maps_onebox.rb +10 -8
- data/lib/onebox/engine/google_photos_onebox.rb +18 -18
- data/lib/onebox/engine/google_play_app_onebox.rb +3 -7
- data/lib/onebox/engine/imgur_onebox.rb +2 -2
- data/lib/onebox/engine/instagram_onebox.rb +4 -5
- data/lib/onebox/engine/kaltura_onebox.rb +8 -6
- data/lib/onebox/engine/opengraph_image.rb +0 -1
- data/lib/onebox/engine/pastebin_onebox.rb +11 -15
- data/lib/onebox/engine/pdf_onebox.rb +7 -15
- data/lib/onebox/engine/pubmed_onebox.rb +17 -12
- data/lib/onebox/engine/replit_onebox.rb +0 -1
- data/lib/onebox/engine/sketchfab_onebox.rb +8 -8
- data/lib/onebox/engine/slides_onebox.rb +10 -10
- data/lib/onebox/engine/soundcloud_onebox.rb +0 -1
- data/lib/onebox/engine/stack_exchange_onebox.rb +3 -2
- data/lib/onebox/engine/standard_embed.rb +2 -5
- data/lib/onebox/engine/steam_store_onebox.rb +6 -5
- data/lib/onebox/engine/trello_onebox.rb +4 -7
- data/lib/onebox/engine/twitch_clips_onebox.rb +1 -3
- data/lib/onebox/engine/twitch_stream_onebox.rb +1 -2
- data/lib/onebox/engine/twitch_video_onebox.rb +0 -2
- data/lib/onebox/engine/typeform_onebox.rb +7 -6
- data/lib/onebox/engine/vimeo_onebox.rb +9 -7
- data/lib/onebox/engine/wikimedia_onebox.rb +1 -2
- data/lib/onebox/engine/wikipedia_onebox.rb +12 -8
- data/lib/onebox/engine/youku_onebox.rb +7 -13
- data/lib/onebox/engine/youtube_onebox.rb +14 -13
- data/lib/onebox/file_type_finder.rb +0 -1
- data/lib/onebox/helpers.rb +7 -24
- data/lib/onebox/layout.rb +2 -14
- data/lib/onebox/matcher.rb +10 -8
- data/lib/onebox/mixins/git_blob_onebox.rb +8 -8
- data/lib/onebox/mixins/github_body.rb +30 -0
- data/lib/onebox/mixins/twitch_onebox.rb +0 -1
- data/lib/onebox/open_graph.rb +4 -4
- data/lib/onebox/preview.rb +3 -4
- data/lib/onebox/version.rb +1 -1
- data/templates/_layout.mustache +6 -2
- data/templates/allowlistedgeneric.mustache +8 -9
- data/templates/amazon.mustache +5 -2
- data/templates/github/github_body.mustache +5 -0
- data/templates/githubblob.mustache +44 -34
- data/templates/githubcommit.mustache +2 -10
- data/templates/githubfolder.mustache +2 -2
- data/templates/githubgist.mustache +9 -6
- data/templates/githubissue.mustache +9 -11
- data/templates/githubpullrequest.mustache +6 -18
- data/templates/gitlabblob.mustache +11 -4
- data/templates/googledocs.mustache +2 -2
- data/templates/googledrive.mustache +2 -2
- data/templates/googleplayapp.mustache +2 -1
- data/templates/instagram.mustache +1 -1
- data/templates/pastebin.mustache +6 -2
- data/templates/pdf.mustache +6 -3
- data/templates/stackexchange.mustache +1 -0
- data/templates/twitterstatus.mustache +20 -5
- data/templates/wikimedia.mustache +2 -2
- data/templates/wikipedia.mustache +2 -2
- data/templates/xkcd.mustache +2 -2
- metadata +7 -5
@@ -11,24 +11,20 @@ module Onebox
|
|
11
11
|
MAX_DESCRIPTION_CHARS: 500
|
12
12
|
}
|
13
13
|
|
14
|
-
matches_regexp
|
14
|
+
matches_regexp(/^https?:\/\/play\.(?:(?:\w)+\.)?(google)\.com(?:\/)?\/store\/apps\//)
|
15
15
|
always_https
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
19
|
def data
|
20
20
|
price = raw.css("meta[itemprop=price]").first["content"] rescue "Free"
|
21
|
-
|
21
|
+
{
|
22
22
|
link: link,
|
23
23
|
title: raw.css("meta[property='og:title']").first["content"].gsub(" - Apps on Google Play", ""),
|
24
24
|
image: ::Onebox::Helpers.normalize_url_for_output(raw.css("meta[property='og:image']").first["content"]),
|
25
25
|
description: raw.css("meta[name=description]").first["content"][0..DEFAULTS[:MAX_DESCRIPTION_CHARS]].chop + "...",
|
26
|
-
price: price
|
26
|
+
price: price == "0" ? "Free" : price
|
27
27
|
}
|
28
|
-
if result[:price] == "0"
|
29
|
-
result[:price] = "Free"
|
30
|
-
end
|
31
|
-
result
|
32
28
|
end
|
33
29
|
end
|
34
30
|
end
|
@@ -40,7 +40,7 @@ module Onebox
|
|
40
40
|
<span class='album-title'>#{album_title}</span>
|
41
41
|
</span>
|
42
42
|
</span>
|
43
|
-
<img src='#{og.
|
43
|
+
<img src='#{og.secure_image_url}' #{og.title_attr} height='#{og.image_height}' width='#{og.image_width}'>
|
44
44
|
</a>
|
45
45
|
</div>
|
46
46
|
HTML
|
@@ -58,7 +58,7 @@ module Onebox
|
|
58
58
|
|
59
59
|
<<-HTML
|
60
60
|
<a href='#{escaped_url}' target='_blank' rel='noopener' class="onebox">
|
61
|
-
<img src='#{og.
|
61
|
+
<img src='#{og.secure_image_url.chomp("?fb")}' #{og.title_attr} alt='Imgur'>
|
62
62
|
</a>
|
63
63
|
HTML
|
64
64
|
end
|
@@ -18,9 +18,8 @@ module Onebox
|
|
18
18
|
oembed = get_oembed
|
19
19
|
raise "No oEmbed data found. Ensure 'facebook_app_access_token' is valid" if oembed.data.empty?
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
{ link: permalink,
|
21
|
+
{
|
22
|
+
link: clean_url.gsub("/#{oembed.author_name}/", "/"),
|
24
23
|
title: "@#{oembed.author_name}",
|
25
24
|
image: oembed.thumbnail_url,
|
26
25
|
description: Onebox::Helpers.truncate(oembed.title, 250),
|
@@ -36,10 +35,10 @@ module Onebox
|
|
36
35
|
|
37
36
|
def get_oembed_url
|
38
37
|
if access_token != ''
|
39
|
-
|
38
|
+
"https://graph.facebook.com/v9.0/instagram_oembed?url=#{clean_url}&access_token=#{access_token}"
|
40
39
|
else
|
41
40
|
# The following is officially deprecated by Instagram, but works in some limited circumstances.
|
42
|
-
|
41
|
+
"https://api.instagram.com/oembed/?url=#{clean_url}"
|
43
42
|
end
|
44
43
|
end
|
45
44
|
end
|
@@ -14,7 +14,7 @@ module Onebox
|
|
14
14
|
og = get_opengraph
|
15
15
|
|
16
16
|
<<~HTML
|
17
|
-
<img src="#{og.image_secure_url}" width="#{og.video_width}" height="#{og.video_height}"
|
17
|
+
<img src="#{og.image_secure_url}" width="#{og.video_width}" height="#{og.video_height}">
|
18
18
|
HTML
|
19
19
|
end
|
20
20
|
|
@@ -22,11 +22,13 @@ module Onebox
|
|
22
22
|
og = get_opengraph
|
23
23
|
|
24
24
|
<<~HTML
|
25
|
-
<iframe
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
<iframe
|
26
|
+
src="#{og.video_secure_url}"
|
27
|
+
width="#{og.video_width}"
|
28
|
+
height="#{og.video_height}"
|
29
|
+
frameborder='0'
|
30
|
+
allowfullscreen
|
31
|
+
></iframe>
|
30
32
|
HTML
|
31
33
|
end
|
32
34
|
end
|
@@ -30,29 +30,25 @@ module Onebox
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def lines
|
33
|
-
return @lines if @lines
|
33
|
+
return @lines if defined?(@lines)
|
34
34
|
response = Onebox::Helpers.fetch_response("http://pastebin.com/raw/#{paste_key}", redirect_limit: 1) rescue ""
|
35
35
|
@lines = response.split("\n")
|
36
36
|
end
|
37
37
|
|
38
38
|
def paste_key
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
match = uri.path.match(/\/embed\/([^\/]+)/)
|
47
|
-
return match[1] if match && match[1]
|
39
|
+
regex = case uri
|
40
|
+
when /\/raw\//
|
41
|
+
/\/raw\/([^\/]+)/
|
42
|
+
when /\/download\//
|
43
|
+
/\/download\/([^\/]+)/
|
44
|
+
when /\/embed\//
|
45
|
+
/\/embed\/([^\/]+)/
|
48
46
|
else
|
49
|
-
|
50
|
-
return match[1] if match && match[1]
|
47
|
+
/\/([^\/]+)/
|
51
48
|
end
|
52
49
|
|
53
|
-
|
54
|
-
|
55
|
-
nil
|
50
|
+
match = uri.path.match(regex)
|
51
|
+
match[1] if match && match[1]
|
56
52
|
end
|
57
53
|
end
|
58
54
|
end
|
@@ -12,25 +12,17 @@ module Onebox
|
|
12
12
|
private
|
13
13
|
|
14
14
|
def data
|
15
|
-
|
16
|
-
|
15
|
+
begin
|
16
|
+
size = Onebox::Helpers.fetch_content_length(@url)
|
17
|
+
rescue
|
18
|
+
raise "Unable to read pdf file: #{@url}"
|
19
|
+
end
|
17
20
|
|
18
|
-
result = { link: link,
|
19
|
-
title: pdf_info[:name],
|
20
|
-
filesize: pdf_info[:filesize]
|
21
|
-
}
|
22
|
-
result
|
23
|
-
end
|
24
|
-
|
25
|
-
def get_pdf_info
|
26
|
-
uri = URI.parse(@url)
|
27
|
-
size = Onebox::Helpers.fetch_content_length(@url)
|
28
21
|
{
|
22
|
+
link: link,
|
23
|
+
title: File.basename(uri.path),
|
29
24
|
filesize: size ? Onebox::Helpers.pretty_filesize(size.to_i) : nil,
|
30
|
-
name: File.basename(uri.path)
|
31
25
|
}
|
32
|
-
rescue
|
33
|
-
nil
|
34
26
|
end
|
35
27
|
end
|
36
28
|
end
|
@@ -6,17 +6,18 @@ module Onebox
|
|
6
6
|
include Engine
|
7
7
|
include LayoutSupport
|
8
8
|
|
9
|
-
matches_regexp
|
9
|
+
matches_regexp(/^https?:\/\/(?:(?:\w)+\.)?(www.ncbi.nlm.nih)\.gov(?:\/)?\/pubmed\/\d+/)
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
|
-
def
|
13
|
+
def xml
|
14
|
+
return @xml if defined?(@xml)
|
14
15
|
doc = Nokogiri::XML(URI.open(URI.join(@url, "?report=xml&format=text")))
|
15
16
|
pre = doc.xpath("//pre")
|
16
|
-
Nokogiri::XML("<root>" + pre.text + "</root>")
|
17
|
+
@xml = Nokogiri::XML("<root>" + pre.text + "</root>")
|
17
18
|
end
|
18
19
|
|
19
|
-
def
|
20
|
+
def authors
|
20
21
|
initials = xml.css("Initials").map { |x| x.content }
|
21
22
|
last_names = xml.css("LastName").map { |x| x.content }
|
22
23
|
author_list = (initials.zip(last_names)).map { |i, l| i + " " + l }
|
@@ -27,21 +28,25 @@ module Onebox
|
|
27
28
|
author_list.join(", ")
|
28
29
|
end
|
29
30
|
|
30
|
-
def
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
def date
|
32
|
+
xml.css("PubDate")
|
33
|
+
.children
|
34
|
+
.map { |x| x.content }
|
35
|
+
.select { |s| !s.match(/^\s+$/) }
|
36
|
+
.map { |s| s.split }
|
37
|
+
.flatten
|
38
|
+
.sort
|
39
|
+
.reverse
|
40
|
+
.join(" ") # Reverse sort so month before year.
|
35
41
|
end
|
36
42
|
|
37
43
|
def data
|
38
|
-
xml = get_xml()
|
39
44
|
{
|
40
45
|
title: xml.css("ArticleTitle").text,
|
41
|
-
authors:
|
46
|
+
authors: authors,
|
42
47
|
journal: xml.css("Title").text,
|
43
48
|
abstract: xml.css("AbstractText").text,
|
44
|
-
date:
|
49
|
+
date: date,
|
45
50
|
link: @url,
|
46
51
|
pmid: match[:pmid]
|
47
52
|
}
|
@@ -15,20 +15,20 @@ module Onebox
|
|
15
15
|
src = og.video_url.gsub("autostart=1", "")
|
16
16
|
|
17
17
|
<<-HTML
|
18
|
-
<iframe
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
18
|
+
<iframe
|
19
|
+
src="#{src}"
|
20
|
+
width="#{og.video_width}"
|
21
|
+
height="#{og.video_height}"
|
22
|
+
scrolling="no"
|
23
|
+
frameborder="0"
|
24
|
+
allowfullscreen
|
25
|
+
></iframe>
|
25
26
|
HTML
|
26
27
|
end
|
27
28
|
|
28
29
|
def placeholder_html
|
29
30
|
"<img src='#{get_opengraph.image}'>"
|
30
31
|
end
|
31
|
-
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -11,15 +11,16 @@ module Onebox
|
|
11
11
|
|
12
12
|
def to_html
|
13
13
|
<<-HTML
|
14
|
-
<iframe
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
14
|
+
<iframe
|
15
|
+
src="https://slides.com#{uri.path}/embed?style=light"
|
16
|
+
width="576"
|
17
|
+
height="420"
|
18
|
+
scrolling="no"
|
19
|
+
frameborder="0"
|
20
|
+
webkitallowfullscreen
|
21
|
+
mozallowfullscreen
|
22
|
+
allowfullscreen
|
23
|
+
></iframe>
|
23
24
|
HTML
|
24
25
|
end
|
25
26
|
|
@@ -27,7 +28,6 @@ module Onebox
|
|
27
28
|
escaped_src = ::Onebox::Helpers.normalize_url_for_output(raw[:image])
|
28
29
|
"<img src='#{escaped_src}'>"
|
29
30
|
end
|
30
|
-
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -25,7 +25,7 @@ module Onebox
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def url
|
28
|
-
domain =
|
28
|
+
domain = uri.host
|
29
29
|
question_id = match[:question_id]
|
30
30
|
answer_id = match[:answer_id2] || match[:answer_id1]
|
31
31
|
|
@@ -37,7 +37,7 @@ module Onebox
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def data
|
40
|
-
return @data if @data
|
40
|
+
return @data if defined?(@data)
|
41
41
|
|
42
42
|
result = raw['items'][0]
|
43
43
|
if result
|
@@ -48,6 +48,7 @@ module Onebox
|
|
48
48
|
result['is_answer'] = result.key?('answer_id')
|
49
49
|
result['is_question'] = result.key?('question_id')
|
50
50
|
end
|
51
|
+
|
51
52
|
@data = result
|
52
53
|
end
|
53
54
|
end
|
@@ -7,7 +7,6 @@ require 'onebox/oembed'
|
|
7
7
|
module Onebox
|
8
8
|
module Engine
|
9
9
|
module StandardEmbed
|
10
|
-
|
11
10
|
def self.oembed_providers
|
12
11
|
@@oembed_providers ||= {}
|
13
12
|
end
|
@@ -37,7 +36,7 @@ module Onebox
|
|
37
36
|
end
|
38
37
|
|
39
38
|
def raw
|
40
|
-
return @raw if @raw
|
39
|
+
return @raw if defined?(@raw)
|
41
40
|
|
42
41
|
og = get_opengraph
|
43
42
|
twitter = get_twitter
|
@@ -67,7 +66,7 @@ module Onebox
|
|
67
66
|
protected
|
68
67
|
|
69
68
|
def html_doc
|
70
|
-
return @html_doc if @html_doc
|
69
|
+
return @html_doc if defined?(@html_doc)
|
71
70
|
|
72
71
|
headers = nil
|
73
72
|
headers = { 'Cookie' => options[:cookie] } if options[:cookie]
|
@@ -117,8 +116,6 @@ module Onebox
|
|
117
116
|
"{}"
|
118
117
|
end
|
119
118
|
|
120
|
-
protected
|
121
|
-
|
122
119
|
def get_oembed_url
|
123
120
|
oembed_url = nil
|
124
121
|
|
@@ -28,11 +28,12 @@ module Onebox
|
|
28
28
|
escaped_src = ::Onebox::Helpers.normalize_url_for_output(iframe_url)
|
29
29
|
|
30
30
|
<<-HTML
|
31
|
-
<iframe
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
<iframe
|
32
|
+
src='#{escaped_src}'
|
33
|
+
frameborder='0'
|
34
|
+
width='100%'
|
35
|
+
height='190'
|
36
|
+
></iframe>
|
36
37
|
HTML
|
37
38
|
end
|
38
39
|
end
|
@@ -11,12 +11,11 @@ module Onebox
|
|
11
11
|
always_https
|
12
12
|
|
13
13
|
def to_html
|
14
|
-
|
15
|
-
|
14
|
+
src = "https://trello.com/#{match[:type]}/#{match[:key]}.html"
|
16
15
|
height = match[:type] == 'b' ? 400 : 200
|
17
16
|
|
18
17
|
<<-HTML
|
19
|
-
<iframe src
|
18
|
+
<iframe src="#{src}" width="100%" height="#{height}" frameborder="0" style="border:0"></iframe>
|
20
19
|
HTML
|
21
20
|
end
|
22
21
|
|
@@ -25,12 +24,10 @@ module Onebox
|
|
25
24
|
end
|
26
25
|
|
27
26
|
private
|
28
|
-
def match
|
29
|
-
return @match if @match
|
30
27
|
|
28
|
+
def match
|
29
|
+
return @match if defined?(@match)
|
31
30
|
@match = @url.match(%{trello\.com/(?<type>[^/]+)/(?<key>[^/]+)/?\W*})
|
32
|
-
|
33
|
-
@match
|
34
31
|
end
|
35
32
|
end
|
36
33
|
end
|
@@ -3,12 +3,11 @@
|
|
3
3
|
require_relative '../mixins/twitch_onebox'
|
4
4
|
|
5
5
|
class Onebox::Engine::TwitchClipsOnebox
|
6
|
-
|
7
6
|
def self.twitch_regexp
|
8
7
|
/^https?:\/\/clips\.twitch\.tv\/([a-zA-Z0-9_]+\/?[^#\?\/]+)/
|
9
8
|
end
|
10
|
-
include Onebox::Mixins::TwitchOnebox
|
11
9
|
|
10
|
+
include Onebox::Mixins::TwitchOnebox
|
12
11
|
requires_iframe_origins "https://clips.twitch.tv"
|
13
12
|
|
14
13
|
def query_params
|
@@ -18,5 +17,4 @@ class Onebox::Engine::TwitchClipsOnebox
|
|
18
17
|
def base_url
|
19
18
|
"clips.twitch.tv/embed?"
|
20
19
|
end
|
21
|
-
|
22
20
|
end
|