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