From 9a297edc84a67b141d400238948202d0b55234df Mon Sep 17 00:00:00 2001 From: Enoc Date: Tue, 4 May 2021 20:59:43 -0600 Subject: [PATCH] Convert compat tables module to a filter. - Fix numbers in tables. --- lib/docs/core/compat_tables.rb | 194 -------------------- lib/docs/core/filter.rb | 5 - lib/docs/filters/css/clean_html.rb | 14 -- lib/docs/filters/dom/clean_html.rb | 14 -- lib/docs/filters/html/clean_html.rb | 12 -- lib/docs/filters/javascript/clean_html.rb | 13 -- lib/docs/filters/mdn/compat_tables.rb | 212 ++++++++++++++++++++++ lib/docs/filters/svg/clean_html.rb | 14 -- lib/docs/filters/xslt_xpath/clean_html.rb | 13 -- lib/docs/scrapers/mdn/mdn.rb | 2 +- 10 files changed, 213 insertions(+), 280 deletions(-) delete mode 100644 lib/docs/core/compat_tables.rb create mode 100644 lib/docs/filters/mdn/compat_tables.rb diff --git a/lib/docs/core/compat_tables.rb b/lib/docs/core/compat_tables.rb deleted file mode 100644 index 82fbac31..00000000 --- a/lib/docs/core/compat_tables.rb +++ /dev/null @@ -1,194 +0,0 @@ -module CompatTables - require 'json' - require 'net/http' - - BROWSERS = { - 'chrome' => 'Chrome', - 'edge' => 'Edge', - 'firefox' => 'Firefox', - 'ie' => 'Internet Explorer', - 'opera' => 'Opera', - 'safari' => 'Safari', - 'webview_android' => 'WebView Android', - 'chrome_android' => 'Chrome Android', - 'firefox_android' => 'Firefox for Android', - 'opera_android' => 'Opera Android', - 'safari_ios' => 'Safari on IOS', - 'samsunginternet_android' => 'Samsung Internet' - } - - def generate_compatibility_table() - json_files_uri = request_bcd_uris() - - compat_tables = [] - - json_files_uri.each do |uri| - compat_tables.push(generate_compatibility_table_wrapper(uri)) - end - - return compat_tables - end - - def request_bcd_uris - index_json = JSON.load(Net::HTTP.get(URI(current_url.to_s + '/index.json'))) - - uris = [] - - index_json['doc']['body'].each do |element| - uris.push(element['value']['dataURL']) if element['type'] == 'browser_compatibility' and element['value']['dataURL'] - end - - uris.map! do |uri| - tmp_uri = URI.parse(base_url.to_s) - tmp_uri.path = uri - uri = tmp_uri.to_s - end - - return uris - end - - def generate_compatibility_table_wrapper(uri) - - @json_data = JSON.load(Net::HTTP.get(URI(uri)))['data'] - - html_table = generate_basic_html_table() - - @json_data.keys.each do |key| - if key == '__compat' or @json_data[key]['__compat'] - add_entry_to_table(html_table, key) - else - end - end - - return html_table - end - - def generate_basic_html_table - table = Nokogiri::XML::Node.new('table', doc) - - table.add_child('') - - table.css('#bct-browser-type').each do |node| - node.add_child('') - %w(Desktop Mobile).each do |browser_type| - node.add_child("#{browser_type}") - end - end - - table.css('#bct-browsers').each do |node| - node.add_child('') - - BROWSERS.values.each do |browser| - node.add_child("#{browser}") - end - end - - return table - end - - def add_entry_to_table(html_table, key) - json = @json_data[key] - - html_table.at_css('tbody').add_child('') - - last_table_entry = html_table.at_css('tbody').last_element_child - - if key == '__compat' - tmp = slug.split('/') - last_table_entry.add_child("#{tmp.last}") - else - last_table_entry.add_child("#{key}") - end - - - BROWSERS.keys.each do |browser_key| - if key == '__compat' - add_data_to_entry(json['support'][browser_key], last_table_entry) - else - add_data_to_entry(json['__compat']['support'][browser_key], last_table_entry) - end - - end - end - - def add_data_to_entry(json, entry) - version_added = [] - version_removed = [] - notes = [] - - if json - if json.is_a?(Array) - json.each do |element| - - if element['version_added'] - version_added.push(element['version_added']) - else - version_added.push(false) - end - - if element['version_removed'] - version_removed.push(element['version_removed']) - else - version_removed.push(false) - end - - if element['notes'] - notes.push(element['notes']) - else - notes.push(false) - end - - end - else - version_added.push(json['version_added']) - version_removed.push(json['version_removed']) - notes.push(json['notes']) - end - - version_added.map! do |version| - if version == true - version = 'Yes' - elsif version == false - version = 'No' - elsif version.is_a?(Numeric) - else - version = '?' - end - - version - end - - if version_removed[0] - format_string = "" - else - if version_added[0] == 'No' - format_string = "" - else - format_string = "" - end - end - - for value in (0..version_added.length-1) do - if version_removed[value] - format_string += "
#{version_added[value]}-#{version_removed[value]}
" - else - if version_added[value] == 'No' - format_string += "
#{version_added[value]}
" - else - format_string += "
#{version_added[value]}
" - end - end - - if notes[value] - format_string += "
#{notes[value]}
" - end - end - - else - format_string = "
?
" - end - - entry.add_child(format_string) - end - -end diff --git a/lib/docs/core/filter.rb b/lib/docs/core/filter.rb index 8f6bf173..5be77883 100644 --- a/lib/docs/core/filter.rb +++ b/lib/docs/core/filter.rb @@ -1,12 +1,7 @@ # frozen_string_literal: true -require './lib/docs/core/compat_tables.rb' - module Docs class Filter < ::HTML::Pipeline::Filter - - include CompatTables - def css(*args) doc.css(*args) end diff --git a/lib/docs/filters/css/clean_html.rb b/lib/docs/filters/css/clean_html.rb index a081e32a..f202f7c9 100644 --- a/lib/docs/filters/css/clean_html.rb +++ b/lib/docs/filters/css/clean_html.rb @@ -26,21 +26,7 @@ module Docs css('img[style*="float"]').each do |node| node['style'] = node['style'] + ';float: none; display: block;' end - - if at_css('#browser_compatibility') \ - and not at_css('#browser_compatibility').next_sibling.classes.include?('warning') \ - and not at_css('#browser_compatibility').next_sibling.content.match?('Supported') - - at_css('#browser_compatibility').next_sibling.remove - - compatibility_tables = generate_compatibility_table() - compatibility_tables.each do |table| - at_css('#browser_compatibility').add_next_sibling(table) - end - end - end - end end end diff --git a/lib/docs/filters/dom/clean_html.rb b/lib/docs/filters/dom/clean_html.rb index d7c3981c..d6704468 100644 --- a/lib/docs/filters/dom/clean_html.rb +++ b/lib/docs/filters/dom/clean_html.rb @@ -38,21 +38,7 @@ module Docs node['class'] = 'syntaxbox' node.parent.before(node).remove end - - if at_css('#browser_compatibility') \ - and not at_css('#browser_compatibility').next_sibling.classes.include?('warning') \ - and not at_css('#browser_compatibility').next_sibling.content.match?('Supported') - - at_css('#browser_compatibility').next_sibling.remove - - compatibility_tables = generate_compatibility_table() - compatibility_tables.each do |table| - at_css('#browser_compatibility').add_next_sibling(table) - end - end - end - end end end diff --git a/lib/docs/filters/html/clean_html.rb b/lib/docs/filters/html/clean_html.rb index ee090ef2..0d6b43b4 100644 --- a/lib/docs/filters/html/clean_html.rb +++ b/lib/docs/filters/html/clean_html.rb @@ -6,18 +6,6 @@ module Docs node.before(node.children).remove end - if at_css('#browser_compatibility') \ - and not at_css('#browser_compatibility').next_sibling.classes.include?('warning') \ - and not at_css('#browser_compatibility').next_sibling.content.match?('Supported') - - at_css('#browser_compatibility').next_sibling.remove - - compatibility_tables = generate_compatibility_table() - compatibility_tables.each do |table| - at_css('#browser_compatibility').add_next_sibling(table) - end - end - doc end end diff --git a/lib/docs/filters/javascript/clean_html.rb b/lib/docs/filters/javascript/clean_html.rb index 0187e4bf..eeb23ba8 100644 --- a/lib/docs/filters/javascript/clean_html.rb +++ b/lib/docs/filters/javascript/clean_html.rb @@ -19,19 +19,6 @@ module Docs css('div > .overheadIndicator:first-child:last-child', 'div > .blockIndicator:first-child:last-child').each do |node| node.parent.replace(node) end - - if at_css('#browser_compatibility') \ - and not at_css('#browser_compatibility').next_sibling.classes.include?('warning') \ - and not at_css('#browser_compatibility').next_sibling.content.match?('Supported') - - at_css('#browser_compatibility').next_sibling.remove - - compatibility_tables = generate_compatibility_table() - compatibility_tables.each do |table| - at_css('#browser_compatibility').add_next_sibling(table) - end - end - end end end diff --git a/lib/docs/filters/mdn/compat_tables.rb b/lib/docs/filters/mdn/compat_tables.rb new file mode 100644 index 00000000..8f81b488 --- /dev/null +++ b/lib/docs/filters/mdn/compat_tables.rb @@ -0,0 +1,212 @@ +module Docs + class Mdn + class CompatTablesFilter < Filter + + def call + if at_css('#browser_compatibility') \ + and not at_css('#browser_compatibility').next_sibling.classes.include?('warning') \ + and not at_css('#browser_compatibility').next_sibling.content.match?('Supported') + + at_css('#browser_compatibility').next_sibling.remove + + compatibility_tables = generate_compatibility_table() + compatibility_tables.each do |table| + at_css('#browser_compatibility').add_next_sibling(table) + end + end + + doc + end + + BROWSERS = { + 'chrome' => 'Chrome', + 'edge' => 'Edge', + 'firefox' => 'Firefox', + 'ie' => 'Internet Explorer', + 'opera' => 'Opera', + 'safari' => 'Safari', + 'webview_android' => 'WebView Android', + 'chrome_android' => 'Chrome Android', + 'firefox_android' => 'Firefox for Android', + 'opera_android' => 'Opera Android', + 'safari_ios' => 'Safari on IOS', + 'samsunginternet_android' => 'Samsung Internet' + } + + def generate_compatibility_table() + json_files_uri = request_bcd_uris() + + compat_tables = [] + + json_files_uri.each do |uri| + compat_tables.push(generate_compatibility_table_wrapper(uri)) + end + + return compat_tables + end + + def request_bcd_uris + index_json = JSON.load(Net::HTTP.get(URI(current_url.to_s + '/index.json'))) + + uris = [] + + index_json['doc']['body'].each do |element| + uris.push(element['value']['dataURL']) if element['type'] == 'browser_compatibility' and element['value']['dataURL'] + end + + uris.map! do |uri| + tmp_uri = URI.parse(base_url.to_s) + tmp_uri.path = uri + uri = tmp_uri.to_s + end + + return uris + end + + def generate_compatibility_table_wrapper(uri) + + @json_data = JSON.load(Net::HTTP.get(URI(uri)))['data'] + + html_table = generate_basic_html_table() + + @json_data.keys.each do |key| + if key == '__compat' or @json_data[key]['__compat'] + add_entry_to_table(html_table, key) + else + end + end + + return html_table + end + + def generate_basic_html_table + table = Nokogiri::XML::Node.new('table', doc) + + table.add_child('') + + table.css('#bct-browser-type').each do |node| + node.add_child('') + %w(Desktop Mobile).each do |browser_type| + node.add_child("#{browser_type}") + end + end + + table.css('#bct-browsers').each do |node| + node.add_child('') + + BROWSERS.values.each do |browser| + node.add_child("#{browser}") + end + end + + return table + end + + def add_entry_to_table(html_table, key) + json = @json_data[key] + + html_table.at_css('tbody').add_child('') + + last_table_entry = html_table.at_css('tbody').last_element_child + + if key == '__compat' + tmp = slug.split('/') + last_table_entry.add_child("#{tmp.last}") + else + last_table_entry.add_child("#{key}") + end + + + BROWSERS.keys.each do |browser_key| + if key == '__compat' + add_data_to_entry(json['support'][browser_key], last_table_entry) + else + add_data_to_entry(json['__compat']['support'][browser_key], last_table_entry) + end + + end + end + + def add_data_to_entry(json, entry) + version_added = [] + version_removed = [] + notes = [] + + if json + if json.is_a?(Array) + json.each do |element| + + if element['version_added'] + version_added.push(element['version_added']) + else + version_added.push(false) + end + + if element['version_removed'] + version_removed.push(element['version_removed']) + else + version_removed.push(false) + end + + if element['notes'] + notes.push(element['notes']) + else + notes.push(false) + end + + end + else + version_added.push(json['version_added']) + version_removed.push(json['version_removed']) + notes.push(json['notes']) + end + + version_added.map! do |version| + if version == true + version = 'Yes' + elsif version == false + version = 'No' + elsif version.is_a?(String) + else + version = '?' + end + + version + end + + if version_removed[0] + format_string = "" + else + if version_added[0] == 'No' + format_string = "" + else + format_string = "" + end + end + + for value in (0..version_added.length-1) do + if version_removed[value] + format_string += "
#{version_added[value]}-#{version_removed[value]}
" + else + if version_added[value] == 'No' + format_string += "
#{version_added[value]}
" + else + format_string += "
#{version_added[value]}
" + end + end + + if notes[value] + format_string += "
#{notes[value]}
" + end + end + + else + format_string = "
?
" + end + + entry.add_child(format_string) + end + + end + end +end diff --git a/lib/docs/filters/svg/clean_html.rb b/lib/docs/filters/svg/clean_html.rb index 15904229..fa9003f3 100644 --- a/lib/docs/filters/svg/clean_html.rb +++ b/lib/docs/filters/svg/clean_html.rb @@ -7,7 +7,6 @@ module Docs end def root - end def other @@ -26,20 +25,7 @@ module Docs node['class'] = 'index' css('h3').each { |n| n.name = 'span' } end - - if at_css('#browser_compatibility') \ - and not at_css('#browser_compatibility').next_sibling.classes.include?('warning') \ - and not at_css('#browser_compatibility').next_sibling.content.match?('Supported') - - at_css('#browser_compatibility').next_sibling.remove - - compatibility_tables = generate_compatibility_table() - compatibility_tables.each do |table| - at_css('#browser_compatibility').add_next_sibling(table) - end - end end - end end end diff --git a/lib/docs/filters/xslt_xpath/clean_html.rb b/lib/docs/filters/xslt_xpath/clean_html.rb index e7c62084..82096b20 100644 --- a/lib/docs/filters/xslt_xpath/clean_html.rb +++ b/lib/docs/filters/xslt_xpath/clean_html.rb @@ -24,19 +24,6 @@ module Docs child = child.next while child && child.text? && child.content.blank? child.remove if child.try(:name) == 'br' end - - if at_css('#browser_compatibility') \ - and not at_css('#browser_compatibility').next_sibling.classes.include?('warning') \ - and not at_css('#browser_compatibility').next_sibling.content.match?('Supported') - - at_css('#browser_compatibility').next_sibling.remove - - compatibility_tables = generate_compatibility_table() - compatibility_tables.each do |table| - at_css('#browser_compatibility').add_next_sibling(table) - end - end - end end end diff --git a/lib/docs/scrapers/mdn/mdn.rb b/lib/docs/scrapers/mdn/mdn.rb index 03a1d44b..2b31668a 100644 --- a/lib/docs/scrapers/mdn/mdn.rb +++ b/lib/docs/scrapers/mdn/mdn.rb @@ -3,7 +3,7 @@ module Docs self.abstract = true self.type = 'mdn' - html_filters.push 'mdn/clean_html' + html_filters.push 'mdn/clean_html', 'mdn/compat_tables' options[:container] = '#content > .main-page-content' options[:trailing_slash] = false