History

Finish Nim scraper

Thibaut Courouble committed 9 years ago

Commit a4ba32e1 parent 09eea6617 files · +151 −135Browse files

Showing the changes to lib/docs (3 of 17 files). Show all

Unified · Split

3 files
  1. lib/docs/filters/nim/clean_html.rb +46 −12
  2. lib/docs/filters/nim/entries.rb +44 −31
  3. lib/docs/scrapers/nim.rb +8 −8
lib/docs/filters/nim/clean_html.rb+46−12
@@ -4,26 +4,60 @@ module Docs · 3 unmodified lines
44 def call
55 @doc = at_css('#documentId .container')
66
7− css('.docinfo').remove
7+ css('.docinfo', '.footer', 'blockquote > p:empty', '.link-seesrc').remove
88
9− content = at_css('#content')
10− if content != nil
11− at_css('#content').remove_attribute('class')
12− @doc.add_child(at_css('#content').inner_html)
9+ css('h1:not(.title), h2, h3, h4').each do |node|
10+ node.name = node.name.sub(/\d/) { |i| i.to_i + 1 }
1311 end
1412
15− css('> div.row').remove
13+ if content = at_css('#content')
14+ content.prepend_child at_css('h1.title')
15+ @doc = content
16+ end
1617
17− css('pre').each do |node|
18− node['data-language'] = 'nim'
18+ if root_page?
19+ at_css('h1').content = 'Nim Documentation'
1920 end
2021
21− # remove link from headers
2222 css('h1 > a', 'h2 > a', 'h3 > a', 'h4 > a').each do |node|
23− node.parent['id'] = node['id']
24− node.parent.content = node.content
23+ node.parent['id'] = node['id'] if node['id']
24+ node.before(node.children).remove
25+ end
26+
27+ css('a[name]').each do |node|
28+ node.next_element['id'] = node['name']
29+ node.remove
30+ end
31+
32+ css('pre').each do |node|
33+ node.content = node.content.strip
34+ node['data-language'] = 'nim' unless node.content =~ /\A[\w\-\_\:\=\ ]+\z/
2535 end
26−
36+
37+ css('tt').each do |node|
38+ node.name = 'code'
39+ end
40+
41+ css('cite').each do |node|
42+ node.name = 'em'
43+ end
44+
45+ css('.section').each do |node|
46+ node.first_element_child['id'] = node['id'] if node['id']
47+ node.before(node.children).remove
48+ end
49+
50+ css('span.pre').each do |node|
51+ node.before(node.children).remove
52+ end
53+
54+ css('blockquote > pre:only-child', 'blockquote > dl:only-child', 'blockquote > table').each do |node|
55+ node.parent.before(node.parent.children).remove
56+ end
57+
58+ css('a', 'dl', 'table', 'code').remove_attr('class')
59+ css('table').remove_attr('border')
60+
2761 doc
2862 end
2963 end
lib/docs/filters/nim/entries.rb+44−31
@@ -1,49 +1,62 @@
11 module Docs
22 class Nim
33 class EntriesFilter < Docs::EntriesFilter
4− def get_type
5− at_css('h1').content
4+ def get_name
5+ name = at_css('h1').content
6+ name.remove! 'Module '
7+ name.remove! ' User Guide'
8+ name.remove! ' User\'s manual'
9+ name.remove! %r{ \-.*}
10+ name.strip!
11+ name
612 end
713
8− def get_name
9− at_css('h1').content
14+ def get_type
15+ if name.include?('Tutorial')
16+ 'Tutorial'
17+ elsif slug == 'manual'
18+ 'Manual'
19+ elsif at_css('h1').content.include?('Module ')
20+ name
21+ else
22+ 'Reference'
23+ end
1024 end
1125
1226 def additional_entries
1327 entries = []
14− if get_name.start_with? 'Module '
15− module_name = get_name[7..-1]
16− css('div .section').map do |node|
17− section_node = node.at_css('h1 a')
18− if section_node != nil
19− section_name = section_node.content.strip
20− items_node = node.at_css('dl.item')
21− if items_node != nil
22− items_node.css('dt a').map do |item_node|
23− item_name = item_node['name']
24− if item_name.include? ','
25− item_name = item_name.sub(',', '(') + ')'
26− end
27− entries << [module_name + '.' + item_name, item_node.parent['id']]
28− end
29− end
28+
29+ if at_css('h1').content.include?('Module ')
30+ css('#toc-list > li > .simple-toc-section').each do |node|
31+ type = node.previous_element.content.strip
32+
33+ node.css('a.reference:not(.reference-toplevel)').each do |n|
34+ n.css('span').remove
35+ name = n.content.strip
36+ name << '()' if (type == 'Procs' || type == 'Templates') && !name.include?('`')
37+ name.remove! '`'
38+ name.prepend "#{self.name}."
39+ id = n['href'].remove('#')
40+ entries << [name, id] unless entries.any? { |e| e[0] == name }
3041 end
3142 end
32− else
33− css('h1', 'h2', 'h3').map do |node|
34− id = node['id']
43+ elsif slug == 'manual'
44+ css('#toc-list > li > a').each do |node|
3545 name = node.content.strip
36− if id != nil
37− entries << [name, id]
38− else
39− a = node.at_css('a')
40− if a != nil
41− id = a['id']
42− entries << [name, id]
43− end
46+ next if name.start_with?('About')
47+ id = node['href'].remove('#')
48+ entries << [name, id]
49+ end
50+
51+ css('#toc-list > ul').each do |node|
52+ type = node.previous_element.content.strip
53+
54+ node.css('> li > a').each do |n|
55+ entries << [n.content.strip, n['href'].remove('#'), "Manual: #{type}"]
4456 end
4557 end
4658 end
59+
4760 entries
4861 end
4962 end
lib/docs/scrapers/nim.rb+8−8
@@ -2,20 +2,20 @@ module Docs · 1 unmodified line
22 class Nim < UrlScraper
33 self.type = 'nim'
44 self.release = '0.17.0'
5+ self.base_url = 'https://nim-lang.org/docs/'
6+ self.root_path = 'overview.html'
57 self.links = {
68 home: 'https://nim-lang.org/',
79 code: 'https://github.com/nim-lang/Nim'
810 }
9− self.base_url = 'https://nim-lang.org/'
10− self.root_path = 'docs/overview.html'
1111
12− html_filters.push 'nim/entries', 'nim/clean_html'
13−
14− options[:skip] = %w(cdn-cgi/l/email-protection docs/theindex.html docs/docgen.txt)
12+ html_filters.push 'nim/entries', 'nim/clean_html'
13+
14+ options[:skip] = %w(theindex.html docgen.txt)
15+
1516 options[:attribution] = <<-HTML
1617 &copy; 2006&ndash;2017 Andreas Rumpf<br>
17− All rights reserved. Licensed under the MIT License.
18+ Licensed under the MIT License.
1819 HTML
19−
2020 end
21−end
21+end