The official website for the Contextual Dynamics Lab at Dartmouth College, hosted on GitHub Pages.
Live site: https://context-lab.com
contextlab.github.io/
├── index.html # Homepage with animated brain
├── research.html # Research interests and projects
├── people.html # Current members and alumni (auto-generated)
├── publications.html # Papers, talks, posters, materials (auto-generated)
├── software.html # Open-source software projects (auto-generated)
├── contact.html # Contact form
├── news.html # Lab news and updates
├── css/
│ └── style.css # Main stylesheet
├── js/
│ └── main.js # Interactive components
├── images/
│ ├── brain/ # Animated brain frames
│ ├── people/ # Team member photos
│ ├── publications/ # Publication thumbnails
│ └── software/ # Software project images
├── documents/
│ ├── JRM_CV.tex # CV LaTeX source (edit this!)
│ ├── JRM_CV.pdf # Generated PDF (auto-built)
│ └── JRM_CV.html # Generated HTML (auto-built)
├── data/ # Content source files (edit these!)
│ ├── publications.xlsx
│ ├── people.xlsx
│ └── software.xlsx
├── templates/ # HTML templates for auto-generation
│ ├── publications.html
│ ├── people.html
│ └── software.html
├── scripts/ # Build and validation scripts
│ ├── build.py # Content page builder
│ ├── build_cv.py # CV build orchestration
│ ├── extract_cv.py # LaTeX-to-HTML parser
│ └── ...
└── tests/ # Automated tests
└── ...
Site design by Chameleon Studios.
The site uses a green-based color scheme defined in CSS variables:
:root {
--primary-green: rgb(0, 112, 60); /* Main brand color */
--primary-green-light: rgba(0, 112, 60, 0.6);
--bg-green: rgba(0, 112, 60, 0.2); /* Page backgrounds */
--white: #FFFFFF;
--dark-text: rgba(0, 0, 0, 0.7);
}- Body text: Nunito Sans (300 weight)
- Headings: Nunito Sans (300-700 weight), lowercase with letter-spacing
- Base font size: 14px with 1.7 line-height
- Sticky Footer Navigation - Fixed navigation bar at the bottom of the viewport
- Animated Brain - Homepage features a rotating brain animation (GIF frames)
- Info Panel Toggle - Homepage "i" button reveals lab description with smooth animation
- Modal Forms - Contact and join-us forms appear in centered modals
- Publication Cards - Hover effects reveal additional information
- Animated brain image that scales with viewport
- "Info" button toggles descriptive panel
- Brain and text resize responsively
- Lab director section
- Grid of current members
- "Join Us" modal for prospective members
- Alumni section with past lab members
- Collaborators list
- Peer-reviewed articles with thumbnails
- Talks section with video/PDF links
- Course materials
- Conference abstracts and posters
- Contact form (Formspree integration)
- Physical address and email
Located in js/main.js:
- initDropdowns() - Dropdown menu behavior
- initStickyNav() - Footer nav visibility on scroll
- initSlideshow() - Image carousel with autoplay
- initModal() - Modal open/close handling
- initSmoothScroll() - Anchor link smooth scrolling
- initInfoPanel() - Homepage info toggle with animations
- initContactForms() - AJAX form submission
- initMobileMenu() - Mobile navigation toggle
- initCustomValidation() - Styled form validation messages
Contact forms use Formspree for processing. Form validation messages are styled to match the site's green theme.
To update the form endpoint:
- Create a Formspree account
- Create a new form
- Replace the
actionURL in the form HTML
The publications, people, and software pages are automatically generated from Excel spreadsheets. This makes it easy to update content without editing HTML directly.
data/ # Source data (edit these!)
├── publications.xlsx # 104 publications
├── people.xlsx # 95 people entries
└── software.xlsx # 20 software items
templates/ # HTML templates with markers
├── publications.html
├── people.html
└── software.html
scripts/ # Build scripts
├── build.py # Master build script
├── build_publications.py
├── build_people.py
├── build_software.py
├── validate_data.py # Data validation
├── pre_push_check.py # Pre-push checks
└── utils.py # Shared utilities
# Generated output (don't edit directly!)
├── publications.html
├── people.html
└── software.html
- Open
data/publications.xlsxin Excel/Google Sheets - Go to the appropriate sheet (
papers,preprints,chapters, orother) - Add a new row with:
title- Publication titletitle_url- Link to paper (DOI, PDF, etc.)citation- Full citation text (can include HTML links)image- Thumbnail filename (optional, place image inimages/publications/)
- Save and push to GitHub (or run build locally)
- Open
data/people.xlsxin Excel/Google Sheets - Go to the
memberssheet - Add a new row with:
name- Person's namename_url- Personal website (optional)role- e.g., "grad student", "undergrad", "postdoc"bio- Biography textimage- Photo filename (place photo inimages/people/)
- Save and push to GitHub
- Open
data/people.xlsx - Go to the appropriate sheet:
alumni_postdocs- Former postdocsalumni_grads- Former graduate studentsalumni_managers- Former lab managersalumni_undergrads- Former undergraduates
- Add a row with:
name- Person's namename_url- Personal website (optional)current_position- e.g., "now at Google"current_position_url- Link to current employer (optional)
- Open
data/software.xlsx - Go to the appropriate sheet (
python,javascript, ormatlab) - Add a new row with:
name- Project namedescription- Brief descriptionlinks_html- HTML for links, e.g.,[<a href="https://github.com/..." target="_blank">GitHub</a>]
# Install dependencies
pip install -r requirements-build.txt
# Validate data files
python scripts/validate_data.py
# Build all pages
python scripts/build.py
# Or run the full pre-push check
python scripts/pre_push_check.pyWhen you push changes to data/, templates/, or scripts/ on the main branch, GitHub Actions automatically:
- Validates all spreadsheet data
- Rebuilds the HTML pages
- Runs the test suite (76 tests)
- Commits and pushes the regenerated HTML
You can also manually trigger a build from the Actions tab.
| Field | Required | Description |
|---|---|---|
title |
Yes | Publication title |
title_url |
No | Link to paper |
citation |
Yes | Full citation (HTML allowed) |
image |
No | Thumbnail filename |
| Field | Required | Description |
|---|---|---|
name |
Yes | Person's name |
name_url |
No | Personal website |
role |
No | Role in lab |
bio |
No | Biography text |
image |
No | Photo filename |
| Field | Required | Description |
|---|---|---|
name |
Yes | Person's name |
name_url |
No | Personal website |
current_position |
No | Current role/employer |
current_position_url |
No | Link to employer |
| Field | Required | Description |
|---|---|---|
name |
Yes | Project name |
description |
Yes | Brief description |
links_html |
No | HTML links to repo, docs, etc. |
- HTML in cells: You can use HTML tags in spreadsheet cells (e.g.,
<a href="...">,<em>,<strong>) - Image files: Place images in the appropriate
images/subdirectory before referencing them - Validation: Run
python scripts/validate_data.pyto check for missing required fields or broken image references - Don't edit generated HTML: Changes to
publications.html,people.html, andsoftware.htmlin the root directory will be overwritten by the build system
Jeremy Manning's CV is automatically compiled from LaTeX source into both PDF and HTML formats. The HTML version matches the PDF styling and includes a download button.
documents/
├── JRM_CV.tex # LaTeX source (edit this!)
├── JRM_CV.pdf # Generated PDF
└── JRM_CV.html # Generated HTML
scripts/
├── build_cv.py # Build orchestration
└── extract_cv.py # Custom LaTeX-to-HTML parser
css/
└── cv.css # CV-specific stylesheet
data/
└── DartmouthRuzicka-*.ttf # Dartmouth Ruzicka fonts
.github/workflows/
└── build-cv.yml # GitHub Actions automation
- Edit
documents/JRM_CV.texin any LaTeX editor - Push to GitHub - the CV will be automatically rebuilt
- Both PDF and HTML versions are generated and committed
# Install dependencies
pip install -r requirements-build.txt
# Build CV (requires XeLaTeX)
cd scripts
python build_cv.py
# Run tests
python -m pytest tests/test_build_cv.py -vThe extract_cv.py script provides a custom LaTeX-to-HTML converter that handles:
- Text formatting:
\textbf,\textit,\emph,\textsc,\ul - Links:
\href{url}{text}→<a href="url">text</a> - Lists:
etaremune(reverse-numbered),itemize,enumerate - Multi-column:
\begin{multicols}{2}→ CSS two-column layout - Sections:
\section*,\subsection*→ semantic HTML headings - Special characters: em-dashes, en-dashes, quotes, accented characters
- Footnotes:
\blfootnote{}→ section notes displayed inline - Block spacing:
\\[0.1cm]→ visual block separators
| Function | Purpose |
|---|---|
extract_document_body() |
Extract content between \begin{document} and \end{document} |
balanced_braces_extract() |
Parse nested LaTeX braces correctly |
convert_latex_formatting() |
Convert LaTeX commands to HTML |
parse_etaremune() |
Parse reverse-numbered publication lists |
extract_header_info() |
Extract name and contact information |
extract_sections() |
Split document into sections/subsections |
render_section_content() |
Convert section content based on type |
generate_html() |
Assemble complete HTML document |
The stylesheet provides:
- Dartmouth Ruzicka font via
@font-facedeclarations - Dartmouth green color scheme:
rgb(0, 105, 62) - Sticky download bar at top of page
- Responsive design for tablet and mobile
- Print styles that match PDF appearance
- Reverse-numbered lists using native
<ol reversed>support
The build-cv.yml workflow triggers when you push changes to:
documents/JRM_CV.texscripts/build_cv.pyorscripts/extract_cv.pycss/cv.css.github/workflows/build-cv.yml
The workflow:
- Installs TeX Live and Dartmouth Ruzicka fonts
- Compiles LaTeX to PDF using XeLaTeX
- Converts LaTeX to HTML using the custom parser
- Runs 61 automated tests
- Commits and pushes the generated files
The test suite (tests/test_build_cv.py) includes 61 tests covering:
- LaTeX formatting conversion
- Balanced brace parsing
- Section extraction
- HTML generation
- PDF compilation
- Content validation
- Link validation
- Edge cases
Note: For publications, people, and software pages, use the spreadsheet method above. The manual method below is for other pages or special cases.
- Add photo to
images/people/(recommended: 400x400px) - Edit
people.html, add to appropriate section:
<div class="team-member">
<img src="images/people/name.jpg" alt="Name">
<h3>name | role</h3>
<p>Bio text here.</p>
</div>- Add thumbnail to
images/publications/(recommended: 500x500px with green border) - Edit
publications.html, add to publications grid:
<div class="publication-card">
<img src="images/publications/thumbnail.png" alt="Paper title">
<div class="publication-info">
<h3>Paper Title</h3>
<p>Authors (Year). Journal Name.</p>
<a href="https://doi.org/..." target="_blank">PDF</a>
</div>
</div>- Add screenshot to
images/software/ - Edit
software.html, add to software grid
The site is fully responsive with breakpoints at:
- 768px - Tablet layout
- 480px - Mobile layout
Key mobile adaptations:
- Collapsible navigation menu
- Single-column layouts
- Adjusted font sizes
- Touch-friendly tap targets
The site deploys automatically via GitHub Pages when changes are pushed to the main branch.
To test locally, open any HTML file directly in a browser or use a local server:
python3 -m http.server 8000
# Then visit http://localhost:8000Tested and supported in:
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
- Design: Chameleon Studios
- Development: Contextual Dynamics Lab
- Hosting: GitHub Pages