compat_tables.rb 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. module CompatTables
  2. require 'json'
  3. require 'net/http'
  4. require 'pry'
  5. BROWSERS = {
  6. 'chrome' => 'Chrome',
  7. 'edge' => 'Edge',
  8. 'firefox' => 'Firefox',
  9. 'ie' => 'Internet Explorer',
  10. 'opera' => 'Opera',
  11. 'safari' => 'Safari',
  12. 'webview_android' => 'WebView Android',
  13. 'chrome_android' => 'Chrome Android',
  14. 'firefox_android' => 'Firefox for Android',
  15. 'opera_android' => 'Opera Android',
  16. 'safari_ios' => 'Safari on IOS',
  17. 'samsunginternet_android' => 'Samsung Internet'
  18. }
  19. def generate_compatibility_table()
  20. json_files_uri = request_bcd_uris()
  21. compat_tables = []
  22. json_files_uri.each do |uri|
  23. compat_tables.push(generate_compatibility_table_wrapper(uri))
  24. end
  25. return compat_tables
  26. end
  27. def request_bcd_uris
  28. index_json = JSON.load(Net::HTTP.get(URI(current_url.to_s + '/index.json')))
  29. uris = []
  30. index_json['doc']['body'].each do |element|
  31. uris.push(element['value']['dataURL']) if element['type'] == 'browser_compatibility'
  32. end
  33. uris.map! do |uri|
  34. tmp_uri = URI.parse(base_url.to_s)
  35. tmp_uri.path = uri
  36. uri = tmp_uri.to_s
  37. end
  38. return uris
  39. end
  40. def generate_compatibility_table_wrapper(uri)
  41. @json_data = JSON.load(Net::HTTP.get(URI(uri)))['data']
  42. html_table = generate_basic_html_table()
  43. @json_data.keys.each do |key|
  44. if key == '__compat' or @json_data[key]['__compat']
  45. add_entry_to_table(html_table, key)
  46. else
  47. end
  48. end
  49. return html_table
  50. end
  51. def generate_basic_html_table
  52. table = Nokogiri::XML::Node.new('table', doc)
  53. table.add_child('<thead><tr id=bct-browser-type><tr id=bct-browsers><tbody>')
  54. table.css('#bct-browser-type').each do |node|
  55. node.add_child('<th>')
  56. %w(Desktop Mobile).each do |browser_type|
  57. node.add_child("<th colspan=6>#{browser_type}")
  58. end
  59. end
  60. table.css('#bct-browsers').each do |node|
  61. node.add_child('<th>')
  62. BROWSERS.values.each do |browser|
  63. node.add_child("<th>#{browser}")
  64. end
  65. end
  66. return table
  67. end
  68. def add_entry_to_table(html_table, key)
  69. json = @json_data[key]
  70. html_table.at_css('tbody').add_child('<tr>')
  71. last_table_entry = html_table.at_css('tbody').last_element_child
  72. last_table_entry.add_child("<th><code>#{key}")
  73. BROWSERS.keys.each do |browser_key|
  74. if key == '__compat'
  75. add_data_to_entry(json['support'][browser_key], last_table_entry)
  76. else
  77. add_data_to_entry(json['__compat']['support'][browser_key], last_table_entry)
  78. end
  79. end
  80. end
  81. def add_data_to_entry(json, entry)
  82. version_added = []
  83. version_removed = []
  84. notes = []
  85. if json.is_a?(Array)
  86. json.each do |element|
  87. if element['version_added']
  88. version_added.push(element['version_added'])
  89. else
  90. version_added.push(false)
  91. end
  92. if element['version_removed']
  93. version_removed.push(element['version_removed'])
  94. else
  95. version_removed.push(false)
  96. end
  97. if element['notes']
  98. notes.push(element['notes'])
  99. else
  100. notes.push(false)
  101. end
  102. end
  103. else
  104. version_added.push(json['version_added'])
  105. version_removed.push(json['version_removed'])
  106. notes.push(json['notes'])
  107. end
  108. version_added.map! do |version|
  109. if version == true
  110. version = 'Yes'
  111. elsif version == false
  112. version = 'No'
  113. elsif version.is_a?(Numeric)
  114. else
  115. version = '?'
  116. end
  117. version
  118. end
  119. if version_removed[0]
  120. format_string = "<td class=bc-supports-no>"
  121. else
  122. if version_added[0] == 'No'
  123. format_string = "<td class=bc-supports-no>"
  124. else
  125. format_string = "<td class=bc-supports-yes>"
  126. end
  127. end
  128. for value in (0..version_added.length-1) do
  129. if version_removed[value]
  130. format_string += "<div>#{version_added[value]}-#{version_removed[value]}</div>"
  131. else
  132. if version_added[value] == 'No'
  133. format_string += "<div>#{version_added[value]}</div>"
  134. else
  135. format_string += "<div>#{version_added[value]}</div>"
  136. end
  137. end
  138. if notes[value]
  139. format_string += "<div>#{notes[value]}</div>"
  140. end
  141. end
  142. entry.add_child(format_string)
  143. end
  144. end