diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee index c7e5a414..e0ef245f 100644 --- a/assets/javascripts/templates/pages/about_tmpl.coffee +++ b/assets/javascripts/templates/pages/about_tmpl.coffee @@ -290,6 +290,11 @@ credits = [ '2005-2018 Linus Torvalds and others', 'GPLv2', 'https://raw.githubusercontent.com/git/git/master/COPYING' + ], [ + 'GnuCOBOL', + 'Free Software Foundation', + 'GFDL', + 'https://www.gnu.org/licenses/fdl-1.3.en.html' ], [ 'Go', 'Google, Inc.', diff --git a/lib/docs/filters/gnu_cobol/clean_html.rb b/lib/docs/filters/gnu_cobol/clean_html.rb new file mode 100644 index 00000000..4e0d9ef2 --- /dev/null +++ b/lib/docs/filters/gnu_cobol/clean_html.rb @@ -0,0 +1,56 @@ +module Docs + class GnuCobol + class CleanHtmlFilter < Filter + def call + # Replace the title + at_css('.settitle').content = 'GnuCOBOL' + + # Remove the Table of Contents + # It's huge and the DevDocs sidebar is basically a direct copy + css('.contents, .contents-heading').remove + + # Remove the changelog + at_css('p').remove + at_css('ol').remove + + # Remove everything after Appendix B + # This includes the license text, the document changelog, the compiler changelog and the footnote + start_element = at_css('a[name="Appendix-C-_002d-GNU-Free-Documentation-License"]').previous_element + next_element = start_element.next_element + until start_element.nil? + start_element.remove + start_element = next_element + next_element = start_element.nil? ? nil : start_element.next_element + end + + # Make headers bigger + css('h4').each {|node| node.name = 'h3'} + + # Remove the newlines + # All paragraphs are inside <p> tags already anyways + css('br').remove + + # The original document contains sub-headers surrounded by equal signs + # Convert that to actual header elements + css('div[align="center"]').each do |node| + if node.content.include?('=' * 50) + node.replace('<hr>') + else + node.remove_attribute('align') + node.name = 'h4' + end + end + + # Remove all hr's after h4's + css('h4').each do |node| + next_element = node.next_element + if !next_element.nil? && next_element.name == 'hr' + next_element.remove + end + end + + doc + end + end + end +end diff --git a/lib/docs/filters/gnu_cobol/entries.rb b/lib/docs/filters/gnu_cobol/entries.rb new file mode 100644 index 00000000..a11e2edd --- /dev/null +++ b/lib/docs/filters/gnu_cobol/entries.rb @@ -0,0 +1,50 @@ +module Docs + class GnuCobol + class EntriesFilter < Docs::EntriesFilter + # The entire reference is one big page, so get_name and get_type are not necessary + + def additional_entries + entries = [] + + css('.contents > ul > li:not(:last-child)').each do |node| + parent = node.at_css('a') + + entries << create_entry(parent, parent) + + node.css('ul a').each do |link| + entries << create_entry(parent, link) + end + end + + entries.compact + end + + def create_entry(parent_link, current_link) + name = current_link.content + id = current_link['href'][1..-1] + type = parent_link.content + + # The navigation link don't actually navigate to the correct header + # Instead, it references an `a` tag above it + # The `a` tag it is referencing is removed by a filter further down the pipeline + # This adds the id to the correct header element + target_node = at_css("a[name='#{id}']") + target_node.next_element.next_element['id'] = id + + if name.start_with?('Appendix') + type = 'Appendices' + end + + # Everything after Appendix B is removed by the clean_html filter + ignored_names = [ + 'Appendix C - GNU Free Documentation License', + 'Appendix D - Summary of Document Changes', + 'Appendix E - Summary of Compiler Changes since 2009 and version v1-1', + 'Index' + ] + + ignored_names.include?(name) ? nil : [name, id, type] + end + end + end +end diff --git a/lib/docs/scrapers/gnu_cobol.rb b/lib/docs/scrapers/gnu_cobol.rb new file mode 100644 index 00000000..75d939a9 --- /dev/null +++ b/lib/docs/scrapers/gnu_cobol.rb @@ -0,0 +1,20 @@ +module Docs + class GnuCobol < UrlScraper + self.name = 'GnuCOBOL' + self.slug = 'gnu_cobol' + self.type = 'simple' + self.release = '2.2' + self.base_url = 'https://open-cobol.sourceforge.io/HTML/gnucobpg.html' + self.links = { + home: 'https://sourceforge.net/projects/open-cobol/', + code: 'https://sourceforge.net/p/open-cobol/code/HEAD/tree/trunk/' + } + + html_filters.push 'gnu_cobol/entries', 'gnu_cobol/clean_html' + + options[:attribution] = <<-HTML + Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.<br> + Licensed under the GNU Free Documentation License. + HTML + end +end