| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- module CompatTables
- require 'json'
- require 'net/http'
- require 'pry'
- 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'
- 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
- last_table_entry.add_child("<th><code>#{key}")
- 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.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
- entry.add_child(format_string)
- end
- end
|