build.webkit.org/dashboard: Move layoutTestResultsDirectoryURLForIteration implementa...
[WebKit-https.git] / Websites / webkit.org / team.html
1 <?php 
2 $title = "WebKit Team";
3 include("header.inc");
4 ?>
5
6 <h2>WebKit Team</h2>
7
8 <p>Here is the key for each item:</p>
9 <ul>
10     <li><strong class="name">Name</strong> <span class="nick">(IRC nickname)</span> <em class="affiliation">Affiliation</em>
11         <ul><li class="expertise">Areas of knowledge</li></ul>
12     </li>
13 </ul>
14
15 <div id="container">
16 <h2>Reviewers</h2>
17 <ul id="reviewers"></ul>
18
19 <h2>Committers</h2>
20 <ul id="committers"></ul>
21
22 <h2>Contributors</h2>
23 <ul id="contributors"></ul>
24 </div>
25
26 <script>
27
28 var svnTrunkUrl = 'https://svn.webkit.org/repository/webkit/trunk/';
29 var domainAffiliations = {
30     'apple.com': 'Apple',
31     'adobe.com': 'Adobe',
32     'basyskom.com': 'basysKom GmbH',
33     'cisco.com': 'Cisco Systems',
34     'collabora.co.uk': 'Collabora',
35     'company100.com': 'Company100',
36     'google.com': 'Google',
37     'igalia.com': 'Igalia',
38     'intel.com' : 'Intel',
39     'lge.com' : 'LG Electronics',
40     'motorola.com': 'Motorola Mobility',
41     'navercorp.com' : 'Naver',
42     'nokia.com': 'Nokia',
43     'openbossa.org': 'INdT / Nokia',
44     'profusion.mobi': 'ProFUSION',
45     'rim.com': 'Research In Motion',
46     'samsung.com': 'Samsung Electronics',
47     'sencha.com': 'Sencha',
48     'sisa.samsung.com': 'Samsung Electronics',
49     'torchmobile.com.cn': 'Torch Mobile (Beijing) Co. Ltd.',
50     'digia.com': 'Digia',
51     'partner.samsung.com': 'Samsung Electronics',
52
53     // Universities
54     'inf.u-szeged.hu': 'University of Szeged',
55     'stud.u-szeged.hu': 'University of Szeged',
56
57     // Open source communities
58     'chromium.org': 'Chromium',
59     'codeaurora.org': 'Code Aurora Forum',
60     'gnome.org': 'GNOME',
61     'kde.org': 'KDE'
62 };
63
64 function parseContributorsJSON(text) {
65     var contributorsJSON = JSON.parse(text);
66     var contributors = [];
67
68     for (var contributorType in contributorsJSON) {
69         for (var contributor in contributorsJSON[contributorType]) {
70             contributors.push({
71                 name: contributor,
72                 kind: contributorType.replace(/s$/, "").toLowerCase(),
73                 emails: contributorsJSON[contributorType][contributor].emails,
74                 nicks: contributorsJSON[contributorType][contributor].nicks,
75                 expertise: contributorsJSON[contributorType][contributor].expertise
76             });
77         }
78     }
79     return contributors;
80 }
81
82 function formatAffiliation(contributor) {
83     if (contributor.affiliation)
84         return contributor.affiliation;
85
86     if (!contributor.emails || !contributor.emails.length)
87         return null;
88
89     var affiliations = [];
90     for (var domain in domainAffiliations) {
91         for (var i = 0; i < contributor.emails.length; i++) {
92             if (contributor.emails[i].indexOf('@' + domain) > 0 && affiliations.indexOf(domainAffiliations[domain]) < 0)
93                 affiliations.push(domainAffiliations[domain]);
94         }
95     }
96     return affiliations.join(' / ');
97 }
98
99 function addText(container, text) { container.appendChild(document.createTextNode(text)); }
100
101 function addWrappedText(container, tagName, attributes, text) {
102     var element = document.createElement(tagName);
103     for (var name in attributes)
104         element.setAttribute(name, attributes[name]);
105     addText(element, text);
106     container.appendChild(element);
107 }
108
109 function populateContributorListItem(listItem, contributor) {
110     addWrappedText(listItem, 'strong', {'class': 'name'}, contributor.name);
111     if (contributor.nicks) {
112         addText(listItem, ' (');
113         addWrappedText(listItem, 'span', {'class': 'nicks'}, contributor.nicks.join(', '));
114         addText(listItem, ')');
115     }
116
117     var affiliation = formatAffiliation(contributor);
118     if (affiliation) {
119         addText(listItem, ' ');
120         addWrappedText(listItem, 'em', {'class': 'affiliation'}, affiliation);        
121     }
122
123     if (contributor.expertise) {
124         var expertiseList = document.createElement('ul');
125         addWrappedText(expertiseList, 'li', {'class': 'expertise'}, contributor.expertise);
126         listItem.appendChild(expertiseList);
127     }
128 }
129
130 function populateContributorList(contributors, kind) {
131     var contributorsOfKind = contributors.filter(function(contributor) { return contributor.kind == kind; });
132     var listElement = document.getElementById(kind + 's');
133     for (var i = 0; i < contributorsOfKind.length; i++) {
134         var listItem = document.createElement('li');
135         listElement.appendChild(listItem);
136         populateContributorListItem(listItem, contributorsOfKind[i]);
137     }
138 }
139
140 function nicksInListItem(listItem) {
141     var nicksContainer = listItem.querySelector('.nicks');
142     if (!nicksContainer || !nicksContainer.textContent)
143         return null;
144     return nicksContainer.textContent.split(/,\s*/);
145 }
146
147 function findListChildForContributor(contributor) {
148     var listChildren = document.getElementsByTagName('li');
149     for (var i = 0; i < listChildren.length; i++) {
150         var nameContainer = listChildren[i].querySelector('.name');
151         if (nameContainer && nameContainer.textContent.toLowerCase().indexOf(contributor.name.toLowerCase()) >= 0)
152             return listChildren[i];
153         var nicksInContainer = nicksInListItem(listChildren[i]);
154         if (nicksInContainer && contributor.nicks) {
155             for (var j = 0; j < contributor.nicks.length; j++) {
156                 if (nicksInContainer.indexOf(contributor.nicks[j]) >= 0)
157                     return listChildren[i];
158             }
159         }
160     }
161     return null;
162 }
163
164 var xhr = new XMLHttpRequest();
165 xhr.onload = function () {
166     if (this.status !== 200)
167         return this.onerror();
168     var contributors = parseContributorsJSON(this.responseText);
169
170     populateContributorList(contributors, 'reviewer');
171     populateContributorList(contributors, 'committer');
172     populateContributorList(contributors, 'contributor');
173 };
174 xhr.onerror = function () { document.getElementById('container').textContent = 'Could not obtain contributors.json'; };
175 xhr.open('GET', svnTrunkUrl + 'Tools/Scripts/webkitpy/common/config/contributors.json');
176 xhr.send();
177
178 </script>
179
180 <?php
181 include("footer.inc");
182 ?>