Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ One or two sentences of bio.
The `email` field drives the profile photo via [Gravatar](https://gravatar.com). If no
email is set, a placeholder avatar is shown.

**Alumni** — set `role: Alumni` to move someone out of the Team grid and into the
simple "Alumni" list at the bottom of the People section (just their name, linked to
`website` if set).

---

## Publishing your changes
Expand Down
Binary file removed assets/banner.png
Binary file not shown.
Binary file added assets/banner.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
46 changes: 43 additions & 3 deletions build.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,23 @@ def flush_para() -> None:
return "\n".join(parts)


def render_alumni(alumni: list[Collaborator]) -> str:
if not alumni:
return ""

items = []
for a in alumni:
if a.website:
items.append(
f'<li><a href="{html.escape(a.website)}" target="_blank" '
f'rel="noopener">{html.escape(a.name)}</a></li>'
)
else:
items.append(f'<li><span>{html.escape(a.name)}</span></li>')

return "\n".join(items)


def render_collaborators(collaborators: list[Collaborator]) -> str:
if not collaborators:
return "<p>No collaborators found.</p>"
Expand Down Expand Up @@ -378,6 +395,15 @@ def render_collaborators(collaborators: list[Collaborator]) -> str:
</div>
</section>"""

_ALUMNI_SECTION = """\
<section class="db-section" id="alumni">
<div class="section-label">People</div>
<h2>Alumni</h2>
<ul class="alumni-list">
{items}
</ul>
</section>"""


def build_projects_html(projects: list[Project]) -> str:
return _PROJECTS_SECTION.format(cards=render_projects(projects))
Expand All @@ -387,6 +413,12 @@ def build_collaborators_html(collaborators: list[Collaborator]) -> str:
return _COLLABORATORS_SECTION.format(cards=render_collaborators(collaborators))


def build_alumni_html(alumni: list[Collaborator]) -> str:
if not alumni:
return ""
return _ALUMNI_SECTION.format(items=render_alumni(alumni))


# ── Injection ─────────────────────────────────────────────────────────────────

def inject(html_text: str, key: str, content: str) -> str:
Expand Down Expand Up @@ -432,17 +464,23 @@ def main() -> None:
if not projects_source.exists():
sys.exit(f"[build] Error: neither {data_dir / 'projects'} nor {data_dir / 'projects.md'} found")

collaborators = parse_collaborators(team_source)
all_collaborators = parse_collaborators(team_source)
projects = parse_projects(projects_source)

alumni = [c for c in all_collaborators if c.role.lower() == "alumni"]
collaborators = [c for c in all_collaborators if c.role.lower() != "alumni"]

proj_html = build_projects_html(projects)
collab_html = build_collaborators_html(collaborators)
alumni_html = build_alumni_html(alumni)

if args.check:
print("── Projects ─────────────────────────────────")
print(proj_html)
print("\n── Collaborators ────────────────────────────")
print(collab_html)
print("\n── Alumni ────────────────────────────────────")
print(alumni_html)
return

index = Path(args.output)
Expand All @@ -452,10 +490,12 @@ def main() -> None:
text = index.read_text()
text = inject(text, "projects", proj_html)
text = inject(text, "collaborators", collab_html)
text = inject(text, "alumni", alumni_html)
index.write_text(text)

print(f"[build] Wrote {len(projects)} project(s) and "
f"{len(collaborators)} collaborator(s) into {index}")
print(f"[build] Wrote {len(projects)} project(s), "
f"{len(collaborators)} collaborator(s), and "
f"{len(alumni)} alumnus/alumna(e) into {index}")


if __name__ == "__main__":
Expand Down
2 changes: 1 addition & 1 deletion data/team/07-dion-osmani.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
## Dion Osmani
role: Research Assistant
role: Alumni
website: https://dionosmani.vercel.app/
email: dion.osmani@hevs.ch
interests: Dynamical Systems, Optimization
3 changes: 3 additions & 0 deletions data/team/10-hiten-goel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## Hiten Goel
role: Alumni
website: https://www.linkedin.com/in/hiten-goel-003599250/
52 changes: 41 additions & 11 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>SIMLab – Scientific and Industrial Machine Learning Laboratory</title>
<link rel="preload" as="image" href="assets/banner.webp" fetchpriority="high" />
<style>
:root {
--accent: #2563eb;
Expand All @@ -26,7 +27,7 @@

/* ── Header ── */
header {
background: url('assets/banner.png') center/cover no-repeat;
background: #123c4d url('assets/banner.webp') center/cover no-repeat;
color: #fff;
padding: 5rem 1.5rem 4rem;
text-align: center;
Expand Down Expand Up @@ -341,6 +342,34 @@

.collab-links { margin-top: 0.5rem; }

/* ── Alumni list ── */
.alumni-list {
display: flex;
flex-wrap: wrap;
gap: 0.6rem 1rem;
margin-top: 1.5rem;
padding: 0;
list-style: none;
}

.alumni-list li {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 999px;
padding: 0.45rem 1.1rem;
font-size: 0.9rem;
}

.alumni-list a {
color: var(--text);
text-decoration: none;
font-weight: 600;
}

.alumni-list a:hover { color: var(--accent); text-decoration: underline; }

.alumni-list span { color: var(--text); font-weight: 600; }

/* ── Collaborators grid ── */
.collab-grid {
display: grid;
Expand Down Expand Up @@ -715,16 +744,6 @@ <h3>Marta Rende</h3>

</div>
</div>
<div class="collab-card">
<img class="collab-photo" src="https://www.gravatar.com/avatar/c086ad602e01d905dd4dea3c976604d6?s=200&d=mp" alt="DO" />
<div class="collab-body">
<h3><a href="https://dionosmani.vercel.app/" target="_blank" rel="noopener">Dion Osmani</a></h3>
<div class="collab-interests"><span class="interest-tag">Dynamical Systems</span><span class="interest-tag">Optimization</span></div>
<div class="collab-subtitle">Research Assistant</div>

<div class="collab-links"><a class="collab-link" href="https://dionosmani.vercel.app/" target="_blank" rel="noopener">Website →</a></div>
</div>
</div>
<div class="collab-card">
<img class="collab-photo" src="https://www.gravatar.com/avatar/ddc70699c7c2f1b05b3ea69ff0b10836?s=200&d=mp" alt="FR" />
<div class="collab-body">
Expand All @@ -749,6 +768,17 @@ <h3>Ambrus Tóth</h3>
</section>
<!-- END:collaborators -->

<!-- BEGIN:alumni -->
<section class="db-section" id="alumni">
<div class="section-label">People</div>
<h2>Alumni</h2>
<ul class="alumni-list">
<li><a href="https://dionosmani.vercel.app/" target="_blank" rel="noopener">Dion Osmani</a></li>
<li><a href="https://www.linkedin.com/in/hiten-goel-003599250/" target="_blank" rel="noopener">Hiten Goel</a></li>
</ul>
</section>
<!-- END:alumni -->

</main>

<footer>
Expand Down
Loading