diff --git a/_config.yml b/_config.yml index e132fb0f..1851e5be 100644 --- a/_config.yml +++ b/_config.yml @@ -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 diff --git a/_less/screen.less b/_less/screen.less index 28304662..0e73695b 100644 --- a/_less/screen.less +++ b/_less/screen.less @@ -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{ diff --git a/_plugins/contributors.rb b/_plugins/contributors.rb index e4dac71a..dea97c23 100644 --- a/_plugins/contributors.rb +++ b/_plugins/contributors.rb @@ -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 - end - end - - def merge_contributors(contributors, aliases) - contributors = contributors.map do |c| - c['name'] = aliases[c['name']] if aliases.has_key?(c['name']) - - c - 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 + # 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 - }.flatten + # 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 + # Generate final ordered contributors array + result.each do |key, value| + contributors.push(value) + end + 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 diff --git a/_templates/development.html b/_templates/development.html index 9fa1caae..bd915b83 100755 --- a/_templates/development.html +++ b/_templates/development.html @@ -77,7 +77,7 @@ id: development
{% for c in site.contributors %} {% if c.gravatar_id %}icon{% else %}icon{% endif %} - {% if c.login %}{{ c.name }} ({{ c.contributions }}){% else %}{{ c.name }} ({{ c.contributions }}){% endif %} + {% if c.login %}{{ c.name | htmlescape }} ({{ c.contributions }}){% else %}{{ c.name | htmlescape }} ({{ c.contributions }}){% endif %} {% endfor %}