Skip to content

Commit dba3c1d

Browse files
committed
website update: 2025-07-20 10:59:26
1 parent a979173 commit dba3c1d

24 files changed

+1674
-43
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
name: Build and Deploy Academic Website
2+
3+
on:
4+
push:
5+
branches: [ main, master ]
6+
pull_request:
7+
branches: [ main, master ]
8+
workflow_dispatch:
9+
10+
permissions:
11+
contents: read
12+
pages: write
13+
id-token: write
14+
15+
concurrency:
16+
group: "pages"
17+
cancel-in-progress: false
18+
19+
jobs:
20+
build:
21+
runs-on: ubuntu-latest
22+
steps:
23+
- name: Checkout
24+
uses: actions/checkout@v4
25+
26+
- name: Setup Ruby
27+
uses: ruby/setup-ruby@v1
28+
with:
29+
ruby-version: '3.2'
30+
bundler-cache: true
31+
cache-version: 0
32+
working-directory: ./
33+
34+
- name: Setup Pages
35+
id: pages
36+
uses: actions/configure-pages@v4
37+
38+
- name: Build with Jekyll
39+
working-directory: ./
40+
run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}"
41+
env:
42+
JEKYLL_ENV: production
43+
44+
- name: Upload artifact
45+
uses: actions/upload-pages-artifact@v3
46+
with:
47+
path: ./_site/
48+
49+
deploy:
50+
environment:
51+
name: github-pages
52+
url: ${{ steps.deployment.outputs.page_url }}
53+
runs-on: ubuntu-latest
54+
needs: build
55+
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master'
56+
steps:
57+
- name: Deploy to GitHub Pages
58+
id: deployment
59+
uses: actions/deploy-pages@v4
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
<!DOCTYPE html>
2+
<html lang="{{ page.lang | default: site.lang | default: "en" }}">
3+
4+
<head>
5+
<meta charset="utf-8">
6+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
7+
<meta name="viewport" content="width=device-width, initial-scale=1">
8+
9+
{%- seo -%}
10+
11+
<link rel="stylesheet" href="{{ "/assets/css/main.css" | relative_url }}">
12+
{%- feed_meta -%}
13+
14+
<!-- Favicon -->
15+
<link rel="icon" type="image/svg+xml" href="/assets/images/favicon.svg">
16+
<link rel="alternate icon" href="/assets/images/favicon.ico">
17+
18+
<!-- MathJax for LaTeX rendering -->
19+
<script>
20+
MathJax = {
21+
tex: {
22+
inlineMath: [['$', '$'], ['\\(', '\\)']],
23+
displayMath: [['$$', '$$'], ['\\[', '\\]']],
24+
processEscapes: true,
25+
processEnvironments: true,
26+
packages: {'[+]': ['ams', 'newcommand', 'configmacros']}
27+
},
28+
options: {
29+
ignoreHtmlClass: 'tex2jax_ignore',
30+
processHtmlClass: 'tex2jax_process'
31+
},
32+
svg: {
33+
fontCache: 'global'
34+
}
35+
};
36+
</script>
37+
<script type="text/javascript" id="MathJax-script" async
38+
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
39+
</script>
40+
41+
<!-- Academic structured data -->
42+
{% if page.layout == 'publication' or page.collection == 'publications' %}
43+
<script type="application/ld+json">
44+
{
45+
"@context": "https://schema.org",
46+
"@type": "ScholarlyArticle",
47+
"headline": "{{ page.title | escape }}",
48+
"author": [
49+
{% for author in page.authors %}
50+
{
51+
"@type": "Person",
52+
"name": "{{ author | escape }}"
53+
}{% unless forloop.last %},{% endunless %}
54+
{% endfor %}
55+
],
56+
"datePublished": "{{ page.date | date: "%Y-%m-%d" }}",
57+
"publisher": {
58+
"@type": "Organization",
59+
"name": "{{ page.venue | escape }}"
60+
}
61+
}
62+
</script>
63+
{% endif %}
64+
</head>
65+
66+
<body>
67+
<header class="header">
68+
<div class="container">
69+
<div class="header-content">
70+
<div class="header-text">
71+
<h1 class="title">
72+
<a href="{{ "/" | relative_url }}">{{ site.title | escape }}</a>
73+
</h1>
74+
{% if site.subtitle %}
75+
<p class="subtitle">{{ site.subtitle | escape }}</p>
76+
{% endif %}
77+
</div>
78+
<div class="header-contact">
79+
{% if site.email %}
80+
<div class="contact-item">
81+
<a href="mailto:{{ site.email }}">{{ site.email }}</a>
82+
</div>
83+
{% endif %}
84+
<div class="contact-links">
85+
{% if site.orcid %}
86+
<a href="https://orcid.org/{{ site.orcid }}" target="_blank" rel="noopener" title="ORCID">ORCID</a>
87+
{% endif %}
88+
{% if site.scholar %}
89+
<a href="https://scholar.google.com/citations?user={{ site.scholar }}" target="_blank" rel="noopener" title="Google Scholar">Scholar</a>
90+
{% endif %}
91+
{% if site.github_username %}
92+
<a href="https://github.com/{{ site.github_username }}" target="_blank" rel="noopener" title="GitHub">GitHub</a>
93+
{% endif %}
94+
{% if site.linkedin %}
95+
<a href="https://linkedin.com/in/{{ site.linkedin }}" target="_blank" rel="noopener" title="LinkedIn">LinkedIn</a>
96+
{% endif %}
97+
</div>
98+
</div>
99+
</div>
100+
</div>
101+
</header>
102+
103+
<nav class="navigation">
104+
<div class="container">
105+
<ul class="nav-list">
106+
<li class="nav-item">
107+
<a class="nav-link {% if page.url == "/" %}active{% endif %}" href="{{ "/" | relative_url }}">Home</a>
108+
</li>
109+
<li class="nav-item">
110+
<a class="nav-link {% if page.url == "/cv/" %}active{% endif %}" href="{{ "/cv/" | relative_url }}">CV</a>
111+
</li>
112+
<li class="nav-item">
113+
<a class="nav-link {% if page.url contains "/publications" %}active{% endif %}" href="{{ "/publications/" | relative_url }}">Publications</a>
114+
</li>
115+
<li class="nav-item">
116+
<a class="nav-link {% if page.url contains "/research" %}active{% endif %}" href="{{ "/research/" | relative_url }}">Research</a>
117+
</li>
118+
<li class="nav-item">
119+
<a class="nav-link {% if page.url contains "/teaching" %}active{% endif %}" href="{{ "/teaching/" | relative_url }}">Teaching</a>
120+
</li>
121+
<li class="nav-item">
122+
<a class="nav-link {% if page.url contains "/talks" %}active{% endif %}" href="{{ "/talks/" | relative_url }}">Talks</a>
123+
</li>
124+
<li class="nav-item">
125+
<a class="nav-link {% if page.url == "/contact/" %}active{% endif %}" href="{{ "/contact/" | relative_url }}">Contact</a>
126+
</li>
127+
</ul>
128+
</div>
129+
</nav>
130+
131+
<main class="main-content">
132+
<div class="container">
133+
{{ content }}
134+
</div>
135+
</main>
136+
137+
<footer class="footer">
138+
<div class="container">
139+
<p>&copy; {{ 'now' | date: "%Y" }} {{ site.title | escape }}. Built with Jekyll and managed through Obsidian.</p>
140+
141+
{% if site.github_username or site.orcid or site.scholar or site.linkedin %}
142+
<div style="margin-top: 1rem;">
143+
{% if site.orcid %}
144+
<a href="https://orcid.org/{{ site.orcid }}" target="_blank" rel="noopener">ORCID</a>
145+
{% endif %}
146+
{% if site.scholar %}
147+
<a href="https://scholar.google.com/citations?user={{ site.scholar }}" target="_blank" rel="noopener">Google Scholar</a>
148+
{% endif %}
149+
{% if site.github_username %}
150+
<a href="https://github.com/{{ site.github_username }}" target="_blank" rel="noopener">GitHub</a>
151+
{% endif %}
152+
{% if site.linkedin %}
153+
<a href="https://linkedin.com/in/{{ site.linkedin }}" target="_blank" rel="noopener">LinkedIn</a>
154+
{% endif %}
155+
</div>
156+
{% endif %}
157+
</div>
158+
</footer>
159+
160+
<!-- Analytics (optional) -->
161+
{% if jekyll.environment == 'production' and site.google_analytics %}
162+
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}"></script>
163+
<script>
164+
window.dataLayer = window.dataLayer || [];
165+
function gtag(){dataLayer.push(arguments);}
166+
gtag('js', new Date());
167+
gtag('config', '{{ site.google_analytics }}');
168+
</script>
169+
{% endif %}
170+
</body>
171+
172+
</html>
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
---
2+
layout: default
3+
---
4+
5+
<article class="card">
6+
<header class="card-header">
7+
<h1>{{ page.title }}</h1>
8+
9+
<div class="card-meta">
10+
<strong>{{ page.organization }}</strong>
11+
{% if page.location %} | {{ page.location }}{% endif %}
12+
</div>
13+
14+
<div class="card-meta">
15+
{{ page.start_date | date: "%B %Y" }} - {% if page.end_date %}{{ page.end_date | date: "%B %Y" }}{% else %}Present{% endif %}
16+
{% if page.type %} | {{ page.type | capitalize }}{% endif %}
17+
</div>
18+
</header>
19+
20+
{% if page.description %}
21+
<section>
22+
<h2>Overview</h2>
23+
{{ page.description | markdownify }}
24+
</section>
25+
{% endif %}
26+
27+
{% if content != "" %}
28+
<section>
29+
{{ content }}
30+
</section>
31+
{% endif %}
32+
33+
{% if page.skills %}
34+
<section>
35+
<h2>Skills & Technologies</h2>
36+
<div class="skills-list">
37+
{% for skill in page.skills %}
38+
<span class="skill-tag">{{ skill }}</span>
39+
{% endfor %}
40+
</div>
41+
</section>
42+
{% endif %}
43+
</article>
44+
45+
<style>
46+
.skills-list {
47+
display: flex;
48+
flex-wrap: wrap;
49+
gap: var(--space-2);
50+
margin-top: var(--space-3);
51+
}
52+
53+
.skill-tag {
54+
background-color: var(--surface);
55+
border: 1px solid var(--border);
56+
padding: var(--space-1) var(--space-3);
57+
border-radius: 4px;
58+
font-size: var(--font-size-sm);
59+
color: var(--secondary-text);
60+
}
61+
</style>

0 commit comments

Comments
 (0)