From d6756ce24fc0e6135e9baeeb0ce9eccc16ac1ef6 Mon Sep 17 00:00:00 2001 From: Phil Scherer Date: Tue, 8 Dec 2020 03:18:34 -0500 Subject: [PATCH] Update Pygame documentation (2.0.0) --- assets/stylesheets/application.css.scss | 1 + assets/stylesheets/pages/_pygame.scss | 12 +++ lib/docs/filters/pygame/clean_html.rb | 112 ++++++---------------- lib/docs/filters/pygame/entries.rb | 21 ++-- lib/docs/filters/pygame/pre_clean_html.rb | 11 +++ lib/docs/scrapers/pygame.rb | 6 +- 6 files changed, 63 insertions(+), 100 deletions(-) create mode 100644 assets/stylesheets/pages/_pygame.scss create mode 100644 lib/docs/filters/pygame/pre_clean_html.rb diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss index 41fa4c1b..97347da6 100644 --- a/assets/stylesheets/application.css.scss +++ b/assets/stylesheets/application.css.scss @@ -92,6 +92,7 @@ 'pages/phpunit', 'pages/postgres', 'pages/pug', + 'pages/pygame', 'pages/python', 'pages/qt', 'pages/ramda', diff --git a/assets/stylesheets/pages/_pygame.scss b/assets/stylesheets/pages/_pygame.scss new file mode 100644 index 00000000..10add41b --- /dev/null +++ b/assets/stylesheets/pages/_pygame.scss @@ -0,0 +1,12 @@ +._pygame { + @extend %simple; + + dl.class > dt { @extend %block-label, %label-orange; } + dl.function > dt, dl.method > dt { @extend %block-label, %label-blue; } + dl.attribute > dt, dl.exception > dt , dl.data > dt { @extend %block-label, %label-green; } + + .line-block { @extend %note; } + .line-block > .line:first-child { margin-bottom: 1em; } + .line-block > .line:only-child { margin-bottom: 0em; } + span.signature { font-family: monospace; } +} diff --git a/lib/docs/filters/pygame/clean_html.rb b/lib/docs/filters/pygame/clean_html.rb index 956807b8..af01f2d0 100644 --- a/lib/docs/filters/pygame/clean_html.rb +++ b/lib/docs/filters/pygame/clean_html.rb @@ -2,100 +2,46 @@ module Docs class Pygame class CleanHtmlFilter < Filter def call - @doc = at_css '.body' - - if root_page? - # remove unneeded stuff - at_css('.modindex-jumpbox').remove - css('[role="navigation"],.pcap, .cap, .footer').remove - # table -> list - list = at_css('table') - list.replace(list.children) - list.name = 'ul' - css('tr').each do |row| - row.name = 'li' - row.remove_attribute('class') - end - at_css('h1').content = 'Pygame' - return doc - end + @doc = at_css('.body') + root_page? ? root : other + doc + end - # remove unwanted stuff - # .headerlink => ¶ after links - # .toc => table of content - # .tooltip-content => tooltips after links to functions - css('table.toc.docutils, .headerlink, .tooltip-content').remove + def root + at_css('h1').content = 'Pygame' - # Remove wrapper .section - section = at_css('.section') - definition = at_css('.definition') - definition['id'] = section['id'] - section.replace(section.children) + # remove unneeded stuff + at_css('.modindex-jumpbox').remove + css('[role="navigation"], .pcap, .cap, .footer').remove + css('tr > td:first-child').remove - # Format code for it be highlighted - css('.highlight-default.notranslate').each do |node| - pre = node.at_css('pre') - node.replace(pre) - # gets rid of the already existing syntax highlighting - pre.content = pre.content - pre['class'] = 'language-python' - pre['data-language'] = "python" - end - - # change descriptions of functions/attributes to blockquote - css('.line-block').each do |node| - node.name = 'blockquote' + # Unitalicize package descriptions + css('td > em').each do |node| + node.parent.content = node.content end + end - # change functions - css('.definition').each do |d| + def other + css('> :not(.section), table.toc.docutils, .tooltip-content').remove - # the header is the function/attribute name. It might look something like - # this: - # pygame.image.load() - # It'll end up being something like this: - # pygame.image.load(filename) -> Surface - # pygame.image.load(fileobj, namehint="") -> Surface + # Remove code tag from function, class, method, module, etc. + css('dl > dt').each do |node| + node.content = node.content + end - header = d.at_css('dt.title') - if d['class'].include?('class') or d['class'].include?('module') - header.name = 'h1' - @section = header.content.strip - else - header.name = 'h3' - end - # save the original header - initial_header = header.content.strip - # save the real name for the entries - header['data-name'] = initial_header - # empty the header - if header.name == 'h3' - header.inner_html = '' - end - # to replace it with the signatures - next_el = header.next_element - signatures = next_el.css('.signature') - signatures.each do |sig| - sig.name = 'code' - if header.name == 'h3' - sig.parent = header - # the signature don't contain pygame.module. I think it's better - # to display them, as it avoids confusion with methods (have a - # look at the pygame.Rect page) - if initial_header.start_with?(@section) - sig.content = @section + '.' + sig.text - end - # separate the signatures on different lines. - header.add_child "
" - end - end + css('> .section > dl > dt').each do |node| + node.name = 'h1' + node.parent.parent.before(node) end - css('> dl', '> dl > dd', 'h1 code').each do |node| - node.before(node.children).remove + # Format code for it be highlighted + css('.highlight-default.notranslate').each do |node| + node.name = 'pre' + node.content = node.content.strip + node['class'] = 'language-python' + node['data-language'] = 'python' end - doc end end end diff --git a/lib/docs/filters/pygame/entries.rb b/lib/docs/filters/pygame/entries.rb index 94c171b6..08ebda88 100644 --- a/lib/docs/filters/pygame/entries.rb +++ b/lib/docs/filters/pygame/entries.rb @@ -2,26 +2,19 @@ module Docs class Pygame class EntriesFilter < Docs::EntriesFilter def get_name - at_css('h1').content.remove('pygame.') + at_css('.title').content.remove('pygame.').strip end def get_type - at_css('h1').content + at_css('.title').content.strip end def additional_entries - return [] if root_page? - - css('h1, h2, h3').each_with_object [] do |node, entries| - name = node['id'] || node['data-name'] - - if node.parent['class'].include?('function') or node.parent['class'].include?('method') - name << '()' - end - - name.remove!('pygame.') - - entries << [name, node['id']] unless name == self.name + css('dl.definition > dt.title').each_with_object [] do |node, entries| + name = node['id'] || node.parent.parent['id'] + name.remove! 'pygame.' + id = node['id'] + entries << [name, id] unless name == self.name end end end diff --git a/lib/docs/filters/pygame/pre_clean_html.rb b/lib/docs/filters/pygame/pre_clean_html.rb new file mode 100644 index 00000000..4cf71095 --- /dev/null +++ b/lib/docs/filters/pygame/pre_clean_html.rb @@ -0,0 +1,11 @@ +module Docs + class Pygame + class PreCleanHtmlFilter < Filter + def call + # Remove ¶ character from tag w/ name & type + css('.headerlink').remove + doc + end + end + end +end diff --git a/lib/docs/scrapers/pygame.rb b/lib/docs/scrapers/pygame.rb index f77ddbc7..75bcb198 100644 --- a/lib/docs/scrapers/pygame.rb +++ b/lib/docs/scrapers/pygame.rb @@ -1,7 +1,7 @@ module Docs class Pygame < UrlScraper - self.type = 'simple' - self.release = '1.9.6' + self.type = 'pygame' + self.release = '2.0.0' self.base_url = 'https://www.pygame.org/docs/' self.root_path = 'py-modindex.html' self.links = { @@ -9,7 +9,7 @@ module Docs code: 'https://github.com/pygame/pygame' } - html_filters.push 'pygame/clean_html', 'pygame/entries' + html_filters.push 'pygame/pre_clean_html', 'pygame/entries', 'pygame/clean_html' options[:only_patterns] = [/ref\//]