You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
devdocs/lib/docs/scrapers/support_tables.rb

188 lines
5.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

require 'yajl/json_gem'
module Docs
class SupportTables < Doc
include Instrumentable
self.name = 'Support Tables'
self.slug = 'browser_support_tables'
self.type = 'support_tables'
self.release = '1.0.30001376'
def build_pages
url = 'https://github.com/Fyrd/caniuse/raw/main/data.json'
instrument 'running.scraper', urls: [url]
response = Request.run(url)
instrument 'process_response.scraper', response: response
data = JSON.parse(response.body)
instrument 'queued.scraper', urls: data['data'].keys
data['agents']['and_chr']['browser'] = 'Android Chrome'
data['agents']['and_ff']['browser'] = 'Android Firefox'
data['agents']['and_uc']['browser'] = 'Android UC Browser'
data['desktop_agents'] = data['agents'].select { |_, agent| agent['type'] == 'desktop' }
data['mobile_agents'] = data['agents'].select { |, agent| agent['type'] == 'mobile' }
data['total_versions'] = data['agents']['firefox']['versions'].length
index_page = {
path: 'index',
store_path: 'index.html',
output: ERB.new(INDEX_PAGE_ERB).result(binding),
entries: [Entry.new(nil, 'index', nil)]
}
yield index_page
data['data'].each do |feature_id, feature|
url = "https://github.com/Fyrd/caniuse/raw/main/features-json/#{feature_id}.json"
response = Request.run(url)
instrument 'process_response.scraper', response: response
feature = JSON.parse(response.body)
name = feature['title']
type = feature['categories'].find { |category| name.include?(category) } || feature['categories'].first
page = {
path: feature_id,
store_path: "#{feature_id}.html",
output: ERB.new(PAGE_ERB).result(binding),
entries: [Entry.new(name, feature_id, type)]
}
yield page
end
end
def md_to_html(str)
str = CGI::escape_html(str.strip)
str.gsub! %r{`(.*?)`}, '<code>\1</code>'
str.gsub! %r{\n\s*\n}, '</p><p>'
str.gsub! "\n", '<br>'
str.gsub! %r{\[(.+?)\]\((.+?)\)}, '<a href="\2">\1</a>'
str
end
def support_to_css_class(support)
support.select { |s| s.length == 1 }.join(' ')
end
def support_to_note_indicators(support)
notes = support.select { |s| s.start_with?('#') }.map { |s| s[1..-1] }
notes << '*' if support.include?('x')
"<sup>(#{notes.join(',')})</sup>" if notes.present?
end
INDEX_PAGE_ERB = <<-HTML.strip_heredoc
<h1>Browser support tables</h1>
HTML
PAGE_ERB = <<-HTML.strip_heredoc
<h1><%= feature['title'] %></h1>
<p><%= md_to_html feature['description'] %></p>
<table>
<% if feature['spec'].present? %>
<tr>
<th>Spec</th>
<td><a href="<%= feature['spec'] %>"><%= feature['spec'] %></a></td>
</tr>
<% end %>
<% if feature['status'].present? %>
<tr>
<th>Status</th>
<td><%= data['statuses'][feature['status']] %></td>
</tr>
<% end %>
</table>
<% ['desktop', 'mobile'].each do |type| %>
<table class="stats">
<tr>
<% data["\#{type}_agents"].each do |agent_id, agent| %>
<th><%= agent['browser'] %></th>
<% end %>
</tr>
<% (0...(data['total_versions'])).reverse_each do |i| %>
<% next if data["\#{type}_agents"].none? { |_, agent| agent['versions'][i] } %>
<% if i == (data['total_versions'] - 8) %>
<tr class="show-all">
<th class="show-all" colspan="<%= data["\#{type}_agents"].length %>">
<a href="#" class="show-all">Show all</a>
</th>
</tr>
<% end %>
<tr<%= ' class="current"' if i == (data['total_versions'] - 4) %>>
<% data["\#{type}_agents"].each do |agent_id, agent| %>
<% version = agent['versions'][i] %>
<% if version %>
<% support = feature['stats'][agent_id][version].split(' ') %>
<% feature['prefix'] = true if support.include?('x') %>
<td class="<%= support_to_css_class(support) %>"><%= version %> <%= support_to_note_indicators(support) %></td>
<% else %>
<td>&nbsp;</td>
<% end %>
<% end %>
</tr>
<% end %>
</table>
<% end %>
<h2>Notes</h2>
<% if feature['notes'].present? %>
<p><%= md_to_html feature['notes'] %></p>
<% end %>
<% if feature['notes_by_num'].present? %>
<ol>
<% feature['notes_by_num'].each do |num, note| %>
<li><p><%= md_to_html note %></p></li>
<% end %>
</ol>
<% end %>
<% if feature['prefix'] %>
<dl>
<dd><sup>*</sup> Partial support with prefix.</dd>
</dl>
<% end %>
<% if feature['bugs'].present? %>
<h2>Bugs</h2>
<ul>
<% feature['bugs'].each do |bug| %>
<li><p><%= md_to_html bug['description'] %></p></li>
<% end %>
</ul>
<% end %>
<% if feature['links'].present? %>
<h2>Resources</h2>
<ul>
<% feature['links'].each do |link| %>
<li><a href="<%= link['url'] %>"><%= link['title'] %></a></li>
<% end %>
</ul>
<% end %>
<div class="_attribution">
<p class="_attribution-p">
Data by caniuse.com<br>
Licensed under the Creative Commons Attribution License v4.0.<br>
<a href="https://caniuse.com/<%= feature_id %>" class="_attribution-link">https://caniuse.com/<%= feature_id %></a>
</p>
</div>
HTML
def get_latest_version(opts)
get_npm_version('caniuse-db', opts)
end
end
end