Added Eigen3 document
Unified · Split
| @@ -262,6 +262,11 @@ credits = [ · 261 unmodified lines | |||
| 262 | '2001-2015 by the original authors<br>Drupal is a registered trademark of Dries Buytaert.', | 262 | '2001-2015 by the original authors<br>Drupal is a registered trademark of Dries Buytaert.', |
| 263 | 'GPLv2', | 263 | 'GPLv2', |
| 264 | 'https://api.drupal.org/api/drupal/LICENSE.txt' | 264 | 'https://api.drupal.org/api/drupal/LICENSE.txt' |
| 265 | ],[ | ||
| 266 | 'Eigen3', | ||
| 267 | 'Eigen', | ||
| 268 | 'MPL2', | ||
| 269 | 'https://www.mozilla.org/en-US/MPL/2.0/' | ||
| 265 | ], [ | 270 | ], [ |
| 266 | 'Electron', | 271 | 'Electron', |
| 267 | 'GitHub Inc.', | 272 | 'GitHub Inc.', |
| @@ -52,6 +52,7 @@ · 51 unmodified lines | |||
| 52 | 'pages/dart', | 52 | 'pages/dart', |
| 53 | 'pages/dojo', | 53 | 'pages/dojo', |
| 54 | 'pages/drupal', | 54 | 'pages/drupal', |
| 55 | 'pages/eigen3', | ||
| 55 | 'pages/elixir', | 56 | 'pages/elixir', |
| 56 | 'pages/elisp', | 57 | 'pages/elisp', |
| 57 | 'pages/ember', | 58 | 'pages/ember', |
Empty file added.
| @@ -0,0 +1,25 @@ | |||
| 1 | module Docs | ||
| 2 | class Eigen3 | ||
| 3 | class CleanHtmlFilter < Filter | ||
| 4 | |||
| 5 | def call | ||
| 6 | @doc = at_css('#doc-content') | ||
| 7 | css('#MSearchSelectWindow').remove | ||
| 8 | css('#MSearchResultsWindow').remove | ||
| 9 | css('.directory .levels').remove | ||
| 10 | css('.header .summary').remove | ||
| 11 | css('.ttc').remove | ||
| 12 | css('.top').remove | ||
| 13 | css('.dynheader.closed').remove | ||
| 14 | css('.permalink').remove | ||
| 15 | css('.groupheader').remove | ||
| 16 | css('.header').remove | ||
| 17 | css('#details').remove | ||
| 18 | css('*').each do |node| | ||
| 19 | node.remove_attribute('class') | ||
| 20 | end | ||
| 21 | doc | ||
| 22 | end | ||
| 23 | end | ||
| 24 | end | ||
| 25 | end | ||
| @@ -0,0 +1,123 @@ | |||
| 1 | module Docs | ||
| 2 | class Eigen3 | ||
| 3 | class EntriesFilter < Docs::EntriesFilter | ||
| 4 | def get_type | ||
| 5 | group = at_css('.title .ingroups') | ||
| 6 | content = at_css('.contents').content | ||
| 7 | title = get_title() | ||
| 8 | downtitle = title.downcase | ||
| 9 | name = get_name | ||
| 10 | |||
| 11 | if slug.include?('unsupported') | ||
| 12 | return 'Unsupported' | ||
| 13 | elsif slug.start_with?('Topic') || downtitle.end_with?("topics") | ||
| 14 | return 'Topics' | ||
| 15 | elsif downtitle.end_with?("class template reference") || downtitle.end_with?("class reference") | ||
| 16 | return 'Classes' | ||
| 17 | elsif downtitle.end_with?("struct reference") | ||
| 18 | return 'Structs' | ||
| 19 | elsif downtitle.end_with?("typedefs") | ||
| 20 | return 'Typedefs' | ||
| 21 | elsif downtitle.end_with?("namespace reference") | ||
| 22 | return 'Namespaces' | ||
| 23 | elsif not group.nil? and group.content.include?('Reference') and (downtitle.end_with?("module") || downtitle.end_with?("modules")) | ||
| 24 | return "Modules" | ||
| 25 | elsif not group.nil? | ||
| 26 | if group.children.length > 0 | ||
| 27 | return 'Chapter: ' + group.children[-1].content | ||
| 28 | else | ||
| 29 | return 'Chapter: ' + group.content | ||
| 30 | end | ||
| 31 | else | ||
| 32 | return 'Eigen' | ||
| 33 | end | ||
| 34 | end | ||
| 35 | |||
| 36 | def get_name | ||
| 37 | title = get_title().gsub(/[<(].*/, '').gsub(/(Class|Class Template|Namespace|Struct) Reference/, '').strip | ||
| 38 | end | ||
| 39 | |||
| 40 | def get_title | ||
| 41 | unless at_css('.title').nil? | ||
| 42 | group = at_css('.title .ingroups') | ||
| 43 | title = at_css('.title').content | ||
| 44 | if not group.nil? | ||
| 45 | title = title.delete_suffix(group.content) | ||
| 46 | end | ||
| 47 | return title.strip | ||
| 48 | else | ||
| 49 | return slug | ||
| 50 | end | ||
| 51 | end | ||
| 52 | |||
| 53 | |||
| 54 | def additional_entries | ||
| 55 | # return [] if slug.include?('unsupported') | ||
| 56 | name = get_name() | ||
| 57 | entries = [] | ||
| 58 | |||
| 59 | css('table.memberdecls').map do |table| | ||
| 60 | doxygen_type = table.at_css("tr.heading").text.strip | ||
| 61 | case doxygen_type | ||
| 62 | when "Functions" | ||
| 63 | type = "Functions" | ||
| 64 | when "Public Member Functions", "Static Public Member Functions", "Public Types", "Additional Inherited Members" | ||
| 65 | type = nil | ||
| 66 | when "Classes" | ||
| 67 | type = "Classes" | ||
| 68 | when "Typedefs" | ||
| 69 | type = "Typedefs" | ||
| 70 | when "Variables" | ||
| 71 | type = "Variables" | ||
| 72 | else | ||
| 73 | next | ||
| 74 | end | ||
| 75 | |||
| 76 | tmp_entries = [] | ||
| 77 | |||
| 78 | table.css('td.memItemRight,td.memTemplItemRight').map do |node_r| | ||
| 79 | node_l = node_r.parent.at_css('memItemLeft') | ||
| 80 | if (not node_l.nil? and node_l.text.strip == 'enum') || node_r.content.include?('{') | ||
| 81 | node_r.css("a").each {|n| tmp_entries << [n.content, n.attr('href')]} | ||
| 82 | else | ||
| 83 | n = node_r.at_css("a") | ||
| 84 | next if n.nil? | ||
| 85 | tmp_entries << [node_r.content, n.attr('href')] | ||
| 86 | end | ||
| 87 | end | ||
| 88 | |||
| 89 | tmp_entries.each do |args| | ||
| 90 | (content, href) = args | ||
| 91 | next if href.nil? | ||
| 92 | if not href.include?("#") and (name == 'Eigen' || type == "Classes") then | ||
| 93 | next | ||
| 94 | end | ||
| 95 | |||
| 96 | if slug.include?('unsupported') | ||
| 97 | if not (href.include?('unsupported') || href.include?('#')) | ||
| 98 | next | ||
| 99 | elsif href.include?('#') and not href.include?('unsupported') | ||
| 100 | href = 'unsupported/' + href | ||
| 101 | end | ||
| 102 | end | ||
| 103 | |||
| 104 | if doxygen_type == "Typedefs" | ||
| 105 | content = content.sub(/\s*=.*$/, "") | ||
| 106 | end | ||
| 107 | |||
| 108 | if not (name.end_with?('module') || name.end_with?('typedefs')) \ | ||
| 109 | and not content.start_with?("Eigen::") | ||
| 110 | content = name + "::" + content | ||
| 111 | end | ||
| 112 | content.gsub! /^\s+/, '' | ||
| 113 | content.gsub! /\s+,\s+/, ', ' | ||
| 114 | content.gsub! /\s\s+/, ' ' | ||
| 115 | entries << [content, href, type] | ||
| 116 | end | ||
| 117 | |||
| 118 | end | ||
| 119 | entries | ||
| 120 | end | ||
| 121 | end | ||
| 122 | end | ||
| 123 | end | ||
| @@ -0,0 +1,76 @@ | |||
| 1 | module Docs | ||
| 2 | class Eigen3 < UrlScraper | ||
| 3 | self.name = 'Eigen3' | ||
| 4 | self.type = 'eigen3' | ||
| 5 | self.slug = 'eigen3' | ||
| 6 | self.base_url = 'https://eigen.tuxfamily.org/dox/' | ||
| 7 | self.root_path = 'index.html' | ||
| 8 | self.initial_paths = [ | ||
| 9 | "modules.html" | ||
| 10 | ] | ||
| 11 | self.release = '3.4.0' | ||
| 12 | |||
| 13 | self.links = { | ||
| 14 | home: 'https://eigen.tuxfamily.org', | ||
| 15 | code: 'https://gitlab.com/libeigen/eigen' | ||
| 16 | } | ||
| 17 | |||
| 18 | html_filters.push 'eigen3/entries', 'eigen3/clean_html', 'title' | ||
| 19 | |||
| 20 | # Remove the `clean_text` because Doxygen are actually creating empty | ||
| 21 | # anchor such as <a id="asd"></a> to do anchor link.. and that anchor | ||
| 22 | # will be removed by clean_text | ||
| 23 | self.text_filters = FilterStack.new | ||
| 24 | text_filters.push 'images', 'inner_html', 'attribution' | ||
| 25 | |||
| 26 | |||
| 27 | |||
| 28 | def get_latest_version(opts) | ||
| 29 | tags = get_gitlab_tags("https://gitlab.com", "libeigen", "eigen", opts) | ||
| 30 | tags[0]['name'] | ||
| 31 | end | ||
| 32 | |||
| 33 | options[:attribution] = <<-HTML | ||
| 34 | © Eigen.<br> | ||
| 35 | Licensed under the MPL2 License. | ||
| 36 | HTML | ||
| 37 | |||
| 38 | # Skip source code since it doesn't provide any useful docs | ||
| 39 | options[:skip_patterns] = [/_source/, /-members/, /__Reference\.html/, /_chapter\.html/, /\.txt/, /\.tgz/] | ||
| 40 | |||
| 41 | # TODO: replace cppreference | ||
| 42 | # options[:replace_urls] = { 'http://en.cppreference.com/w/cpp/' => 'cpp/' } | ||
| 43 | |||
| 44 | def parse(response) # Hook here because Nokogori removes whitespace from code fragments | ||
| 45 | last_idx = 0 | ||
| 46 | # Process nested <div>s inside code fragment div. | ||
| 47 | while not (last_idx = response.body.index('<div class="fragment">', last_idx)).nil? | ||
| 48 | # enter code fragment <div> | ||
| 49 | level = 1 | ||
| 50 | while not (last_idx = response.body.index(/<\/?div/, last_idx+1)).nil? | ||
| 51 | # skip nested divs inside. | ||
| 52 | if response.body[last_idx..last_idx+3] == '<div' | ||
| 53 | level += 1 | ||
| 54 | else | ||
| 55 | level -= 1 | ||
| 56 | end | ||
| 57 | break if level == 0 # exit code fragment | ||
| 58 | end | ||
| 59 | if not last_idx.nil? and response.body[last_idx..last_idx+5] == '</div>' | ||
| 60 | response.body[last_idx..last_idx+5] = '</pre>' | ||
| 61 | end | ||
| 62 | end | ||
| 63 | response.body.gsub! /[\r\n\s]*<div class="ttc"[^>]*>.*<\/div>[\r\n\s]*/, "" | ||
| 64 | response.body.gsub! /<div class="line">(.*?)<\/div>/m, "\\1" | ||
| 65 | response.body.gsub! '<div class="fragment">', '<pre class="fragment" data-language="cpp">' | ||
| 66 | super | ||
| 67 | end | ||
| 68 | |||
| 69 | def process_response?(response) | ||
| 70 | return false unless super | ||
| 71 | # Remove Empty pages. | ||
| 72 | response.body.index(/<div class="contents">[\r\n\s]*<\/div>/m).nil? and \ | ||
| 73 | response.body.index(/<p>TODO: write this dox page!<\/p>/).nil? | ||
| 74 | end | ||
| 75 | end | ||
| 76 | end | ||
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1 @@ | |||
| 1 | https://gitlab.com/libeigen/eigen/-/blob/master/doc/Eigen_Silly_Professor_64x64.png | ||