mirror of
https://github.com/seigler/dash-docs
synced 2025-07-27 09:46:12 +00:00
Improve contributors.rb plugin
Validate returned data from GitHub API htmlescape data on the HTML page Drop unnecessary yaml dependency Add more comments in the code Add more aliases in _config.yml Fix vertical-align style
This commit is contained in:
parent
f6f85b4447
commit
187ed2562a
4 changed files with 68 additions and 33 deletions
|
@ -112,6 +112,13 @@ aliases:
|
|||
--author=Satoshi Nakamoto: Satoshi Nakamoto
|
||||
gavinandresen: Gavin Andresen
|
||||
tcatm: Nils Schneider
|
||||
gmaxwell: Gregory Maxwell
|
||||
sipa: Pieter Wuille
|
||||
jgarzik: Jeff Garzik
|
||||
petertodd: Peter Todd
|
||||
luke-jr: Luke-Jr
|
||||
laanwj: Wladimir J. van der Laan
|
||||
mikehearn: Mike Hearn
|
||||
|
||||
safe: false
|
||||
server_port: 4000
|
||||
|
|
|
@ -961,10 +961,11 @@ table td,table th{
|
|||
font-size:80%;
|
||||
}
|
||||
.contributors span{
|
||||
padding:6px 0;
|
||||
padding:8px 0;
|
||||
width:170px;
|
||||
overflow:hidden;
|
||||
display:inline-block;
|
||||
vertical-align:top;
|
||||
}
|
||||
|
||||
.resources{
|
||||
|
|
|
@ -4,56 +4,83 @@
|
|||
|
||||
require 'open-uri'
|
||||
require 'json'
|
||||
require 'yaml'
|
||||
|
||||
module Jekyll
|
||||
|
||||
class CategoryGenerator < Generator
|
||||
def fetch_contributors
|
||||
page = 1
|
||||
|
||||
def contributors(aliases)
|
||||
contributors = []
|
||||
# Call GitHub API with 100 results per page
|
||||
page = 1
|
||||
data = []
|
||||
while page < 10 do
|
||||
begin
|
||||
ar = JSON.parse(open("https://api.github.com/repos/bitcoin/bitcoin/contributors?page=#{page}&per_page=100","User-Agent"=>"Ruby/#{RUBY_VERSION}").read)
|
||||
# Prevent any error to stop the build process, return an empty array instead
|
||||
rescue
|
||||
print 'GitHub API Call Failed!'
|
||||
break
|
||||
end
|
||||
if !ar.is_a?(Array)
|
||||
print 'GitHub API Call Failed!'
|
||||
return contributors
|
||||
end
|
||||
if ar.length > 100
|
||||
print 'GitHub API exceeding the 100 results limit!'
|
||||
return contributors
|
||||
end
|
||||
# Stop calling GitHub API when no new results are returned
|
||||
break if (ar.length == 0)
|
||||
contributors.push(*ar)
|
||||
# Merge contributors into a single array
|
||||
data.push(*ar)
|
||||
page += 1
|
||||
end
|
||||
|
||||
contributors.map do |x|
|
||||
x['name'] = x['login'] unless x.has_key?('name')
|
||||
x['name'] = x['login'] if x['name'] == ""
|
||||
|
||||
x
|
||||
# Loop in returned results array
|
||||
result = {}
|
||||
for c in data
|
||||
# Skip incomplete / invalid data and set contributor's name
|
||||
next if !c.is_a?(Hash)
|
||||
next if !c.has_key?('contributions') or !c['contributions'].is_a?(Integer) or c['contributions'] > 1000000
|
||||
if c.has_key?('name') and c['name'].is_a?(String) and /^[A-Za-z0-9\-]{1,150}$/.match(c['name'])
|
||||
name = c['name']
|
||||
elsif c.has_key?('login') and c['login'].is_a?(String) and /^[A-Za-z0-9\-]{1,150}$/.match(c['login'])
|
||||
name = c['login']
|
||||
else
|
||||
next
|
||||
end
|
||||
# Replace name by its corresponding alias if defined in _config.yml
|
||||
name = aliases[name] if aliases.has_key?(name)
|
||||
# Assign variables
|
||||
x = {}
|
||||
x['name'] = name
|
||||
x['contributions'] = c['contributions']
|
||||
# Set gravatar_id when available
|
||||
if c.has_key?('gravatar_id') and c['gravatar_id'].is_a?(String) and /^[A-Za-z0-9\-]{1,150}$/.match(c['gravatar_id'])
|
||||
x['gravatar_id'] = c['gravatar_id']
|
||||
end
|
||||
# Set login when available
|
||||
if c.has_key?('login') and c['login'].is_a?(String) and /^[A-Za-z0-9\-]{1,150}$/.match(c['login'])
|
||||
x['login'] = c['login']
|
||||
end
|
||||
# Add new contributor to the array, or increase contributions if it already exists
|
||||
if result.has_key?(name)
|
||||
result[name]['contributions'] += x['contributions']
|
||||
else
|
||||
result[name] = x
|
||||
end
|
||||
end
|
||||
|
||||
def merge_contributors(contributors, aliases)
|
||||
contributors = contributors.map do |c|
|
||||
c['name'] = aliases[c['name']] if aliases.has_key?(c['name'])
|
||||
|
||||
c
|
||||
# Generate final ordered contributors array
|
||||
result.each do |key, value|
|
||||
contributors.push(value)
|
||||
end
|
||||
|
||||
hoaoh = contributors.reduce({}) do |result, item|
|
||||
result.merge({ item['name'] => [item] }) { |key, old, new| old[0]['contributions'] += new[0]['contributions']; old }
|
||||
end
|
||||
|
||||
hoaoh.values.map { |sublist|
|
||||
sublist.reduce({}) do |merged,h|
|
||||
merged.merge(h) do |key,old,new| (key=='name' ? old : old+new) end
|
||||
end
|
||||
}.flatten
|
||||
contributors.sort_by{|c| - c['contributions']}
|
||||
end
|
||||
|
||||
def generate(site)
|
||||
# Set site.contributors global variables for liquid/jekyll
|
||||
class << site
|
||||
attr_accessor :contributors
|
||||
|
||||
alias contrib_site_payload site_payload
|
||||
def site_payload
|
||||
h = contrib_site_payload
|
||||
|
@ -63,8 +90,8 @@ module Jekyll
|
|||
h
|
||||
end
|
||||
end
|
||||
|
||||
site.contributors = merge_contributors(fetch_contributors(), site.config['aliases']).sort_by{|c| - c['contributions']}
|
||||
# Populate site.contributors array
|
||||
site.contributors = contributors(site.config['aliases'])
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -77,7 +77,7 @@ id: development
|
|||
<div class="contributors">{% for c in site.contributors %}
|
||||
<span>
|
||||
{% if c.gravatar_id %}<img class="icon" height="16" width="16" src="https://secure.gravatar.com/avatar/{{c.gravatar_id}}?s=140&d=mm" alt="icon" />{% else %}<img class="icon" height="16" width="16" alt="icon" />{% endif %}
|
||||
{% if c.login %}<a href="https://github.com/{{c.login}}">{{ c.name }} ({{ c.contributions }})</a>{% else %}{{ c.name }} ({{ c.contributions }}){% endif %}
|
||||
{% if c.login %}<a href="https://github.com/{{c.login}}">{{ c.name | htmlescape }} ({{ c.contributions }})</a>{% else %}<a>{{ c.name | htmlescape }} ({{ c.contributions }})</a>{% endif %}
|
||||
</span>{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue