Skip to content

Commit c4bd4e7

Browse files
authored
Feature/chair stars (#19)
* fix: allow Google Analytics in Content Security Policy Add https://www.googletagmanager.com to script-src and https://www.google-analytics.com, https://analytics.google.com, https://www.googletagmanager.com to connect-src so that the GA gtag script set via jekyll google_analytics config loads without CSP violations. * feat: add chair star visualization to author and institution profiles - Authors display 1 star per chair role (direct 1:1 mapping) - Institutions display stars = max(1, floor(chairs/2)) for compressed view - Formula: 1 chair = 1★, 2-3 chairs = 1★, 4-5 chairs = 2★, etc. - Added chair-stars CSS class with golden color styling - Integrated star display in profile score cards and contributor tables - Stars appear in author/institution detail pages and overview tables * feat: add chair star visualization to profiles ## Summary Display chair roles as stars in author and institution profiles to visually highlight AE leadership experience. ## Changes - **Authors**: Direct 1:1 mapping (1 chair = 1★) - **Institutions**: Compressed mapping (max(1, floor(chairs/2))) - 1 chair = 1★ - 2-3 chairs = 1★ - 4-5 chairs = 2★ - 6-7 chairs = 3★ - etc. ## Files Modified - `src/assets/js/reprodb-profile.js`: Added `chairDisplayAuthor()` and `chairDisplayInstitution()` helper functions with configurable star formulas - `src/assets/js/reprodb-profile-page.js`: Integrated star display in profile score cards and contributor table - `src/assets/css/reprodb-profile.css`: Added `.chair-stars` styling with golden color (#d18c00 light / #f5c44c dark) ## Rationale The compressed formula for institutions avoids visual inflation while still recognizing leadership. Authors use direct stars since chair counts are sparser (max 5). Both use `max(1, floor(...))` so single chairs receive visual credit.
1 parent 17900d9 commit c4bd4e7

4 files changed

Lines changed: 125 additions & 87 deletions

File tree

src/_data/navigation.yml

Lines changed: 86 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,93 @@
11
main:
2-
- title: "Search"
3-
url: index.html
4-
- title: "Ranking"
2+
- title: Search
3+
url: index.html
4+
- title: Ranking
5+
url: combined_rankings.html
6+
children:
7+
- title: Author Ranking
58
url: combined_rankings.html
6-
children:
7-
- title: "Author Ranking"
8-
url: combined_rankings.html
9-
- title: "Institution Ranking"
10-
url: institution_rankings.html
11-
- title: "Systems vs. Security"
12-
url: overview.html
13-
- title: "Geographic Statistics"
14-
url: statistics/
15-
- title: "Profiles"
16-
url: profile.html
17-
- title: "Security"
9+
- title: Institution Ranking
10+
url: institution_rankings.html
11+
- title: Systems vs. Security
12+
url: overview.html
13+
- title: Geographic Statistics
14+
url: statistics/
15+
- title: Profiles
16+
url: profile.html
17+
- title: Security
18+
url: security/
19+
children:
20+
- title: Overview
1821
url: security/
19-
children:
20-
- title: "Overview"
21-
url: security/
22-
- title: "ACSAC"
23-
url: security/acsac.html
24-
- title: "CHES"
25-
url: security/ches.html
26-
- title: "NDSS"
27-
url: security/ndss.html
28-
- title: "IEEE S&P"
29-
url: security/sp.html
30-
- title: "PETS"
31-
url: security/pets.html
32-
- title: "SysTEX"
33-
url: security/systex.html
34-
- title: "USENIX Security"
35-
url: security/usenixsec.html
36-
- title: "WOOT"
37-
url: security/woot.html
38-
- title: "Systems"
22+
- title: ACSAC
23+
url: security/acsac.html
24+
- title: CHES
25+
url: security/ches.html
26+
- title: IEEE S&P
27+
url: security/sp.html
28+
- title: NDSS
29+
url: security/ndss.html
30+
- title: PETS
31+
url: security/pets.html
32+
- title: SysTEX
33+
url: security/systex.html
34+
- title: USENIX Security
35+
url: security/usenixsec.html
36+
- title: USENIX VehicleSec
37+
url: security/vehiclesec.html
38+
- title: WOOT
39+
url: security/woot.html
40+
- title: Systems
41+
url: systems/
42+
children:
43+
- title: Overview
3944
url: systems/
40-
children:
41-
- title: "Overview"
42-
url: systems/
43-
- title: "ATC"
44-
url: systems/atc.html
45-
- title: "CAIS"
46-
url: systems/cais.html
47-
- title: "EuroSys"
48-
url: systems/eurosys.html
49-
- title: "FAST"
50-
url: systems/fast.html
51-
- title: "OSDI"
52-
url: systems/osdi.html
53-
- title: "SC"
54-
url: systems/sc.html
55-
- title: "SOSP"
56-
url: systems/sosp.html
57-
- title: "AE Committees"
45+
- title: ACM CAIS
46+
url: systems/cais.html
47+
- title: EuroSys
48+
url: systems/eurosys.html
49+
- title: OSDI
50+
url: systems/osdi.html
51+
- title: SC
52+
url: systems/sc.html
53+
- title: SOSP
54+
url: systems/sosp.html
55+
- title: USENIX ATC
56+
url: systems/atc.html
57+
- title: USENIX FAST
58+
url: systems/fast.html
59+
- title: AE Committees
60+
url: committee.html
61+
children:
62+
- title: Overview
5863
url: committee.html
59-
children:
60-
- title: "Overview"
61-
url: committee.html
62-
- title: "Ranking"
63-
url: combined_rankings.html?contrib=ae
64-
- title: "Chair Statistics"
65-
url: ae_chairs.html
66-
- title: "Systems Statistics"
67-
url: systems/committee.html
68-
- title: "Security Statistics"
69-
url: security/committee.html
70-
- title: "Repository Stats"
64+
- title: Ranking
65+
url: combined_rankings.html?contrib=ae
66+
- title: Chair Statistics
67+
url: ae_chairs.html
68+
- title: Systems Statistics
69+
url: systems/committee.html
70+
- title: Security Statistics
71+
url: security/committee.html
72+
- title: Repository Stats
73+
url: repo_stats.html
74+
children:
75+
- title: Overview
7176
url: repo_stats.html
72-
children:
73-
- title: "Overview"
74-
url: repo_stats.html
75-
- title: "Systems"
76-
url: systems/repo_stats.html
77-
- title: "Security"
78-
url: security/repo_stats.html
79-
- title: "Methodology"
80-
url: methodology.html
81-
- title: "Contribute"
77+
- title: Systems
78+
url: systems/repo_stats.html
79+
- title: Security
80+
url: security/repo_stats.html
81+
- title: Methodology
82+
url: methodology.html
83+
- title: Contribute
84+
url: about.html
85+
children:
86+
- title: Overview
8287
url: about.html
83-
children:
84-
- title: "Overview"
85-
url: about.html
86-
- title: "Repositories"
87-
url: https://github.com/reprodb
88-
- title: "Documentation"
89-
url: https://reprodb.github.io/reprodb-pipeline/
90-
- title: "Data Schemas"
91-
url: https://reprodb.github.io/data-schemas/
88+
- title: Repositories
89+
url: https://github.com/reprodb
90+
- title: Documentation
91+
url: https://reprodb.github.io/reprodb-pipeline/
92+
- title: Data Schemas
93+
url: https://reprodb.github.io/data-schemas/

src/assets/css/reprodb-profile.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,13 @@
111111
.role-artifact { background:#2980b9; }
112112
.role-evaluation { background:#27ae60; }
113113

114+
/* Chair-star indicator used in author/institution profile cards and tables. */
115+
.chair-stars {
116+
color: #d18c00;
117+
letter-spacing: 0.02em;
118+
white-space: nowrap;
119+
}
120+
114121
/* ── Unified search result type labels ─────────────────────────────────── */
115122
.sr-type { display:inline-block; padding:1px 6px; border-radius:3px; font-size:0.72em; color:#fff; margin-right:6px; vertical-align:middle; }
116123
.sr-type-author { background:#2980b9; }
@@ -180,3 +187,4 @@ html[data-theme="dark"] .ae-detail-row td,
180187
html[data-theme="dark"] .ae-detail-row:hover { background: #23272d; }
181188
html[data-theme="dark"] .ranking-history-details summary::before { color: #aab0b8; }
182189
html[data-theme="dark"] .avail-warn { color: #f0c040; background: #332b00; border-color: #665500; }
190+
html[data-theme="dark"] .chair-stars { color: #f5c44c; }

src/assets/js/reprodb-profile-page.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@
118118
}
119119
c += card(p.artifact_count, 'Artifacts') + card(p.total_papers, 'Total Papers') + card(p.artifact_pct + '%', 'Artifact Rate');
120120
if (p.ae_memberships) c += card(p.ae_memberships, 'AE Memberships');
121-
if (p.chair_count) c += card(p.chair_count, 'Chair Roles');
121+
if (p.chair_count) c += card(P.chairDisplayAuthor(p.chair_count), 'Chair Roles');
122122
document.getElementById('score-cards').innerHTML = c;
123123

124124
// Papers table
@@ -252,7 +252,7 @@
252252
c += card((inst.artifact_pct || 0) + '%', 'Artifact Rate');
253253
var reproRate = inst.artifact_count > 0 ? Math.round(((inst.badges_reproducible || 0) / inst.artifact_count) * 100) : 0;
254254
c += card(reproRate + '%', 'Repro Rate') + card(inst.ae_memberships || 0, 'AE Memberships');
255-
if (inst.chair_count) c += card(inst.chair_count, 'Chair Roles');
255+
if (inst.chair_count) c += card(P.chairDisplayInstitution(inst.chair_count), 'Chair Roles');
256256
if (inst._denseRank) {
257257
c += card('#' + inst._denseRank, 'Rank');
258258
} else if (instHistory.length >= 2) {
@@ -287,7 +287,11 @@
287287
{ title: 'Artifacts', field: 'artifact_count', sorter: 'number' },
288288
{ title: 'Papers', field: 'total_papers', sorter: 'number' },
289289
{ title: 'AE Svc', field: 'ae_memberships', sorter: 'number' },
290-
{ title: 'Chair', field: 'chair_count', sorter: 'number', formatter: function(cell) { var v = cell.getValue(); return v ? v + ' \u2605' : ''; } }
290+
{ title: 'Chair', field: 'chair_count', sorter: 'number', formatter: function(cell) {
291+
var v = Number(cell.getValue()) || 0;
292+
if (!v) return '';
293+
return P.chairDisplayAuthor(v);
294+
} }
291295
]
292296
});
293297
} else {

src/assets/js/reprodb-profile.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,28 @@ var ReproDBProfile = (function() {
2828
return '<div class="rdb-card"><div class="rdb-card-value">' + value + '</div><div class="rdb-card-label">' + label + '</div></div>';
2929
}
3030

31+
function renderStars(n) {
32+
var count = Number(n) || 0;
33+
if (count <= 0) return '';
34+
return Array(count + 1).join('\u2605');
35+
}
36+
37+
// Author profile: direct one-star-per-chair mapping.
38+
function chairDisplayAuthor(chairCount) {
39+
var chairs = Number(chairCount) || 0;
40+
if (chairs <= 0) return '0';
41+
return chairs + ' <span class="chair-stars" aria-label="' + chairs + ' chair roles">' + renderStars(chairs) + '</span>';
42+
}
43+
44+
// Institution profile: compressed mapping to reduce skew.
45+
// Formula: stars = max(1, floor(chair_count / 2)), so 1->1, 2->1, 3->1, 4->2, 5->2.
46+
function chairDisplayInstitution(chairCount) {
47+
var chairs = Number(chairCount) || 0;
48+
if (chairs <= 0) return '0';
49+
var stars = Math.max(1, Math.floor(chairs / 2));
50+
return chairs + ' <span class="chair-stars" aria-label="' + stars + ' stars from ' + chairs + ' chair roles">' + renderStars(stars) + '</span>';
51+
}
52+
3153
/**
3254
* Initialise search/autocomplete, share button, and URL management.
3355
*
@@ -230,6 +252,8 @@ var ReproDBProfile = (function() {
230252
cleanName: cleanName,
231253
badgeHtml: badgeHtml,
232254
card: card,
255+
chairDisplayAuthor: chairDisplayAuthor,
256+
chairDisplayInstitution: chairDisplayInstitution,
233257
initSearch: initSearch,
234258
parseAEEntry: parseAEEntry,
235259
renderHistoryChart: renderHistoryChart

0 commit comments

Comments
 (0)