mirror of
https://github.com/freeCodeCamp/devdocs
synced 2024-11-16 19:48:10 +01:00
Convert compat tables module to a filter.
- Fix numbers in tables.
This commit is contained in:
parent
5b3e3b3e53
commit
9a297edc84
10 changed files with 213 additions and 280 deletions
|
@ -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('<thead><tr id=bct-browser-type><tr id=bct-browsers><tbody>')
|
||||
|
||||
table.css('#bct-browser-type').each do |node|
|
||||
node.add_child('<th>')
|
||||
%w(Desktop Mobile).each do |browser_type|
|
||||
node.add_child("<th colspan=6>#{browser_type}")
|
||||
end
|
||||
end
|
||||
|
||||
table.css('#bct-browsers').each do |node|
|
||||
node.add_child('<th>')
|
||||
|
||||
BROWSERS.values.each do |browser|
|
||||
node.add_child("<th>#{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('<tr>')
|
||||
|
||||
last_table_entry = html_table.at_css('tbody').last_element_child
|
||||
|
||||
if key == '__compat'
|
||||
tmp = slug.split('/')
|
||||
last_table_entry.add_child("<th><code>#{tmp.last}")
|
||||
else
|
||||
last_table_entry.add_child("<th><code>#{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 = "<td class=bc-supports-no>"
|
||||
else
|
||||
if version_added[0] == 'No'
|
||||
format_string = "<td class=bc-supports-no>"
|
||||
else
|
||||
format_string = "<td class=bc-supports-yes>"
|
||||
end
|
||||
end
|
||||
|
||||
for value in (0..version_added.length-1) do
|
||||
if version_removed[value]
|
||||
format_string += "<div>#{version_added[value]}-#{version_removed[value]}</div>"
|
||||
else
|
||||
if version_added[value] == 'No'
|
||||
format_string += "<div>#{version_added[value]}</div>"
|
||||
else
|
||||
format_string += "<div>#{version_added[value]}</div>"
|
||||
end
|
||||
end
|
||||
|
||||
if notes[value]
|
||||
format_string += "<div>#{notes[value]}</div>"
|
||||
end
|
||||
end
|
||||
|
||||
else
|
||||
format_string = "<td class=bc-supports-no><div>?</div></td>"
|
||||
end
|
||||
|
||||
entry.add_child(format_string)
|
||||
end
|
||||
|
||||
end
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
212
lib/docs/filters/mdn/compat_tables.rb
Normal file
212
lib/docs/filters/mdn/compat_tables.rb
Normal file
|
@ -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('<thead><tr id=bct-browser-type><tr id=bct-browsers><tbody>')
|
||||
|
||||
table.css('#bct-browser-type').each do |node|
|
||||
node.add_child('<th>')
|
||||
%w(Desktop Mobile).each do |browser_type|
|
||||
node.add_child("<th colspan=6>#{browser_type}")
|
||||
end
|
||||
end
|
||||
|
||||
table.css('#bct-browsers').each do |node|
|
||||
node.add_child('<th>')
|
||||
|
||||
BROWSERS.values.each do |browser|
|
||||
node.add_child("<th>#{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('<tr>')
|
||||
|
||||
last_table_entry = html_table.at_css('tbody').last_element_child
|
||||
|
||||
if key == '__compat'
|
||||
tmp = slug.split('/')
|
||||
last_table_entry.add_child("<th><code>#{tmp.last}")
|
||||
else
|
||||
last_table_entry.add_child("<th><code>#{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 = "<td class=bc-supports-no>"
|
||||
else
|
||||
if version_added[0] == 'No'
|
||||
format_string = "<td class=bc-supports-no>"
|
||||
else
|
||||
format_string = "<td class=bc-supports-yes>"
|
||||
end
|
||||
end
|
||||
|
||||
for value in (0..version_added.length-1) do
|
||||
if version_removed[value]
|
||||
format_string += "<div>#{version_added[value]}-#{version_removed[value]}</div>"
|
||||
else
|
||||
if version_added[value] == 'No'
|
||||
format_string += "<div>#{version_added[value]}</div>"
|
||||
else
|
||||
format_string += "<div>#{version_added[value]}</div>"
|
||||
end
|
||||
end
|
||||
|
||||
if notes[value]
|
||||
format_string += "<div>#{notes[value]}</div>"
|
||||
end
|
||||
end
|
||||
|
||||
else
|
||||
format_string = "<td class=bc-supports-no><div>?</div></td>"
|
||||
end
|
||||
|
||||
entry.add_child(format_string)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue