html2rss 0.6.0 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fdb35d5375dda349c92fb7ccaed71747de5e49b2adfb3a1cfca9a9c251aa86a9
4
- data.tar.gz: 6532e1df3c67108c6ae8bf7eaef7a6d5eb228c4d3020f99aa02f8a9d507a625e
3
+ metadata.gz: 645fe7ea0ebe4a733c9833e8c22a93aa3f2d2b3b8589160fb001ad6ffd4659d3
4
+ data.tar.gz: 0fb454258a1f334243984bdb73a699ffcfc676c529d87bb0886fbba75127b7cf
5
5
  SHA512:
6
- metadata.gz: 86fbfe46d9ec7b0f21bc0e756da94ed96ecfa635f858336424034875a646f81c08e64610bf8b478d9e0212ea272ea06ee13d6bf33c32cf01dd25363e4ba44868
7
- data.tar.gz: dfad9fc0ba59cc8ecd323299b330c5cc6831336da7fd913f4f72a52ee807861d4b604927e73477f33e353314f2107477457cfa4f320024cd63c19e4b0a577cd5
6
+ metadata.gz: 350f0fd0e11bd35963c89b56aea9eb1dc90ae72956d849fd85b0b67d39e0bb7625176558becc0712f5e573a7605b541dea6497557699f727e4c27ef510d6d58f
7
+ data.tar.gz: e83905ddf24fc4c63793392cd47aa2d02e984c44ba489610119cff6a25bb70be57f4a95f5b9fb78229d9dc6366e0181d2322743eeee8ba59ee840831f8790bb1
@@ -21,9 +21,6 @@ Metrics/ModuleLength:
21
21
  Metrics/MethodLength:
22
22
  Max: 15
23
23
 
24
- Documentation:
25
- Enabled: true
26
-
27
24
  Style/BlockDelimiters:
28
25
  Enabled: true
29
26
  Exclude:
@@ -1,4 +1,17 @@
1
- # [](https://github.com/gildesmarais/html2rss/compare/v0.6.0...v) (2019-10-05)
1
+ # [](https://github.com/gildesmarais/html2rss/compare/v0.7.0...v) (2019-10-28)
2
+
3
+
4
+
5
+ # [0.7.0](https://github.com/gildesmarais/html2rss/compare/v0.6.0...v0.7.0) (2019-10-28)
6
+
7
+
8
+ ### Features
9
+
10
+ * handle json array response ([#49](https://github.com/gildesmarais/html2rss/issues/49)) ([288c2af](https://github.com/gildesmarais/html2rss/commit/288c2af))
11
+ * support enclosure on items ([#52](https://github.com/gildesmarais/html2rss/issues/52)) ([80a30a1](https://github.com/gildesmarais/html2rss/commit/80a30a1)), closes [#50](https://github.com/gildesmarais/html2rss/issues/50)
12
+ * use zeitwerk for autoloading ([#47](https://github.com/gildesmarais/html2rss/issues/47)) ([bce523d](https://github.com/gildesmarais/html2rss/commit/bce523d))
13
+ * **post_processors:** add gsub ([#53](https://github.com/gildesmarais/html2rss/issues/53)) ([de268ae](https://github.com/gildesmarais/html2rss/commit/de268ae))
14
+ * **postprocessor:** always wrap img tag in an a tag in sanitze html ([#51](https://github.com/gildesmarais/html2rss/issues/51)) ([6c7fb88](https://github.com/gildesmarais/html2rss/commit/6c7fb88))
2
15
 
3
16
 
4
17
 
@@ -1,15 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- html2rss (0.6.0)
4
+ html2rss (0.7.0)
5
5
  activesupport (~> 5.0)
6
6
  builder
7
7
  faraday (~> 0.15)
8
8
  faraday_middleware (~> 0.13)
9
9
  hashie (~> 3.6)
10
+ mime-types (> 3.0)
10
11
  nokogiri (>= 1.10, < 2.0)
11
12
  reverse_markdown (~> 1.3)
12
13
  sanitize (~> 5.0)
14
+ to_regexp
15
+ zeitwerk
13
16
 
14
17
  GEM
15
18
  remote: https://rubygems.org/
@@ -23,10 +26,10 @@ GEM
23
26
  builder (3.2.3)
24
27
  byebug (11.0.1)
25
28
  concurrent-ruby (1.1.5)
26
- crass (1.0.4)
29
+ crass (1.0.5)
27
30
  diff-lcs (1.3)
28
31
  docile (1.3.2)
29
- faraday (0.16.2)
32
+ faraday (0.17.0)
30
33
  multipart-post (>= 1.2, < 3)
31
34
  faraday_middleware (0.13.1)
32
35
  faraday (>= 0.7.4, < 1.0)
@@ -35,6 +38,9 @@ GEM
35
38
  concurrent-ruby (~> 1.0)
36
39
  jaro_winkler (1.5.3)
37
40
  json (2.2.0)
41
+ mime-types (3.3)
42
+ mime-types-data (~> 3.2015)
43
+ mime-types-data (3.2019.1009)
38
44
  mini_portile2 (2.4.0)
39
45
  minitest (5.12.2)
40
46
  multipart-post (2.1.1)
@@ -42,25 +48,25 @@ GEM
42
48
  mini_portile2 (~> 2.4.0)
43
49
  nokogumbo (2.0.1)
44
50
  nokogiri (~> 1.8, >= 1.8.4)
45
- parallel (1.17.0)
51
+ parallel (1.18.0)
46
52
  parser (2.6.5.0)
47
53
  ast (~> 2.4.0)
48
54
  rainbow (3.0.0)
49
55
  reverse_markdown (1.3.0)
50
56
  nokogiri
51
- rspec (3.8.0)
52
- rspec-core (~> 3.8.0)
53
- rspec-expectations (~> 3.8.0)
54
- rspec-mocks (~> 3.8.0)
55
- rspec-core (3.8.2)
56
- rspec-support (~> 3.8.0)
57
- rspec-expectations (3.8.5)
57
+ rspec (3.9.0)
58
+ rspec-core (~> 3.9.0)
59
+ rspec-expectations (~> 3.9.0)
60
+ rspec-mocks (~> 3.9.0)
61
+ rspec-core (3.9.0)
62
+ rspec-support (~> 3.9.0)
63
+ rspec-expectations (3.9.0)
58
64
  diff-lcs (>= 1.2.0, < 2.0)
59
- rspec-support (~> 3.8.0)
60
- rspec-mocks (3.8.2)
65
+ rspec-support (~> 3.9.0)
66
+ rspec-mocks (3.9.0)
61
67
  diff-lcs (>= 1.2.0, < 2.0)
62
- rspec-support (~> 3.8.0)
63
- rspec-support (3.8.3)
68
+ rspec-support (~> 3.9.0)
69
+ rspec-support (3.9.0)
64
70
  rubocop (0.75.0)
65
71
  jaro_winkler (~> 1.5.1)
66
72
  parallel (~> 1.10)
@@ -83,11 +89,13 @@ GEM
83
89
  simplecov-html (~> 0.10.0)
84
90
  simplecov-html (0.10.2)
85
91
  thread_safe (0.3.6)
92
+ to_regexp (0.2.1)
86
93
  tzinfo (1.2.5)
87
94
  thread_safe (~> 0.1)
88
95
  unicode-display_width (1.6.0)
89
96
  vcr (5.0.0)
90
97
  yard (0.9.20)
98
+ zeitwerk (2.2.0)
91
99
 
92
100
  PLATFORMS
93
101
  ruby
data/README.md CHANGED
@@ -20,45 +20,106 @@ Add this line to your application's Gemfile: `gem 'html2rss'`
20
20
  Then execute: `bundle`
21
21
 
22
22
  ```ruby
23
- rss = Html2rss.feed(
24
- channel: { title: 'StackOverflow: Hot Network Questions', url: 'https://stackoverflow.com/questions' },
25
- selectors: {
26
- items: { selector: '#hot-network-questions > ul > li' },
27
- title: { selector: 'a' },
28
- link: { selector: 'a', extractor: 'href' }
29
- }
30
- )
23
+ rss =
24
+ Html2rss.feed(
25
+ channel: { title: 'StackOverflow: Hot Network Questions', url: 'https://stackoverflow.com/questions' },
26
+ selectors: {
27
+ items: { selector: '#hot-network-questions > ul > li' },
28
+ title: { selector: 'a' },
29
+ link: { selector: 'a', extractor: 'href' }
30
+ }
31
+ )
31
32
 
32
33
  puts rss.to_s
33
34
  ```
34
35
 
35
36
  ## Usage with a YAML config file
36
37
 
37
- Create a YAML config file. Find an example at [`rspec/config.test.yml`](https://github.com/gildesmarais/html2rss/blob/master/spec/config.test.yml).
38
+ Create a YAML config file. Find an example at [`spec/config.test.yml`](https://github.com/gildesmarais/html2rss/blob/master/spec/config.test.yml).
38
39
 
39
- `Html2rss.feed_from_yaml_config(File.join(['spec', 'config.test.yml']), 'nuxt-releases')` returns
40
-
41
- an `RSS:Rss` object.
40
+ `Html2rss.feed_from_yaml_config(File.join(['spec', 'config.test.yml']), 'nuxt-releases')`
41
+ returns an `RSS:Rss` object.
42
42
 
43
43
  **Too complicated?** See [`html2rss-configs`](https://github.com/gildesmarais/html2rss-configs) for ready-made feed configs!
44
44
 
45
+ ## Assigning categories to an item
46
+
47
+ The `categories` selector takes an array of selector names. The value of those
48
+ selectors will become a category on the item.
49
+
50
+ <details>
51
+ <summary>See a YAML config example</summary>
52
+
53
+ ```yml
54
+ channel:
55
+ # ... omitted
56
+ selectors:
57
+ #... omitted
58
+ genre:
59
+ selector: '.genre'
60
+ branch:
61
+ selector: '.branch'
62
+ categories:
63
+ - genre
64
+ - branch
65
+ ```
66
+
67
+ </details>
68
+
69
+ ## Adding an enclosure to each item
70
+
71
+ An enclosure can be 'anything', e.g. a image, audio or video file.
72
+
73
+ The config's `enclosure` selector needs to return a URL of the content to enclose. If the extracted URL is relative, it will be converted to an absolute one using the channel's url as a base.
74
+
75
+ Since html2rss does no further inspection of the enclosure, the support of this tag comes with trade-offs:
76
+
77
+ 1. The content-type is guessed from the file extension of the URL.
78
+ 2. If the content-type guessing fails, it will default to `application/octet-stream`.
79
+ 3. The content-length will always be undetermined and thus stated as `0` bytes.
80
+
81
+ Read the [RSS 2.0 spec](http://www.rssboard.org/rss-profile#element-channel-item-enclosure) for further information on enclosing content.
82
+
83
+ <details>
84
+ <summary>See a YAML config example</summary>
85
+
86
+ ```yml
87
+ channel:
88
+ # ... omitted
89
+ selectors:
90
+ #... omitted
91
+ enclosure:
92
+ selector: 'img'
93
+ extractor: 'attribute'
94
+ attribute: 'src'
95
+ ```
96
+
97
+ </details>
98
+
45
99
  ## Scraping JSON
46
100
 
47
- Since 0.5.0 it is possible to scrape and process JSON.
101
+ Since 0.5.0 it's possible to scrape and process JSON.
48
102
 
49
103
  Adding `json: true` to the channel config will convert the JSON response to XML.
50
104
 
51
- Feed config:
105
+ <details>
106
+ <summary>See a YAML feed config example</summary>
52
107
 
53
108
  ```yaml
54
109
  channel:
55
110
  url: https://example.com
56
- title: "Example with JSON"
111
+ title: 'Example with JSON'
57
112
  json: true
58
113
  # ...
59
114
  ```
60
115
 
61
- Imagine this HTTP response:
116
+ </details>
117
+
118
+ Under the hood it uses ActiveSupport's [`Hash.to_xml`](https://apidock.com/rails/Hash/to_xml) core extension for the JSON to XML conversion.
119
+
120
+ ### Conversion of JSON objects
121
+
122
+ This JSON object:
62
123
 
63
124
  ```json
64
125
  {
@@ -69,19 +130,38 @@ Imagine this HTTP response:
69
130
  will be converted to:
70
131
 
71
132
  ```xml
72
- <html>
133
+ <hash>
73
134
  <data>
74
135
  <datum>
75
136
  <title>Headline</title>
76
137
  <url>https://example.com</url>
77
138
  </datum>
78
139
  </data>
79
- </html>
140
+ </hash>
80
141
  ```
81
142
 
82
- Your items selector would be `data > datum`, the item's link selector would be `url`.
143
+ Your items selector would be `data > datum`, the item's `link` selector would be `url`.
83
144
 
84
- Under the hood it uses ActiveSupport's [`Hash.to_xml`](https://apidock.com/rails/Hash/to_xml) core extension for the JSON to XML conversion.
145
+ ### Conversion of JSON arrays
146
+
147
+ This JSON array:
148
+
149
+ ```json
150
+ [{ "title": "Headline", "url": "https://example.com" }]
151
+ ```
152
+
153
+ will be converted to:
154
+
155
+ ```xml
156
+ <objects>
157
+ <object>
158
+ <title>Headline</title>
159
+ <url>https://example.com</url>
160
+ </object>
161
+ </objects>
162
+ ```
163
+
164
+ Your items selector would be `objects > object`, the item's `link` selector would be `url`.
85
165
 
86
166
  ## Set any HTTP header in the request
87
167
 
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.description = 'Give the URL to scrape and some CSS selectors. Get a RSS::Rss instance in return.'
13
13
  spec.homepage = 'https://github.com/gildesmarais/html2rss'
14
14
  spec.license = 'MIT'
15
- spec.required_ruby_version = '>= 2.4.0'
15
+ spec.required_ruby_version = '>= 2.4.4'
16
16
 
17
17
  if spec.respond_to?(:metadata)
18
18
  spec.metadata['allowed_push_host'] = 'https://rubygems.org'
@@ -34,9 +34,12 @@ Gem::Specification.new do |spec|
34
34
  spec.add_dependency 'faraday', '~> 0.15'
35
35
  spec.add_dependency 'faraday_middleware', '~> 0.13'
36
36
  spec.add_dependency 'hashie', '~> 3.6'
37
+ spec.add_dependency 'mime-types', '> 3.0'
37
38
  spec.add_dependency 'nokogiri', '>= 1.10', '< 2.0'
38
39
  spec.add_dependency 'reverse_markdown', '~> 1.3'
39
40
  spec.add_dependency 'sanitize', '~> 5.0'
41
+ spec.add_dependency 'to_regexp'
42
+ spec.add_dependency 'zeitwerk'
40
43
  spec.add_development_dependency 'bundler', '~> 1.16'
41
44
  spec.add_development_dependency 'byebug'
42
45
  spec.add_development_dependency 'rspec', '~> 3.0'
@@ -1,7 +1,8 @@
1
- require 'html2rss/config'
2
- require 'html2rss/feed_builder'
3
- require 'html2rss/version'
4
- require 'html2rss/utils'
1
+ require 'zeitwerk'
2
+
3
+ loader = Zeitwerk::Loader.for_gem
4
+ loader.setup
5
+
5
6
  require 'yaml'
6
7
 
7
8
  ##
@@ -1,19 +1,15 @@
1
- require_relative 'attribute_post_processors/html_to_markdown'
2
- require_relative 'attribute_post_processors/parse_time'
3
- require_relative 'attribute_post_processors/parse_uri'
4
- require_relative 'attribute_post_processors/sanitize_html'
5
- require_relative 'attribute_post_processors/substring'
6
- require_relative 'attribute_post_processors/template'
7
-
8
1
  module Html2rss
9
2
  ##
10
3
  # Provides a namespace for attribute post processors.
11
4
  module AttributePostProcessors
12
5
  def self.get_processor(name)
13
- camel_cased_name = name.split('_').map(&:capitalize).join
14
- class_name = ['Html2rss', 'AttributePostProcessors', camel_cased_name].join('::')
6
+ @get_processor ||= Hash.new do |processors, key|
7
+ camel_cased_name = key.split('_').map(&:capitalize).join
8
+ class_name = ['Html2rss', 'AttributePostProcessors', camel_cased_name].join('::')
9
+ processors[key] = Object.const_get(class_name)
10
+ end
15
11
 
16
- Object.const_get(class_name)
12
+ @get_processor[name]
17
13
  end
18
14
  end
19
15
  end
@@ -0,0 +1,39 @@
1
+ require 'to_regexp'
2
+
3
+ module Html2rss
4
+ module AttributePostProcessors
5
+ ##
6
+ #
7
+ # Imagine this HTML:
8
+ # <h1>Foo bar and boo<h1>
9
+ #
10
+ # YAML usage example:
11
+ # selectors:
12
+ # title:
13
+ # selector: h1
14
+ # post_process:
15
+ # name: gsub
16
+ # pattern: boo
17
+ # replacement: baz
18
+ #
19
+ # Would return:
20
+ # 'Foo bar and baz'
21
+ #
22
+ # `pattern` can be a Regexp or a String.
23
+ # `replacement` can be a String or a Hash.
24
+ # See the doc on [String#gsub](https://ruby-doc.org/core/String.html#method-i-gsub) for more info.
25
+ class Gsub
26
+ def initialize(value, env)
27
+ @value = value
28
+ @pattern = env[:options]['pattern'].to_regexp || env[:options]['pattern']
29
+ @replacement = env[:options]['replacement']
30
+ end
31
+
32
+ ##
33
+ # @return [String]
34
+ def get
35
+ @value.to_s.gsub(@pattern, @replacement)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -17,6 +17,10 @@ module Html2rss
17
17
  # <script>alert();</script>
18
18
  # </section>
19
19
  #
20
+ # It also:
21
+ #
22
+ # - wraps all <img> tags, whose direct parent is not an <a>, into an <a>
23
+ #
20
24
  # YAML usage example:
21
25
  #
22
26
  # selectors:
@@ -41,28 +45,26 @@ module Html2rss
41
45
  # - adds target="_blank" to a elements
42
46
  # @return [String]
43
47
  def get
44
- Sanitize.fragment(@value, Sanitize::Config.merge(
45
- Sanitize::Config::RELAXED,
46
- attributes: { all: %w[dir lang alt title translate] },
47
- add_attributes: {
48
- 'a' => {
49
- 'rel' => 'nofollow noopener noreferrer',
50
- 'target' => '_blank'
51
- },
52
- 'img' => {
53
- 'referrer-policy' => 'no-referrer'
54
- }
55
- },
56
- transformers: [transform_urls_to_absolute_ones]
57
- )).to_s.split.join(' ')
48
+ Sanitize.fragment(
49
+ @value,
50
+ Sanitize::Config.merge(
51
+ Sanitize::Config::RELAXED,
52
+ attributes: { all: %w[dir lang alt title translate] },
53
+ add_attributes: {
54
+ 'a' => { 'rel' => 'nofollow noopener noreferrer', 'target' => '_blank' },
55
+ 'img' => { 'referrer-policy' => 'no-referrer' }
56
+ },
57
+ transformers: [transform_urls_to_absolute_ones, wrap_img_in_a]
58
+ )
59
+ )
60
+ .to_s
61
+ .split
62
+ .join(' ')
58
63
  end
59
64
 
60
65
  private
61
66
 
62
- URL_ELEMENTS_WITH_URL_ATTRIBUTE = {
63
- 'a' => :href,
64
- 'img' => :src
65
- }.freeze
67
+ URL_ELEMENTS_WITH_URL_ATTRIBUTE = { 'a' => :href, 'img' => :src }.freeze
66
68
 
67
69
  def transform_urls_to_absolute_ones
68
70
  lambda do |env|
@@ -78,6 +80,23 @@ module Html2rss
78
80
  env[:node][url_attribute] = absolute_url
79
81
  end
80
82
  end
83
+
84
+ def wrap_img_in_a
85
+ lambda do |env|
86
+ return if env[:node_name] != 'img'
87
+
88
+ img = env[:node]
89
+
90
+ return if img.parent.name == 'a'
91
+
92
+ anchor = Nokogiri::XML::Node.new('a', img)
93
+ anchor[:href] = img[:src]
94
+
95
+ anchor.add_child img.dup
96
+
97
+ img.replace(anchor)
98
+ end
99
+ end
81
100
  end
82
101
  end
83
102
  end
@@ -1,5 +1,5 @@
1
1
  require 'rss'
2
- require_relative 'item'
2
+ require 'mime/types'
3
3
 
4
4
  module Html2rss
5
5
  ##
@@ -20,9 +20,7 @@ module Html2rss
20
20
  RSS::Maker.make('2.0') do |maker|
21
21
  add_channel(maker)
22
22
 
23
- feed_items.map do |feed_item|
24
- add_item(feed_item, maker.items.new_item)
25
- end
23
+ feed_items.map { |feed_item| add_item(feed_item, maker.items.new_item) }
26
24
  end
27
25
  end
28
26
 
@@ -48,10 +46,25 @@ module Html2rss
48
46
  rss_item.public_send("#{attribute_name}=".to_sym, feed_item.public_send(attribute_name))
49
47
  end
50
48
 
51
- feed_item.categories.each do |category|
52
- rss_item.categories.new_category.content = category
53
- end
49
+ feed_item.categories.each { |category| rss_item.categories.new_category.content = category }
50
+ add_enclosure_from_url(feed_item.enclosure_url, rss_item) if config.attribute?(:enclosure)
51
+
52
+ add_guid(feed_item, rss_item)
53
+ end
54
+
55
+ def add_enclosure_from_url(url, rss_item)
56
+ content_type = MIME::Types.type_for(File.extname(url).delete('.'))
57
+
58
+ rss_item.enclosure.type = if content_type && content_type.first
59
+ content_type.first.to_s
60
+ else
61
+ 'application/octet-stream'
62
+ end
63
+ rss_item.enclosure.length = 0
64
+ rss_item.enclosure.url = url
65
+ end
54
66
 
67
+ def add_guid(feed_item, rss_item)
55
68
  rss_item.guid.content = Digest::SHA1.hexdigest(feed_item.title)
56
69
  rss_item.guid.isPermaLink = false
57
70
  end
@@ -1,9 +1,6 @@
1
1
  require 'faraday'
2
2
  require 'faraday_middleware'
3
- require 'open-uri'
4
3
  require 'nokogiri'
5
- require_relative 'item_extractors'
6
- require_relative 'attribute_post_processors'
7
4
 
8
5
  module Html2rss
9
6
  ##
@@ -34,7 +31,7 @@ module Html2rss
34
31
 
35
32
  def available_attributes
36
33
  @available_attributes ||= (%w[title link description author comments updated] &
37
- @config.attribute_names) - ['categories']
34
+ @config.attribute_names) - %w[categories enclosure]
38
35
  end
39
36
 
40
37
  ##
@@ -54,14 +51,19 @@ module Html2rss
54
51
  categories.keep_if { |category| category.to_s != '' }
55
52
  end
56
53
 
54
+ def enclosure_url
55
+ enclosure = method_missing(:enclosure)
56
+ return if enclosure.to_s == ''
57
+
58
+ Html2rss::Utils.build_absolute_url_from_relative(enclosure, config.url).to_s
59
+ end
60
+
57
61
  ##
58
62
  # @return [Array]
59
63
  def self.from_url(url, config)
60
64
  body = get_body_from_url(url, config)
61
65
 
62
- Nokogiri::HTML(body).css(config.selector('items')).map do |xml_item|
63
- new xml_item, config
64
- end
66
+ Nokogiri.HTML(body).css(config.selector('items')).map { |xml_item| new xml_item, config }
65
67
  end
66
68
 
67
69
  private
@@ -1,23 +1,17 @@
1
- require_relative 'item_extractors/attribute'
2
- require_relative 'item_extractors/current_time'
3
- require_relative 'item_extractors/href'
4
- require_relative 'item_extractors/html'
5
- require_relative 'item_extractors/static'
6
- require_relative 'item_extractors/text'
7
-
8
1
  module Html2rss
9
2
  ##
10
3
  # Provides a namespace for item extractors.
11
4
  module ItemExtractors
12
- DEFAULT = 'text'.freeze
5
+ DEFAULT = 'Text'.freeze
13
6
 
14
7
  def self.get_extractor(name)
15
- @extractors = Hash.new do |hash, key|
16
- camel_cased_name = key.split('_').map(&:capitalize).join
8
+ @get_extractor ||= Hash.new do |extractors, key|
9
+ camel_cased_name = (key || DEFAULT).split('_').map(&:capitalize).join
17
10
  class_name = ['Html2rss', 'ItemExtractors', camel_cased_name].join('::')
11
+ extractors[key] = Object.const_get(class_name)
12
+ end
18
13
 
19
- hash[key] = Object.const_get(class_name)
20
- end[name || DEFAULT]
14
+ @get_extractor[name]
21
15
  end
22
16
 
23
17
  ##
@@ -28,7 +28,7 @@ module Html2rss
28
28
  end
29
29
 
30
30
  def self.hash_to_xml(hash)
31
- hash.to_xml(root: :html, skip_instruct: true, skip_types: true)
31
+ hash.to_xml(skip_instruct: true, skip_types: true)
32
32
  end
33
33
  end
34
34
  end
@@ -1,3 +1,3 @@
1
1
  module Html2rss
2
- VERSION = '0.6.0'.freeze
2
+ VERSION = '0.7.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: html2rss
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gil Desmarais
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-05 00:00:00.000000000 Z
11
+ date: 2019-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '3.6'
83
+ - !ruby/object:Gem::Dependency
84
+ name: mime-types
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: nokogiri
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -128,6 +142,34 @@ dependencies:
128
142
  - - "~>"
129
143
  - !ruby/object:Gem::Version
130
144
  version: '5.0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: to_regexp
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: zeitwerk
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
131
173
  - !ruby/object:Gem::Dependency
132
174
  name: bundler
133
175
  requirement: !ruby/object:Gem::Requirement
@@ -277,6 +319,7 @@ files:
277
319
  - html2rss.gemspec
278
320
  - lib/html2rss.rb
279
321
  - lib/html2rss/attribute_post_processors.rb
322
+ - lib/html2rss/attribute_post_processors/gsub.rb
280
323
  - lib/html2rss/attribute_post_processors/html_to_markdown.rb
281
324
  - lib/html2rss/attribute_post_processors/parse_time.rb
282
325
  - lib/html2rss/attribute_post_processors/parse_uri.rb
@@ -310,7 +353,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
310
353
  requirements:
311
354
  - - ">="
312
355
  - !ruby/object:Gem::Version
313
- version: 2.4.0
356
+ version: 2.4.4
314
357
  required_rubygems_version: !ruby/object:Gem::Requirement
315
358
  requirements:
316
359
  - - ">="