article_json 0.2.0 → 0.2.1
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/CHANGELOG.md +3 -0
- data/lib/article_json/elements/embed.rb +6 -1
- data/lib/article_json/export/common/html/elements/embed.rb +9 -0
- data/lib/article_json/utils/o_embed_resolver/base.rb +35 -4
- data/lib/article_json/utils/o_embed_resolver/facebook_video.rb +8 -4
- data/lib/article_json/utils/o_embed_resolver/slideshare.rb +9 -4
- data/lib/article_json/utils/o_embed_resolver/tweet.rb +8 -4
- data/lib/article_json/utils/o_embed_resolver/vimeo_video.rb +8 -4
- data/lib/article_json/utils/o_embed_resolver/youtube_video.rb +8 -4
- data/lib/article_json/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b9a465102850e508e0122f49d1a07dc2bb2f557
|
4
|
+
data.tar.gz: 1a8245e0c0c8e7d1d12cfc0fb3935ca339faf687
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0825cb1ba5323f0fc31472af514c1606720e4c3ce22011dd61da46309c6eb9bd3997c9faf32e6cca995c7cc9069caf17c3dd22bc105b10add4040a995d8d1675'
|
7
|
+
data.tar.gz: 738b909324f0a12a1a9a27efcbdb58b6e7f496790b2a5f99e153c4424253c2c79be7af14b4824ddf48b3865b1e32934755272edeee5569fba1d31df45b000e18
|
data/CHANGELOG.md
CHANGED
@@ -28,11 +28,16 @@ module ArticleJSON
|
|
28
28
|
end
|
29
29
|
|
30
30
|
# Obtain the oembed data for this embed element
|
31
|
-
# @return [Hash]
|
31
|
+
# @return [Hash|nil]
|
32
32
|
def oembed_data
|
33
33
|
oembed_resolver&.oembed_data
|
34
34
|
end
|
35
35
|
|
36
|
+
# @return [Array[ArticleJSON::Elements::Text]|nil]
|
37
|
+
def oembed_unavailable_message
|
38
|
+
oembed_resolver&.unavailable_message
|
39
|
+
end
|
40
|
+
|
36
41
|
private
|
37
42
|
|
38
43
|
# @return [ArticleJSON::Utils::OEmbedResolver::Base]
|
@@ -24,8 +24,17 @@ module ArticleJSON
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def embedded_object
|
27
|
+
return unavailable_node unless @element.oembed_data
|
27
28
|
Nokogiri::HTML.fragment(@element.oembed_data[:html])
|
28
29
|
end
|
30
|
+
|
31
|
+
def unavailable_node
|
32
|
+
create_element(:span, class: 'unavailable-embed') do |span|
|
33
|
+
@element.oembed_unavailable_message.each do |element|
|
34
|
+
span.add_child(base_class.build(element).export)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
29
38
|
end
|
30
39
|
end
|
31
40
|
end
|
@@ -7,22 +7,53 @@ module ArticleJSON
|
|
7
7
|
@element = embed_element
|
8
8
|
end
|
9
9
|
|
10
|
-
#
|
10
|
+
# Requests the OEmbed endpoint of the respective service and returns its
|
11
|
+
# data as a Hash. If the endpoint returns an error, `nil` will be
|
12
|
+
# returned.
|
13
|
+
# @return [Hash|nil]
|
11
14
|
def oembed_data
|
12
15
|
resolver = self.class == Base ? self.class.build(@element) : self
|
13
16
|
resolver.parsed_api_response
|
14
17
|
end
|
15
18
|
|
19
|
+
# In case that there was an error with requesting the OEmbed data from
|
20
|
+
# the endpoint (e.g. because the URL is unavailable), this message can
|
21
|
+
# be rendered to let the user know about the issue
|
22
|
+
# @return [Array[ArticleJSON::Elements::Text]|nil]
|
23
|
+
def unavailable_message
|
24
|
+
[
|
25
|
+
ArticleJSON::Elements::Text.new(content: "The #{name} "),
|
26
|
+
ArticleJSON::Elements::Text.new(content: source_url,
|
27
|
+
href: source_url),
|
28
|
+
ArticleJSON::Elements::Text.new(content: ' is not available.'),
|
29
|
+
]
|
30
|
+
end
|
31
|
+
|
32
|
+
def name
|
33
|
+
raise NotImplementedError,
|
34
|
+
'`#name` needs to be implemented by the subclass'
|
35
|
+
end
|
36
|
+
|
37
|
+
def source_url
|
38
|
+
raise NotImplementedError,
|
39
|
+
'`#source_url` needs to be implemented by the subclass'
|
40
|
+
end
|
41
|
+
|
16
42
|
protected
|
17
43
|
|
18
|
-
# @return [Hash]
|
44
|
+
# @return [Hash|nil]
|
19
45
|
def parsed_api_response
|
20
|
-
@api_response
|
46
|
+
return @api_response if defined? @api_response
|
47
|
+
@api_response = begin
|
21
48
|
uri = URI.parse(oembed_url)
|
22
49
|
http = Net::HTTP.new(uri.host, uri.port)
|
23
50
|
http.use_ssl = (uri.scheme == 'https')
|
24
51
|
response = http.request(Net::HTTP::Get.new(uri, http_headers))
|
25
|
-
|
52
|
+
if response.kind_of? Net::HTTPSuccess
|
53
|
+
JSON.parse(response.body, symbolize_names: true)
|
54
|
+
end
|
55
|
+
rescue Net::ProtocolError, JSON::ParserError
|
56
|
+
nil
|
26
57
|
end
|
27
58
|
end
|
28
59
|
|
@@ -2,17 +2,21 @@ module ArticleJSON
|
|
2
2
|
module Utils
|
3
3
|
module OEmbedResolver
|
4
4
|
class FacebookVideo < Base
|
5
|
+
# Human readable name of the resolver
|
6
|
+
# @return [String]
|
7
|
+
def name
|
8
|
+
'Facebook video'
|
9
|
+
end
|
10
|
+
|
5
11
|
# The URL for the oembed API call
|
6
12
|
# @return [String]
|
7
13
|
def oembed_url
|
8
|
-
"https://www.facebook.com/plugins/video/oembed.json?url=#{
|
14
|
+
"https://www.facebook.com/plugins/video/oembed.json?url=#{source_url}"
|
9
15
|
end
|
10
16
|
|
11
|
-
private
|
12
|
-
|
13
17
|
# The video URL of the element
|
14
18
|
# @return [String]
|
15
|
-
def
|
19
|
+
def source_url
|
16
20
|
"https://www.facebook.com/facebook/videos/#{@element.embed_id}"
|
17
21
|
end
|
18
22
|
end
|
@@ -2,17 +2,22 @@ module ArticleJSON
|
|
2
2
|
module Utils
|
3
3
|
module OEmbedResolver
|
4
4
|
class Slideshare < Base
|
5
|
+
# Human readable name of the resolver
|
6
|
+
# @return [String]
|
7
|
+
def name
|
8
|
+
'Slideshare deck'
|
9
|
+
end
|
10
|
+
|
5
11
|
# The URL for the oembed API call
|
6
12
|
# @return [String]
|
7
13
|
def oembed_url
|
8
|
-
|
14
|
+
'https://www.slideshare.net/api/oembed/2?format=json&url='\
|
15
|
+
"#{source_url}"
|
9
16
|
end
|
10
17
|
|
11
|
-
private
|
12
|
-
|
13
18
|
# The URL of the slideshow
|
14
19
|
# @return [String]
|
15
|
-
def
|
20
|
+
def source_url
|
16
21
|
handle, slug = @element.embed_id.split('/', 2)
|
17
22
|
"https://www.slideshare.net/#{handle}/#{slug}"
|
18
23
|
end
|
@@ -2,18 +2,22 @@ module ArticleJSON
|
|
2
2
|
module Utils
|
3
3
|
module OEmbedResolver
|
4
4
|
class Tweet < Base
|
5
|
+
# Human readable name of the resolver
|
6
|
+
# @return [String]
|
7
|
+
def name
|
8
|
+
'Tweet'
|
9
|
+
end
|
10
|
+
|
5
11
|
# The URL for the oembed API call
|
6
12
|
# @return [String]
|
7
13
|
def oembed_url
|
8
14
|
'https://api.twitter.com/1/statuses/oembed.json?align=center' \
|
9
|
-
"&url=#{
|
15
|
+
"&url=#{source_url}"
|
10
16
|
end
|
11
17
|
|
12
|
-
private
|
13
|
-
|
14
18
|
# The URL of the tweet
|
15
19
|
# @return [String]
|
16
|
-
def
|
20
|
+
def source_url
|
17
21
|
handle, tweet_id = @element.embed_id.split('/', 2)
|
18
22
|
"https://twitter.com/#{handle}/status/#{tweet_id}"
|
19
23
|
end
|
@@ -2,17 +2,21 @@ module ArticleJSON
|
|
2
2
|
module Utils
|
3
3
|
module OEmbedResolver
|
4
4
|
class VimeoVideo < Base
|
5
|
+
# Human readable name of the resolver
|
6
|
+
# @return [String]
|
7
|
+
def name
|
8
|
+
'Vimeo video'
|
9
|
+
end
|
10
|
+
|
5
11
|
# The URL for the oembed API call
|
6
12
|
# @return [String]
|
7
13
|
def oembed_url
|
8
|
-
"https://vimeo.com/api/oembed.json?url=#{
|
14
|
+
"https://vimeo.com/api/oembed.json?url=#{source_url}"
|
9
15
|
end
|
10
16
|
|
11
|
-
private
|
12
|
-
|
13
17
|
# The video URL of the element
|
14
18
|
# @return [String]
|
15
|
-
def
|
19
|
+
def source_url
|
16
20
|
"https://vimeo.com/#{@element.embed_id}"
|
17
21
|
end
|
18
22
|
end
|
@@ -2,17 +2,21 @@ module ArticleJSON
|
|
2
2
|
module Utils
|
3
3
|
module OEmbedResolver
|
4
4
|
class YoutubeVideo < Base
|
5
|
+
# Human readable name of the resolver
|
6
|
+
# @return [String]
|
7
|
+
def name
|
8
|
+
'Youtube video'
|
9
|
+
end
|
10
|
+
|
5
11
|
# The URL for the oembed API call
|
6
12
|
# @return [String]
|
7
13
|
def oembed_url
|
8
|
-
"http://www.youtube.com/oembed?format=json&url=#{
|
14
|
+
"http://www.youtube.com/oembed?format=json&url=#{source_url}"
|
9
15
|
end
|
10
16
|
|
11
|
-
private
|
12
|
-
|
13
17
|
# The video URL of the element
|
14
18
|
# @return [String]
|
15
|
-
def
|
19
|
+
def source_url
|
16
20
|
"https://www.youtube.com/watch?v=#{@element.embed_id}"
|
17
21
|
end
|
18
22
|
end
|
data/lib/article_json/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: article_json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Sager
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-11-
|
13
|
+
date: 2017-11-08 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: nokogiri
|