diff --git a/lib/docs/filters/http/entries.rb b/lib/docs/filters/http/entries.rb index 1d4f98c8..a6793f86 100644 --- a/lib/docs/filters/http/entries.rb +++ b/lib/docs/filters/http/entries.rb @@ -6,9 +6,9 @@ module Docs name = at_css('h1').content name.remove! %r{\A.+\:} name.remove! %r{\A.+\-\-} - rfc = slug.sub('rfc', 'RFC ') + name = 'WebDAV' if name.include?('WebDAV') "#{rfc}: #{name.strip}" - elsif slug.start_with?('Status') + elsif slug.start_with?('Status/') at_css('code').content else name = super @@ -22,7 +22,7 @@ module Docs end def get_type - return 'RFC' if current_url.host == 'tools.ietf.org' + return name if current_url.host == 'tools.ietf.org' if slug.start_with?('Headers/Content-Security-Policy') 'CSP' @@ -38,6 +38,94 @@ module Docs 'Guides' end end + + def rfc + slug.sub('rfc', 'RFC ') + end + + SECTIONS = { + 'rfc2616' => [ + [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15], + [14], + [] + ], + 'rfc4918' => [ + [], + [11], + [] + ], + 'rfc7230' => [ + (2..9).to_a, + [], + [] + ], + 'rfc7231' => [ + [3, 8, 9], + [], + [4, 5, 6, 7] + ], + 'rfc7232' => [ + [5, 6, 7, 8], + [2, 3, 4], + [] + ], + 'rfc7233' => [ + [5, 6], + [2, 3, 4], + [] + ], + 'rfc7234' => [ + [3, 6, 7, 8], + [4, 5], + [] + ], + 'rfc7235' => [ + [2, 5, 6], + [3, 4], + [] + ] + } + + LEVEL_1 = /\A(\d+)\z/ + LEVEL_2 = /\A(\d+)\.\d+\z/ + LEVEL_3 = /\A(\d+)\.\d+\.\d+\z/ + + def additional_entries + return [] unless current_url.host == 'tools.ietf.org' + type = nil + + css('a[href^="#section-"]').each_with_object([]) do |node, entries| + id = node['href'].remove('#') + break entries if entries.any? { |e| e[1] == id } + + content = node.next.content.strip + content.remove! %r{\s*\.+\d*\z} + content.remove! %r{\A[\.\s]+} + + name = "#{content} (#{rfc})" + number = node.content.strip + + if number =~ LEVEL_1 + if SECTIONS[slug][0].include?($1.to_i) + entries << [name, id, self.name] + end + + type = content.sub(/\ Definitions\z/, 's') + if type.include?('Header Fields') + type = 'Headers' + elsif type.include?('Status Codes') + type = 'Status' + elsif type.include?('Methods') + type = 'Methods' + else + type = self.name + end + elsif (number =~ LEVEL_2 && SECTIONS[slug][1].include?($1.to_i)) || + (number =~ LEVEL_3 && SECTIONS[slug][2].include?($1.to_i)) + entries << [name, id, (name =~ /\A\d\d\d/ ? 'Status' : type )] + end + end + end end end end diff --git a/lib/docs/scrapers/http.rb b/lib/docs/scrapers/http.rb index d1c83577..81f81ee3 100644 --- a/lib/docs/scrapers/http.rb +++ b/lib/docs/scrapers/http.rb @@ -17,6 +17,10 @@ module Docs options[:skip_links] = ->(filter) { filter.current_url.host == 'tools.ietf.org' ? true : false } + options[:fix_urls] = ->(url) { + url.sub! %r{(Status/\d\d\d)_[A-Z].+}, '\1' + url + } options[:attribution] = ->(filter) { if filter.current_url.host == 'tools.ietf.org' "© document authors. All rights reserved."