Add adobe.com to team.html
[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 <div id="container">
9 <h2>Reviewers</h2>
10 <ul id="reviewers"></ul>
11
12 <h2>Committers</h2>
13 <ul id="committers"></ul>
14
15 <h2>Contributors</h2>
16 <ul id="contributors"></ul>
17 </div>
18
19 <script>
20
21 var svnTrunkUrl = 'http://svn.webkit.org/repository/webkit/trunk/';
22 var domainAffiliations = {
23     'apple.com': 'Apple',
24     'adobe.com': 'Adobe',
25     'collabora.co.uk': 'Collabora',
26     'google.com': 'Google',
27     'igalia.com': 'Igalia',
28     'motorola.com': 'Motorola Mobility',
29     'nokia.com': 'Nokia',
30     'openbossa.org': 'INdT / Nokia',
31     'profusion.mobi': 'ProFUSION',
32     'rim.com': 'Research In Motion',
33     'samsung.com': 'Samsung Electronics',
34     'sencha.com': 'Sencha',
35     'sisa.samsung.com': 'Samsung Electronics',
36     'torchmobile.com.cn': 'Torch Mobile (Beijing) Co. Ltd.',
37
38     // Universities
39     'inf.u-szeged.hu': 'University of Szeged',
40
41     // Open source communities
42     'chromium.org': 'Chromium',
43     'codeaurora.org': 'Code Aurora Forum',
44     'gnome.org': 'GNOME',
45     'kde.org': 'KDE'
46 };
47
48 function parseCommittersPy(text) {
49     var lines = text.split('\n');
50     var contributors = [];
51     for (var i = 0; i < lines.length; i++) {
52         var contributorLine = /^\s+(Reviewer|Committer|Contributor)\((.+)\),?$/;
53         var match = contributorLine.exec(lines[i]);
54         if (!match)
55             continue;
56
57         try {
58             var nameEmailsNicks = JSON.parse('[' + match[2].replace(/^u"/,'"') + ']');
59         } catch (e) {
60             continue;
61         }
62         contributors.push({
63             name: nameEmailsNicks[0],
64             kind: match[1].toLowerCase(),
65             emails: typeof nameEmailsNicks[1] == 'string' ? [nameEmailsNicks[1]] : nameEmailsNicks[1],
66             nicks: typeof nameEmailsNicks[2] == 'string' ? [nameEmailsNicks[2]] : nameEmailsNicks[2],
67             area: nameEmailsNicks[3]
68         });
69     }
70     return contributors;
71 }
72
73 function formatAffiliation(contributor) {
74     if (contributor.affiliation)
75         return contributor.affiliation;
76
77     if (!contributor.emails || !contributor.emails.length)
78         return null;
79
80     var affiliations = [];
81     for (var domain in domainAffiliations) {
82         for (var i = 0; i < contributor.emails.length; i++) {
83             if (contributor.emails[i].indexOf('@' + domain) > 0 && affiliations.indexOf(domainAffiliations[domain]) < 0)
84                 affiliations.push(domainAffiliations[domain]);
85         }
86     }
87     return affiliations.join(' / ');
88 }
89
90 function addText(container, text) { container.appendChild(document.createTextNode(text)); }
91
92 function addWrappedText(container, tagName, attributes, text) {
93     var element = document.createElement(tagName);
94     for (var name in attributes)
95         element.setAttribute(name, attributes[name]);
96     addText(element, text);
97     container.appendChild(element);
98 }
99
100 function populateContributorListItem(listItem, contributor) {
101     addWrappedText(listItem, 'strong', {'class': 'name'}, contributor.name);
102     if (contributor.nicks) {
103         addText(listItem, ' (');
104         addWrappedText(listItem, 'span', {'class': 'nicks'}, contributor.nicks.join(', '));
105         addText(listItem, ')');
106     }
107
108     var affiliation = formatAffiliation(contributor);
109     if (affiliation) {
110         addText(listItem, ' ');
111         addWrappedText(listItem, 'em', {'class': 'affiliation'}, affiliation);        
112     }
113 }
114
115 function populateContributorList(contributors, kind) {
116     var contributorsOfKind = contributors.filter(function(contributor) { return contributor.kind == kind; });
117     var listElement = document.getElementById(kind + 's');
118     for (var i = 0; i < contributorsOfKind.length; i++) {
119         var listItem = document.createElement('li');
120         listElement.appendChild(listItem);
121         populateContributorListItem(listItem, contributorsOfKind[i]);
122     }
123 }
124
125 function nicksInListItem(listItem) {
126     var nicksContainer = listItem.querySelector('.nicks');
127     if (!nicksContainer || !nicksContainer.textContent)
128         return null;
129     return nicksContainer.textContent.split(/,\s*/);
130 }
131
132 function findListChildForContributor(contributor) {
133     var listChildren = document.getElementsByTagName('li');
134     for (var i = 0; i < listChildren.length; i++) {
135         var nameContainer = listChildren[i].querySelector('.name');
136         if (nameContainer && nameContainer.textContent.toLowerCase().indexOf(contributor.name.toLowerCase()) >= 0)
137             return listChildren[i];
138         var nicksInContainer = nicksInListItem(listChildren[i]);
139         if (nicksInContainer && contributor.nicks) {
140             for (var j = 0; j < contributor.nicks.length; j++) {
141                 if (nicksInContainer.indexOf(contributor.nicks[j]) >= 0)
142                     return listChildren[i];
143             }
144         }
145     }
146     return null;
147 }
148
149 function annotateWithWikiData() {
150     function annotateForContributor(contributor) {
151         var listItem = findListChildForContributor(contributor);
152         if (!listItem) {
153             var listElement = document.getElementById(contributor.kind + 's');
154             var listItem = document.createElement('li');
155             listElement.appendChild(listItem);
156             listItem.style.backgroundColor = 'red';
157             populateContributorListItem(listItem, contributor);
158         } else {
159             var affiliationContainer = listItem.querySelector('.affiliation');
160             var affiliation = formatAffiliation(contributor);
161             if (affiliation && (!affiliationContainer || affiliationContainer.textContent != affiliation)) {
162                 addText(listItem, ' ');
163                 addWrappedText(listItem, 'em', {'style': 'background-color:red'}, affiliation);
164             }
165         }
166     }
167
168     var webkitTeamWikiUrl = 'http://trac.webkit.org/wiki/WebKit%20Team';
169     var xhr = new XMLHttpRequest();
170     xhr.onload = function () {
171         if (this.status !== 200)
172             return this.onerror();
173
174         var lines = this.responseText.split('\n');
175         // Match lines like * '''Ryosuke Niwa''' (rniwa) ''Google''
176         var teamWikiContributorEntryPattern = /^\s+\*\s+'''([^']+)'''\s*(\(([^']+)\)\s*)?(''([^']+)'')?\s*$/;
177         for (var i = 0; i < lines.length; i++) {
178             var match = lines[i].match(/\=\s+(Reviewer|Committer|Contributor)s\s+=/i);
179             if (match) {
180                 var currentKind = match[1].toLowerCase();
181                 continue;
182             }
183
184             // Strip special HTML characters
185             match = lines[i].replace(/[{}<>"%;&+/]/g, '').match(teamWikiContributorEntryPattern);
186             if (currentKind && match) {
187                 annotateForContributor({
188                     kind: currentKind,
189                     name: match[1],
190                     nicks: match[3] ? match[3].split(/,\s*/) : null,
191                     affiliation: match[5]
192                 });
193             }
194         }
195     }
196     xhr.onerror = function () { alert('Could not obtain http://trac.webkit.org/wiki/WebKit%20Team'); };
197     xhr.open('GET', webkitTeamWikiUrl + '?format=txt');
198     xhr.send();
199 }
200
201 var xhr = new XMLHttpRequest();
202 xhr.onload = function () {
203     if (this.status !== 200)
204         return this.onerror();
205     var contributors = parseCommittersPy(this.responseText);
206
207     populateContributorList(contributors, 'reviewer');
208     populateContributorList(contributors, 'committer');
209     populateContributorList(contributors, 'contributor');
210
211     if (location.search.indexOf('annotate') >= 0)
212         annotateWithWikiData();
213 };
214 xhr.onerror = function () { document.getElementById('container').textContent = 'Could not obtain committers.py'; };
215 xhr.open('GET', svnTrunkUrl + 'Tools/Scripts/webkitpy/common/config/committers.py');
216 xhr.send();
217
218 </script>
219
220 <?php
221 include("footer.inc");
222 ?>