2 $title = "WebKit Team";
10 <ul id="reviewers"></ul>
13 <ul id="committers"></ul>
16 <ul id="contributors"></ul>
21 var svnTrunkUrl = 'http://svn.webkit.org/repository/webkit/trunk/';
22 var domainAffiliations = {
24 'collabora.co.uk': 'Collabora',
25 'google.com': 'Google',
26 'igalia.com': 'Igalia',
27 'motorola.com': 'Motorola Mobility',
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 'sisa.samsung.com': 'Samsung Electronics',
35 'torchmobile.com.cn': 'Torch Mobile (Beijing) Co. Ltd.',
38 'inf.u-szeged.hu': 'University of Szeged',
40 // Open source communities
41 'chromium.org': 'Chromium',
42 'codeaurora.org': 'Code Aurora Forum',
47 function parseCommittersPy(text) {
48 var lines = text.split('\n');
49 var contributors = [];
50 for (var i = 0; i < lines.length; i++) {
51 var contributorLine = /^\s+(Reviewer|Committer|Contributor)\((.+)\),?$/;
52 var match = contributorLine.exec(lines[i]);
57 var nameEmailsNicks = JSON.parse('[' + match[2].replace(/^u"/,'"') + ']');
62 name: nameEmailsNicks[0],
63 kind: match[1].toLowerCase(),
64 emails: typeof nameEmailsNicks[1] == 'string' ? [nameEmailsNicks[1]] : nameEmailsNicks[1],
65 nicks: typeof nameEmailsNicks[2] == 'string' ? [nameEmailsNicks[2]] : nameEmailsNicks[2],
66 area: nameEmailsNicks[3]
72 function formatAffiliation(contributor) {
73 if (contributor.affiliation)
74 return contributor.affiliation;
76 if (!contributor.emails || !contributor.emails.length)
79 var affiliations = [];
80 for (var domain in domainAffiliations) {
81 for (var i = 0; i < contributor.emails.length; i++) {
82 if (contributor.emails[i].indexOf('@' + domain) > 0 && affiliations.indexOf(domainAffiliations[domain]) < 0)
83 affiliations.push(domainAffiliations[domain]);
86 return affiliations.join(' / ');
89 function addText(container, text) { container.appendChild(document.createTextNode(text)); }
91 function addWrappedText(container, tagName, attributes, text) {
92 var element = document.createElement(tagName);
93 for (var name in attributes)
94 element.setAttribute(name, attributes[name]);
95 addText(element, text);
96 container.appendChild(element);
99 function populateContributorListItem(listItem, contributor) {
100 addWrappedText(listItem, 'strong', {'class': 'name'}, contributor.name);
101 if (contributor.nicks) {
102 addText(listItem, ' (');
103 addWrappedText(listItem, 'span', {'class': 'nicks'}, contributor.nicks.join(', '));
104 addText(listItem, ')');
107 var affiliation = formatAffiliation(contributor);
109 addText(listItem, ' ');
110 addWrappedText(listItem, 'em', {'class': 'affiliation'}, affiliation);
114 function populateContributorList(contributors, kind) {
115 var contributorsOfKind = contributors.filter(function(contributor) { return contributor.kind == kind; });
116 var listElement = document.getElementById(kind + 's');
117 for (var i = 0; i < contributorsOfKind.length; i++) {
118 var listItem = document.createElement('li');
119 listElement.appendChild(listItem);
120 populateContributorListItem(listItem, contributorsOfKind[i]);
124 function nicksInListItem(listItem) {
125 var nicksContainer = listItem.querySelector('.nicks');
126 if (!nicksContainer || !nicksContainer.textContent)
128 return nicksContainer.textContent.split(/,\s*/);
131 function findListChildForContributor(contributor) {
132 var listChildren = document.getElementsByTagName('li');
133 for (var i = 0; i < listChildren.length; i++) {
134 var nameContainer = listChildren[i].querySelector('.name');
135 if (nameContainer && nameContainer.textContent.toLowerCase().indexOf(contributor.name.toLowerCase()) >= 0)
136 return listChildren[i];
137 var nicksInContainer = nicksInListItem(listChildren[i]);
138 if (nicksInContainer && contributor.nicks) {
139 for (var j = 0; j < contributor.nicks.length; j++) {
140 if (nicksInContainer.indexOf(contributor.nicks[j]) >= 0)
141 return listChildren[i];
148 function annotateWithWikiData() {
149 function annotateForContributor(contributor) {
150 var listItem = findListChildForContributor(contributor);
152 var listElement = document.getElementById(contributor.kind + 's');
153 var listItem = document.createElement('li');
154 listElement.appendChild(listItem);
155 listItem.style.backgroundColor = 'red';
156 populateContributorListItem(listItem, contributor);
158 var affiliationContainer = listItem.querySelector('.affiliation');
159 var affiliation = formatAffiliation(contributor);
160 if (affiliation && (!affiliationContainer || affiliationContainer.textContent != affiliation)) {
161 addText(listItem, ' ');
162 addWrappedText(listItem, 'em', {'style': 'background-color:red'}, affiliation);
167 var webkitTeamWikiUrl = 'http://trac.webkit.org/wiki/WebKit%20Team';
168 var xhr = new XMLHttpRequest();
169 xhr.onload = function () {
170 if (this.status !== 200)
171 return this.onerror();
173 var lines = this.responseText.split('\n');
174 // Match lines like * '''Ryosuke Niwa''' (rniwa) ''Google''
175 var teamWikiContributorEntryPattern = /^\s+\*\s+'''([^']+)'''\s*(\(([^']+)\)\s*)?(''([^']+)'')?\s*$/;
176 for (var i = 0; i < lines.length; i++) {
177 var match = lines[i].match(/\=\s+(Reviewer|Committer|Contributor)s\s+=/i);
179 var currentKind = match[1].toLowerCase();
183 // Strip special HTML characters
184 match = lines[i].replace(/[{}<>"%;&+/]/g, '').match(teamWikiContributorEntryPattern);
185 if (currentKind && match) {
186 annotateForContributor({
189 nicks: match[3] ? match[3].split(/,\s*/) : null,
190 affiliation: match[5]
195 xhr.onerror = function () { alert('Could not obtain http://trac.webkit.org/wiki/WebKit%20Team'); };
196 xhr.open('GET', webkitTeamWikiUrl + '?format=txt');
200 var xhr = new XMLHttpRequest();
201 xhr.onload = function () {
202 if (this.status !== 200)
203 return this.onerror();
204 var contributors = parseCommittersPy(this.responseText);
206 populateContributorList(contributors, 'reviewer');
207 populateContributorList(contributors, 'committer');
208 populateContributorList(contributors, 'contributor');
210 if (location.search.indexOf('annotate') >= 0)
211 annotateWithWikiData();
213 xhr.onerror = function () { document.getElementById('container').textContent = 'Could not obtain committers.py'; };
214 xhr.open('GET', svnTrunkUrl + 'Tools/Scripts/webkitpy/common/config/committers.py');
220 include("footer.inc");