onebox 1.9.24 → 1.9.25
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +39 -0
- data/lib/onebox/engine/amazon_onebox.rb +1 -1
- data/lib/onebox/engine/cloudapp_onebox.rb +3 -3
- data/lib/onebox/engine/github_blob_onebox.rb +1 -1
- data/lib/onebox/engine/gitlab_blob_onebox.rb +1 -1
- data/lib/onebox/helpers.rb +23 -47
- data/lib/onebox/version.rb +1 -1
- data/onebox.gemspec +2 -1
- data/templates/instagram.mustache +3 -3
- metadata +20 -6
- data/.travis.yml +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6261462665816f1ed15b3da351e0fa160342038955023b1548be3af10ebd3a96
|
4
|
+
data.tar.gz: 70174996ce5669ff406f2970bec253112dadcfababe3caeaa4f35f615379629c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e120c498fc253c6863a6437282d5d922c6a89e6c23b59144441326c1c2f4bcf1ab33a215873e07a6d7bd2a6b51d32ac6b7ad592e58b3bb6798e44e1cf07c30cd
|
7
|
+
data.tar.gz: d245616280be4f55c0a245a7466aef9a7290cd48b7abec83a2120c664dc8ed1e117cbd02226fa4c0c6bb49ccb5250dd5e3e5e6161cbb4c78fb41858a37961438
|
@@ -0,0 +1,39 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
pull_request:
|
5
|
+
push:
|
6
|
+
branches:
|
7
|
+
- master
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
build:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
|
13
|
+
strategy:
|
14
|
+
matrix:
|
15
|
+
ruby:
|
16
|
+
- 2.4
|
17
|
+
- 2.5
|
18
|
+
- 2.6
|
19
|
+
|
20
|
+
steps:
|
21
|
+
- uses: actions/checkout@v1
|
22
|
+
|
23
|
+
- name: Setup ruby
|
24
|
+
uses: actions/setup-ruby@v1
|
25
|
+
with:
|
26
|
+
ruby-version: ${{ matrix.ruby }}
|
27
|
+
architecture: 'x64'
|
28
|
+
|
29
|
+
- name: Setup bundler
|
30
|
+
run: gem install bundler
|
31
|
+
|
32
|
+
- name: Setup gems
|
33
|
+
run: bundle install
|
34
|
+
|
35
|
+
- name: Rubocop
|
36
|
+
run: bundle exec rubocop
|
37
|
+
|
38
|
+
- name: RSpec
|
39
|
+
run: bundle exec rspec
|
@@ -13,11 +13,11 @@ module Onebox
|
|
13
13
|
og = get_opengraph
|
14
14
|
|
15
15
|
if !og.image.nil?
|
16
|
-
|
16
|
+
image_html(og)
|
17
17
|
elsif og.title.to_s[/\.(mp4|ogv|webm)$/]
|
18
|
-
|
18
|
+
video_html(og)
|
19
19
|
else
|
20
|
-
|
20
|
+
link_html(og)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -20,7 +20,7 @@ module Onebox
|
|
20
20
|
"https://raw.githubusercontent.com/#{m[:user]}/#{m[:repo]}/#{m[:sha1]}/#{m[:file]}"
|
21
21
|
end
|
22
22
|
def title
|
23
|
-
Sanitize.fragment(
|
23
|
+
Sanitize.fragment(Onebox::Helpers.uri_unencode(link).sub(/^https?\:\/\/github\.com\//, ''))
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -20,7 +20,7 @@ module Onebox
|
|
20
20
|
"https://gitlab.com/#{m[:user]}/#{m[:repo]}/raw/#{m[:sha1]}/#{m[:file]}"
|
21
21
|
end
|
22
22
|
def title
|
23
|
-
Sanitize.fragment(
|
23
|
+
Sanitize.fragment(Onebox::Helpers.uri_unencode(link).sub(/^https?\:\/\/gitlab\.com\//, ''))
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
data/lib/onebox/helpers.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "addressable"
|
4
|
+
|
3
5
|
module Onebox
|
4
6
|
module Helpers
|
5
7
|
|
6
8
|
class DownloadTooLarge < StandardError; end
|
7
9
|
|
10
|
+
IGNORE_CANONICAL_DOMAINS ||= ['www.instagram.com']
|
11
|
+
|
8
12
|
def self.symbolize_keys(hash)
|
9
13
|
return {} if hash.nil?
|
10
14
|
|
@@ -23,12 +27,15 @@ module Onebox
|
|
23
27
|
def self.fetch_html_doc(url, headers = nil)
|
24
28
|
response = (fetch_response(url, nil, nil, headers) rescue nil)
|
25
29
|
doc = Nokogiri::HTML(response)
|
30
|
+
uri = URI(url)
|
31
|
+
|
32
|
+
ignore_canonical_tag = doc.at('meta[property="og:ignore_canonical"]')
|
33
|
+
should_ignore_canonical = IGNORE_CANONICAL_DOMAINS.map { |hostname| uri.hostname.match?(hostname) }.any?
|
26
34
|
|
27
|
-
|
28
|
-
unless ignore_canonical && ignore_canonical['content'].to_s == 'true'
|
35
|
+
unless (ignore_canonical_tag && ignore_canonical_tag['content'].to_s == 'true') || should_ignore_canonical
|
29
36
|
# prefer canonical link
|
30
37
|
canonical_link = doc.at('//link[@rel="canonical"]/@href')
|
31
|
-
if canonical_link && "#{URI(canonical_link).host}#{URI(canonical_link).path}" != "#{
|
38
|
+
if canonical_link && "#{URI(canonical_link).host}#{URI(canonical_link).path}" != "#{uri.host}#{uri.path}"
|
32
39
|
response = (fetch_response(canonical_link, nil, nil, headers) rescue nil)
|
33
40
|
doc = Nokogiri::HTML(response) if response
|
34
41
|
end
|
@@ -188,56 +195,25 @@ module Onebox
|
|
188
195
|
src
|
189
196
|
end
|
190
197
|
|
191
|
-
RFC_3986_URI_REGEX ||= /^(?<scheme>([^:\/?#]+):)?(?<authority>\/\/([^\/?#]*))?(?<path>[^?#]*)(\?(?<query>[^#]*))?(#(?<fragment>.*))?$/
|
192
|
-
DOUBLE_ESCAPED_REGEXP ||= /%25([0-9a-f]{2})/i
|
193
|
-
|
194
|
-
# Percent-encodes a URI query parameter per RFC3986 - https://tools.ietf.org/html/rfc3986
|
195
|
-
def self.uri_query_encode(query_string)
|
196
|
-
return "" unless query_string
|
197
|
-
|
198
|
-
# query can encode space to %20 OR +
|
199
|
-
# + MUST be encoded as %2B
|
200
|
-
# in RFC3968 both query and fragment are defined as:
|
201
|
-
# = *( pchar / "/" / "?" )
|
202
|
-
# CGI.escape turns space into + which is the most backward compatible
|
203
|
-
# however it doesn't roundtrip through URI.unescape which prefers %20
|
204
|
-
CGI.escape(query_string).gsub('%25', '%').gsub('+', '%20')
|
205
|
-
end
|
206
|
-
|
207
198
|
# Percent-encodes a URI string per RFC3986 - https://tools.ietf.org/html/rfc3986
|
208
199
|
def self.uri_encode(url)
|
209
200
|
return "" unless url
|
210
201
|
|
211
|
-
|
212
|
-
parts = url.match(RFC_3986_URI_REGEX)
|
213
|
-
|
214
|
-
encoded = ""
|
215
|
-
encoded += parts[:scheme] unless parts[:scheme].nil?
|
216
|
-
encoded += parts[:authority] unless parts[:authority].nil?
|
217
|
-
|
218
|
-
# path requires space to be encoded as %20 (NEVER +)
|
219
|
-
# + should be left unencoded
|
220
|
-
# URI::parse and URI::Generic.build don't like paths encoded with CGI.escape
|
221
|
-
# URI.escape does not change / to %2F and : to %3A like CGI.escape
|
222
|
-
encoded += URI.escape(parts[:path]) unless parts[:path].nil?
|
223
|
-
encoded.gsub!(DOUBLE_ESCAPED_REGEXP, '%\1')
|
224
|
-
|
225
|
-
# each query parameter
|
226
|
-
if !parts[:query].nil?
|
227
|
-
query_string = parts[:query].split('&').map do |pair|
|
228
|
-
# can optionally be separated by an =
|
229
|
-
pair.split('=').map do |v|
|
230
|
-
uri_query_encode(v)
|
231
|
-
end.join('=')
|
232
|
-
end.join('&')
|
233
|
-
encoded += '?' + query_string
|
234
|
-
end
|
202
|
+
uri = Addressable::URI.parse(url)
|
235
203
|
|
236
|
-
|
237
|
-
|
238
|
-
|
204
|
+
encoded_uri = Addressable::URI.new(
|
205
|
+
scheme: Addressable::URI.encode_component(uri.scheme, Addressable::URI::CharacterClasses::SCHEME),
|
206
|
+
authority: Addressable::URI.encode_component(uri.authority, Addressable::URI::CharacterClasses::AUTHORITY),
|
207
|
+
path: Addressable::URI.encode_component(uri.path, Addressable::URI::CharacterClasses::PATH + "\\%"),
|
208
|
+
query: Addressable::URI.encode_component(uri.query, "a-zA-Z0-9\\-\\.\\_\\~\\$\\&\\*\\,\\=\\:\\@\\?\\%"),
|
209
|
+
fragment: Addressable::URI.encode_component(uri.fragment, "a-zA-Z0-9\\-\\.\\_\\~\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=\\:\\/\\?\\%")
|
210
|
+
)
|
211
|
+
|
212
|
+
encoded_uri.to_s
|
213
|
+
end
|
239
214
|
|
240
|
-
|
215
|
+
def self.uri_unencode(url)
|
216
|
+
Addressable::URI.unencode(url)
|
241
217
|
end
|
242
218
|
|
243
219
|
def self.video_placeholder_html
|
data/lib/onebox/version.rb
CHANGED
data/onebox.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.files = `git ls-files`.split($/).reject { |s| s =~ /^(spec|web)/ }
|
21
21
|
spec.require_paths = ['lib']
|
22
22
|
|
23
|
+
spec.add_runtime_dependency 'addressable', '~> 2.7.0'
|
23
24
|
spec.add_runtime_dependency 'multi_json', '~> 1.11'
|
24
25
|
spec.add_runtime_dependency 'mustache'
|
25
26
|
spec.add_runtime_dependency 'nokogiri', '~> 1.7'
|
@@ -32,7 +33,7 @@ Gem::Specification.new do |spec|
|
|
32
33
|
spec.add_development_dependency 'fakeweb', '~> 1.3'
|
33
34
|
spec.add_development_dependency 'pry', '~> 0.10'
|
34
35
|
spec.add_development_dependency 'mocha', '~> 1.1'
|
35
|
-
spec.add_development_dependency 'rubocop', '~> 0.
|
36
|
+
spec.add_development_dependency 'rubocop', '~> 0.78.0'
|
36
37
|
spec.add_development_dependency 'rubocop-discourse', '~> 1.0.1'
|
37
38
|
spec.add_development_dependency 'twitter', '~> 4.8'
|
38
39
|
spec.add_development_dependency 'guard-rspec', '~> 4.2.8'
|
@@ -1,9 +1,9 @@
|
|
1
|
-
<h3><a href="{{link}}" target="_blank">{{title}}</a></h3>
|
1
|
+
<h3><a href="{{{link}}}" target="_blank">{{title}}</a></h3>
|
2
2
|
|
3
3
|
{{#image}}
|
4
4
|
<div class="instagram-images">
|
5
|
-
{{#video_link}} <a href="{{video_link}}" target="_blank"> {{/video_link}}
|
6
|
-
<img class="instagram-image" src="{{image}}"/>
|
5
|
+
{{#video_link}} <a href="{{{video_link}}}" target="_blank"> {{/video_link}}
|
6
|
+
<img class="instagram-image" src="{{{image}}}"/>
|
7
7
|
{{#video_link}} <span class="instagram-video-icon"></span></a> {{/video_link}}
|
8
8
|
</div>
|
9
9
|
{{/image}}
|
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: 1.9.
|
4
|
+
version: 1.9.25
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joanna Zeta
|
@@ -10,8 +10,22 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2020-01-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: addressable
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "~>"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.7.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - "~>"
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: 2.7.0
|
15
29
|
- !ruby/object:Gem::Dependency
|
16
30
|
name: multi_json
|
17
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -172,14 +186,14 @@ dependencies:
|
|
172
186
|
requirements:
|
173
187
|
- - "~>"
|
174
188
|
- !ruby/object:Gem::Version
|
175
|
-
version: 0.
|
189
|
+
version: 0.78.0
|
176
190
|
type: :development
|
177
191
|
prerelease: false
|
178
192
|
version_requirements: !ruby/object:Gem::Requirement
|
179
193
|
requirements:
|
180
194
|
- - "~>"
|
181
195
|
- !ruby/object:Gem::Version
|
182
|
-
version: 0.
|
196
|
+
version: 0.78.0
|
183
197
|
- !ruby/object:Gem::Dependency
|
184
198
|
name: rubocop-discourse
|
185
199
|
requirement: !ruby/object:Gem::Requirement
|
@@ -287,11 +301,11 @@ executables: []
|
|
287
301
|
extensions: []
|
288
302
|
extra_rdoc_files: []
|
289
303
|
files:
|
304
|
+
- ".github/workflows/ci.yml"
|
290
305
|
- ".gitignore"
|
291
306
|
- ".rspec"
|
292
307
|
- ".rubocop.yml"
|
293
308
|
- ".ruby-gemset"
|
294
|
-
- ".travis.yml"
|
295
309
|
- CHANGELOG.md
|
296
310
|
- Gemfile
|
297
311
|
- Guardfile
|
@@ -421,7 +435,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
421
435
|
- !ruby/object:Gem::Version
|
422
436
|
version: '0'
|
423
437
|
requirements: []
|
424
|
-
rubygems_version: 3.
|
438
|
+
rubygems_version: 3.1.2
|
425
439
|
signing_key:
|
426
440
|
specification_version: 4
|
427
441
|
summary: A gem for generating embeddable HTML previews from URLs.
|
data/.travis.yml
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
sudo: false
|
3
|
-
rvm:
|
4
|
-
- 2.4
|
5
|
-
- 2.5
|
6
|
-
- 2.6
|
7
|
-
notifications:
|
8
|
-
email:
|
9
|
-
on_success: change
|
10
|
-
on_failure: change
|
11
|
-
script:
|
12
|
-
- bundle exec rubocop
|
13
|
-
- bundle exec rspec
|
14
|
-
cache:
|
15
|
-
bundler: true
|
16
|
-
before_install:
|
17
|
-
- gem install bundler
|