2 $title = "WebKit Team";
8 <p>Here is the key for each item:</p>
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>
17 <ul id="reviewers"></ul>
20 <ul id="committers"></ul>
23 <ul id="contributors"></ul>
28 var svnTrunkUrl = 'http://svn.webkit.org/repository/webkit/trunk/';
29 var domainAffiliations = {
32 'basyskom.com': 'basysKom GmbH',
33 'collabora.co.uk': 'Collabora',
34 'company100.com': 'Company100',
35 'google.com': 'Google',
36 'igalia.com': 'Igalia',
37 'intel.com' : 'Intel',
38 'motorola.com': 'Motorola Mobility',
40 'openbossa.org': 'INdT / Nokia',
41 'profusion.mobi': 'ProFUSION',
42 'rim.com': 'Research In Motion',
43 'samsung.com': 'Samsung Electronics',
44 'sencha.com': 'Sencha',
45 'sisa.samsung.com': 'Samsung Electronics',
46 'torchmobile.com.cn': 'Torch Mobile (Beijing) Co. Ltd.',
48 'partner.samsung.com': 'Samsung Electronics',
51 'inf.u-szeged.hu': 'University of Szeged',
53 // Open source communities
54 'chromium.org': 'Chromium',
55 'codeaurora.org': 'Code Aurora Forum',
60 function parseContributorsJSON(text) {
61 var contributorsJSON = JSON.parse(text);
62 var contributors = [];
64 for (var contributorType in contributorsJSON) {
65 for (var contributor in contributorsJSON[contributorType]) {
68 kind: contributorType.replace(/s$/, "").toLowerCase(),
69 emails: contributorsJSON[contributorType][contributor].emails,
70 nicks: contributorsJSON[contributorType][contributor].nicks,
71 expertise: contributorsJSON[contributorType][contributor].expertise
78 function formatAffiliation(contributor) {
79 if (contributor.affiliation)
80 return contributor.affiliation;
82 if (!contributor.emails || !contributor.emails.length)
85 var affiliations = [];
86 for (var domain in domainAffiliations) {
87 for (var i = 0; i < contributor.emails.length; i++) {
88 if (contributor.emails[i].indexOf('@' + domain) > 0 && affiliations.indexOf(domainAffiliations[domain]) < 0)
89 affiliations.push(domainAffiliations[domain]);
92 return affiliations.join(' / ');
95 function addText(container, text) { container.appendChild(document.createTextNode(text)); }
97 function addWrappedText(container, tagName, attributes, text) {
98 var element = document.createElement(tagName);
99 for (var name in attributes)
100 element.setAttribute(name, attributes[name]);
101 addText(element, text);
102 container.appendChild(element);
105 function populateContributorListItem(listItem, contributor) {
106 addWrappedText(listItem, 'strong', {'class': 'name'}, contributor.name);
107 if (contributor.nicks) {
108 addText(listItem, ' (');
109 addWrappedText(listItem, 'span', {'class': 'nicks'}, contributor.nicks.join(', '));
110 addText(listItem, ')');
113 var affiliation = formatAffiliation(contributor);
115 addText(listItem, ' ');
116 addWrappedText(listItem, 'em', {'class': 'affiliation'}, affiliation);
119 if (contributor.expertise) {
120 var expertiseList = document.createElement('ul');
121 addWrappedText(expertiseList, 'li', {'class': 'expertise'}, contributor.expertise);
122 listItem.appendChild(expertiseList);
126 function populateContributorList(contributors, kind) {
127 var contributorsOfKind = contributors.filter(function(contributor) { return contributor.kind == kind; });
128 var listElement = document.getElementById(kind + 's');
129 for (var i = 0; i < contributorsOfKind.length; i++) {
130 var listItem = document.createElement('li');
131 listElement.appendChild(listItem);
132 populateContributorListItem(listItem, contributorsOfKind[i]);
136 function nicksInListItem(listItem) {
137 var nicksContainer = listItem.querySelector('.nicks');
138 if (!nicksContainer || !nicksContainer.textContent)
140 return nicksContainer.textContent.split(/,\s*/);
143 function findListChildForContributor(contributor) {
144 var listChildren = document.getElementsByTagName('li');
145 for (var i = 0; i < listChildren.length; i++) {
146 var nameContainer = listChildren[i].querySelector('.name');
147 if (nameContainer && nameContainer.textContent.toLowerCase().indexOf(contributor.name.toLowerCase()) >= 0)
148 return listChildren[i];
149 var nicksInContainer = nicksInListItem(listChildren[i]);
150 if (nicksInContainer && contributor.nicks) {
151 for (var j = 0; j < contributor.nicks.length; j++) {
152 if (nicksInContainer.indexOf(contributor.nicks[j]) >= 0)
153 return listChildren[i];
160 function annotateWithWikiData() {
161 function annotateForContributor(contributor) {
162 var listItem = findListChildForContributor(contributor);
164 var listElement = document.getElementById(contributor.kind + 's');
165 var listItem = document.createElement('li');
166 listElement.appendChild(listItem);
167 listItem.style.backgroundColor = 'red';
168 populateContributorListItem(listItem, contributor);
170 var affiliationContainer = listItem.querySelector('.affiliation');
171 var affiliation = formatAffiliation(contributor);
172 if (affiliation && (!affiliationContainer || affiliationContainer.textContent != affiliation)) {
173 addText(listItem, ' ');
174 addWrappedText(listItem, 'em', {'style': 'background-color:red'}, affiliation);
179 var webkitTeamWikiUrl = 'http://trac.webkit.org/wiki/WebKit%20Team';
180 var xhr = new XMLHttpRequest();
181 xhr.onload = function () {
182 if (this.status !== 200)
183 return this.onerror();
185 var lines = this.responseText.split('\n');
186 // Match lines like * '''Ryosuke Niwa''' (rniwa) ''Google''
187 var teamWikiContributorEntryPattern = /^\s+\*\s+'''([^']+)'''\s*(\(([^']+)\)\s*)?(''([^']+)'')?\s*$/;
188 for (var i = 0; i < lines.length; i++) {
189 var match = lines[i].match(/\=\s+(Reviewer|Committer|Contributor)s\s+=/i);
191 var currentKind = match[1].toLowerCase();
195 // Strip special HTML characters
196 match = lines[i].replace(/[{}<>"%;&+/]/g, '').match(teamWikiContributorEntryPattern);
197 if (currentKind && match) {
198 annotateForContributor({
201 nicks: match[3] ? match[3].split(/,\s*/) : null,
202 affiliation: match[5]
207 xhr.onerror = function () { alert('Could not obtain http://trac.webkit.org/wiki/WebKit%20Team'); };
208 xhr.open('GET', webkitTeamWikiUrl + '?format=txt');
212 var xhr = new XMLHttpRequest();
213 xhr.onload = function () {
214 if (this.status !== 200)
215 return this.onerror();
216 var contributors = parseContributorsJSON(this.responseText);
218 populateContributorList(contributors, 'reviewer');
219 populateContributorList(contributors, 'committer');
220 populateContributorList(contributors, 'contributor');
222 if (location.search.indexOf('annotate') >= 0)
223 annotateWithWikiData();
225 xhr.onerror = function () { document.getElementById('container').textContent = 'Could not obtain contributors.json'; };
226 xhr.open('GET', svnTrunkUrl + 'Tools/Scripts/webkitpy/common/config/contributors.json');
232 include("footer.inc");