Showing the changes to lib/docs (73 of 175 files). Show all
Unified · Split
| @@ -0,0 +1,74 @@ | |||
| 1 | module Docs | ||
| 2 | class Bash | ||
| 3 | class CleanHtmlFilter < Filter | ||
| 4 | def call | ||
| 5 | # Remove the navigation header and footer and the lines underneath and above it | ||
| 6 | at_css('.header + hr').remove | ||
| 7 | line_above = at_xpath('//div[@class="header"]/preceding::hr[1]') | ||
| 8 | line_above.remove unless line_above.nil? | ||
| 9 | css('.header').remove | ||
| 10 | |||
| 11 | # Remove chapter and section numbers from title | ||
| 12 | title_node = at_css('h1, h2, h3, h4, h5, h6') | ||
| 13 | title_node.content = title_node.content.gsub(/(\d+\.?)+/, '').strip | ||
| 14 | title_node.name = 'h1' | ||
| 15 | |||
| 16 | # Remove the "D. " from names like "D. Concept Index" and "D. Function Index" | ||
| 17 | title_node.content = title_node.content[3..-1] if title_node.content.start_with?("D. ") | ||
| 18 | |||
| 19 | # Remove columns containing a single space from tables | ||
| 20 | # In the original reference they are used to add width between two columns | ||
| 21 | xpath('//td[text()=" " and not(descendant::*)]').remove | ||
| 22 | |||
| 23 | # Add id's to additional entry nodes | ||
| 24 | css('dl > dt > code').each do |node| | ||
| 25 | # Only take the direct text (i.e. "<div>Hello <span>World</span></div>" becomes "Hello") | ||
| 26 | node['id'] = node.xpath('text()').to_s.strip | ||
| 27 | end | ||
| 28 | |||
| 29 | # Fix hashes of index entries so they link to the correct hash on the linked page | ||
| 30 | css('table[class^=index-] td[valign=top] > a').each do |node| | ||
| 31 | path = node['href'].split('#')[0] | ||
| 32 | hash = node.content | ||
| 33 | |||
| 34 | # Fix the index entries linking to the Special Parameters page | ||
| 35 | # There are multiple index entries that should link to the same paragraph on that page | ||
| 36 | # Example: the documentation for "$!" is equal to the documentation for "!" | ||
| 37 | if path.downcase.include?('special-parameters') | ||
| 38 | if hash.size > 1 && hash[0] == '$' | ||
| 39 | hash = hash[1..-1] | ||
| 40 | end | ||
| 41 | end | ||
| 42 | |||
| 43 | node['href'] = path + '#' + hash | ||
| 44 | end | ||
| 45 | |||
| 46 | # Fix index table letter hashes (the "Jump to" hashes) | ||
| 47 | css('table[class^=index-] th > a').each do |node| | ||
| 48 | node['id'] = node['name'] | ||
| 49 | end | ||
| 50 | |||
| 51 | # Remove the rows with a horizontal line in them from the index tables | ||
| 52 | css('td[colspan="4"]').remove | ||
| 53 | |||
| 54 | # Remove additional text from menu entry and index entry cells | ||
| 55 | css('td[valign=top]').each do |node| | ||
| 56 | link = node.at_css('a') | ||
| 57 | node.children = link unless link.nil? | ||
| 58 | end | ||
| 59 | |||
| 60 | css('tt', 'code', 'table').remove_attr('class') | ||
| 61 | |||
| 62 | css('tt').each do |node| | ||
| 63 | node.name = 'code' | ||
| 64 | end | ||
| 65 | |||
| 66 | css('pre').each do |node| | ||
| 67 | node.content = node.content | ||
| 68 | end | ||
| 69 | |||
| 70 | doc | ||
| 71 | end | ||
| 72 | end | ||
| 73 | end | ||
| 74 | end | ||
| @@ -0,0 +1,56 @@ | |||
| 1 | module Docs | ||
| 2 | class Bash | ||
| 3 | class EntriesFilter < Docs::EntriesFilter | ||
| 4 | def get_name | ||
| 5 | name = at_css('hr + a + *').content.gsub(/(\d+\.?)+/, '') | ||
| 6 | |||
| 7 | # Remove the "D. " from names like "D. Concept Index" and "D. Function Index" | ||
| 8 | name = name[3..-1] if name.start_with?('D. ') | ||
| 9 | |||
| 10 | name | ||
| 11 | end | ||
| 12 | |||
| 13 | def get_type | ||
| 14 | return 'Manual: Appendices' if name.start_with?('Appendix') | ||
| 15 | return 'Manual: Indexes' if at_css('a[rel=up]').content.include?("Index") | ||
| 16 | "Manual" | ||
| 17 | end | ||
| 18 | |||
| 19 | def additional_entries | ||
| 20 | entry_type = { | ||
| 21 | "Function Index" => "Functions", | ||
| 22 | "Index of Shell Builtin Commands" => "Builtin Commands", | ||
| 23 | "Index of Shell Reserved Words" => "Reserved Words", | ||
| 24 | "Parameter and Variable Index" => "Parameters and Variables" | ||
| 25 | }[name] | ||
| 26 | |||
| 27 | # Only extract additional entries from certain index pages | ||
| 28 | return [] if entry_type.nil? | ||
| 29 | |||
| 30 | entries = [] | ||
| 31 | |||
| 32 | css('table[class^=index-] td[valign=top] > a').each_slice(2) do |entry_node, section_node| | ||
| 33 | entry_name = entry_node.content | ||
| 34 | |||
| 35 | page = section_node['href'].split('#')[0] | ||
| 36 | hash = entry_name | ||
| 37 | |||
| 38 | # The Special Parameters page has multiple additional entries which should link to the same paragraph | ||
| 39 | # Example: the documentation for "$!" is equal to the documentation for "!" | ||
| 40 | if page == 'special-parameters' | ||
| 41 | if hash.size > 1 && hash[0] == '$' | ||
| 42 | hash = hash[1..-1] | ||
| 43 | end | ||
| 44 | end | ||
| 45 | |||
| 46 | # Construct path to the page which the index links to | ||
| 47 | entry_path = '/html_node/' + page + '#' + hash | ||
| 48 | |||
| 49 | entries << [entry_name, entry_path, entry_type] | ||
| 50 | end | ||
| 51 | |||
| 52 | entries | ||
| 53 | end | ||
| 54 | end | ||
| 55 | end | ||
| 56 | end | ||
| @@ -0,0 +1,66 @@ | |||
| 1 | module Docs | ||
| 2 | class Dart | ||
| 3 | class CleanHtmlFilter < Filter | ||
| 4 | def call | ||
| 5 | # Move the title into the main content node in the v1 docs | ||
| 6 | title = at_css('h1.title') | ||
| 7 | if title | ||
| 8 | name = title.children.last.content.strip | ||
| 9 | kind = title.at_css('.kind').content | ||
| 10 | at_css('.main-content').prepend_child("<h1>#{name} #{kind}</h1>") | ||
| 11 | end | ||
| 12 | |||
| 13 | # Add a title to the homepage of the v2 docs | ||
| 14 | if subpath == 'index.html' && at_css('.main-content > h1').nil? | ||
| 15 | at_css('.main-content').prepend_child('<h1>Dart SDK</h1>') | ||
| 16 | end | ||
| 17 | |||
| 18 | # Add the library to the main content (it is not always visible in the menu entry) | ||
| 19 | breadcrumbs = at_css('.breadcrumbs').css('li:not(.self-crumb) > a') | ||
| 20 | if breadcrumbs.length > 1 | ||
| 21 | library = breadcrumbs[1].content | ||
| 22 | |||
| 23 | # Generate the link to the homepage of the library | ||
| 24 | with_hypens = library.gsub(/:/, '-') | ||
| 25 | location = "#{'../' * subpath.count('/')}#{with_hypens}/#{with_hypens}-library" | ||
| 26 | link = "<a href=\"#{location}\" class=\"_links-link\">#{library}</span>" | ||
| 27 | |||
| 28 | # Add the link to the main title, just like how the "Homepage" and "Source code" links appear | ||
| 29 | at_css('.main-content').prepend_child("<p class=\"_links\">#{link}</p>") | ||
| 30 | end | ||
| 31 | |||
| 32 | # Extract the actual content | ||
| 33 | # We can't use options[:container] here because the entries filter uses the breadcrumbs node | ||
| 34 | @doc = at_css('.main-content') | ||
| 35 | |||
| 36 | # Move the features (i.e. "read-only, inherited") into the blue header | ||
| 37 | css('.features').each do |node| | ||
| 38 | header = node.xpath('parent::dd/preceding::dt').last | ||
| 39 | header.add_child node unless header.nil? | ||
| 40 | end | ||
| 41 | |||
| 42 | css('section').each do |node| | ||
| 43 | if node['id'] && node.first_element_child | ||
| 44 | node.first_element_child['id'] ||= node['id'] | ||
| 45 | end | ||
| 46 | |||
| 47 | node.before(node.children).remove | ||
| 48 | end | ||
| 49 | |||
| 50 | css('span').each do |node| | ||
| 51 | node.before(node.children).remove | ||
| 52 | end | ||
| 53 | |||
| 54 | # Make code blocks detectable by Prism | ||
| 55 | css('pre').each do |node| | ||
| 56 | node['data-language'] = 'dart' | ||
| 57 | node.content = node.content | ||
| 58 | end | ||
| 59 | |||
| 60 | css('.properties', '.property', '.callables', '.callable').remove_attr('class') | ||
| 61 | |||
| 62 | doc | ||
| 63 | end | ||
| 64 | end | ||
| 65 | end | ||
| 66 | end | ||
| @@ -0,0 +1,42 @@ | |||
| 1 | module Docs | ||
| 2 | class Dart | ||
| 3 | class EntriesFilter < Docs::EntriesFilter | ||
| 4 | def get_name | ||
| 5 | title = at_css('h1.title') | ||
| 6 | if title # v1 | ||
| 7 | name = title.element_children.last.content.strip | ||
| 8 | kind = title.at_css('.kind').content | ||
| 9 | else # v2 | ||
| 10 | title = at_css('.main-content > h1') | ||
| 11 | name = title.content[/(.*)( )/, 1].split(' top-level')[0] | ||
| 12 | kind = title.content[/(.*)( )(.+)/, 3] | ||
| 13 | end | ||
| 14 | |||
| 15 | breadcrumbs = at_css('.breadcrumbs').css('li:not(.self-crumb) > a') | ||
| 16 | first_part = '' | ||
| 17 | |||
| 18 | if breadcrumbs.length == 2 && !kind.include?('class') | ||
| 19 | first_part = breadcrumbs[1].content | ||
| 20 | elsif breadcrumbs.length == 3 | ||
| 21 | first_part = breadcrumbs[2].content | ||
| 22 | end | ||
| 23 | |||
| 24 | separator = '' | ||
| 25 | |||
| 26 | unless first_part.empty? | ||
| 27 | if kind.include?('class') | ||
| 28 | separator = ':' | ||
| 29 | else | ||
| 30 | separator = '.' | ||
| 31 | end | ||
| 32 | end | ||
| 33 | |||
| 34 | "#{first_part}#{separator}#{name}" | ||
| 35 | end | ||
| 36 | |||
| 37 | def get_type | ||
| 38 | at_css('.breadcrumbs > li:nth-child(2)').content.split(' ')[0] | ||
| 39 | end | ||
| 40 | end | ||
| 41 | end | ||
| 42 | end | ||
| @@ -26,6 +26,7 @@ module Docs · 25 unmodified lines | |||
| 26 | 'Geometry' => 'Geometry', | 26 | 'Geometry' => 'Geometry', |
| 27 | 'High Resolution Time' => 'Performance', | 27 | 'High Resolution Time' => 'Performance', |
| 28 | 'Intersection' => 'Intersection Observer', | 28 | 'Intersection' => 'Intersection Observer', |
| 29 | 'Media Capabilities' => 'Media', | ||
| 29 | 'Media Capture' => 'Media', | 30 | 'Media Capture' => 'Media', |
| 30 | 'Media Session' => 'Media', | 31 | 'Media Session' => 'Media', |
| 31 | 'Media Source' => 'Media', | 32 | 'Media Source' => 'Media', |
| @@ -99,6 +100,7 @@ module Docs · 67 unmodified lines | |||
| 99 | 'MediaSession' => 'Media Session', | 100 | 'MediaSession' => 'Media Session', |
| 100 | 'MediaTrack' => 'Media Streams', | 101 | 'MediaTrack' => 'Media Streams', |
| 101 | 'Message' => 'Channel Messaging', | 102 | 'Message' => 'Channel Messaging', |
| 103 | 'Mutation' => 'DOM', | ||
| 102 | 'NamedNode' => 'Nodes', | 104 | 'NamedNode' => 'Nodes', |
| 103 | 'Node' => 'Nodes', | 105 | 'Node' => 'Nodes', |
| 104 | 'Notification' => 'Notification', | 106 | 'Notification' => 'Notification', |
| @@ -116,6 +118,7 @@ module Docs · 11 unmodified lines | |||
| 116 | 'Shadow' => 'Shadow DOM', | 118 | 'Shadow' => 'Shadow DOM', |
| 117 | 'StaticRange' => 'Range', | 119 | 'StaticRange' => 'Range', |
| 118 | 'Streams' => 'Media Streams', | 120 | 'Streams' => 'Media Streams', |
| 121 | 'StyleProperty' => 'CSS', | ||
| 119 | 'StyleSheet' => 'CSS', | 122 | 'StyleSheet' => 'CSS', |
| 120 | 'Stylesheet' => 'CSS', | 123 | 'Stylesheet' => 'CSS', |
| 121 | 'SVG' => 'SVG', | 124 | 'SVG' => 'SVG', |
| @@ -59,6 +59,7 @@ module Docs · 58 unmodified lines | |||
| 59 | 59 | ||
| 60 | css('pre').each do |node| | 60 | css('pre').each do |node| |
| 61 | node['data-language'] = 'elixir' | 61 | node['data-language'] = 'elixir' |
| 62 | node.content = node.content | ||
| 62 | end | 63 | end |
| 63 | end | 64 | end |
| 64 | end | 65 | end |
| @@ -42,6 +42,11 @@ module Docs · 41 unmodified lines | |||
| 42 | node.parent.content = node.parent.content | 42 | node.parent.content = node.parent.content |
| 43 | end | 43 | end |
| 44 | 44 | ||
| 45 | # Fix links to the method reference | ||
| 46 | css('a').each do |node| | ||
| 47 | node['href'] = node['href'].sub('4x/api', 'index') | ||
| 48 | end | ||
| 49 | |||
| 45 | doc | 50 | doc |
| 46 | end | 51 | end |
| 47 | end | 52 | end |
| @@ -0,0 +1,27 @@ | |||
| 1 | module Docs | ||
| 2 | class Graphite | ||
| 3 | class CleanHtmlFilter < Filter | ||
| 4 | def call | ||
| 5 | # Remove the paragraph icon after all headers | ||
| 6 | css('.headerlink').remove | ||
| 7 | |||
| 8 | css('dl.function > dt').each do |node| | ||
| 9 | node.content = node.content | ||
| 10 | end | ||
| 11 | |||
| 12 | css('.section').each do |node| | ||
| 13 | node.before(node.children).remove | ||
| 14 | end | ||
| 15 | |||
| 16 | css('div[class*="highlight-"]').each do |node| | ||
| 17 | node.content = node.content.strip | ||
| 18 | node.name = 'pre' | ||
| 19 | node['data-language'] = node['class'][/highlight\-(\w+)/, 1] | ||
| 20 | node.remove_attribute('class') | ||
| 21 | end | ||
| 22 | |||
| 23 | doc | ||
| 24 | end | ||
| 25 | end | ||
| 26 | end | ||
| 27 | end | ||
| @@ -0,0 +1,46 @@ | |||
| 1 | module Docs | ||
| 2 | class Graphite | ||
| 3 | class EntriesFilter < Docs::EntriesFilter | ||
| 4 | def get_name | ||
| 5 | at_css('h1').children[0].to_s | ||
| 6 | end | ||
| 7 | |||
| 8 | def get_type | ||
| 9 | get_name | ||
| 10 | end | ||
| 11 | |||
| 12 | def additional_entries | ||
| 13 | entries = [] | ||
| 14 | |||
| 15 | # Sections | ||
| 16 | css('.section > .section').each do |node| | ||
| 17 | title = node.at_css('h2, h3') | ||
| 18 | |||
| 19 | next if title.nil? | ||
| 20 | |||
| 21 | # Move the id attribute to the title | ||
| 22 | # If this is excluded, the complete section will be highlighted in yellow when someone navigates to it | ||
| 23 | title['id'] = node['id'] | ||
| 24 | node.remove_attribute('id') | ||
| 25 | |||
| 26 | parent_title_selector = "parent::div[@class='section']/preceding::#{title.name == 'h2' ? 'h1' : 'h2'}" | ||
| 27 | |||
| 28 | entries << [ | ||
| 29 | title.children[0].to_s, | ||
| 30 | title['id'], | ||
| 31 | title.xpath(parent_title_selector).last.children[0].to_s | ||
| 32 | ] | ||
| 33 | end | ||
| 34 | |||
| 35 | # Functions | ||
| 36 | css('dl.function > dt').each do |node| | ||
| 37 | name = node.at_css('.descname').content | ||
| 38 | name << '()' | ||
| 39 | entries << [name, node['id'], 'Functions'] | ||
| 40 | end | ||
| 41 | |||
| 42 | entries | ||
| 43 | end | ||
| 44 | end | ||
| 45 | end | ||
| 46 | end | ||
| @@ -0,0 +1,44 @@ | |||
| 1 | module Docs | ||
| 2 | class Handlebars | ||
| 3 | class CleanHtmlFilter < Filter | ||
| 4 | def call | ||
| 5 | # Remove the t-shirt shop advertisement | ||
| 6 | css('#callout').remove | ||
| 7 | |||
| 8 | # The title filter is used to add titles to pages without one, remove original headers | ||
| 9 | css('h1').remove | ||
| 10 | |||
| 11 | # Remove the link to the issue tracker | ||
| 12 | css('.issue-tracker').remove | ||
| 13 | |||
| 14 | css('pre').each do |node| | ||
| 15 | # Remove nested nodes inside pre tags | ||
| 16 | node.content = node.content | ||
| 17 | |||
| 18 | # Add syntax highlighting | ||
| 19 | node['data-language'] = 'html' | ||
| 20 | end | ||
| 21 | |||
| 22 | # Transform 'Learn More' links to headers in the "Getting Started" part of the homepage | ||
| 23 | # If this step is skipped, that section looks cluttered with 4 sub-sections without any dividers | ||
| 24 | css('#getting-started + .contents a.more-info').each do |node| | ||
| 25 | clone = node.clone | ||
| 26 | |||
| 27 | # Move it to the top of the sub-section | ||
| 28 | node.parent.prepend_child(clone) | ||
| 29 | |||
| 30 | # Turn it into a header | ||
| 31 | clone.name = 'h3' | ||
| 32 | |||
| 33 | # Remove the "Learn More: " part | ||
| 34 | clone.content = clone.content[12..-1] | ||
| 35 | end | ||
| 36 | |||
| 37 | # Remove class attributes from div elements to reduce file size | ||
| 38 | css('div').remove_attr('class') | ||
| 39 | |||
| 40 | doc | ||
| 41 | end | ||
| 42 | end | ||
| 43 | end | ||
| 44 | end | ||
| @@ -0,0 +1,19 @@ | |||
| 1 | module Docs | ||
| 2 | class Handlebars | ||
| 3 | class EntriesFilter < Docs::EntriesFilter | ||
| 4 | def get_name | ||
| 5 | subpath[0..-6].titleize | ||
| 6 | end | ||
| 7 | |||
| 8 | def get_type | ||
| 9 | name | ||
| 10 | end | ||
| 11 | |||
| 12 | def additional_entries | ||
| 13 | css('h2, h3').to_a.map do |node| | ||
| 14 | [node.content.strip, node['id'], root_page? ? 'Manual' : nil] | ||
| 15 | end | ||
| 16 | end | ||
| 17 | end | ||
| 18 | end | ||
| 19 | end | ||
| @@ -0,0 +1,24 @@ | |||
| 1 | module Docs | ||
| 2 | class Puppeteer | ||
| 3 | class CleanHtmlFilter < Filter | ||
| 4 | def call | ||
| 5 | at_css('h1').content = 'Puppeteer Documentation' | ||
| 6 | |||
| 7 | # None of the elements to remove have classes, so the order of the remove calls is trivial | ||
| 8 | |||
| 9 | # Remove links to previous versions of the reference | ||
| 10 | at_css('h1 + ul').remove | ||
| 11 | |||
| 12 | # Remove table of contents | ||
| 13 | at_css('h1 + h5').remove | ||
| 14 | at_css('h1 + ul').remove | ||
| 15 | |||
| 16 | # Make headers bigger by transforming them into a bigger variant | ||
| 17 | css('h3').each { |node| node.name = 'h2' } | ||
| 18 | css('h4').each { |node| node.name = 'h3' } | ||
| 19 | |||
| 20 | doc | ||
| 21 | end | ||
| 22 | end | ||
| 23 | end | ||
| 24 | end | ||
| @@ -0,0 +1,41 @@ | |||
| 1 | module Docs | ||
| 2 | class Puppeteer | ||
| 3 | class EntriesFilter < Docs::EntriesFilter | ||
| 4 | # The entire reference is one big page, so get_name and get_type are not necessary | ||
| 5 | |||
| 6 | def additional_entries | ||
| 7 | entries = [] | ||
| 8 | |||
| 9 | css('h3').each do |node| | ||
| 10 | name = node.content.split(': ').last | ||
| 11 | |||
| 12 | # Find all sub-items (all h4's between the current h3 and the next) | ||
| 13 | current = node.next | ||
| 14 | while !current.nil? && current.name != 'h3' | ||
| 15 | if current.name == 'h4' | ||
| 16 | current_name = current.content | ||
| 17 | |||
| 18 | # Prepend events with the class name | ||
| 19 | if current_name.start_with?('event: ') | ||
| 20 | current_name = "#{name} event: #{current_name[/'(.*)'/, 1]}" | ||
| 21 | end | ||
| 22 | |||
| 23 | # Remove arguments from functions | ||
| 24 | if current_name.include?('(') | ||
| 25 | current_name = current_name.split('(')[0] + '()' | ||
| 26 | end | ||
| 27 | |||
| 28 | entries << [current_name, current['id'], name] | ||
| 29 | end | ||
| 30 | |||
| 31 | current = current.next | ||
| 32 | end | ||
| 33 | |||
| 34 | entries << [name, node['id'], name] | ||
| 35 | end | ||
| 36 | |||
| 37 | entries | ||
| 38 | end | ||
| 39 | end | ||
| 40 | end | ||
| 41 | end | ||
| @@ -0,0 +1,102 @@ | |||
| 1 | module Docs | ||
| 2 | class Pygame | ||
| 3 | class CleanHtmlFilter < Filter | ||
| 4 | def call | ||
| 5 | @doc = at_css '.body' | ||
| 6 | |||
| 7 | if root_page? | ||
| 8 | # remove unneeded stuff | ||
| 9 | at_css('.modindex-jumpbox').remove | ||
| 10 | css('[role="navigation"],.pcap, .cap, .footer').remove | ||
| 11 | # table -> list | ||
| 12 | list = at_css('table') | ||
| 13 | list.replace(list.children) | ||
| 14 | list.name = 'ul' | ||
| 15 | css('tr').each do |row| | ||
| 16 | row.name = 'li' | ||
| 17 | row.remove_attribute('class') | ||
| 18 | end | ||
| 19 | at_css('h1').content = 'Pygame' | ||
| 20 | return doc | ||
| 21 | end | ||
| 22 | |||
| 23 | # remove unwanted stuff | ||
| 24 | # .headerlink => ¶ after links | ||
| 25 | # .toc => table of content | ||
| 26 | # .tooltip-content => tooltips after links to functions | ||
| 27 | css('table.toc.docutils, .headerlink, .tooltip-content').remove | ||
| 28 | |||
| 29 | # Remove wrapper .section | ||
| 30 | section = at_css('.section') | ||
| 31 | definition = at_css('.definition') | ||
| 32 | definition['id'] = section['id'] | ||
| 33 | section.replace(section.children) | ||
| 34 | |||
| 35 | # Format code for it be highlighted | ||
| 36 | css('.highlight-default.notranslate').each do |node| | ||
| 37 | pre = node.at_css('pre') | ||
| 38 | node.replace(pre) | ||
| 39 | # gets rid of the already existing syntax highlighting | ||
| 40 | pre.content = pre.content | ||
| 41 | pre['class'] = 'language-python' | ||
| 42 | pre['data-language'] = "python" | ||
| 43 | end | ||
| 44 | |||
| 45 | # change descriptions of functions/attributes to blockquote | ||
| 46 | css('.line-block').each do |node| | ||
| 47 | node.name = 'blockquote' | ||
| 48 | end | ||
| 49 | |||
| 50 | # change functions | ||
| 51 | css('.definition').each do |d| | ||
| 52 | |||
| 53 | # the header is the function/attribute name. It might look something like | ||
| 54 | # this: | ||
| 55 | # pygame.image.load() | ||
| 56 | # It'll end up being something like this: | ||
| 57 | # pygame.image.load(filename) -> Surface | ||
| 58 | # pygame.image.load(fileobj, namehint="") -> Surface | ||
| 59 | |||
| 60 | header = d.at_css('dt.title') | ||
| 61 | if d['class'].include?('class') or d['class'].include?('module') | ||
| 62 | header.name = 'h1' | ||
| 63 | @section = header.content.strip | ||
| 64 | else | ||
| 65 | header.name = 'h3' | ||
| 66 | end | ||
| 67 | # save the original header | ||
| 68 | initial_header = header.content.strip | ||
| 69 | # save the real name for the entries | ||
| 70 | header['data-name'] = initial_header | ||
| 71 | # empty the header | ||
| 72 | if header.name == 'h3' | ||
| 73 | header.inner_html = '' | ||
| 74 | end | ||
| 75 | # to replace it with the signatures | ||
| 76 | next_el = header.next_element | ||
| 77 | signatures = next_el.css('.signature') | ||
| 78 | signatures.each do |sig| | ||
| 79 | sig.name = 'code' | ||
| 80 | if header.name == 'h3' | ||
| 81 | sig.parent = header | ||
| 82 | # the signature don't contain pygame.module. I think it's better | ||
| 83 | # to display them, as it avoids confusion with methods (have a | ||
| 84 | # look at the pygame.Rect page) | ||
| 85 | if initial_header.start_with?(@section) | ||
| 86 | sig.content = @section + '.' + sig.text | ||
| 87 | end | ||
| 88 | # seperate the signatures on different lines. | ||
| 89 | header.add_child "<br>" | ||
| 90 | end | ||
| 91 | end | ||
| 92 | end | ||
| 93 | |||
| 94 | css('> dl', '> dl > dd', 'h1 code').each do |node| | ||
| 95 | node.before(node.children).remove | ||
| 96 | end | ||
| 97 | |||
| 98 | doc | ||
| 99 | end | ||
| 100 | end | ||
| 101 | end | ||
| 102 | end | ||
| @@ -0,0 +1,29 @@ | |||
| 1 | module Docs | ||
| 2 | class Pygame | ||
| 3 | class EntriesFilter < Docs::EntriesFilter | ||
| 4 | def get_name | ||
| 5 | at_css('h1').content.remove('pygame.') | ||
| 6 | end | ||
| 7 | |||
| 8 | def get_type | ||
| 9 | at_css('h1').content | ||
| 10 | end | ||
| 11 | |||
| 12 | def additional_entries | ||
| 13 | return [] if root_page? | ||
| 14 | |||
| 15 | css('h1, h2, h3').each_with_object [] do |node, entries| | ||
| 16 | name = node['id'] || node['data-name'] | ||
| 17 | |||
| 18 | if node.parent['class'].include?('function') or node.parent['class'].include?('method') | ||
| 19 | name << '()' | ||
| 20 | end | ||
| 21 | |||
| 22 | name.remove!('pygame.') | ||
| 23 | |||
| 24 | entries << [name, node['id']] unless name == self.name | ||
| 25 | end | ||
| 26 | end | ||
| 27 | end | ||
| 28 | end | ||
| 29 | end | ||
| @@ -15,15 +15,17 @@ module Docs · 14 unmodified lines | |||
| 15 | 15 | ||
| 16 | def other | 16 | def other |
| 17 | css('h1').each do |node| | 17 | css('h1').each do |node| |
| 18 | node.content = node.content.sub!(/\A[\d\.]+/) do |str| | 18 | node.content = node.content.sub(/\A[\d\.]+/) do |str| |
| 19 | rgx = /\A#{str}/ | 19 | rgx = /\A#{str}/ |
| 20 | @levelRegexp = @levelRegexp ? Regexp.union(@levelRegexp, rgx) : rgx | 20 | @levelRegexp = @levelRegexp ? Regexp.union(@levelRegexp, rgx) : rgx |
| 21 | '' | 21 | '' |
| 22 | end | 22 | end |
| 23 | end | 23 | end |
| 24 | 24 | ||
| 25 | css('h2', 'h3', 'h4').each do |node| | 25 | unless @levelRegexp.nil? |
| 26 | node.inner_html = node.inner_html.remove @levelRegexp | 26 | css('h2', 'h3', 'h4').each do |node| |
| 27 | node.inner_html = node.inner_html.remove @levelRegexp | ||
| 28 | end | ||
| 27 | end | 29 | end |
| 28 | end | 30 | end |
| 29 | end | 31 | end |
| @@ -2,16 +2,18 @@ module Docs · 1 unmodified line | |||
| 2 | class Python | 2 | class Python |
| 3 | class EntriesV3Filter < Docs::EntriesFilter | 3 | class EntriesV3Filter < Docs::EntriesFilter |
| 4 | REPLACE_TYPES = { | 4 | REPLACE_TYPES = { |
| 5 | 'Cryptographic' => 'Cryptography', | 5 | 'contextvars — Context Variables' => 'Context Variables', |
| 6 | 'Custom Interpreters' => 'Interpreters', | 6 | 'Cryptographic' => 'Cryptography', |
| 7 | 'Data Compression & Archiving' => 'Data Compression', | 7 | 'Custom Interpreters' => 'Interpreters', |
| 8 | 'Generic Operating System' => 'Operating System', | 8 | 'Data Compression & Archiving' => 'Data Compression', |
| 9 | 'Graphical User Interfaces with Tk' => 'Tk', | 9 | 'email — An email & MIME handling package' => 'Email', |
| 10 | 'Internet Data Handling' => 'Internet Data', | 10 | 'Generic Operating System' => 'Operating System', |
| 11 | 'Internet Protocols & Support' => 'Internet', | 11 | 'Graphical User Interfaces with Tk' => 'Tk', |
| 12 | 'Interprocess Communication & Networking' => 'Networking', | 12 | 'Internet Data Handling' => 'Internet Data', |
| 13 | 'Program Frameworks' => 'Frameworks', | 13 | 'Internet Protocols & Support' => 'Internet', |
| 14 | 'Structured Markup Processing Tools' => 'Structured Markup' } | 14 | 'Interprocess Communication & Networking' => 'Networking', |
| 15 | 'Program Frameworks' => 'Frameworks', | ||
| 16 | 'Structured Markup Processing Tools' => 'Structured Markup' } | ||
| 15 | 17 | ||
| 16 | def get_name | 18 | def get_name |
| 17 | name = at_css('h1').content | 19 | name = at_css('h1').content |
| @@ -0,0 +1,31 @@ | |||
| 1 | module Docs | ||
| 2 | class Qt | ||
| 3 | class CleanHtmlFilter < Filter | ||
| 4 | def call | ||
| 5 | # Remove unneeded elements | ||
| 6 | css('.copy-notice, .navigationbar, .headerNavi, .footerNavi, .sidebar, .toc, #ec_toggle', '.landingicons img', 'br').remove | ||
| 7 | |||
| 8 | # QML property/method header | ||
| 9 | css('.qmlproto').each do |node| | ||
| 10 | id = node.at_css('tr')['id'] | ||
| 11 | node.inner_html = node.at_css('td').inner_html | ||
| 12 | node.name = 'h3' | ||
| 13 | node['id'] = id | ||
| 14 | end | ||
| 15 | |||
| 16 | css('.main-rounded', '.content', '.line', '.context', '.descr', '.types', '.func', '.table', 'div:not([class])', '.landing', '.col-1', '.heading', '.qmlitem', '.qmldoc', 'div.pre').each do |node| | ||
| 17 | node.before(node.children).remove | ||
| 18 | end | ||
| 19 | |||
| 20 | css('pre').each do |node| | ||
| 21 | node.content = node.content | ||
| 22 | node['data-language'] = 'cpp' if node['class'].include?('cpp') | ||
| 23 | node['data-language'] = 'qml' if node['class'].include?('qml') | ||
| 24 | node.remove_attribute('class') | ||
| 25 | end | ||
| 26 | |||
| 27 | doc | ||
| 28 | end | ||
| 29 | end | ||
| 30 | end | ||
| 31 | end | ||
| @@ -0,0 +1,141 @@ | |||
| 1 | # frozen_string_literal: true | ||
| 2 | |||
| 3 | module Docs | ||
| 4 | class Qt | ||
| 5 | class EntriesFilter < Docs::EntriesFilter | ||
| 6 | def get_name | ||
| 7 | header = at_css('h1.title + .small-subtitle a') || at_css('h1.title') || at_css('.context h2') | ||
| 8 | name = header.content | ||
| 9 | name.sub! %r{ Class$}, ' (class)' | ||
| 10 | name.sub! %r{ QML Type$}, ' (QML type)' | ||
| 11 | name.sub! %r{ QML Basic Type$}, ' (QML basic type)' | ||
| 12 | |||
| 13 | # Add '(class)' to the class pages where the subtitle name is used (e.g. qset-const-iterator.html) | ||
| 14 | if at_css('h1.title').content.strip.end_with?(' Class') && !name.include?('(class)') | ||
| 15 | name = "#{name} (class) " | ||
| 16 | end | ||
| 17 | |||
| 18 | name | ||
| 19 | end | ||
| 20 | |||
| 21 | def get_type | ||
| 22 | breadcrumb = css('#main_title_bar + ul li') | ||
| 23 | category = if breadcrumb.length < 3 | ||
| 24 | then 'Qt'.dup | ||
| 25 | else breadcrumb.at(1).content | ||
| 26 | end | ||
| 27 | |||
| 28 | if category == 'Qt' | ||
| 29 | return 'Qt Platforms' if name.include?(' for ') || name == 'Qt Platform Abstraction' | ||
| 30 | return 'Qt Quick' if name == 'Qt Quick Test' || name == 'Qt Quick Test Reference Documentation' | ||
| 31 | |||
| 32 | alwaysInQt = ['Qt Configure Options', 'Qt Image Formats'] | ||
| 33 | category = name if name.start_with?('Qt ') && !alwaysInQt.include?(name) | ||
| 34 | end | ||
| 35 | |||
| 36 | qtPlatformsTypes = ['Qt Platform Headers', 'Qt Android Extras', 'Qt Mac Extras', 'Qt Windows Extras', 'Qt X11 Extras'] | ||
| 37 | return 'Qt Platforms' if qtPlatformsTypes.include?(category) | ||
| 38 | |||
| 39 | category.remove!(' Manual') | ||
| 40 | category | ||
| 41 | end | ||
| 42 | |||
| 43 | def include_default_entry? | ||
| 44 | name != 'All Classes' && name != 'All QML Types' | ||
| 45 | end | ||
| 46 | |||
| 47 | def additional_entries | ||
| 48 | entries = [] | ||
| 49 | titles = [] | ||
| 50 | |||
| 51 | className = at_css('h1.title').content.strip.remove(' Class') | ||
| 52 | displayedClassName = className | ||
| 53 | alternativeClassName = at_css('h1.title + .small-subtitle a') | ||
| 54 | displayedClassName = alternativeClassName.content if alternativeClassName | ||
| 55 | |||
| 56 | # Functions signatures | ||
| 57 | css('h3.fn').each do |node| | ||
| 58 | header = node.clone | ||
| 59 | |||
| 60 | # Skip typenames | ||
| 61 | next if header.content.strip.start_with?('typename ') | ||
| 62 | |||
| 63 | # Remove leading <a name=""> | ||
| 64 | header.children.css('a[name]').remove | ||
| 65 | |||
| 66 | # Remove leading <code> tag (virtual/static/… attributes) | ||
| 67 | code = header.children.first | ||
| 68 | code.remove if code.name == 'code' | ||
| 69 | |||
| 70 | # Remove leading ‘const’ | ||
| 71 | header.children.first.remove if header.content.strip.start_with?('const ') | ||
| 72 | |||
| 73 | # Remove return type | ||
| 74 | returnType = header.children.first | ||
| 75 | returnType.remove if returnType['class'] == 'type' | ||
| 76 | |||
| 77 | title = header.content.strip | ||
| 78 | |||
| 79 | # Remove leading '&'/'*' | ||
| 80 | title[0] = '' if title[0] == '&' || title[0] == '*' | ||
| 81 | |||
| 82 | # Ignore operator overloads | ||
| 83 | next if title.start_with?('operator') | ||
| 84 | |||
| 85 | # Remove function parameters | ||
| 86 | title.sub! %r{\(.*\)}, '()' | ||
| 87 | |||
| 88 | # Remove template generics | ||
| 89 | title.remove!(%r{^<.*> }) | ||
| 90 | |||
| 91 | # Remove ‘const’ at the end | ||
| 92 | title.remove!(%r{ const$}) | ||
| 93 | |||
| 94 | # Enum/typedef formatting | ||
| 95 | title.sub! %r{(enum|typedef) (.*)}, '\2 (\1)' | ||
| 96 | |||
| 97 | # Remove property type | ||
| 98 | title = "#{displayedClassName}::#{title}" if title.sub!(%r{ : .*$}, '') | ||
| 99 | |||
| 100 | # Replace the class name by the alternative class name if available | ||
| 101 | title = title.sub(className, displayedClassName) if alternativeClassName | ||
| 102 | |||
| 103 | unless titles.include?(title) # Remove duplicates (function overloading) | ||
| 104 | entries << [title, header['id']] | ||
| 105 | titles.push title | ||
| 106 | end | ||
| 107 | end | ||
| 108 | |||
| 109 | # QML properties/functions | ||
| 110 | qmlTypeName = at_css('h1.title').content.remove(' QML Type', '') | ||
| 111 | css('.qmlproto').each do |node| | ||
| 112 | title = node.content.strip | ||
| 113 | id = node.at_css('tr')['id'] | ||
| 114 | |||
| 115 | # Remove options | ||
| 116 | title.remove!(%r{^\[.*\] }) | ||
| 117 | |||
| 118 | # Remove function parameters | ||
| 119 | title.sub! %r{\(.*\)}, '()' | ||
| 120 | |||
| 121 | # Remove property type | ||
| 122 | title.remove!(%r{ : .*$}) | ||
| 123 | |||
| 124 | # Remove return type | ||
| 125 | title.remove!(%r{.* }) | ||
| 126 | |||
| 127 | # Remove return type | ||
| 128 | title.remove!(%r{.* }) | ||
| 129 | |||
| 130 | title = "#{qmlTypeName}.#{title.strip}" | ||
| 131 | unless titles.include?(title) # Remove duplicates (function overloading) | ||
| 132 | entries << [title, id] | ||
| 133 | titles.push(title) | ||
| 134 | end | ||
| 135 | end | ||
| 136 | |||
| 137 | entries | ||
| 138 | end | ||
| 139 | end | ||
| 140 | end | ||
| 141 | end | ||
| @@ -12,7 +12,7 @@ module Docs · 11 unmodified lines | |||
| 12 | when 'HDEL' then 'Hashes' | 12 | when 'HDEL' then 'Hashes' |
| 13 | when 'BLPOP' then 'Lists' | 13 | when 'BLPOP' then 'Lists' |
| 14 | when 'SADD' then 'Sets' | 14 | when 'SADD' then 'Sets' |
| 15 | when 'ZADD' then 'Sorted Sets' | 15 | when 'BZPOPMAX' then 'Sorted Sets' |
| 16 | when 'PSUBSCRIBE' then 'Pub/Sub' | 16 | when 'PSUBSCRIBE' then 'Pub/Sub' |
| 17 | when 'DISCARD' then 'Transactions' | 17 | when 'DISCARD' then 'Transactions' |
| 18 | when 'EVAL' then 'Scripting' | 18 | when 'EVAL' then 'Scripting' |
| @@ -21,6 +21,7 @@ module Docs · 2 unmodified lines | |||
| 21 | when 'PFADD' then 'HyperLogLog' | 21 | when 'PFADD' then 'HyperLogLog' |
| 22 | when 'CLUSTER ADDSLOTS' then 'Cluster' | 22 | when 'CLUSTER ADDSLOTS' then 'Cluster' |
| 23 | when 'GEOADD' then 'Geo' | 23 | when 'GEOADD' then 'Geo' |
| 24 | when 'XADD' then 'Stream' | ||
| 24 | else 'Miscellaneous' | 25 | else 'Miscellaneous' |
| 25 | end | 26 | end |
| 26 | end | 27 | end |
| @@ -2,10 +2,8 @@ module Docs · 1 unmodified line | |||
| 2 | class Rust | 2 | class Rust |
| 3 | class CleanHtmlFilter < Filter | 3 | class CleanHtmlFilter < Filter |
| 4 | def call | 4 | def call |
| 5 | puts subpath if at_css('#versioninfo') | ||
| 6 | |||
| 7 | if slug.start_with?('book') || slug.start_with?('reference') | 5 | if slug.start_with?('book') || slug.start_with?('reference') |
| 8 | @doc = at_css('#content') | 6 | @doc = at_css('#content main') |
| 9 | elsif slug == 'error-index' | 7 | elsif slug == 'error-index' |
| 10 | css('.error-undescribed').remove | 8 | css('.error-undescribed').remove |
| 11 | 9 | ||
| @@ -29,12 +27,16 @@ module Docs · 17 unmodified lines | |||
| 29 | 27 | ||
| 30 | css('.rusttest', '.test-arrow', 'hr').remove | 28 | css('.rusttest', '.test-arrow', 'hr').remove |
| 31 | 29 | ||
| 30 | css('.docblock.attributes').each do |node| | ||
| 31 | node.remove if node.content.include?('#[must_use]') | ||
| 32 | end | ||
| 33 | |||
| 32 | css('a.header').each do |node| | 34 | css('a.header').each do |node| |
| 33 | node.first_element_child['id'] = node['name'] | 35 | node.first_element_child['id'] = node['name'] || node['id'] |
| 34 | node.before(node.children).remove | 36 | node.before(node.children).remove |
| 35 | end | 37 | end |
| 36 | 38 | ||
| 37 | css('.docblock > h1').each { |node| node.name = 'h4' } | 39 | css('.docblock > h1:not(.section-header)').each { |node| node.name = 'h4' } |
| 38 | css('h2.section-header').each { |node| node.name = 'h3' } | 40 | css('h2.section-header').each { |node| node.name = 'h3' } |
| 39 | css('h1.section-header').each { |node| node.name = 'h2' } | 41 | css('h1.section-header').each { |node| node.name = 'h2' } |
| 40 | 42 | ||
| @@ -44,7 +46,7 @@ module Docs · 3 unmodified lines | |||
| 44 | end | 46 | end |
| 45 | end | 47 | end |
| 46 | 48 | ||
| 47 | css('> .impl-items', '> .docblock', 'pre > pre').each do |node| | 49 | css('> .impl-items', '> .docblock', 'pre > pre', '.tooltiptext', '.tooltip').each do |node| |
| 48 | node.before(node.children).remove | 50 | node.before(node.children).remove |
| 49 | end | 51 | end |
| 50 | 52 | ||
| @@ -62,6 +64,35 @@ module Docs · 11 unmodified lines | |||
| 62 | node['data-language'] = 'rust' if node['class'] && node['class'].include?('rust') | 64 | node['data-language'] = 'rust' if node['class'] && node['class'].include?('rust') |
| 63 | end | 65 | end |
| 64 | 66 | ||
| 67 | doc.first_element_child.name = 'h1' if doc.first_element_child.name = 'h2' | ||
| 68 | at_css('h1').content = 'Rust Documentation' if root_page? | ||
| 69 | |||
| 70 | css('.table-display').each do |node| | ||
| 71 | node.css('td').each do |td| | ||
| 72 | node.before(td.children) | ||
| 73 | end | ||
| 74 | node.remove | ||
| 75 | end | ||
| 76 | |||
| 77 | css('h2 .important-traits', 'h3 .important-traits', 'h4 .important-traits').each do |node| | ||
| 78 | content = node.at_css('.content.hidden .content') | ||
| 79 | node.at_css('.content.hidden').replace(content) if content | ||
| 80 | node.parent.after(node) | ||
| 81 | end | ||
| 82 | |||
| 83 | css('code.content').each do |node| | ||
| 84 | node.name = 'pre' | ||
| 85 | node.css('.fmt-newline').each do |line| | ||
| 86 | line.inner_html = line.inner_html + "\n" | ||
| 87 | end | ||
| 88 | node.inner_html = node.inner_html.gsub('<br>', "\n") | ||
| 89 | node.content = node.content | ||
| 90 | end | ||
| 91 | |||
| 92 | css('.since + .srclink').each do |node| | ||
| 93 | node.previous_element.before(node) | ||
| 94 | end | ||
| 95 | |||
| 65 | doc | 96 | doc |
| 66 | end | 97 | end |
| 67 | end | 98 | end |
| @@ -42,11 +42,14 @@ module Docs · 41 unmodified lines | |||
| 42 | entries << [node.content, node['id']] unless node.content.include?('Note:') | 42 | entries << [node.content, node['id']] unless node.content.include?('Note:') |
| 43 | end | 43 | end |
| 44 | else | 44 | else |
| 45 | css('#methods + * + div > .method', '#required-methods + div > .method', '#provided-methods + div > .method').map do |node| | 45 | css('.method') |
| 46 | name = node.at_css('.fnname').content | 46 | .select {|node| !node.at_css('.fnname').nil?} |
| 47 | name.prepend "#{self.name}::" | 47 | .map {|node| |
| 48 | [name, node['id']] | 48 | name = node.at_css('.fnname').content |
| 49 | end | 49 | name.prepend "#{self.name}::" |
| 50 | [name, node['id']] | ||
| 51 | } | ||
| 52 | .uniq {|item| item[0]} | ||
| 50 | end | 53 | end |
| 51 | end | 54 | end |
| 52 | end | 55 | end |
| @@ -9,6 +9,7 @@ module Docs · 8 unmodified lines | |||
| 9 | 9 | ||
| 10 | def get_type | 10 | def get_type |
| 11 | return 'Declaration Files' if subpath.include?('declaration-files') | 11 | return 'Declaration Files' if subpath.include?('declaration-files') |
| 12 | return 'Project Configuration' if slug == 'handbook/configuring-watch' | ||
| 12 | type = at_css('#main-nav a.active').ancestors('.panel').first.at_css('> a').content | 13 | type = at_css('#main-nav a.active').ancestors('.panel').first.at_css('> a').content |
| 13 | type = name if type == 'Handbook' | 14 | type = name if type == 'Handbook' |
| 14 | type | 15 | type |
| @@ -3,7 +3,7 @@ module Docs · 2 unmodified lines | |||
| 3 | self.name = 'Apache HTTP Server' | 3 | self.name = 'Apache HTTP Server' |
| 4 | self.slug = 'apache_http_server' | 4 | self.slug = 'apache_http_server' |
| 5 | self.type = 'apache' | 5 | self.type = 'apache' |
| 6 | self.release = '2.4.33' | 6 | self.release = '2.4.34' |
| 7 | self.base_url = 'https://httpd.apache.org/docs/2.4/en/' | 7 | self.base_url = 'https://httpd.apache.org/docs/2.4/en/' |
| 8 | self.links = { | 8 | self.links = { |
| 9 | home: 'https://httpd.apache.org/' | 9 | home: 'https://httpd.apache.org/' |
| @@ -2,7 +2,7 @@ module Docs · 1 unmodified line | |||
| 2 | class ApachePig < UrlScraper | 2 | class ApachePig < UrlScraper |
| 3 | self.name = 'Apache Pig' | 3 | self.name = 'Apache Pig' |
| 4 | self.slug = 'apache_pig' | 4 | self.slug = 'apache_pig' |
| 5 | self.type = 'apache_pig' | 5 | self.type = 'simple' |
| 6 | self.links = { | 6 | self.links = { |
| 7 | home: 'https://pig.apache.org/' | 7 | home: 'https://pig.apache.org/' |
| 8 | } | 8 | } |
| @@ -0,0 +1,21 @@ | |||
| 1 | module Docs | ||
| 2 | class Bash < UrlScraper | ||
| 3 | self.type = 'bash' | ||
| 4 | self.release = '4.4' | ||
| 5 | self.base_url = 'https://www.gnu.org/software/bash/manual' | ||
| 6 | self.root_path = '/html_node/index.html' | ||
| 7 | self.links = { | ||
| 8 | home: 'https://www.gnu.org/software/bash/', | ||
| 9 | code: 'http://git.savannah.gnu.org/cgit/bash.git' | ||
| 10 | } | ||
| 11 | |||
| 12 | html_filters.push 'bash/entries', 'bash/clean_html' | ||
| 13 | |||
| 14 | options[:only_patterns] = [/\/html_node\//] | ||
| 15 | |||
| 16 | options[:attribution] = <<-HTML | ||
| 17 | Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.<br> | ||
| 18 | Licensed under the GNU Free Documentation License. | ||
| 19 | HTML | ||
| 20 | end | ||
| 21 | end | ||
| @@ -16,7 +16,7 @@ module Docs · 15 unmodified lines | |||
| 16 | HTML | 16 | HTML |
| 17 | 17 | ||
| 18 | version '4' do | 18 | version '4' do |
| 19 | self.release = '4.1.1' | 19 | self.release = '4.1.3' |
| 20 | self.base_url = 'https://getbootstrap.com/docs/4.1/' | 20 | self.base_url = 'https://getbootstrap.com/docs/4.1/' |
| 21 | self.root_path = 'getting-started/introduction/' | 21 | self.root_path = 'getting-started/introduction/' |
| 22 | 22 | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Bower < UrlScraper | 2 | class Bower < UrlScraper |
| 3 | self.name = 'Bower' | 3 | self.name = 'Bower' |
| 4 | self.type = 'bower' | 4 | self.type = 'simple' |
| 5 | self.release = '1.8.4' | 5 | self.release = '1.8.4' |
| 6 | self.base_url = 'https://bower.io/docs/' | 6 | self.base_url = 'https://bower.io/docs/' |
| 7 | self.root_path = 'api' | 7 | self.root_path = 'api' |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Chai < UrlScraper | 2 | class Chai < UrlScraper |
| 3 | self.name = 'Chai' | 3 | self.name = 'Chai' |
| 4 | self.type = 'chai' | 4 | self.type = 'simple' |
| 5 | self.release = '4.1.0' | 5 | self.release = '4.1.0' |
| 6 | self.base_url = 'http://chaijs.com' | 6 | self.base_url = 'http://chaijs.com' |
| 7 | self.root_path = '/api/' | 7 | self.root_path = '/api/' |
| @@ -16,12 +16,22 @@ module Docs · 15 unmodified lines | |||
| 16 | options[:skip_patterns] = [/\Agenerator/, /\Ainclude/, /\Arelease/] | 16 | options[:skip_patterns] = [/\Agenerator/, /\Ainclude/, /\Arelease/] |
| 17 | 17 | ||
| 18 | options[:attribution] = <<-HTML | 18 | options[:attribution] = <<-HTML |
| 19 | © 2000–2017 Kitware, Inc. and Contributors<br> | 19 | © 2000–2018 Kitware, Inc. and Contributors<br> |
| 20 | Licensed under the BSD 3-clause License. | 20 | Licensed under the BSD 3-clause License. |
| 21 | HTML | 21 | HTML |
| 22 | 22 | ||
| 23 | version '3.12' do | ||
| 24 | self.release = '3.12.1' | ||
| 25 | self.base_url = 'https://cmake.org/cmake/help/v3.12/' | ||
| 26 | end | ||
| 27 | |||
| 28 | version '3.11' do | ||
| 29 | self.release = '3.11.4' | ||
| 30 | self.base_url = 'https://cmake.org/cmake/help/v3.11/' | ||
| 31 | end | ||
| 32 | |||
| 23 | version '3.10' do | 33 | version '3.10' do |
| 24 | self.release = '3.10.1' | 34 | self.release = '3.10.3' |
| 25 | self.base_url = 'https://cmake.org/cmake/help/v3.10/' | 35 | self.base_url = 'https://cmake.org/cmake/help/v3.10/' |
| 26 | end | 36 | end |
| 27 | 37 | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Codeceptjs < UrlScraper | 2 | class Codeceptjs < UrlScraper |
| 3 | self.name = 'CodeceptJS' | 3 | self.name = 'CodeceptJS' |
| 4 | self.type = 'codeceptjs' | 4 | self.type = 'simple' |
| 5 | self.root_path = 'index.html' | 5 | self.root_path = 'index.html' |
| 6 | self.release = '1.3.1' | 6 | self.release = '1.3.1' |
| 7 | self.base_url = 'https://codecept.io/' | 7 | self.base_url = 'https://codecept.io/' |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Crystal < UrlScraper | 2 | class Crystal < UrlScraper |
| 3 | self.type = 'crystal' | 3 | self.type = 'crystal' |
| 4 | self.release = '0.25.1' | 4 | self.release = '0.26.0' |
| 5 | self.base_url = 'https://crystal-lang.org/' | 5 | self.base_url = 'https://crystal-lang.org/' |
| 6 | self.root_path = "api/#{release}/index.html" | 6 | self.root_path = "api/#{release}/index.html" |
| 7 | self.initial_paths = %w(docs/index.html) | 7 | self.initial_paths = %w(docs/index.html) |
| @@ -0,0 +1,37 @@ | |||
| 1 | module Docs | ||
| 2 | class Dart < FileScraper | ||
| 3 | self.type = 'dart' | ||
| 4 | self.root_path = 'index.html' | ||
| 5 | self.links = { | ||
| 6 | home: 'https://www.dartlang.org/', | ||
| 7 | code: 'https://github.com/dart-lang/sdk' | ||
| 8 | } | ||
| 9 | |||
| 10 | html_filters.push 'dart/entries', 'dart/clean_html' | ||
| 11 | |||
| 12 | options[:fix_urls] = ->(url) do | ||
| 13 | # localhost/dart-web_audio/..dart-io/dart-io-library.html > localhost/dart-io/dart-io-library.html | ||
| 14 | url.remove!(/[^\/]+\/\.\./) | ||
| 15 | url | ||
| 16 | end | ||
| 17 | |||
| 18 | options[:attribution] = <<-HTML | ||
| 19 | © 2012 the Dart project authors<br> | ||
| 20 | Licensed under the Creative Commons Attribution-ShareAlike License v4.0. | ||
| 21 | HTML | ||
| 22 | |||
| 23 | # Download the documentation from https://www.dartlang.org/tools/sdk/archive | ||
| 24 | |||
| 25 | version '2' do | ||
| 26 | self.release = '2.0.0' | ||
| 27 | self.dir = '/Users/Thibaut/DevDocs/Docs/Dart2' | ||
| 28 | self.base_url = "https://api.dartlang.org/stable/#{release}/" | ||
| 29 | end | ||
| 30 | |||
| 31 | version '1' do | ||
| 32 | self.release = '1.24.3' | ||
| 33 | self.dir = '/Users/Thibaut/DevDocs/Docs/Dart1' | ||
| 34 | self.base_url = "https://api.dartlang.org/stable/#{release}/" | ||
| 35 | end | ||
| 36 | end | ||
| 37 | end | ||
| @@ -34,6 +34,12 @@ module Docs · 33 unmodified lines | |||
| 34 | Licensed under the BSD License. | 34 | Licensed under the BSD License. |
| 35 | HTML | 35 | HTML |
| 36 | 36 | ||
| 37 | version '2.1' do | ||
| 38 | self.release = '2.1.0' | ||
| 39 | self.dir = '/Users/Thibaut/DevDocs/Docs/Django21' | ||
| 40 | self.base_url = 'https://docs.djangoproject.com/en/2.1/' | ||
| 41 | end | ||
| 42 | |||
| 37 | version '2.0' do | 43 | version '2.0' do |
| 38 | self.release = '2.0.7' | 44 | self.release = '2.0.7' |
| 39 | self.dir = '/Users/Thibaut/DevDocs/Docs/Django20' | 45 | self.dir = '/Users/Thibaut/DevDocs/Docs/Django20' |
| @@ -1,6 +1,6 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Docker < UrlScraper | 2 | class Docker < UrlScraper |
| 3 | self.type = 'docker' | 3 | self.type = 'simple' |
| 4 | self.links = { | 4 | self.links = { |
| 5 | home: 'https://docker.com/', | 5 | home: 'https://docker.com/', |
| 6 | code: 'https://github.com/docker/docker' | 6 | code: 'https://github.com/docker/docker' |
| @@ -1,6 +1,6 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Electron < UrlScraper | 2 | class Electron < UrlScraper |
| 3 | self.type = 'electron' | 3 | self.type = 'simple' |
| 4 | self.base_url = 'https://electronjs.org/docs' | 4 | self.base_url = 'https://electronjs.org/docs' |
| 5 | self.release = '2.0.2' | 5 | self.release = '2.0.2' |
| 6 | self.links = { | 6 | self.links = { |
| @@ -33,6 +33,19 @@ module Docs · 32 unmodified lines | |||
| 33 | "https://elixir-lang.org/getting-started/introduction.html" ] | 33 | "https://elixir-lang.org/getting-started/introduction.html" ] |
| 34 | end | 34 | end |
| 35 | 35 | ||
| 36 | version '1.7' do | ||
| 37 | self.release = '1.7.3' | ||
| 38 | self.base_urls = [ | ||
| 39 | "https://hexdocs.pm/elixir/#{release}/", | ||
| 40 | "https://hexdocs.pm/eex/#{release}/", | ||
| 41 | "https://hexdocs.pm/ex_unit/#{release}/", | ||
| 42 | "https://hexdocs.pm/iex/#{release}/", | ||
| 43 | "https://hexdocs.pm/logger/#{release}/", | ||
| 44 | "https://hexdocs.pm/mix/#{release}/", | ||
| 45 | 'https://elixir-lang.org/getting-started/' | ||
| 46 | ] | ||
| 47 | end | ||
| 48 | |||
| 36 | version '1.6' do | 49 | version '1.6' do |
| 37 | self.release = '1.6.5' | 50 | self.release = '1.6.5' |
| 38 | self.base_urls = [ | 51 | self.base_urls = [ |
| @@ -2,7 +2,7 @@ module Docs · 1 unmodified line | |||
| 2 | class Express < UrlScraper | 2 | class Express < UrlScraper |
| 3 | self.name = 'Express' | 3 | self.name = 'Express' |
| 4 | self.type = 'express' | 4 | self.type = 'express' |
| 5 | self.release = '4.16.1' | 5 | self.release = '4.16.3' |
| 6 | self.base_url = 'http://expressjs.com/en/' | 6 | self.base_url = 'http://expressjs.com/en/' |
| 7 | self.root_path = '4x/api.html' | 7 | self.root_path = '4x/api.html' |
| 8 | self.initial_paths = %w( | 8 | self.initial_paths = %w( |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Fish < UrlScraper | 2 | class Fish < UrlScraper |
| 3 | self.name = 'Fish' | 3 | self.name = 'Fish' |
| 4 | self.type = 'fish' | 4 | self.type = 'simple' |
| 5 | self.root_path = 'index.html' | 5 | self.root_path = 'index.html' |
| 6 | self.links = { | 6 | self.links = { |
| 7 | home: 'https://fishshell.com/', | 7 | home: 'https://fishshell.com/', |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Flow < UrlScraper | 2 | class Flow < UrlScraper |
| 3 | self.type = 'flow' | 3 | self.type = 'simple' |
| 4 | self.release = '0.75.0' | 4 | self.release = '0.79.1' |
| 5 | self.base_url = 'https://flow.org/en/docs/' | 5 | self.base_url = 'https://flow.org/en/docs/' |
| 6 | self.links = { | 6 | self.links = { |
| 7 | home: 'https://flow.org/', | 7 | home: 'https://flow.org/', |
| @@ -1,6 +1,6 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Gnu < FileScraper | 2 | class Gnu < FileScraper |
| 3 | self.type = 'gnu' | 3 | self.type = 'simple' |
| 4 | self.root_path = 'index.html' | 4 | self.root_path = 'index.html' |
| 5 | self.abstract = 'true' | 5 | self.abstract = 'true' |
| 6 | 6 | ||
| @@ -0,0 +1,21 @@ | |||
| 1 | module Docs | ||
| 2 | class Graphite < UrlScraper | ||
| 3 | self.type = 'graphite' | ||
| 4 | self.release = '1.1.3' | ||
| 5 | self.base_url = 'https://graphite.readthedocs.io/en/latest/' | ||
| 6 | self.links = { | ||
| 7 | code: 'https://github.com/graphite-project/graphite-web' | ||
| 8 | } | ||
| 9 | |||
| 10 | html_filters.push 'graphite/entries', 'graphite/clean_html' | ||
| 11 | |||
| 12 | options[:container] = '.document > div' | ||
| 13 | options[:skip] = %w(releases.html who-is-using.html composer.html search.html py-modindex.html genindex.html) | ||
| 14 | |||
| 15 | options[:attribution] = <<-HTML | ||
| 16 | © 2008–2012 Chris Davis<br> | ||
| 17 | © 2011–2016 The Graphite Project<br> | ||
| 18 | Licensed under the Apache License, Version 2.0. | ||
| 19 | HTML | ||
| 20 | end | ||
| 21 | end | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Grunt < UrlScraper | 2 | class Grunt < UrlScraper |
| 3 | self.name = 'Grunt' | 3 | self.name = 'Grunt' |
| 4 | self.type = 'grunt' | 4 | self.type = 'simple' |
| 5 | self.release = '1.0.1' | 5 | self.release = '1.0.1' |
| 6 | self.base_url = 'https://gruntjs.com/' | 6 | self.base_url = 'https://gruntjs.com/' |
| 7 | self.root_path = 'getting-started' | 7 | self.root_path = 'getting-started' |
| @@ -0,0 +1,23 @@ | |||
| 1 | module Docs | ||
| 2 | class Handlebars < UrlScraper | ||
| 3 | self.name = 'Handlebars.js' | ||
| 4 | self.slug = 'handlebars' | ||
| 5 | self.type = 'simple' | ||
| 6 | self.release = '4.0.12' | ||
| 7 | self.base_url = 'https://handlebarsjs.com/' | ||
| 8 | self.links = { | ||
| 9 | home: 'https://handlebarsjs.com/', | ||
| 10 | code: 'https://github.com/wycats/handlebars.js/' | ||
| 11 | } | ||
| 12 | |||
| 13 | html_filters.push 'handlebars/entries', 'handlebars/clean_html', 'title' | ||
| 14 | |||
| 15 | options[:container] = '#contents' | ||
| 16 | options[:root_title] = 'Handlebars.js' | ||
| 17 | |||
| 18 | options[:attribution] = <<-HTML | ||
| 19 | © 2011–2017 by Yehuda Katz<br> | ||
| 20 | Licensed under the MIT License. | ||
| 21 | HTML | ||
| 22 | end | ||
| 23 | end | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Haxe < UrlScraper | 2 | class Haxe < UrlScraper |
| 3 | self.name = 'Haxe' | 3 | self.name = 'Haxe' |
| 4 | self.type = 'haxe' | 4 | self.type = 'simple' |
| 5 | self.release = '3.4.7' | 5 | self.release = '3.4.7' |
| 6 | self.base_url = 'https://api.haxe.org/' | 6 | self.base_url = 'https://api.haxe.org/' |
| 7 | 7 | ||
| @@ -2,7 +2,7 @@ module Docs · 1 unmodified line | |||
| 2 | class Immutable < UrlScraper | 2 | class Immutable < UrlScraper |
| 3 | self.name = 'Immutable.js' | 3 | self.name = 'Immutable.js' |
| 4 | self.slug = 'immutable' | 4 | self.slug = 'immutable' |
| 5 | self.type = 'immutable' | 5 | self.type = 'simple' |
| 6 | self.release = '3.8.1' | 6 | self.release = '3.8.1' |
| 7 | self.base_url = 'https://facebook.github.io/immutable-js/docs/' | 7 | self.base_url = 'https://facebook.github.io/immutable-js/docs/' |
| 8 | self.links = { | 8 | self.links = { |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Influxdata < UrlScraper | 2 | class Influxdata < UrlScraper |
| 3 | self.name = 'InfluxData' | 3 | self.name = 'InfluxData' |
| 4 | self.type = 'influxdata' | 4 | self.type = 'simple' |
| 5 | self.release = '1.3' | 5 | self.release = '1.3' |
| 6 | self.base_url = 'https://docs.influxdata.com/' | 6 | self.base_url = 'https://docs.influxdata.com/' |
| 7 | self.links = { | 7 | self.links = { |
| @@ -1,8 +1,8 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Jasmine < UrlScraper | 2 | class Jasmine < UrlScraper |
| 3 | self.type = 'jasmine' | 3 | self.type = 'simple' |
| 4 | self.release = '3.1.0' | 4 | self.release = '3.2.1' |
| 5 | self.base_url = 'https://jasmine.github.io/api/3.0/' | 5 | self.base_url = 'https://jasmine.github.io/api/3.2/' |
| 6 | self.root_path = 'index.html' | 6 | self.root_path = 'index.html' |
| 7 | self.links = { | 7 | self.links = { |
| 8 | home: 'https://jasmine.github.io/', | 8 | home: 'https://jasmine.github.io/', |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Jest < UrlScraper | 2 | class Jest < UrlScraper |
| 3 | self.type = 'jest' | 3 | self.type = 'simple' |
| 4 | self.release = '23.3.0' | 4 | self.release = '23.5.0' |
| 5 | self.base_url = 'https://jestjs.io/docs/en/' | 5 | self.base_url = 'https://jestjs.io/docs/en/' |
| 6 | self.root_path = 'getting-started' | 6 | self.root_path = 'getting-started' |
| 7 | self.links = { | 7 | self.links = { |
| @@ -12,9 +12,29 @@ module Docs · 11 unmodified lines | |||
| 12 | Licensed under the MIT License. | 12 | Licensed under the MIT License. |
| 13 | HTML | 13 | HTML |
| 14 | 14 | ||
| 15 | version '1.0' do | ||
| 16 | self.release = '1.0.0' | ||
| 17 | self.base_url = "https://docs.julialang.org/en/v#{release}/" | ||
| 18 | self.type = 'julia' | ||
| 19 | |||
| 20 | html_filters.push 'julia/entries', 'julia/clean_html' | ||
| 21 | |||
| 22 | options[:container] = '#docs' | ||
| 23 | end | ||
| 24 | |||
| 25 | version '0.7' do | ||
| 26 | self.release = '0.7.0' | ||
| 27 | self.base_url = "https://docs.julialang.org/en/v#{release}/" | ||
| 28 | self.type = 'julia' | ||
| 29 | |||
| 30 | html_filters.push 'julia/entries', 'julia/clean_html' | ||
| 31 | |||
| 32 | options[:container] = '#docs' | ||
| 33 | end | ||
| 34 | |||
| 15 | version '0.6' do | 35 | version '0.6' do |
| 16 | self.release = '0.6.2' | 36 | self.release = '0.6.2' |
| 17 | self.base_url = 'https://docs.julialang.org/en/release-0.6/' | 37 | self.base_url = "https://docs.julialang.org/en/v#{release}/" |
| 18 | self.type = 'julia' | 38 | self.type = 'julia' |
| 19 | 39 | ||
| 20 | html_filters.push 'julia/entries', 'julia/clean_html' | 40 | html_filters.push 'julia/entries', 'julia/clean_html' |
| @@ -24,7 +44,7 @@ module Docs · 3 unmodified lines | |||
| 24 | 44 | ||
| 25 | version '0.5' do | 45 | version '0.5' do |
| 26 | self.release = '0.5.2' | 46 | self.release = '0.5.2' |
| 27 | self.base_url = 'https://docs.julialang.org/en/release-0.5/' | 47 | self.base_url = "https://docs.julialang.org/en/v#{release}/" |
| 28 | self.type = 'sphinx_simple' | 48 | self.type = 'sphinx_simple' |
| 29 | 49 | ||
| 30 | html_filters.push 'julia/entries_sphinx', 'julia/clean_html_sphinx', 'sphinx/clean_html' | 50 | html_filters.push 'julia/entries_sphinx', 'julia/clean_html_sphinx', 'sphinx/clean_html' |
| @@ -29,8 +29,21 @@ module Docs · 28 unmodified lines | |||
| 29 | Laravel is a trademark of Taylor Otwell. | 29 | Laravel is a trademark of Taylor Otwell. |
| 30 | HTML | 30 | HTML |
| 31 | 31 | ||
| 32 | version '5.7' do | ||
| 33 | self.release = '5.7.7' | ||
| 34 | self.root_path = '/api/5.7/index.html' | ||
| 35 | self.initial_paths = %w(/docs/5.7/installation /api/5.7/classes.html) | ||
| 36 | |||
| 37 | options[:only_patterns] = [%r{\A/api/5\.7/}, %r{\A/docs/5\.7/}] | ||
| 38 | |||
| 39 | options[:fix_urls] = ->(url) do | ||
| 40 | url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/5.7/" | ||
| 41 | url | ||
| 42 | end | ||
| 43 | end | ||
| 44 | |||
| 32 | version '5.6' do | 45 | version '5.6' do |
| 33 | self.release = '5.6.12' | 46 | self.release = '5.6.33' |
| 34 | self.root_path = '/api/5.6/index.html' | 47 | self.root_path = '/api/5.6/index.html' |
| 35 | self.initial_paths = %w(/docs/5.6/installation /api/5.6/classes.html) | 48 | self.initial_paths = %w(/docs/5.6/installation /api/5.6/classes.html) |
| 36 | 49 | ||
| @@ -1,6 +1,6 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Less < UrlScraper | 2 | class Less < UrlScraper |
| 3 | self.type = 'less' | 3 | self.type = 'simple' |
| 4 | self.release = '2.7.2' | 4 | self.release = '2.7.2' |
| 5 | self.base_url = 'http://lesscss.org' | 5 | self.base_url = 'http://lesscss.org' |
| 6 | self.root_path = '/features' | 6 | self.root_path = '/features' |
| @@ -2,7 +2,7 @@ module Docs · 1 unmodified line | |||
| 2 | class Lodash < UrlScraper | 2 | class Lodash < UrlScraper |
| 3 | self.name = 'lodash' | 3 | self.name = 'lodash' |
| 4 | self.slug = 'lodash' | 4 | self.slug = 'lodash' |
| 5 | self.type = 'lodash' | 5 | self.type = 'simple' |
| 6 | self.links = { | 6 | self.links = { |
| 7 | home: 'https://lodash.com/', | 7 | home: 'https://lodash.com/', |
| 8 | code: 'https://github.com/lodash/lodash/' | 8 | code: 'https://github.com/lodash/lodash/' |
| @@ -2,7 +2,7 @@ module Docs · 1 unmodified line | |||
| 2 | class Marionette < UrlScraper | 2 | class Marionette < UrlScraper |
| 3 | self.name = 'Marionette.js' | 3 | self.name = 'Marionette.js' |
| 4 | self.slug = 'marionette' | 4 | self.slug = 'marionette' |
| 5 | self.type = 'marionette' | 5 | self.type = 'simple' |
| 6 | self.root_path = 'index' | 6 | self.root_path = 'index' |
| 7 | self.links = { | 7 | self.links = { |
| 8 | home: 'https://marionettejs.com/', | 8 | home: 'https://marionettejs.com/', |
| @@ -18,6 +18,13 @@ module Docs · 9 unmodified lines | |||
| 18 | Licensed under the MIT License. | 18 | Licensed under the MIT License. |
| 19 | HTML | 19 | HTML |
| 20 | 20 | ||
| 21 | version '4' do | ||
| 22 | self.release = '4.0.0' | ||
| 23 | self.base_url = "https://marionettejs.com/docs/v#{release}/" | ||
| 24 | |||
| 25 | html_filters.push 'marionette/entries_v3' | ||
| 26 | end | ||
| 27 | |||
| 21 | version '3' do | 28 | version '3' do |
| 22 | self.release = '3.5.1' | 29 | self.release = '3.5.1' |
| 23 | self.base_url = "https://marionettejs.com/docs/v#{release}/" | 30 | self.base_url = "https://marionettejs.com/docs/v#{release}/" |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Markdown < UrlScraper | 2 | class Markdown < UrlScraper |
| 3 | self.name = 'Markdown' | 3 | self.name = 'Markdown' |
| 4 | self.type = 'markdown' | 4 | self.type = 'simple' |
| 5 | self.base_url = 'http://daringfireball.net/projects/markdown/syntax' | 5 | self.base_url = 'http://daringfireball.net/projects/markdown/syntax' |
| 6 | 6 | ||
| 7 | html_filters.push 'markdown/clean_html', 'markdown/entries' | 7 | html_filters.push 'markdown/clean_html', 'markdown/entries' |
| @@ -1,6 +1,6 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Mocha < UrlScraper | 2 | class Mocha < UrlScraper |
| 3 | self.type = 'mocha' | 3 | self.type = 'simple' |
| 4 | self.release = '5.0.1' | 4 | self.release = '5.0.1' |
| 5 | self.base_url = 'https://mochajs.org/' | 5 | self.base_url = 'https://mochajs.org/' |
| 6 | self.links = { | 6 | self.links = { |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Mongoose < UrlScraper | 2 | class Mongoose < UrlScraper |
| 3 | self.name = 'Mongoose' | 3 | self.name = 'Mongoose' |
| 4 | self.type = 'mongoose' | 4 | self.type = 'simple' |
| 5 | self.release = '4.13.1' | 5 | self.release = '4.13.1' |
| 6 | self.base_url = 'http://mongoosejs.com/docs/' | 6 | self.base_url = 'http://mongoosejs.com/docs/' |
| 7 | self.root_path = 'index.html' | 7 | self.root_path = 'index.html' |
| @@ -1,6 +1,6 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Nim < UrlScraper | 2 | class Nim < UrlScraper |
| 3 | self.type = 'nim' | 3 | self.type = 'simple' |
| 4 | self.release = '0.18.0' | 4 | self.release = '0.18.0' |
| 5 | self.base_url = 'https://nim-lang.org/docs/' | 5 | self.base_url = 'https://nim-lang.org/docs/' |
| 6 | self.root_path = 'overview.html' | 6 | self.root_path = 'overview.html' |
| @@ -23,17 +23,17 @@ module Docs · 22 unmodified lines | |||
| 23 | HTML | 23 | HTML |
| 24 | 24 | ||
| 25 | version do | 25 | version do |
| 26 | self.release = '10.6.0' | 26 | self.release = '10.9.0' |
| 27 | self.base_url = 'https://nodejs.org/dist/latest-v10.x/docs/api/' | 27 | self.base_url = 'https://nodejs.org/dist/latest-v10.x/docs/api/' |
| 28 | end | 28 | end |
| 29 | 29 | ||
| 30 | version '8 LTS' do | 30 | version '8 LTS' do |
| 31 | self.release = '8.11.2' | 31 | self.release = '8.11.4' |
| 32 | self.base_url = 'https://nodejs.org/dist/latest-v8.x/docs/api/' | 32 | self.base_url = 'https://nodejs.org/dist/latest-v8.x/docs/api/' |
| 33 | end | 33 | end |
| 34 | 34 | ||
| 35 | version '6 LTS' do | 35 | version '6 LTS' do |
| 36 | self.release = '6.14.2' | 36 | self.release = '6.14.4' |
| 37 | self.base_url = 'https://nodejs.org/dist/latest-v6.x/docs/api/' | 37 | self.base_url = 'https://nodejs.org/dist/latest-v6.x/docs/api/' |
| 38 | end | 38 | end |
| 39 | 39 | ||
| @@ -2,7 +2,7 @@ module Docs · 1 unmodified line | |||
| 2 | class Npm < UrlScraper | 2 | class Npm < UrlScraper |
| 3 | self.name = 'npm' | 3 | self.name = 'npm' |
| 4 | self.type = 'npm' | 4 | self.type = 'npm' |
| 5 | self.release = '6.1.0' | 5 | self.release = '6.4.0' |
| 6 | self.base_url = 'https://docs.npmjs.com/' | 6 | self.base_url = 'https://docs.npmjs.com/' |
| 7 | self.force_gzip = true | 7 | self.force_gzip = true |
| 8 | self.links = { | 8 | self.links = { |
| @@ -4,7 +4,7 @@ module Docs · 3 unmodified lines | |||
| 4 | 4 | ||
| 5 | self.name = 'PHP' | 5 | self.name = 'PHP' |
| 6 | self.type = 'php' | 6 | self.type = 'php' |
| 7 | self.release = '7.2.5' | 7 | self.release = '7.2.9' |
| 8 | self.base_url = 'https://secure.php.net/manual/en/' | 8 | self.base_url = 'https://secure.php.net/manual/en/' |
| 9 | self.root_path = 'index.html' | 9 | self.root_path = 'index.html' |
| 10 | self.initial_paths = %w( | 10 | self.initial_paths = %w( |
| @@ -0,0 +1,18 @@ | |||
| 1 | module Docs | ||
| 2 | class Puppeteer < Github | ||
| 3 | self.release = '1.8.0' | ||
| 4 | self.base_url = 'https://github.com/GoogleChrome/puppeteer/blob/v1.8.0/docs/api.md' | ||
| 5 | self.links = { | ||
| 6 | code: 'https://github.com/GoogleChrome/puppeteer' | ||
| 7 | } | ||
| 8 | |||
| 9 | html_filters.push 'puppeteer/entries', 'puppeteer/clean_html' | ||
| 10 | |||
| 11 | options[:container] = '.markdown-body' | ||
| 12 | |||
| 13 | options[:attribution] = <<-HTML | ||
| 14 | © 2017 Google Inc<br> | ||
| 15 | Licensed under the Apache License 2.0. | ||
| 16 | HTML | ||
| 17 | end | ||
| 18 | end | ||
| @@ -0,0 +1,20 @@ | |||
| 1 | module Docs | ||
| 2 | class Pygame < UrlScraper | ||
| 3 | self.type = 'simple' | ||
| 4 | self.release = '1.9.4' | ||
| 5 | self.root_path = 'py-modindex.html' | ||
| 6 | self.links = { | ||
| 7 | home: 'https://www.pygame.org/', | ||
| 8 | code: 'https://github.com/pygame/pygame' | ||
| 9 | } | ||
| 10 | |||
| 11 | html_filters.push 'pygame/clean_html', 'pygame/entries' | ||
| 12 | |||
| 13 | options[:only_patterns] = [/ref\//] | ||
| 14 | |||
| 15 | options[:attribution] = <<-HTML | ||
| 16 | © Pygame Developpers.<br> | ||
| 17 | Licensed under the GNU LGPL License version 2.1. | ||
| 18 | HTML | ||
| 19 | end | ||
| 20 | end | ||
| @@ -0,0 +1,121 @@ | |||
| 1 | module Docs | ||
| 2 | class Qt < UrlScraper | ||
| 3 | self.name = 'Qt' | ||
| 4 | self.type = 'qt' | ||
| 5 | self.initial_paths = %w(classes.html qmltypes.html) | ||
| 6 | self.root_path = 'index.html' | ||
| 7 | self.links = { | ||
| 8 | home: 'https://www.qt.io', | ||
| 9 | code: 'https://code.qt.io/cgit/' | ||
| 10 | } | ||
| 11 | |||
| 12 | html_filters.push 'qt/entries', 'qt/clean_html' | ||
| 13 | |||
| 14 | options[:container] = '.main' | ||
| 15 | options[:max_image_size] = 156_000 | ||
| 16 | options[:skip_patterns] = [ | ||
| 17 | # License, copyright attributions | ||
| 18 | /3rdparty/, | ||
| 19 | /attribution/, | ||
| 20 | /license/, | ||
| 21 | /licensing/, | ||
| 22 | |||
| 23 | # Examples, guides, tutorials | ||
| 24 | /example/, | ||
| 25 | /guide$/, | ||
| 26 | /tutorial/, | ||
| 27 | /porting/, | ||
| 28 | /usecase/, | ||
| 29 | /topic/, | ||
| 30 | /^modelview/, | ||
| 31 | /deploy(ing|ment)/, | ||
| 32 | /building/, | ||
| 33 | |||
| 34 | # Old versions, changelog | ||
| 35 | /obsolete/, | ||
| 36 | /compatibility/, | ||
| 37 | /^whatsnew/, | ||
| 38 | /^newclasses/, | ||
| 39 | |||
| 40 | # Deprecated modules | ||
| 41 | /(qtopengl|qgl)/, | ||
| 42 | /qt?script/, | ||
| 43 | |||
| 44 | # Indexes | ||
| 45 | /members/, | ||
| 46 | /module/, | ||
| 47 | /overview/, | ||
| 48 | /^qopenglfunctions/, | ||
| 49 | |||
| 50 | # Tooling | ||
| 51 | /^(qt)?(linguist|assistant|qdbusviewer)/, | ||
| 52 | ] | ||
| 53 | |||
| 54 | options[:skip] = [ | ||
| 55 | "qt5-intro.html", | ||
| 56 | "compatmap.html", | ||
| 57 | |||
| 58 | # Indexes | ||
| 59 | "classes.html", | ||
| 60 | "qtmodules.html", | ||
| 61 | "modules-qml.html", | ||
| 62 | "modules-cpp.html", | ||
| 63 | "functions.html", | ||
| 64 | "namespaces.html", | ||
| 65 | "qmltypes.html", | ||
| 66 | "qt3d-qml.html", | ||
| 67 | "qmlbasictypes.html", | ||
| 68 | "guibooks.html", | ||
| 69 | "annotated.html", | ||
| 70 | "overviews-main.html", | ||
| 71 | "reference-overview.html", | ||
| 72 | |||
| 73 | # Tutorials | ||
| 74 | "qtvirtualkeyboard-build.html", | ||
| 75 | |||
| 76 | # Copyright | ||
| 77 | "trademarks.html", | ||
| 78 | "lgpl.html", | ||
| 79 | "bughowto.html", | ||
| 80 | |||
| 81 | # Changelogs | ||
| 82 | "changes.html", | ||
| 83 | "qtlocation-changes.html", | ||
| 84 | "sourcebreaks.html", | ||
| 85 | |||
| 86 | # Best practice guides | ||
| 87 | "accessible.html", | ||
| 88 | "accessible-qtquick.html", | ||
| 89 | "sharedlibrary.html", | ||
| 90 | "exceptionsafety.html", | ||
| 91 | "scalability.html", | ||
| 92 | "session.html", | ||
| 93 | "appicon.html", | ||
| 94 | "accelerators.html", | ||
| 95 | |||
| 96 | # Other | ||
| 97 | "ecmascript.html", | ||
| 98 | "qtremoteobjects-interaction.html", | ||
| 99 | ] | ||
| 100 | |||
| 101 | options[:attribution] = <<-HTML | ||
| 102 | © The Qt Company Ltd<br> | ||
| 103 | Licensed under the GNU Free Documentation License, Version 1.3. | ||
| 104 | HTML | ||
| 105 | |||
| 106 | version '5.11' do | ||
| 107 | self.release = '5.11' | ||
| 108 | self.base_url = 'https://doc.qt.io/qt-5/' | ||
| 109 | end | ||
| 110 | |||
| 111 | version '5.9' do | ||
| 112 | self.release = '5.9' | ||
| 113 | self.base_url = 'https://doc.qt.io/qt-5.9/' | ||
| 114 | end | ||
| 115 | |||
| 116 | version '5.6' do | ||
| 117 | self.release = '5.6' | ||
| 118 | self.base_url = 'https://doc.qt.io/qt-5.6/' | ||
| 119 | end | ||
| 120 | end | ||
| 121 | end | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Redis < UrlScraper | 2 | class Redis < UrlScraper |
| 3 | self.type = 'redis' | 3 | self.type = 'redis' |
| 4 | self.release = '4.0.9' | 4 | self.release = '4.0.11' |
| 5 | self.base_url = 'https://redis.io/commands' | 5 | self.base_url = 'https://redis.io/commands' |
| 6 | self.links = { | 6 | self.links = { |
| 7 | home: 'https://redis.io/', | 7 | home: 'https://redis.io/', |
| @@ -1,6 +1,6 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Redux < UrlScraper | 2 | class Redux < UrlScraper |
| 3 | self.type = 'redux' | 3 | self.type = 'simple' |
| 4 | self.release = '3.7.2' | 4 | self.release = '3.7.2' |
| 5 | self.base_url = 'http://redux.js.org/docs/' | 5 | self.base_url = 'http://redux.js.org/docs/' |
| 6 | self.links = { | 6 | self.links = { |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Requirejs < UrlScraper | 2 | class Requirejs < UrlScraper |
| 3 | self.name = 'RequireJS' | 3 | self.name = 'RequireJS' |
| 4 | self.type = 'requirejs' | 4 | self.type = 'simple' |
| 5 | self.release = '2.3.5' | 5 | self.release = '2.3.5' |
| 6 | self.base_url = 'http://requirejs.org/docs/' | 6 | self.base_url = 'http://requirejs.org/docs/' |
| 7 | self.links = { | 7 | self.links = { |
| @@ -1,9 +1,9 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Rust < UrlScraper | 2 | class Rust < UrlScraper |
| 3 | self.type = 'rust' | 3 | self.type = 'rust' |
| 4 | self.release = '1.26.0' | 4 | self.release = '1.29.1' |
| 5 | self.base_url = 'https://doc.rust-lang.org/' | 5 | self.base_url = 'https://doc.rust-lang.org/' |
| 6 | self.root_path = 'book/first-edition/index.html' | 6 | self.root_path = 'book/second-edition/index.html' |
| 7 | self.initial_paths = %w( | 7 | self.initial_paths = %w( |
| 8 | reference/introduction.html | 8 | reference/introduction.html |
| 9 | collections/index.html | 9 | collections/index.html |
| @@ -17,13 +17,13 @@ module Docs · 7 unmodified lines | |||
| 17 | html_filters.push 'rust/entries', 'rust/clean_html' | 17 | html_filters.push 'rust/entries', 'rust/clean_html' |
| 18 | 18 | ||
| 19 | options[:only_patterns] = [ | 19 | options[:only_patterns] = [ |
| 20 | /\Abook\/first-edition\//, | 20 | /\Abook\/second-edition\//, |
| 21 | /\Areference\//, | 21 | /\Areference\//, |
| 22 | /\Acollections\//, | 22 | /\Acollections\//, |
| 23 | /\Astd\// ] | 23 | /\Astd\// ] |
| 24 | 24 | ||
| 25 | options[:skip] = %w(book/first-edition/README.html) | 25 | options[:skip] = %w(book/second-edition/README.html) |
| 26 | options[:skip_patterns] = [/(?<!\.html)\z/] | 26 | options[:skip_patterns] = [/(?<!\.html)\z/, /\/print\.html/] |
| 27 | 27 | ||
| 28 | options[:fix_urls] = ->(url) do | 28 | options[:fix_urls] = ->(url) do |
| 29 | url.sub! %r{(#{Rust.base_url}.+/)\z}, '\1index.html' | 29 | url.sub! %r{(#{Rust.base_url}.+/)\z}, '\1index.html' |
| @@ -1,8 +1,8 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Typescript < UrlScraper | 2 | class Typescript < UrlScraper |
| 3 | self.name = 'TypeScript' | 3 | self.name = 'TypeScript' |
| 4 | self.type = 'typescript' | 4 | self.type = 'simple' |
| 5 | self.release = '2.9.0' | 5 | self.release = '3.0.1' |
| 6 | self.base_url = 'https://www.typescriptlang.org/docs/' | 6 | self.base_url = 'https://www.typescriptlang.org/docs/' |
| 7 | self.root_path = 'tutorial.html' | 7 | self.root_path = 'tutorial.html' |
| 8 | self.links = { | 8 | self.links = { |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Vagrant < UrlScraper | 2 | class Vagrant < UrlScraper |
| 3 | self.name = 'Vagrant' | 3 | self.name = 'Vagrant' |
| 4 | self.type = 'vagrant' | 4 | self.type = 'simple' |
| 5 | self.release = '2.1.1' | 5 | self.release = '2.1.1' |
| 6 | self.base_url = 'https://www.vagrantup.com/docs/' | 6 | self.base_url = 'https://www.vagrantup.com/docs/' |
| 7 | self.root_path = 'index.html' | 7 | self.root_path = 'index.html' |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Vulkan < UrlScraper | 2 | class Vulkan < UrlScraper |
| 3 | self.name = 'Vulkan' | 3 | self.name = 'Vulkan' |
| 4 | self.type = 'vulkan' | 4 | self.type = 'simple' |
| 5 | self.release = '1.0.59' | 5 | self.release = '1.0.59' |
| 6 | self.base_url = 'https://www.khronos.org/registry/vulkan/specs/1.0/' | 6 | self.base_url = 'https://www.khronos.org/registry/vulkan/specs/1.0/' |
| 7 | self.root_path = 'apispec.html' | 7 | self.root_path = 'apispec.html' |
| @@ -4,7 +4,7 @@ module Docs · 3 unmodified lines | |||
| 4 | self.type = 'webpack' | 4 | self.type = 'webpack' |
| 5 | 5 | ||
| 6 | version do | 6 | version do |
| 7 | self.release = '4.12.0' | 7 | self.release = '4.16.5' |
| 8 | self.base_url = 'https://webpack.js.org/' | 8 | self.base_url = 'https://webpack.js.org/' |
| 9 | self.root_path = 'guides/' | 9 | self.root_path = 'guides/' |
| 10 | self.initial_paths = %w( | 10 | self.initial_paths = %w( |
| @@ -1,7 +1,7 @@ | |||
| 1 | module Docs | 1 | module Docs |
| 2 | class Yarn < UrlScraper | 2 | class Yarn < UrlScraper |
| 3 | self.type = 'yarn' | 3 | self.type = 'simple' |
| 4 | self.release = '1.7.0' | 4 | self.release = '1.9.4' |
| 5 | self.base_url = 'https://yarnpkg.com/en/docs/' | 5 | self.base_url = 'https://yarnpkg.com/en/docs/' |
| 6 | self.links = { | 6 | self.links = { |
| 7 | home: 'https://yarnpkg.com/', | 7 | home: 'https://yarnpkg.com/', |