article_json 0.3.2 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0f9222cb3d5c6c6c17776ac0c2ac71a1201367c6
4
- data.tar.gz: 0f474e416aed216896f2d2dbb5230670c73efc44
2
+ SHA256:
3
+ metadata.gz: baf39dbf5fb3f225088927c3ea9f7d58a59a502c6c70da1546829d857760ee6a
4
+ data.tar.gz: f9c60e3a2e8aadffda6525eb9acd085ee5ffcc53697cc7fec4a3c204209a571e
5
5
  SHA512:
6
- metadata.gz: ebf75ee9a5d5e5c23a348efaa550c0f96dc29ad97d96e2d4792737d27c6816b0abbb1fa4945bbf1297493b4c2f30ff1aa465663d0be197b274378707c2bf3a49
7
- data.tar.gz: 3ce371166ea56f2e474abfafd0d1d03ce040fc21f00c73d506166031d82825859459c83ce075ea60a10009ce079da284e64e8a1e603c5aa10155eca5a0061418
6
+ metadata.gz: 28783003b3b27d4eca2e5141dd59967f0f2ee44f077726bd5935a8e9dfa49fbd482cac67d49f2bc69e66797cb6dff7c67093124887215423117df6bbed8c5840
7
+ data.tar.gz: 0ee51b7975ed3621a99abe34a4d2180c327e3a1a678539aa58ed40171d8bf0cf812c0b1478c49886418fb410eb8634ac3b20c8a00ed881da2edeb5f5e7bc469f
@@ -1,4 +1,27 @@
1
1
  # Changelog
2
+ ## 0.3.8 - 2020/7/31
3
+ - **Improvements:**
4
+ - Add a script to update oembed stubs fixtures.
5
+ - Support for `alt` attribute in images.
6
+
7
+ - **Fix:** Fix a bug when using the `[image-link-to: ]` tag.
8
+
9
+ ## 0.3.7 - 2019/8/21
10
+ - **Fix:** Only use https for soundcloud oembed api
11
+
12
+ ## 0.3.6 - 2019/8/6
13
+ - **Improvement** Add tags support in text_box element.
14
+
15
+ ## 0.3.5 - 2018/12/12
16
+ - **Improvements** to import and export image links from Google Docs
17
+ - Import image `href` from caption text using a custom tag
18
+ - Export the image element href attribute as a link
19
+
20
+ ## 0.3.4 - 2018/5/10
21
+ - **Fix:** Only include slug from the soundcloud URL in google doc parser
22
+
23
+ ## 0.3.3 - 2018/4/12
24
+ - Support embedding SoundCloud
2
25
 
3
26
  ## 0.3.2 - 2017/12/06
4
27
  - Another **fix** to prevent `nil` elements when placing additional elements on articles that end with empty paragraphs
@@ -43,7 +66,7 @@ One potentially **breaking change** was added:
43
66
 
44
67
  ## 0.1.0 - 2017/09/20
45
68
  This is the very first release, with the following functionality:
46
- - article-json format that supports several basic elements; like headings,
69
+ - article-json format that supports several basic elements; like headings,
47
70
  paragraphs, images or lists
48
71
  - Resolving of embedded elements like videos or tweets via OEmbed standard
49
72
  - Conversion from and to JSON (or ruby hashes)
data/README.md CHANGED
@@ -53,6 +53,21 @@ $ ./bin/article_json_export_google_doc.rb $DOC_ID \
53
53
  | ./bin/article_json_export_html.rb
54
54
  ```
55
55
 
56
+ You can also update all the different exported versions of the reference
57
+ document (html, json, amp, facebook instant article and plain txt) by
58
+ running the following command:
59
+
60
+ ```
61
+ $ ./bin/update_reference_document.sh
62
+ ```
63
+
64
+ When running the tests, we use some fixtures to mock the responses for oembed
65
+ request, but these may change over time. To update them, run:
66
+
67
+ ```
68
+ $ ./bin/update_oembed_request-stubs.sh
69
+ ```
70
+
56
71
  ### Configuration
57
72
  There are some configuration options that allow a more tailored usage of the
58
73
  `article_json` gem. The following code snippet gives an example for every
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
4
+ #
5
+ # Simple script to read a JSON document and export it to AMP.
6
+ #
7
+ # Usage:
8
+ #
9
+ # ./bin/article_json_export_amp.rb < my_document.json
10
+ #
11
+ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
12
+
13
+ require_relative '../lib/article_json'
14
+ puts ArticleJSON::Article.from_json(ARGF.read).to_amp
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
4
+ #
5
+ # Simple script to read a JSON document and export it to Facebook Instant
6
+ # Article.
7
+ #
8
+ # Usage:
9
+ #
10
+ # ./bin/article_json_export_facebook.rb < my_document.json
11
+ #
12
+ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
13
+
14
+ require_relative '../lib/article_json'
15
+ puts ArticleJSON::Article.from_json(ARGF.read).to_facebook_instant_article
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
4
+ #
5
+ # Simple script to read a JSON document and export it to plain text.
6
+ #
7
+ # Usage:
8
+ #
9
+ # ./bin/article_json_export_plain_text.rb < my_document.json
10
+ #
11
+ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
12
+
13
+ require_relative '../lib/article_json'
14
+ puts ArticleJSON::Article.from_json(ARGF.read).to_plain_text
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env sh
2
+
3
+ curl -X GET "https://vimeo.com/api/oembed.json?url=https://vimeo.com/42315417" | jq > spec/fixtures/vimeo_video_oembed.json
4
+
5
+ curl -X GET "http://www.youtube.com/oembed?format=json&url=https://www.youtube.com/watch?v=_ZG8HBuDjgc" | jq > spec/fixtures/youtube_video_oembed.json
6
+
7
+ curl -X GET "https://www.slideshare.net/api/oembed/2?format=json&url=https://www.slideshare.net/Devex/the-best-global-development-quotes-of-2012" | jq > spec/fixtures/slideshare_oembed.json
8
+
9
+ curl -X GET "https://api.twitter.com/1/statuses/oembed.json?align=center&url=https://twitter.com/d3v3x/status/554608639030599681" | jq > spec/fixtures/tweet_oembed.json
10
+
11
+ curl -X GET 'https://soundcloud.com/oembed?format=json&url=https://soundcloud.com/rich-the-kid/plug-walk-1' | jq > spec/fixtures/soundcloud_oembed.json
12
+
13
+ curl -X GET 'https://www.facebook.com/plugins/video/oembed.json?url=https://www.facebook.com/facebook/videos/1814600831891266' | jq > spec/fixtures/facebook_video_oembed.json
@@ -7,6 +7,9 @@ DOC_ID="1E4lncZE2jDkbE34eDyYQmXKA9O26BHUiwguz4S9qyE8"
7
7
  SOURCE_HTML_FILE="spec/fixtures/reference_document.html"
8
8
  JSON_FILE="spec/fixtures/reference_document_parsed.json"
9
9
  HTML_EXPORT_FILE="spec/fixtures/reference_document_exported.html"
10
+ AMP_EXPORT_FILE="spec/fixtures/reference_document_exported.amp.html"
11
+ FACEBOOK_EXPORT_FILE="spec/fixtures/reference_document_exported.facebook.html"
12
+ PLAIN_TEXT_EXPORT_FILE="spec/fixtures/reference_document_exported.txt"
10
13
 
11
14
  # export the google doc to HTML
12
15
  ./bin/article_json_export_google_doc.rb ${DOC_ID} > ${SOURCE_HTML_FILE}
@@ -16,3 +19,12 @@ HTML_EXPORT_FILE="spec/fixtures/reference_document_exported.html"
16
19
 
17
20
  # convert the JSON export to HTML
18
21
  ./bin/article_json_export_html.rb < ${JSON_FILE} > ${HTML_EXPORT_FILE}
22
+
23
+ # convert the JSON export to AMP
24
+ ./bin/article_json_export_amp.rb < ${JSON_FILE} > ${AMP_EXPORT_FILE}
25
+
26
+ # convert the JSON export to Facebook Instant Article
27
+ ./bin/article_json_export_facebook.rb < ${JSON_FILE} > ${FACEBOOK_EXPORT_FILE}
28
+
29
+ # convert the JSON export to plain text
30
+ ./bin/article_json_export_plain_text.rb < ${JSON_FILE} > ${PLAIN_TEXT_EXPORT_FILE}
@@ -37,6 +37,7 @@ require_relative 'article_json/import/google_doc/html/embedded_vimeo_video_parse
37
37
  require_relative 'article_json/import/google_doc/html/embedded_youtube_video_parser'
38
38
  require_relative 'article_json/import/google_doc/html/embedded_slideshare_parser'
39
39
  require_relative 'article_json/import/google_doc/html/embedded_tweet_parser'
40
+ require_relative 'article_json/import/google_doc/html/embedded_soundcloud_parser'
40
41
  require_relative 'article_json/import/google_doc/html/parser'
41
42
 
42
43
  require_relative 'article_json/export/common/elements/base'
@@ -1,16 +1,20 @@
1
1
  module ArticleJSON
2
2
  module Elements
3
3
  class Image < Base
4
- attr_reader :source_url, :caption, :float
4
+ attr_reader :source_url, :caption, :float, :href, :alt
5
5
 
6
6
  # @param [String] source_url
7
7
  # @param [Array[ArticleJSON::Elements::Text]] caption
8
8
  # @param [Symbol] float
9
- def initialize(source_url:, caption:, float: nil)
9
+ # @param [String] href
10
+ # @param [String] alt
11
+ def initialize(source_url:, caption:, float: nil, href: nil, alt: nil)
10
12
  @type = :image
11
13
  @source_url = source_url
12
14
  @caption = caption
13
15
  @float = float
16
+ @href = href
17
+ @alt = alt
14
18
  end
15
19
 
16
20
  # Hash representation of this image element
@@ -21,6 +25,8 @@ module ArticleJSON
21
25
  source_url: source_url,
22
26
  float: float,
23
27
  caption: caption.map(&:to_h),
28
+ href: href,
29
+ alt: alt,
24
30
  }
25
31
  end
26
32
 
@@ -31,7 +37,9 @@ module ArticleJSON
31
37
  new(
32
38
  source_url: hash[:source_url],
33
39
  caption: parse_hash_list(hash[:caption]),
34
- float: hash[:float]&.to_sym
40
+ float: hash[:float]&.to_sym,
41
+ href: hash[:href],
42
+ alt: hash[:alt]
35
43
  )
36
44
  end
37
45
  end
@@ -1,14 +1,16 @@
1
1
  module ArticleJSON
2
2
  module Elements
3
3
  class TextBox < Base
4
- attr_reader :content, :float
4
+ attr_reader :content, :float, :tags
5
5
 
6
6
  # @param [Array[Paragraph|Heading|List]] content
7
7
  # @param [Symbol] float
8
- def initialize(content:, float: nil)
8
+ # @param [Array] tags
9
+ def initialize(content:, float: nil, tags: [])
9
10
  @type = :text_box
10
11
  @content = content
11
12
  @float = float
13
+ @tags = tags
12
14
  end
13
15
 
14
16
  # Hash representation of this text box element
@@ -18,6 +20,7 @@ module ArticleJSON
18
20
  type: type,
19
21
  float: float,
20
22
  content: content.map(&:to_h),
23
+ tags: tags,
21
24
  }
22
25
  end
23
26
 
@@ -27,7 +30,8 @@ module ArticleJSON
27
30
  def parse_hash(hash)
28
31
  new(
29
32
  content: parse_hash_list(hash[:content]),
30
- float: hash[:float]&.to_sym
33
+ float: hash[:float]&.to_sym,
34
+ tags: hash[:tags]
31
35
  )
32
36
  end
33
37
  end
@@ -26,8 +26,8 @@ module ArticleJSON
26
26
  def script_tags
27
27
  sources.map do |custom_element_tag, src|
28
28
  <<-HTML.gsub(/\s+/, ' ').strip
29
- <script async
30
- custom-element="#{custom_element_tag}"
29
+ <script async
30
+ custom-element="#{custom_element_tag}"
31
31
  src="#{src}"></script>
32
32
  HTML
33
33
  end
@@ -46,6 +46,8 @@ module ArticleJSON
46
46
  'amp-vimeo': 'https://cdn.ampproject.org/v0/amp-vimeo-0.1.js',
47
47
  'amp-facebook':
48
48
  'https://cdn.ampproject.org/v0/amp-facebook-0.1.js',
49
+ 'amp-soundcloud':
50
+ 'https://cdn.ampproject.org/v0/amp-soundcloud-0.1.js',
49
51
  }[custom_element_tag]
50
52
  end
51
53
  end
@@ -14,6 +14,7 @@ module ArticleJSON
14
14
  when :facebook_video then %i(amp-facebook)
15
15
  when :tweet then %i(amp-twitter)
16
16
  when :slideshare then %i(amp-iframe)
17
+ when :soundcloud then %i(amp-soundcloud)
17
18
  else []
18
19
  end
19
20
  end
@@ -33,7 +34,9 @@ module ArticleJSON
33
34
  when :tweet
34
35
  tweet_node
35
36
  when :slideshare
36
- slideshare_node
37
+ iframe_node
38
+ when :soundcloud
39
+ soundcloud_node
37
40
  end
38
41
  end
39
42
 
@@ -74,8 +77,20 @@ module ArticleJSON
74
77
  height: default_height)
75
78
  end
76
79
 
80
+ def soundcloud_node
81
+ src = Nokogiri::HTML(@element.oembed_data[:html])
82
+ .xpath('//iframe/@src').first.value
83
+ track_id = src.match(/tracks%2F(\d+)/)[1]
84
+ create_element('amp-soundcloud',
85
+ layout: 'fixed-height',
86
+ 'data-trackid': track_id,
87
+ 'data-visual': true,
88
+ width: 'auto',
89
+ height: default_height)
90
+ end
91
+
77
92
  # @return [Nokogiri::XML::Element]
78
- def slideshare_node
93
+ def iframe_node
79
94
  node = Nokogiri::HTML(@element.oembed_data[:html]).xpath('//iframe')
80
95
  create_element('amp-iframe',
81
96
  src: node.attribute('src').value,
@@ -7,22 +7,36 @@ module ArticleJSON
7
7
  include ArticleJSON::Export::Common::HTML::Elements::Shared::Caption
8
8
  include ArticleJSON::Export::Common::HTML::Elements::Shared::Float
9
9
 
10
- # Generate the `<figure>` node containing the image and caption
10
+ # Generate the `<figure>` node containing the image and caption or
11
+ # an `<a>` node containing the `<figure>` node if href is present.
11
12
  # @return [Nokogiri::XML::Element]
12
13
  def export
14
+ figure_node
15
+ end
16
+
17
+ private
18
+
19
+ # @return [Nokogiri::XML::NodeSet]
20
+ def figure_node
13
21
  create_element(:figure, node_opts) do |figure|
14
- figure.add_child(image_node)
22
+ node = @element&.href ? href_node : image_node
23
+ figure.add_child(node)
15
24
  if @element.caption&.any?
16
25
  figure.add_child(caption_node(:figcaption))
17
26
  end
18
27
  end
19
28
  end
20
29
 
21
- private
22
-
23
30
  # @return [Nokogiri::XML::NodeSet]
24
31
  def image_node
25
- create_element(:img, src: @element.source_url)
32
+ create_element(:img, src: @element.source_url, alt: @element.alt)
33
+ end
34
+
35
+ # @return [Nokogiri::XML::NodeSet]
36
+ def href_node
37
+ create_element(:a, href: @element.href) do |a|
38
+ a.add_child(image_node)
39
+ end
26
40
  end
27
41
 
28
42
  # @return [Hash]
@@ -94,6 +94,7 @@ module ArticleJSON
94
94
  EmbeddedYoutubeVideoParser,
95
95
  EmbeddedTweetParser,
96
96
  EmbeddedSlideshareParser,
97
+ EmbeddedSoundcloudParser,
97
98
  ]
98
99
  end
99
100
 
@@ -0,0 +1,28 @@
1
+ module ArticleJSON
2
+ module Import
3
+ module GoogleDoc
4
+ module HTML
5
+ class EmbeddedSoundcloudParser < EmbeddedParser
6
+ # The type of this embedded element
7
+ # @return [Symbol]
8
+ def embed_type
9
+ :soundcloud
10
+ end
11
+
12
+ class << self
13
+ # Regular expression to check if a given string is a Soundcloud URL
14
+ # Also used to extract the ID from the URL.
15
+ # @return [Regexp]
16
+ def url_regexp
17
+ %r{
18
+ ^\S* # all protocols & sub domains
19
+ soundcloud\.com/ # domain
20
+ (?<id>[-/0-9a-z]+) # the slug of the user / track
21
+ }xi
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -12,12 +12,19 @@ module ArticleJSON
12
12
  def initialize(node:, caption_node:, css_analyzer:)
13
13
  @node = node
14
14
  @caption_node = caption_node
15
+ @href = href
15
16
  @css_analyzer = css_analyzer
16
17
 
17
18
  # Main node indicates the floating behavior
18
19
  @float_node = @node
19
20
  end
20
21
 
22
+ # The value of the image's `alt` attribute
23
+ # @return [String]
24
+ def alt
25
+ image_node.attribute('alt')&.value || ''
26
+ end
27
+
21
28
  # The value of the image's `src` attribute
22
29
  # @return [String]
23
30
  def source_url
@@ -36,17 +43,43 @@ module ArticleJSON
36
43
  super if floatable_size?
37
44
  end
38
45
 
46
+ # Extracts an href from the tag [image-link-to: url]) if present
47
+ # in the caption node.
48
+ # @return [String]
49
+ def href
50
+ return if @caption_node.nil?
51
+ match = @caption_node.content.strip.match(href_regexp)
52
+ return if match.nil?
53
+ remove_image_link_tag
54
+ match[:url]
55
+ end
56
+
39
57
  # @return [ArticleJSON::Elements::Image]
40
58
  def element
41
59
  ArticleJSON::Elements::Image.new(
42
60
  source_url: source_url,
43
61
  float: float,
44
- caption: caption
62
+ caption: caption,
63
+ href: @href,
64
+ alt: alt
45
65
  )
46
66
  end
47
67
 
48
68
  private
49
69
 
70
+ # Removes the [image-link-to: url] tag from the caption node
71
+ def remove_image_link_tag
72
+ @caption_node
73
+ .children
74
+ .first
75
+ .content = @caption_node.content.sub(href_regexp, '').strip
76
+ end
77
+
78
+ # Regular expression to check if there's a [image-link-to: url] tag
79
+ # @return [Regexp]
80
+ def href_regexp
81
+ %r{\[image-link-to:\s+(?<url>.*?)\]}
82
+ end
50
83
  # Check if the image's width can be determined and is less than 500px
51
84
  # This is about 3/4 of the google document width...
52
85
  # @return [Boolean]
@@ -17,6 +17,14 @@ module ArticleJSON
17
17
  node.inner_text.strip.downcase == text.strip.downcase
18
18
  end
19
19
 
20
+ # Check if the node text begins with a certain text
21
+ # @param [String]
22
+ # @return [Boolean]
23
+ def begins_with?(text)
24
+ first_word = node.inner_text.strip.downcase.split(' ').first
25
+ first_word == text.strip.downcase
26
+ end
27
+
20
28
  # Check if the node is empty, i.e. not containing any text
21
29
  # Given that images are the only nodes without text, we have to make
22
30
  # sure that it's not an image.
@@ -65,7 +73,7 @@ module ArticleJSON
65
73
  # @return [Boolean]
66
74
  def text_box?
67
75
  return @is_text_box if defined? @is_text_box
68
- @is_text_box = has_text?('textbox:') || has_text?('highlight:')
76
+ @is_text_box = begins_with?('textbox:') || begins_with?('highlight:')
69
77
  end
70
78
 
71
79
  # Check if the node starts a quote
@@ -83,7 +83,11 @@ module ArticleJSON
83
83
  # @return [ArticleJSON::Elements::TextBox]
84
84
  def parse_text_box
85
85
  TextBoxParser
86
- .new(nodes: nodes_until_hr, css_analyzer: @css_analyzer)
86
+ .new(
87
+ type_node: @current_node.node,
88
+ nodes: nodes_until_hr,
89
+ css_analyzer: @css_analyzer
90
+ )
87
91
  .element
88
92
  end
89
93
 
@@ -5,14 +5,18 @@ module ArticleJSON
5
5
  class TextBoxParser
6
6
  include Shared::Float
7
7
 
8
+ # @param [Nokogiri::HTML::Node] type_node Document node that states
9
+ # that this is a textbox.
10
+ # May contain tags, too.
8
11
  # @param [Array[Nokogiri::HTML::Node]] nodes
9
12
  # @param [ArticleJSON::Import::GoogleDoc::HTML::CSSAnalyzer] css_analyzer
10
- def initialize(nodes:, css_analyzer:)
13
+ def initialize(type_node: ,nodes:, css_analyzer:)
11
14
  @nodes = nodes.reject { |node| NodeAnalyzer.new(node).empty? }
12
15
  @css_analyzer = css_analyzer
13
16
 
14
17
  # First node of the text box indicates floating behavior
15
18
  @float_node = @nodes.first
19
+ @type_node = type_node
16
20
  end
17
21
 
18
22
  # Parse the text box's nodes to get a list of sub elements
@@ -22,10 +26,23 @@ module ArticleJSON
22
26
  @nodes.map { |node| parse_sub_node(node) }.compact
23
27
  end
24
28
 
29
+ # Extract any potential tags, specified in brackets after the Textbox definition
30
+ # @return [Array[Symbol]]
31
+ def tags
32
+ match = /(.*?)[\s\u00A0]+\[(?<tags>.*)\]/
33
+ .match(@type_node.inner_text)
34
+ return [] unless match
35
+ match[:tags].split(' ')
36
+ end
37
+
25
38
  # Hash representation of this text box
26
39
  # @return [ArticleJSON::Elements::TextBox]
27
40
  def element
28
- ArticleJSON::Elements::TextBox.new(float: float, content: content)
41
+ ArticleJSON::Elements::TextBox.new(
42
+ float: float,
43
+ content: content,
44
+ tags: tags
45
+ )
29
46
  end
30
47
 
31
48
  private
@@ -9,4 +9,5 @@ require_relative 'utils/o_embed_resolver/slideshare'
9
9
  require_relative 'utils/o_embed_resolver/tweet'
10
10
  require_relative 'utils/o_embed_resolver/vimeo_video'
11
11
  require_relative 'utils/o_embed_resolver/youtube_video'
12
+ require_relative 'utils/o_embed_resolver/soundcloud'
12
13
  require_relative 'utils/additional_element_placer'
@@ -85,6 +85,7 @@ module ArticleJSON
85
85
  tweet: Tweet,
86
86
  vimeo_video: VimeoVideo,
87
87
  youtube_video: YoutubeVideo,
88
+ soundcloud: Soundcloud,
88
89
  }[type.to_sym]
89
90
  end
90
91
  end
@@ -0,0 +1,25 @@
1
+ module ArticleJSON
2
+ module Utils
3
+ module OEmbedResolver
4
+ class Soundcloud < Base
5
+ # Human readable name of the resolver
6
+ # @return [String]
7
+ def name
8
+ 'Soundcloud'
9
+ end
10
+
11
+ # The URL for the oembed API call
12
+ # @return [String]
13
+ def oembed_url
14
+ "https://soundcloud.com/oembed?url=#{source_url}&format=json"
15
+ end
16
+
17
+ # The URL of the element
18
+ # @return [String]
19
+ def source_url
20
+ "https://soundcloud.com/#{@element.embed_id}"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,3 +1,3 @@
1
1
  module ArticleJSON
2
- VERSION = '0.3.2'
2
+ VERSION = '0.3.8'
3
3
  end
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.3.2
4
+ version: 0.3.8
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-12-07 00:00:00.000000000 Z
13
+ date: 2020-07-31 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -111,9 +111,13 @@ files:
111
111
  - CODE_OF_CONDUCT.md
112
112
  - LICENSE
113
113
  - README.md
114
+ - bin/article_json_export_amp.rb
115
+ - bin/article_json_export_facebook.rb
114
116
  - bin/article_json_export_google_doc.rb
115
117
  - bin/article_json_export_html.rb
118
+ - bin/article_json_export_plain_text.rb
116
119
  - bin/article_json_parse_google_doc.rb
120
+ - bin/update_oembed_request-stubs.sh
117
121
  - bin/update_reference_document.sh
118
122
  - lib/article_json.rb
119
123
  - lib/article_json/article.rb
@@ -185,6 +189,7 @@ files:
185
189
  - lib/article_json/import/google_doc/html/embedded_facebook_video_parser.rb
186
190
  - lib/article_json/import/google_doc/html/embedded_parser.rb
187
191
  - lib/article_json/import/google_doc/html/embedded_slideshare_parser.rb
192
+ - lib/article_json/import/google_doc/html/embedded_soundcloud_parser.rb
188
193
  - lib/article_json/import/google_doc/html/embedded_tweet_parser.rb
189
194
  - lib/article_json/import/google_doc/html/embedded_vimeo_video_parser.rb
190
195
  - lib/article_json/import/google_doc/html/embedded_youtube_video_parser.rb
@@ -204,6 +209,7 @@ files:
204
209
  - lib/article_json/utils/o_embed_resolver/base.rb
205
210
  - lib/article_json/utils/o_embed_resolver/facebook_video.rb
206
211
  - lib/article_json/utils/o_embed_resolver/slideshare.rb
212
+ - lib/article_json/utils/o_embed_resolver/soundcloud.rb
207
213
  - lib/article_json/utils/o_embed_resolver/tweet.rb
208
214
  - lib/article_json/utils/o_embed_resolver/vimeo_video.rb
209
215
  - lib/article_json/utils/o_embed_resolver/youtube_video.rb
@@ -227,8 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
227
233
  - !ruby/object:Gem::Version
228
234
  version: '0'
229
235
  requirements: []
230
- rubyforge_project:
231
- rubygems_version: 2.6.12
236
+ rubygems_version: 3.0.8
232
237
  signing_key:
233
238
  specification_version: 4
234
239
  summary: JSON Format for News Articles & Ruby Gem