wiki-api 0.1.0 → 0.1.2

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,15 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: !binary |-
4
- NjQ3MjZkMDdmNTg2YjdhZDRmM2E3MjU4ZjA1Y2IwOGYzODEwZTFkMA==
5
- data.tar.gz: !binary |-
6
- YWE4Mzc4ZjRlYTBjNGE4MTkyYmE0OGFkOTJkMDViZTI0MjQ5MGFiMw==
2
+ SHA256:
3
+ metadata.gz: cd978cd4dad89ddc8098d6abafcd6325ec6c0c4a4a5e5b8e93855bc118314b27
4
+ data.tar.gz: c5ead46deb2d10310823d4b639046058cf087a29cb6a0413a5e3addc64037b92
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- OTNhMTZkNjMwNzJiMzU5YWE0ZDZiNzRlZWU5ZDJjM2Q1NTA5ZWRiN2IzY2Mw
10
- MmU1ZDk0ODZhN2U4ODYwNjY0ZjdmY2U5ZTFkMDk4ZDA2MzIyODUzNjE0YzVl
11
- OGE2ZmFmOTYyOWY2MWIyNGNlNmU5NjYwOTNkMGNhNjllOWM0YzQ=
12
- data.tar.gz: !binary |-
13
- YjgzZGEzYzhhOWFmNzZhMjRlMWFiYmJiY2Q3N2EwOGQwZTBjY2Q0NzYxNWE2
14
- ODc5NmMyNmYyODMyNmVmMjFmYzhhOTAzMTUzZTBmODU2OTMwY2RhYjg0Mjkz
15
- Yjk3NjMzNGFlZGViYzQyOGQ5YzVjM2MzMjIyNWVlOWRhOTU0MDk=
6
+ metadata.gz: fcb6e3991c12a415a79b4c109091a41dbe45bff7ee3040a1a4283ddc2625522cfca767c65cba45e0f29bb13d410f082b78337de25d0bfd2bd9e0bd1591a36c24
7
+ data.tar.gz: 3a78fa474766c4cc10c44eb3e8a90ed95c1ddac1f306afa878da2ccf7b75e4fd179fc7933499f261c408cdd2f396d3613a6d74361bdad160cb3c13727aaa135c
data/.rubocop.yml ADDED
@@ -0,0 +1,24 @@
1
+ AllCops:
2
+ SuggestExtensions: false
3
+ Style/ClassVars:
4
+ Enabled: false
5
+ Style/Documentation:
6
+ Enabled: false
7
+ Style/MethodCallWithArgsParentheses:
8
+ Enabled: true
9
+ Metrics/AbcSize:
10
+ Enabled: false
11
+ Metrics/ClassLength:
12
+ Enabled: false
13
+ Metrics/CyclomaticComplexity:
14
+ Enabled: false
15
+ Metrics/PerceivedComplexity:
16
+ Enabled: false
17
+ Metrics/MethodLength:
18
+ Enabled: false
19
+ Naming/MethodParameterName:
20
+ Enabled: false
21
+ Naming/PredicateName:
22
+ Enabled: false
23
+ Lint/RescueException:
24
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.1.0
5
+ - jruby-19mode
6
+ - ruby-head
7
+ - jruby-head
8
+ jdk:
9
+ - oraclejdk7
10
+ before_install:
11
+ - gem update --system
12
+ - gem --version
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in wiki-api.gemspec
data/README.md CHANGED
@@ -1,47 +1,20 @@
1
1
  # Wiki::Api
2
2
 
3
- Wiki API is a gem (Ruby on Rails) that interfaces with the MediaWiki API (https://www.mediawiki.org/wiki/API:Main_page). This gem is more than a interface, it has abstract classes for Page and Headline parsing. You're able to iterate through these headlines, and access data accordingly.
3
+ [![Build Status](https://travis-ci.org/dblommesteijn/wiki-api.svg?branch=master)](https://travis-ci.org/dblommesteijn/wiki-api) [![Code Climate](https://codeclimate.com/github/dblommesteijn/wiki-api.png)](https://codeclimate.com/github/dblommesteijn/wiki-api)
4
4
 
5
- NOTE: This gem has a nokogiri (http://nokogiri.org/Nokogiri.html) backend (for HTML parsing). Major components: Page, Headline, Block, ListItem, and Link are wrappers for easy data access, however it's still possible to retreive the raw HTML within these objects.
5
+ Wiki API is a gem (Ruby on Rails) that interfaces with the MediaWiki API (https://www.mediawiki.org/wiki/API:Main_page). This gem is more than a interface, it has abstract classes for Page and Headline parsing. You're able to iterate through these headlines, and access data accordingly.
6
+
7
+ NOTE: This gem has a nokogiri (http://nokogiri.org/Nokogiri.html) backend (for HTML parsing). Major components: `Page`, `Headline`, `Block`, `ListItem`, and `Link` are wrappers for easy data access, however it's still possible to retreive the raw HTML within these objects.
6
8
 
7
9
  Requests to the MediaWiki API use the following URI structure:
8
10
 
9
11
  http(s)://somemediawiki.org/w/api.php?action=parse&format=json&page="anypage"
10
12
 
11
- # RDoc (rdoc.info)
12
-
13
- http://rdoc.info/github/dblommesteijn/wiki-api/frames/file/README.md
14
-
13
+ ### Dependencies
15
14
 
16
- ### Dependencies (production)
17
-
18
- * json
19
15
  * nokogiri
20
16
 
21
17
 
22
- ### Feature Roadmap
23
-
24
- * Version (0.1.0)
25
-
26
- Major current release with several core changes.
27
-
28
- * Version (0.1.1)
29
-
30
- No features determined yet (please drop me a line if you're interested in additions).
31
-
32
-
33
- ### Changelog
34
-
35
- * Version (0.0.2) -> (current)
36
-
37
- PageLink URI without global config Exception resolved
38
-
39
- Reverse (parent) object lookup
40
-
41
- Nested PageHeadline objects
42
-
43
-
44
-
45
18
  ## Installation
46
19
 
47
20
  Add this line to your application's Gemfile (bundler):
@@ -56,23 +29,29 @@ Or install it yourself (RubyGems):
56
29
 
57
30
  $ gem install wiki-api
58
31
 
32
+ Or try it from this repository (local) in a console:
33
+
34
+ $ bin/console
35
+
59
36
 
60
37
  ## Setup
61
38
 
62
39
  Define a configuration for your connection (initialize script), this example uses wiktionary.org.
63
- NOTE: it can connect to both HTTP and HTTPS MediaWikis.
64
-
65
- ```ruby
66
- CONFIG = { uri: "http://en.wiktionary.org" }
67
- ```
40
+ NOTE: it can connect to both HTTP and HTTPS MediaWikis (however you'll get a 302 response from MediaWiki)
68
41
 
69
42
  Setup default configuration (initialize script)
70
43
 
71
44
  ```ruby
72
- Wiki::Api::Connect.config = CONFIG
45
+ Wiki::Api::Connect.config = { uri: 'https://en.wiktionary.org' }
73
46
  ```
74
47
 
75
48
 
49
+ ## Running tests
50
+
51
+ ```bash
52
+ $ rake test
53
+ ```
54
+
76
55
  ## Usage
77
56
 
78
57
  ### Query a Page and Headline
@@ -80,7 +59,7 @@ Wiki::Api::Connect.config = CONFIG
80
59
  Requesting headlines from a given page.
81
60
 
82
61
  ```ruby
83
- page = Wiki::Api::Page.new name: "Wiktionary:Welcome,_newcomers"
62
+ page = Wiki::Api::Page.new(name: 'Wiktionary:Welcome,_newcomers')
84
63
  # the root headline equals the pagename
85
64
  puts page.root_headline.name
86
65
  # iterate next level of headlines
@@ -93,9 +72,9 @@ end
93
72
  Getting headlines for a given name.
94
73
 
95
74
  ```ruby
96
- page = Wiki::Api::Page.new name: "Wiktionary:Welcome,_newcomers"
75
+ page = Wiki::Api::Page.new(name: 'Wiktionary:Welcome,_newcomers')
97
76
  # lookup headline by name (underscore and case are ignored)
98
- headline = page.root_headline.headline("editing wiktionary").first
77
+ headline = page.root_headline.headline('editing wiktionary').first
99
78
  # printing headline name (PageHeadline)
100
79
  puts headline.name
101
80
  # get the type of nested headline (html h1,2,3,4 etc.)
@@ -105,7 +84,7 @@ puts headline.type
105
84
  ### Basic Page structure
106
85
 
107
86
  ```ruby
108
- page = Wiki::Api::Page.new name: "Wiktionary:Welcome,_newcomers"
87
+ page = Wiki::Api::Page.new(name: 'Wiktionary:Welcome,_newcomers')
109
88
  # iterate PageHeadline objects
110
89
  page.root_headline.headlines.each do |headline_name, headline|
111
90
  # exposing nokogiri internal elements
@@ -114,6 +93,7 @@ page.root_headline.headlines.each do |headline_name, headline|
114
93
  # print will result in: Nokogiri::XML::Text or Nokogiri::XML::Element
115
94
  puts element.class
116
95
  end
96
+
117
97
  # string representation of all nested text
118
98
  block.to_texts
119
99
  # iterate PageListItem objects
@@ -137,7 +117,6 @@ page.root_headline.headlines.each do |headline_name, headline|
137
117
  # string representation of nested text
138
118
  link.to_text
139
119
  end
140
-
141
120
  end
142
121
  ```
143
122
 
@@ -148,21 +127,20 @@ This is a example of querying wikipedia.org on the page: "Ruby_on_rails", and pr
148
127
 
149
128
  ```ruby
150
129
  # setting a target config
151
- CONFIG = { uri: "https://en.wikipedia.org" }
152
- Wiki::Api::Connect.config = CONFIG
130
+ Wiki::Api::Connect.config = { uri: 'https://en.wikipedia.org' }
153
131
 
154
132
  # querying the page
155
- page = Wiki::Api::Page.new name: "Ruby_on_Rails"
133
+ page = Wiki::Api::Page.new(name: 'Ruby_on_Rails')
156
134
 
157
135
  # get headlines with name Reference (there can be multiple headlines with the same name!)
158
- headlines = page.root_headline.headline "References"
136
+ headlines = page.root_headline.headline('References')
159
137
 
160
138
  # iterate headlines
161
139
  headlines.each do |headline|
162
140
  # iterate list items on the given headline
163
141
  headline.block.list_items.each do |list_item|
164
142
  # print the uri of all links
165
- puts list_item.links.map{ |l| l.uri }
143
+ puts list_item.links.map(&:uri)
166
144
  end
167
145
  end
168
146
  ```
@@ -174,19 +152,17 @@ This is the same example as the one above, except for setting a global config to
174
152
 
175
153
  ```ruby
176
154
  # querying the page
177
- page = Wiki::Api::Page.new name: "Ruby_on_Rails", uri: "https://en.wikipedia.org"
155
+ page = Wiki::Api::Page.new(name: 'Ruby_on_Rails', uri: 'https://en.wikipedia.org')
178
156
 
179
157
  # get headlines with name Reference (there can be multiple headlines with the same name!)
180
- headlines = page.root_headline.headline "References"
158
+ headlines = page.root_headline.headline('References')
181
159
 
182
160
  # iterate headlines
183
161
  headlines.each do |headline|
184
162
  # iterate list items on the given headline
185
163
  headline.block.list_items.each do |list_item|
186
-
187
164
  # print the uri of all links
188
- puts list_item.links.map{ |l| l.uri }
189
-
165
+ puts list_item.links.map(&:uri)
190
166
  end
191
167
  end
192
168
  ```
@@ -199,25 +175,47 @@ This example shows how the headlines can be searched. For more info check: https
199
175
 
200
176
  ```ruby
201
177
  # querying the page
202
- page = Wiki::Api::Page.new name: "Ruby_on_Rails", uri: "https://en.wikipedia.org"
178
+ page = Wiki::Api::Page.new(name: 'Ruby_on_Rails', uri: 'https://en.wikipedia.org')
203
179
 
204
180
  # NOTE: the following are all valid headline names:
205
181
  # request headline (by literal name)
206
- headlines = page.root_headline.headline "Philosophy_and_design"
207
- puts headlines.map{|h| h.name}
182
+ headlines = page.root_headline.headline('Philosophy_and_design')
183
+ puts headlines.map(&:name)
208
184
  # request headline (by downcase name)
209
- headlines = page.root_headline.headline "philosophy_and_design"
210
- puts headlines.map{|h| h.name}
185
+ headlines = page.root_headline.headline('philosophy_and_design')
186
+ puts headlines.map(&:name)
211
187
  # request headline (by human name)
212
- headlines = page.root_headline.headline "philosophy and design"
213
- puts headlines.map{|h| h.name}
188
+ headlines = page.root_headline.headline('philosophy and design')
189
+ puts headlines.map(&:name)
214
190
 
215
191
  # NOTE2: headlines are matched on headline.start_with?(requested_headline)
216
192
  # because of start_with? compare this should work as well!
217
- headlines = page.root_headline.headline "philosophy"
218
- puts headlines.map{|h| h.name}
193
+ headlines = page.root_headline.headline('philosophy')
194
+ puts headlines.map(&:name)
219
195
  ```
220
196
 
221
197
 
198
+ ### Example searching headlines in depth
222
199
 
200
+ Recursive search on all nested headlines, including in depth searches.
201
+
202
+ ```ruby
203
+ # querying the page
204
+ page = Wiki::Api::Page.new(name: 'Ruby_on_Rails', uri: 'https://en.wikipedia.org')
205
+ # get root
206
+ root_headline = page.root_headline
207
+ # lookup 'ramework structure' on current level
208
+ headline = root_headline.headline_in_depth('framework structure').first
209
+ puts headline.name
210
+ # NOTE: lookup of nested headlines does not work with the headline function (because 'Framework_structure' is nested within 'Technical_overview')
211
+ headline = root_headline.headline('framework structure').first
212
+ # depth can be limited adding the depth parameter
213
+ # NOTE: the example below will return nil, 'Framework_structure' is nested beyond depth = 0!
214
+ depth = 0
215
+ headline = root_headline.headline_in_depth('framework structure', depth).first
216
+ # increasing depth search will show the requested headline
217
+ depth = 5
218
+ headline = root_headline.headline_in_depth('framework structure', depth).first
219
+ puts headline.name
220
+ ```
223
221
 
data/Rakefile CHANGED
@@ -1 +1,13 @@
1
- require "bundler/gem_tasks"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.libs << 'test'
8
+ tfs = FileList['test/unit/*.rb']
9
+ t.test_files = tfs
10
+ t.verbose = true
11
+ end
12
+
13
+ task default: %i[build install]
data/bin/console ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'wiki/api'
6
+ require 'pry'
7
+
8
+ Pry.start
@@ -1,85 +1,95 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/http'
2
4
  require 'json'
3
5
  require 'nokogiri'
4
6
 
5
7
  module Wiki
6
8
  module Api
7
-
8
9
  class Connect
9
-
10
10
  attr_accessor :uri, :api_path, :api_options, :http, :request, :response, :html, :parsed, :file
11
11
 
12
- def initialize(options={})
13
- @@config ||= nil
14
- options.merge! @@config unless @@config.nil?
15
- self.uri = options[:uri] if options.include? :uri
16
- self.file = options[:file] if options.include? :file
17
- self.api_path = options[:api_path] if options.include? :api_path
18
- self.api_options = options[:api_options] if options.include? :api_options
12
+ def initialize(options = {})
13
+ @@config ||= {}
14
+ self.uri = options[:uri] || @@config[:uri]
15
+ self.file = options[:file] || @@config[:file]
16
+ self.api_path = options[:api_path] || @@config[:api_path]
17
+ self.api_options = options[:api_options] || @@config[:api_options]
19
18
 
20
19
  # defaults
21
- self.api_path ||= "/w/api.php"
22
- self.api_options ||= {action: "parse", format: "json", page: ""}
20
+ self.api_path ||= '/w/api.php'
21
+ self.api_options ||= { action: 'parse', format: 'json', page: '' }
23
22
 
24
23
  # errors
25
- raise "no uri given" if self.uri.nil?
24
+ raise('no uri given') if uri.nil?
26
25
  end
27
26
 
28
27
  def connect
29
28
  uri = URI("#{self.uri}#{self.api_path}")
30
- uri.query = URI.encode_www_form self.api_options
29
+ uri.query = URI.encode_www_form(self.api_options)
31
30
  self.http = Net::HTTP.new(uri.host, uri.port)
32
- if uri.scheme == "https"
33
- self.http.use_ssl = true
34
- #self.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
31
+ if uri.scheme == 'https'
32
+ http.use_ssl = true
33
+ # self.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
35
34
  end
36
35
  self.request = Net::HTTP::Get.new(uri.request_uri)
37
- self.response = self.http.request(request)
36
+ self.response = http.request(request)
38
37
  end
39
38
 
40
- def page page_name
39
+ def page(page_name)
41
40
  self.api_options[:page] = page_name
42
41
  # parse page by uri
43
- if !self.uri.nil? && self.file.nil?
44
- self.connect
45
- response = self.response
46
- json = JSON.parse response.body, {symbolize_names: true}
47
- raise json[:error][:code] unless valid? json, response
48
- self.html = json[:parse][:text]
49
- self.parsed = Nokogiri::HTML self.html[:*]
42
+ if !uri.nil? && file.nil?
43
+ self.parsed = parse_from_uri(response)
50
44
  # parse page by file
51
- elsif !self.file.nil?
52
- f = File.open(self.file)
53
- # self.parsed = Nokogiri::HTML self.html[:*]
54
- self.parsed = Nokogiri::HTML(f)
55
- f.close
45
+ elsif !file.nil?
46
+ self.parsed = parse_from_file(file)
56
47
  # invalid config, raise exception
57
48
  else
58
- raise "no :uri or :file config found!"
49
+ raise('no :uri or :file config found!')
59
50
  end
60
- self.parsed
51
+ parsed
52
+ end
53
+
54
+ def parse_from_uri(response)
55
+ connect
56
+ # rubocop:disable Lint/ShadowedArgument
57
+ response = self.response
58
+ # rubocop:enable Lint/ShadowedArgument
59
+ json = JSON.parse(response.body, { symbolize_names: true })
60
+ raise(json[:error][:code]) unless valid?(json, response)
61
+
62
+ self.html = json[:parse][:text]
63
+ self.parsed = Nokogiri::HTML(html[:*])
64
+ end
65
+
66
+ def parse_from_file(file)
67
+ f = File.open(file)
68
+ ret = Nokogiri::HTML(f)
69
+ f.close
70
+ ret
61
71
  end
62
72
 
63
73
  class << self
64
74
  def config=(config = {})
65
75
  @@config = config
66
76
  end
77
+
67
78
  def config
68
79
  @@config ||= []
69
80
  end
70
81
  end
71
82
 
72
83
  protected
73
- def valid? json, response
84
+
85
+ def valid?(json, response)
74
86
  b = []
75
87
  # valid http response
76
- b << (response.is_a? Net::HTTPOK)
88
+ b << (response.is_a?(Net::HTTPOK))
77
89
  # not an invalid api response handle
78
- b << (!json.include? :error)
90
+ b << (!json.include?(:error))
79
91
  !b.include?(false)
80
92
  end
81
-
82
93
  end
83
-
84
94
  end
85
- end
95
+ end
data/lib/wiki/api/page.rb CHANGED
@@ -1,25 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Wiki
2
4
  module Api
3
-
4
5
  # MediaWiki Page, collection of all html information plus it's page title
5
6
  class Page
6
-
7
7
  attr_accessor :name, :parsed_page, :uri, :parent
8
8
 
9
- def initialize(options={})
10
- self.name = options[:name] if options.include? :name
11
- self.uri = options[:uri] if options.include? :uri
12
- @connect = Wiki::Api::Connect.new uri: uri
13
- end
14
-
15
- def connect
16
- @connect
9
+ def initialize(options = {})
10
+ self.name = options[:name] if options.include?(:name)
11
+ self.uri = options[:uri] if options.include?(:uri)
12
+ @connect = Wiki::Api::Connect.new(uri:)
17
13
  end
18
14
 
15
+ attr_reader :connect
19
16
 
20
17
  # collect all headlines, keep original page formatting
21
18
  def root_headline
22
- self.parse_blocks
19
+ parse_blocks
23
20
  end
24
21
 
25
22
  # # collect headlines by given name, this will flatten the nested headlines
@@ -30,10 +27,9 @@ module Wiki
30
27
  # self.parse_blocks(headline_name)
31
28
  # end
32
29
 
33
-
34
30
  def to_html
35
- self.load_page!
36
- self.parsed_page.to_xhtml indent: 3, indent_text: " "
31
+ load_page!
32
+ parsed_page.to_xhtml(indent: 3, indent_text: ' ')
37
33
  end
38
34
 
39
35
  def reset!
@@ -41,69 +37,66 @@ module Wiki
41
37
  end
42
38
 
43
39
  def load_page!
44
- self.parsed_page ||= @connect.page self.name
40
+ self.parsed_page ||= @connect.page(name)
45
41
  end
46
42
 
47
-
48
43
  # parse blocks
49
- def parse_blocks headline_name = nil
50
- self.load_page!
44
+ def parse_blocks(headline_name = nil)
45
+ load_page!
51
46
  result = {}
52
47
 
53
48
  # get headline nodes by span class
54
- xs = self.parsed_page.xpath("//span[@class='mw-headline']")
49
+ headlines = self.parsed_page.xpath("//span[@class='mw-headline']")
55
50
 
56
51
  # filter single headline by name (ignore case)
57
- xs = self.filter_headline xs, headline_name unless headline_name.nil?
52
+ headlines = filter_headline(headlines, headline_name) unless headline_name.nil?
58
53
 
59
54
  # NOTE: first_part has no id attribute and thus cannot be filtered or processed within xpath (xs)
60
- if headline_name.nil? || headline_name.start_with?(self.name.downcase)
61
- x = self.first_part
62
- result[self.name] ||= []
63
- result[self.name] << (self.collect_elements(x.parent))
55
+ if headline_name.nil? || headline_name.start_with?(name.downcase)
56
+ x = first_part
57
+ result[name] ||= []
58
+ result[name] << (collect_elements(x.parent))
64
59
  end
65
60
 
66
61
  # append all blocks
67
- xs.each do |x|
68
- headline = x.attributes["id"].value
69
- elements = self.collect_elements x.parent.next
70
- result[headline] ||= []
71
- result[headline] << elements
62
+ headlines.each do |headline|
63
+ headline_value = headline.attributes['id'].value
64
+ elements = collect_elements(headline.parent.next)
65
+ result[headline_value] ||= []
66
+ result[headline_value] << elements
72
67
  end
73
68
 
74
69
  # create root object
75
- PageHeadline.new parent: self, name: result.first[0], headlines: result, level: 0
70
+ PageHeadline.new(parent: self, name: result.first[0], headlines: result, level: 0)
76
71
  end
77
72
 
78
73
  # harvest first part of the page (missing heading and class="mw-headline")
79
74
  def first_part
80
- self.parsed_page ||= @connect.page self.name
81
- self.parsed_page.search("p").first.children.first
75
+ self.parsed_page ||= @connect.page(name)
76
+ self.parsed_page.search('p').first.children.first
82
77
  end
83
78
 
84
79
  # collect elements within headlines (not nested properties, but next elements)
85
- def collect_elements element
80
+ def collect_elements(element)
86
81
  # capture first element name
87
82
  elements = []
88
83
  # iterate text until next headline
89
- while true do
84
+ loop do
90
85
  elements << element
91
86
  element = element.next
92
- break if element.nil? || element.to_html.include?("class=\"mw-headline\"")
87
+ break if element.nil? || element.to_html.include?('class="mw-headline"')
93
88
  end
94
89
  elements
95
90
  end
96
91
 
97
- def filter_headline xs, headline_name
92
+ def filter_headline(xs, headline_name)
98
93
  # transform name to a wiki_id (downcase and space replace with underscore)
99
- headline_name = headline_name.downcase.gsub(" ", "_")
94
+ headline_name = headline_name.downcase.gsub(' ', '_')
100
95
  # reject not matching id's
101
- xs.reject do |t|
102
- !t.attributes["id"].value.downcase.start_with?(headline_name)
96
+ xs.select do |t|
97
+ t.attributes['id'].value.downcase.start_with?(headline_name)
103
98
  end
104
99
  end
105
-
106
100
  end
107
-
108
101
  end
109
- end
102
+ end