Unify jsonresume and RenderCV CVs solutions (#3462)

Fixes #2787 as an alternative to #2969. It was getting too cumbersome to
have 2 different data sources for CV and also a lot of different layout
files, so I decided to unify them all.
Main changes:
- synchronized the information inside RenderCV (`_data/cv.yml`) and
JSONResume (`assets/json/resume.json`)
- unified layout files for CV information
- added the option to set the "data source" in the CV page

---------

Signed-off-by: George Araújo <george.gcac@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
George 2026-01-23 12:36:14 -03:00 committed by GitHub
parent dd425c77c1
commit 55a2685683
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
40 changed files with 1459 additions and 935 deletions

View File

@ -21,15 +21,17 @@ You are an expert customization assistant for the al-folio Jekyll academic websi
- **Deployment:** GitHub Pages (automated via GitHub Actions) - **Deployment:** GitHub Pages (automated via GitHub Actions)
- **File Structure:** - **File Structure:**
- `_config.yml` Main site configuration (URL, metadata, theme colors, enabled features) - `_config.yml` Main site configuration (URL, metadata, theme colors, enabled features)
- `_data/` YAML data files (CV info, social links, repository links, coauthors) - `_data/` YAML data files (CV info in RenderCV format, social links, repository links, coauthors)
- `_pages/` Site pages (About, Blog, Projects, Publications, CV, etc.) - `_pages/` Site pages (About, Blog, Projects, Publications, CV, etc.)
- `_posts/` Blog posts in Markdown (format: `YYYY-MM-DD-title.md`) - `_posts/` Blog posts in Markdown (format: `YYYY-MM-DD-title.md`)
- `_projects/` Project pages in Markdown - `_projects/` Project pages in Markdown
- `_news/` News/announcement items - `_news/` News/announcement items
- `_bibliography/papers.bib` Publications in BibTeX format - `_bibliography/papers.bib` Publications in BibTeX format
- `_sass/` SCSS/SASS stylesheets (colors, themes, layout) - `_sass/` SCSS/SASS stylesheets (colors, themes, layout)
- `assets/` Static assets (images, PDFs, JSON resume, custom CSS/JS) - `assets/` Static assets (images, PDFs, custom CSS/JS)
- `.github/workflows/` GitHub Actions for deployment and CI/CD - `assets/json/resume.json` JSONResume format (synced with `_data/cv.yml`)
- `assets/rendercv/` RenderCV configuration and generated PDFs
- `.github/workflows/` GitHub Actions for deployment and CI/CD (includes CV PDF generation)
## Community Context & Issue/Discussion References ## Community Context & Issue/Discussion References
@ -132,11 +134,14 @@ npx prettier . --write
### 4. CV/Resume ### 4. CV/Resume
**Files:** `assets/json/resume.json` OR `_data/cv.yml` **Files:** `_data/cv.yml` (RenderCV format), `assets/json/resume.json` (JSONResume format), `assets/rendercv/` (configuration)
- Use JSON format (jsonresume.org standard) in `assets/json/resume.json` - **Choose your format:** Users select either RenderCV (`_data/cv.yml`) or JSONResume (`assets/json/resume.json`) — they pick ONE format
- Or use YAML format in `_data/cv.yml` (delete resume.json to use this) - **Delete the unused format:** Remove the file for the format you're not using (so only one source exists) if you want to avoid confusion
- Add education, work experience, skills, awards, publications - **RenderCV features:** Automatic PDF generation via GitHub Actions, customizable styling via `assets/rendercv/` config files (`design.yaml`, `locale.yaml`, `settings.yaml`)
- **JSONResume features:** Standard format compatible with other tools and services
- **Switching formats:** Users can change which format displays on the CV page by editing the `cv_format` setting in `_pages/cv.md` frontmatter
- **Note about both files:** Both files exist in the repository for template flexibility, but users usually only maintain the one they choose
### 5. Publications ### 5. Publications
@ -470,24 +475,24 @@ Help users avoid these frequent errors:
## Quick Reference Map ## Quick Reference Map
| User wants to... | Files to modify | Key documentation | | User wants to... | Files to modify | Key documentation |
| ----------------------- | ------------------------------------------- | --------------------------------- | | ----------------------- | ------------------------------------------------------------------- | --------------------------------- |
| Change personal info | `_config.yml`, `_pages/about.md` | CUSTOMIZE.md § Configuration | | Change personal info | `_config.yml`, `_pages/about.md` | CUSTOMIZE.md § Configuration |
| Add profile picture | `assets/img/prof_pic.jpg` | CUSTOMIZE.md § About page | | Add profile picture | `assets/img/prof_pic.jpg` | CUSTOMIZE.md § About page |
| Update CV | `assets/json/resume.json` OR `_data/cv.yml` | CUSTOMIZE.md § CV information | | Update CV | `_data/cv.yml` (RenderCV) or `assets/json/resume.json` (JSONResume) | CUSTOMIZE.md § CV information |
| Add publications | `_bibliography/papers.bib` | CUSTOMIZE.md § Publications | | Add publications | `_bibliography/papers.bib` | CUSTOMIZE.md § Publications |
| Add blog post | `_posts/YYYY-MM-DD-title.md` | CUSTOMIZE.md § Blog posts | | Add blog post | `_posts/YYYY-MM-DD-title.md` | CUSTOMIZE.md § Blog posts |
| Create project | `_projects/name.md` | CUSTOMIZE.md § Projects | | Create project | `_projects/name.md` | CUSTOMIZE.md § Projects |
| Add news item | `_news/announcement.md` | CUSTOMIZE.md § News | | Add news item | `_news/announcement.md` | CUSTOMIZE.md § News |
| Change theme color | `_sass/_themes.scss` | CUSTOMIZE.md § Theme colors | | Change theme color | `_sass/_themes.scss` | CUSTOMIZE.md § Theme colors |
| Add social links | `_data/socials.yml` | CUSTOMIZE.md § Social media | | Add social links | `_data/socials.yml` | CUSTOMIZE.md § Social media |
| Enable/disable features | `_config.yml` | CUSTOMIZE.md § Configuration | | Enable/disable features | `_config.yml` | CUSTOMIZE.md § Configuration |
| Remove pages | Delete from `_pages/`, update nav | CUSTOMIZE.md § Removing content | | Remove pages | Delete from `_pages/`, update nav | CUSTOMIZE.md § Removing content |
| Fix deployment issues | `_config.yml` (url/baseurl) | FAQ.md, INSTALL.md | | Fix deployment issues | `_config.yml` (url/baseurl) | FAQ.md, INSTALL.md |
| Test changes locally | Docker setup | INSTALL.md § Docker | | Test changes locally | Docker setup | INSTALL.md § Docker |
| Debug broken site | Check GitHub Actions, local preview output | FAQ.md, Testing Before Deployment | | Debug broken site | Check GitHub Actions, local preview output | FAQ.md, Testing Before Deployment |
| Add custom page | Create `_pages/name.md`, update nav | CUSTOMIZE.md § Creating pages | | Add custom page | Create `_pages/name.md`, update nav | CUSTOMIZE.md § Creating pages |
| Customize fonts/spacing | `_sass/_variables.scss` | CUSTOMIZE.md § Customization | | Customize fonts/spacing | `_sass/_variables.scss` | CUSTOMIZE.md § Customization |
## Using Community Context in Your Responses ## Using Community Context in Your Responses

View File

@ -23,10 +23,15 @@ You are a documentation specialist for the al-folio Jekyll theme project.
- `_posts/` Blog posts - `_posts/` Blog posts
- `_projects/`, `_news/`, `_books/` Jekyll collections - `_projects/`, `_news/`, `_books/` Jekyll collections
- `_layouts/`, `_includes/` Liquid templates - `_layouts/`, `_includes/` Liquid templates
- `_includes/cv/` Unified CV component renderers (awards, education, experience, skills, languages, etc.)
- `_sass/` SCSS stylesheets - `_sass/` SCSS stylesheets
- `_data/` YAML data files (cv.yml, repositories.yml, socials.yml, etc.) - `_data/` YAML data files:
- `cv.yml` CV/resume in RenderCV format
- `repositories.yml`, `socials.yml`, `coauthors.yml`, `venues.yml` Other data
- `_bibliography/` BibTeX files for publications - `_bibliography/` BibTeX files for publications
- `.github/workflows/` GitHub Actions for deployment and CI - `assets/json/resume.json` JSONResume format (alternative to RenderCV; syncing between formats is a template maintainer task, not a user responsibility)
- `assets/rendercv/` RenderCV configuration files and generated PDFs
- `.github/workflows/` GitHub Actions for deployment, CI, and CV PDF generation
## Documentation standards ## Documentation standards
@ -49,7 +54,7 @@ You are a documentation specialist for the al-folio Jekyll theme project.
- Reference well-documented configuration files rather than repeating their content - Reference well-documented configuration files rather than repeating their content
- Example: "Configure your deployment settings in `_config.yml`. For Docker deployment, see `docker-compose.yml`" - Example: "Configure your deployment settings in `_config.yml`. For Docker deployment, see `docker-compose.yml`"
- When explaining features, point to the implementation: "The CV page uses `_layouts/cv.liquid` with data from either `assets/json/resume.json` (JSON Resume format) or `_data/cv.yml` (YAML format)" - When explaining CV features, point to both data sources: "The CV page is generated from `_data/cv.yml` (RenderCV format) or `assets/json/resume.json` (JSONResume format), which are kept in sync. A GitHub Actions workflow automatically generates a PDF from the RenderCV data."
**Avoid UI descriptions:** **Avoid UI descriptions:**
@ -92,9 +97,10 @@ You are a documentation specialist for the al-folio Jekyll theme project.
1. **Update configuration documentation** when `_config.yml` changes 1. **Update configuration documentation** when `_config.yml` changes
2. **Document new features** added to the theme (new layouts, plugins, customization options) 2. **Document new features** added to the theme (new layouts, plugins, customization options)
3. **Clarify installation steps** when deployment methods or dependencies change 3. **Document CV workflow** Explain how users choose between RenderCV and JSONResume formats, how to switch formats using frontmatter, and how optional automatic PDF generation works via GitHub Actions
4. **Update troubleshooting** in FAQ when common issues arise 4. **Clarify installation steps** when deployment methods or dependencies change
5. **Maintain consistency** across all documentation files 5. **Update troubleshooting** in FAQ when common issues arise
6. **Maintain consistency** across all documentation files
## Common Technical Terms & Explanations ## Common Technical Terms & Explanations

65
.github/workflows/render-cv.yml vendored Normal file
View File

@ -0,0 +1,65 @@
name: Render a CV
on:
push:
branches:
- main
- master
paths:
- "_data/cv.yml"
- "_data/cv.yaml"
- "assets/rendercv/design.yaml"
- "assets/rendercv/design.yml"
- "assets/rendercv/locale.yaml"
- "assets/rendercv/locale.yml"
- "assets/rendercv/settings.yaml"
- "assets/rendercv/settings.yml"
workflow_call:
workflow_dispatch:
permissions:
contents: write
jobs:
rendercv:
name: RenderCV
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install RenderCV
run: |
pip install -r requirements.txt
- name: RenderCV
run: |
cv_file=$(find _data -maxdepth 1 -type f \( -name "cv.yaml" -o -name "cv.yml" \))
if [ -z "$cv_file" ]; then
echo "No cv.yml file found!"
exit 1
fi
rendercv_dir=$(find assets -maxdepth 1 -type d -name "rendercv")
if [ -z "$rendercv_dir" ]; then
echo "No RenderCV config directory found!"
exit 1
fi
design=$(find $rendercv_dir -maxdepth 1 -type f \( -name "design.yaml" -o -name "design.yml" \))
locale=$(find $rendercv_dir -maxdepth 1 -type f \( -name "locale.yaml" -o -name "locale.yml" \))
settings=$(find $rendercv_dir -maxdepth 1 -type f \( -name "settings.yaml" -o -name "settings.yml" \))
if [ -z "$design" ] || [ -z "$locale" ] || [ -z "$settings" ]; then
echo "Missing RenderCV config files!"
exit 1
fi
rendercv render $cv_file --design $design --locale-catalog $locale --settings $settings
- name: Upload rendercv_output as an artifact
uses: actions/upload-artifact@v4
with:
name: RenderCV Output
path: assets/rendercv/rendercv_output
- name: Push the changes
run: |
git config --global user.name "${{ github.actor }}"
git config --global user.email "${{ github.actor }}@users.noreply.github.com"
git add -A
git commit -m "chore: render the latest CV"
git push

15
.gitignore vendored
View File

@ -1,14 +1,15 @@
_site _site
.bundle .bundle
.sass-cache .DS_store
.idea
.jekyll-cache .jekyll-cache
.jekyll-metadata .jekyll-metadata
.DS_store
.ruby-version .ruby-version
.sass-cache
.tweet-cache .tweet-cache
Gemfile.lock
assets/libs/
node_modules/
vendor
.idea
.venv .venv
assets/libs/
assets/rendercv/rendercv_output/*.typ
Gemfile.lock
node_modules/
vendor

View File

@ -22,6 +22,10 @@ Here we will give you some tips on how to customize the website. One important t
- [Build and Deployment](#build-and-deployment) - [Build and Deployment](#build-and-deployment)
- [Key Integration Points](#key-integration-points) - [Key Integration Points](#key-integration-points)
- [Modifying the CV information](#modifying-the-cv-information) - [Modifying the CV information](#modifying-the-cv-information)
- [RenderCV Format (Recommended)](#rendercv-format-recommended)
- [JSONResume Format](#jsonresume-format)
- [Switching CV Sources (Without Deleting Files)](#switching-cv-sources-without-deleting-files)
- [Automatic PDF Generation (RenderCV only)](#automatic-pdf-generation-rendercv-only)
- [Modifying the user and repository information](#modifying-the-user-and-repository-information) - [Modifying the user and repository information](#modifying-the-user-and-repository-information)
- [Configuring external service URLs](#configuring-external-service-urls) - [Configuring external service URLs](#configuring-external-service-urls)
- [Creating new pages](#creating-new-pages) - [Creating new pages](#creating-new-pages)
@ -274,9 +278,64 @@ Understanding how these technologies work together will help you customize al-fo
## Modifying the CV information ## Modifying the CV information
There are currently 2 different ways of generating the CV page content. The first one is by using a json file located in [assets/json/resume.json](assets/json/resume.json). It is a [known standard](https://jsonresume.org/) for creating a CV programmatically. The second one, currently used as a fallback when the json file is not found, is by using a yml file located in [\_data/cv.yml](_data/cv.yml). This was the original way of creating the CV page content and since it is more human readable than a json file we decided to keep it as an option. Your CV can be created using one of two formats. Choose the format that works best for you:
What this means is, if there is no resume data defined in [\_config.yml](_config.yml) and loaded via a json file, it will load the contents of [\_data/cv.yml](_data/cv.yml). If you want to use the [\_data/cv.yml](_data/cv.yml) file as the source of your CV, you must delete the [assets/json/resume.json](assets/json/resume.json) file. ### RenderCV Format (Recommended)
[`_data/cv.yml`](_data/cv.yml) uses the [RenderCV](https://rendercv.com/) YAML format, which is human-readable and designed specifically for generating professional resumes. This format also enables optional automatic PDF generation via GitHub Actions.
**If you choose this format:**
1. Edit your CV data in [`_data/cv.yml`](_data/cv.yml)
2. Delete [`assets/json/resume.json`](assets/json/resume.json) so the website uses the YAML file
3. (Optional) Customize how the PDF is styled by editing:
- [`assets/rendercv/design.yaml`](assets/rendercv/design.yaml) — Design and styling
- [`assets/rendercv/locale.yaml`](assets/rendercv/locale.yaml) — Localization and formatting
- [`assets/rendercv/settings.yaml`](assets/rendercv/settings.yaml) — RenderCV settings
### JSONResume Format
[`assets/json/resume.json`](assets/json/resume.json) uses the [JSONResume](https://jsonresume.org/) standard format, which is compatible with other tools and services.
**If you choose this format:**
1. Edit your CV data in [`assets/json/resume.json`](assets/json/resume.json)
2. Delete [`_data/cv.yml`](_data/cv.yml) so the website uses the JSON file
### Switching CV Sources (Without Deleting Files)
If you keep both CV files in your repository, you can switch which format displays on your website by setting the `cv_format` variable in the frontmatter of [`_pages/cv.md`](_pages/cv.md):
```yaml
---
layout: cv
cv_format: rendercv # options: rendercv or jsonresume
---
```
Change `rendercv` to `jsonresume` to display the JSONResume format instead.
### Automatic PDF Generation (RenderCV only)
If you use the RenderCV format, a GitHub Actions workflow can automatically generate a PDF version of your CV whenever you push changes to [`_data/cv.yml`](_data/cv.yml). The PDF is saved to `assets/rendercv/rendercv_output/`.
**To link the auto-generated PDF to your CV page:**
Set the `cv_pdf` variable in the frontmatter of [`_pages/cv.md`](_pages/cv.md) to point to the generated PDF:
```yaml
---
layout: cv
cv_pdf: /assets/rendercv/rendercv_output/CV.pdf
cv_format: rendercv
---
```
This will add a download button on your CV page that links to the PDF. (The exact filename depends on your RenderCV settings—check the output directory after the first workflow run to see the generated PDF name.)
**To disable automatic PDF generation:**
Delete or comment out the [`.github/workflows/render-cv.yml`](.github/workflows/render-cv.yml) workflow file.
## Modifying the user and repository information ## Modifying the user and repository information

View File

@ -1,97 +1,189 @@
- title: General Information cv:
type: map name: Albert Einstein
contents: label: Scientist
- name: Full Name email: einstein@example.com
value: Albert Einstein location: Princeton, NJ
- name: Date of Birth image: ""
value: 14th March 1879 summary: A German-born theoretical physicist, widely ranked among the greatest and most influential scientists of all time
- name: Languages
value: English, German
- title: Education social_networks:
type: time_table - network: X
contents: username: AlbertEinstein
- title: PhD - network: GitHub
institution: University of Zurich, Zurich, Switzerland username: example
year: 1905 - network: LinkedIn
description: username: example
- Description 1.
- Description 2.
- title: Description 3.
contents:
- Sub-description 1.
- Sub-description 2.
- title: Federal teaching diploma
institution: Eidgenössische Technische Hochschule, Zurich, Switzerland
year: 1900
description:
- Description 1.
- Description 2.
- title: Experience address:
type: time_table street: 2712 Broadway St
contents: city: San Francisco
- title: Professor of Theoretical Physics region: California
institution: Institute for Advanced Study, Princeton University postalCode: CA 94115
year: 1933 - 1955 countryCode: US
description:
- Description 1.
- Description 2.
- title: Description 3.
contents:
- Sub-description 1.
- Sub-description 2.
- title: Visiting Professor
institution: California Institute of Technology, Pasadena, California, US
year: 1933
description:
- Description 1.
- Description 2.
- title: Director sections:
institution: Kaiser Wilhelm Institute for Physics, Berlin, Germany. Education:
year: 1917-1933 - institution: University of Zurich
location: Zurich, Switzerland
url: https://www.uzh.ch/
area: Physics
studyType: PhD
start_date: 1900
end_date: 1905
score: ""
courses: "Theory of Relativity"
highlights:
- Description 1.
- Description 2.
- title: Professor of Theoretical Physics - institution: Eidgenössische Technische Hochschule
institution: Karl-Ferdinand University, Prague, Czechoslovakia location: Zurich, Switzerland
year: 1911 - 1917 area: Physics
description: studyType: Federal teaching diploma
start_date: 1896
end_date: 1900
highlights:
- Description 1.
- Description 2.
- title: Associate Professor of Theoretical Physics Experience:
institution: University of Zurich, Zurich, Switzerland - company: Institute for Advanced Study, Princeton University
year: 1909 - 1911 position: Professor of Theoretical Physics
location: Princeton University, NJ
start_date: 1933
end_date: 1955
summary: Teaching at Palmer Physical Laboratory (now 302 Frist Campus Center). While not a professor at Princeton, I associated with the physics professors and continued to give lectures on campus.
highlights:
- Relativity
- Description 2.
- title: Open Source Projects - company: California Institute of Technology
type: time_table position: Visiting Professor
contents: location: Pasadena, California, US
- title: <a href="https://github.com/alshedivat/al-folio">al-folio</a> start_date: 1933
year: 2015-now end_date: 1933
description: A beautiful, simple, clean, and responsive Jekyll theme for academics. highlights:
- Description 1.
- Description 2.
- title: Honors and Awards - company: Kaiser Wilhelm Institute for Physics
type: time_table position: Director
contents: location: Berlin, Germany
- year: 1921 start_date: 1917
items: end_date: 1933
- Nobel Prize in Physics
- Matteucci Medal
- year: 2029
items:
- Max Planck Medal
- title: Academic Interests - company: Karl-Ferdinand University
type: nested_list position: Professor of Theoretical Physics
contents: location: Prague, Czechoslovakia
- title: Topic 1. start_date: 1911
items: end_date: 1917
- Description 1.
- Description 2.
- title: Topic 2.
items:
- Description 1.
- Description 2.
- title: Other Interests - company: University of Zurich
type: list position: Associate Professor of Theoretical Physics
contents: location: Zurich, Switzerland
- <u>Hobbies:</u> Hobby 1, Hobby 2, etc. start_date: 1909
end_date: 1911
Volunteer:
- company: People's Climate March
position: Lead Organizer
location: Zurich, Switzerland
start_date: 2014-04-01
end_date: 2015-07-01
summary: Lead organizer for the New York City branch of the People's Climate March, the largest climate march in history.
highlights:
- "Awarded 'Climate Hero' award by Greenpeace for my efforts organizing the march."
- "Men of the year 2014 by Time magazine"
Awards:
- title: Nobel Prize in Physics
authors:
- "Royal Swedish Academy of Sciences"
date: 1921-11-01
awarder: Royal Swedish Academy of Sciences
url: https://www.nobelprize.org/prizes/physics/1921/einstein/biographical/
summary: The Nobel Prizes are five separate prizes that, according to Alfred Nobel's will of 1895, are awarded to 'those who, during the preceding year, have conferred the greatest benefit to humankind.'
- title: Max Planck Medal
authors:
- "German Physical Society"
date: 2029
awarder: German Physical Society
summary: Awarded for outstanding scientific achievement
Publications:
- title: Zur Elektrodynamik bewegter Körper
authors:
- Albert Einstein
publisher: Annalen der Physik
releaseDate: 1905-06-30
url: https://en.wikisource.org/wiki/Translation:On_the_Electrodynamics_of_Moving_Bodies
summary: It concerned an interpretation of the MichelsonMorley experiment and the properties of light and time. Special relativity incorporates the principle that the speed of light is the same for all inertial observers regardless of the state of motion of the source.
- title: Über einen die Erzeugung und Verwandlung des Lichtes betreffenden heuristischen Gesichtspunkt
authors:
- Albert Einstein
publisher: Annalen der Physik
releaseDate: 1905-03-18
url: https://de.wikisource.org/wiki/Über_einen_die_Erzeugung_und_Verwandlung_des_Lichtes_betreffenden_heuristischen_Gesichtspunkt
summary: In the second paper, he applied the quantum theory to light to explain the photoelectric effect. In particular, he used the idea of light quanta (photons) to explain experimental results, but stressed the importance of the experimental results. The importance of his work on the photoelectric effect earned him the Nobel Prize in Physics in 1921.
- title: Die Grundlage der allgemeinen Relativitätstheorie
authors:
- Albert Einstein
publisher: Annalen der Physik
releaseDate: 1916-03-20
url: https://de.wikisource.org/wiki/Die_Grundlage_der_allgemeinen_Relativitätstheorie
summary: The publication of the theory of general relativity made him internationally famous. He was professor of physics at the universities of Zurich (19091911) and Prague (19111912), before he returned to ETH Zurich (19121914).
Skills:
- name: Physics
level: Master
icon: fa-solid fa-hashtag
keywords: "Quantum Mechanics, Quantum Computing, Quantum Information, Quantum Cryptography, Quantum Communication, Quantum Teleportation"
Languages:
- name: German
summary: "Native speaker"
- name: English
summary: "Fluent"
Interests:
- name: Physics
icon: fa-solid fa-tag
keywords: "Quantum Mechanics, Quantum Computing, Quantum Information, Quantum Cryptography, Quantum Communication, Quantum Teleportation"
Certificates:
- name: Machine Learning
date: 2018-01-01
issuer: Stanford University
icon: fa-solid fa-location-dot
- name: Quantum Computing
date: 2018-01-01
issuer: Stanford University
icon: fa-solid fa-tag
- name: Quantum Information
date: 2018-01-01
issuer: Stanford University
icon: fa-solid fa-envelope
Projects:
- name: Quantum Computing
summary: Quantum computing is the use of quantum-mechanical phenomena such as superposition and entanglement to perform computation. Computers that perform quantum computations are known as quantum computers.
highlights:
- Quantum Teleportation
- Quantum Cryptography
start_date: 2018-01-01
end_date: 2018-01-01
References:
- name: Professor John Doe
icon: fa-solid fa-laptop
reference: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit.
- name: Professor Jane Smith
icon: fa-solid fa-thumbtack
reference: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit.

View File

@ -0,0 +1,66 @@
{% comment %}
Unified awards entry renderer for both formats
{% endcomment %}
<ul class="card-text font-weight-light list-group list-group-flush">
{% for entry in entries %}
<li class="list-group-item">
<div class="row">
{% capture start_date %}
{% if entry.date %}{{ entry.date }}{% endif %}
{% endcapture %}
{% if start_date != '' %}
<div class="col-xs-2 col-sm-2 col-md-2 text-center">
<table class="table-cv">
<tbody>
<tr>
<td>
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px">
{{- start_date | split: '-' | slice: 0, 1 | join: '' -}}
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
{% if entry.url %}
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ entry.url }}">{{ entry.title }}</a>
</h6>
{% elsif entry.title %}
<h6 class="title font-weight-bold ml-1 ml-md-4">{{ entry.title }}</h6>
{% endif %}
{% if entry.awarder %}
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">{{ entry.awarder }}</h6>
{% endif %}
{% if entry.summary %}
<p class="ml-1 ml-md-4">{{ entry.summary | markdownify | remove: '<p>' | remove: '</p>' }}</p>
{% endif %}
</div>
{% else %}
<div class="col-xs-12 col-sm-12 col-md-12">
{% if entry.url %}
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ entry.url }}">{{ entry.title }}</a>
</h6>
{% elsif entry.title %}
<h6 class="title font-weight-bold ml-1 ml-md-4">{{ entry.title }}</h6>
{% endif %}
{% if entry.awarder %}
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">{{ entry.awarder }}</h6>
{% endif %}
{% if entry.summary %}
<p class="ml-1 ml-md-4">{{ entry.summary | markdownify | remove: '<p>' | remove: '</p>' }}</p>
{% endif %}
</div>
{% endif %}
</div>
</li>
{% endfor %}
</ul>

View File

@ -0,0 +1,28 @@
{% comment %}
Unified certificates entry renderer for both formats
{% endcomment %}
<ul class="card-text font-weight-light list-group list-group-flush">
{% for entry in entries %}
<li class="list-group-item">
{% if entry.icon %}
<i class="{{ entry.icon }}"></i>
{% endif %}
{% if entry.url %}
<strong
><a href="{{ entry.url }}" target="_blank">{{ entry.name }}</a></strong
>
{% else %}
<strong>{{ entry.name }}</strong>
{% endif %}
{% if entry.issuer %}
- <em>{{ entry.issuer }}</em>
{% endif %}
{% if entry.date %}
({{ entry.date | split: '-' | slice: 0, 1 | join: '' }})
{% endif %}
</li>
{% endfor %}
</ul>

View File

@ -0,0 +1,93 @@
{% comment %}
Unified education entry renderer for both RenderCV and JSONResume formats
Handles both:
- RenderCV: institution, area, studyType (or degree), start_date, end_date, location, courses, highlights
- JSONResume: institution, area, studyType, startDate, endDate, location, courses, highlights
{% endcomment %}
<ul class="card-text font-weight-light list-group list-group-flush">
{% for entry in entries %}
<li class="list-group-item">
<div class="row">
<div class="col-xs-2 col-sm-2 col-md-2 text-center date-column">
{% capture start_date %}
{% if entry.start_date %}{{ entry.start_date }}{% elsif entry.startDate %}{{ entry.startDate }}{% endif %}
{% endcapture %}
{% capture end_date %}
{% if entry.end_date %}{{ entry.end_date }}{% elsif entry.endDate %}{{ entry.endDate }}{% endif %}
{% endcapture %}
{% if start_date != '' %}
{% comment %} Extract year only from dates like "1933-01-01" or just use "1933" as is {% endcomment %}
{% assign startDate = start_date | split: '-' | first %}
{% assign endDate = end_date | split: '-' | first | default: 'Present' %}
{% assign date = startDate | append: ' - ' | append: endDate %}
{% else %}
{% assign date = null %}
{% endif %}
<table class="table-cv">
<tbody>
<tr>
<td>
{% if date %}
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px">{{ date }}</span>
{% endif %}
</td>
</tr>
{% capture location %}
{% if entry.location %}{{ entry.location }}{% endif %}
{% endcapture %}
{% if location != '' %}
<tr>
<td>
<p class="location">
<i class="fa-solid fa-location-dot iconlocation"></i>
{{ location }}
</p>
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
{% capture study_type %}
{% if entry.studyType %}{{ entry.studyType }}{% elsif entry.degree %}{{ entry.degree }}{% endif %}
{% endcapture %}
{% if entry.url %}
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ entry.url }}">{{ study_type }}</a>
</h6>
{% elsif study_type != '' %}
<h6 class="title font-weight-bold ml-1 ml-md-4">{{ study_type }}</h6>
{% endif %}
{% if entry.institution %}
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">{{ entry.institution }}</h6>
{% endif %}
{% if entry.area %}
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem; font-style: italic">{{ entry.area }}</h6>
{% endif %}
{% if entry.courses or entry.highlights %}
<ul class="items">
{% for item in entry.courses %}
<li>
<span class="item">{{ item }}</span>
</li>
{% endfor %}
{% for item in entry.highlights %}
<li>
<span class="item">{{ item | markdownify | remove: '<p>' | remove: '</p>' }}</span>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
</div>
</li>
{% endfor %}
</ul>

View File

@ -0,0 +1,91 @@
{% comment %}
Unified work/experience entry renderer for both RenderCV and JSONResume formats
Handles both:
- RenderCV: company, position, start_date, end_date, location, url, summary, highlights
- JSONResume: name, position, startDate, endDate, location, url, summary, highlights
{% endcomment %}
<ul class="card-text font-weight-light list-group list-group-flush">
{% for entry in entries %}
<li class="list-group-item">
<div class="row">
<div class="col-xs-2 col-sm-2 col-md-2 text-center date-column">
{% capture start_date %}
{% if entry.start_date %}{{ entry.start_date }}{% elsif entry.startDate %}{{ entry.startDate }}{% endif %}
{% endcapture %}
{% capture end_date %}
{% if entry.end_date %}{{ entry.end_date }}{% elsif entry.endDate %}{{ entry.endDate }}{% endif %}
{% endcapture %}
{% if start_date != '' %}
{% comment %} Extract year only from dates like "1933-01-01" or just use "1933" as is {% endcomment %}
{% assign startDate = start_date | split: '-' | first %}
{% assign endDate = end_date | split: '-' | first | default: 'Present' %}
{% assign date = startDate | append: ' - ' | append: endDate %}
{% else %}
{% assign date = '' %}
{% endif %}
<table class="table-cv">
<tbody>
<tr>
<td>
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px">{{ date }}</span>
</td>
</tr>
{% capture location %}
{% if entry.location %}{{ entry.location }}{% endif %}
{% endcapture %}
{% if location != '' %}
<tr>
<td>
<p class="location">
<i class="fa-solid fa-location-dot iconlocation"></i>
{{ location }}
</p>
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
{% capture position_title %}
{% if entry.position %}{{ entry.position }}{% endif %}
{% endcapture %}
{% if entry.url %}
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ entry.url }}">{{ position_title }}</a>
</h6>
{% elsif position_title != '' %}
<h6 class="title font-weight-bold ml-1 ml-md-4">{{ position_title }}</h6>
{% endif %}
{% capture company_name %}
{% if entry.name %}{{ entry.name }}{% elsif entry.company %}{{ entry.company }}{% elsif entry.organization %}{{ entry.organization }}{% endif %}
{% endcapture %}
{% if company_name != '' %}
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">{{ company_name }}</h6>
{% endif %}
{% if entry.summary %}
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem; font-style: italic">
{{ entry.summary | markdownify | remove: '<p>' | remove: '</p>' }}
</h6>
{% endif %}
{% if entry.highlights %}
<ul class="items">
{% for item in entry.highlights %}
<li>
<span class="item">{{ item | markdownify | remove: '<p>' | remove: '</p>' }}</span>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
</div>
</li>
{% endfor %}
</ul>

View File

@ -0,0 +1,29 @@
{% comment %}
Unified interests entry renderer for both formats
{% endcomment %}
<div class="card-text font-weight-light">
{% for entry in entries %}
<div class="interest-item">
{% if entry.icon %}
<i class="{{ entry.icon }}"></i>
{% endif %}
<strong>{{ entry.name }}:</strong>
{% if entry.keywords %}
{% for keyword in entry.keywords %}
{% if forloop.last %}
{{ keyword }}
{% else %}
{{ keyword }},
{% endif %}
{% endfor %}
{% endif %}
</div>
{% endfor %}
</div>
<style>
.interest-item {
padding: 0.5rem 0;
}
</style>

View File

@ -0,0 +1,28 @@
{% comment %}
Unified languages entry renderer for both formats
- RenderCV uses: name, summary
- JSONResume uses: language, fluency
{% endcomment %}
<div class="card-text font-weight-light">
{% for entry in entries %}
<div class="language-item">
{% if entry.icon %}
<i class="{{ entry.icon }}"></i>
{% endif %}
{% capture lang_name %}
{% if entry.name %}{{ entry.name }}{% elsif entry.language %}{{ entry.language }}{% endif %}
{% endcapture %}
{% capture fluency %}
{% if entry.summary %}{{ entry.summary }}{% elsif entry.fluency %}{{ entry.fluency }}{% endif %}
{% endcapture %}
<strong>{{ lang_name }}:</strong> {{ fluency }}
</div>
{% endfor %}
</div>
<style>
.language-item {
padding: 0.5rem 0;
}
</style>

View File

@ -1,5 +0,0 @@
<ul class="card-text font-weight-light list-group list-group-flush">
{% for content in entry.contents %}
<li class="list-group-item">{{ content }}</li>
{% endfor %}
</ul>

View File

@ -1,51 +0,0 @@
<div class="list-groups">
{% for content in entry.contents %}
<div class="list-group col-md-6">
<table class="table-cv list-group-table">
<tbody>
<tr>
{% if content.icon %}
<td class="list-group-category-icon"><i class="{{ content.icon }}"></i></td>
{% else %}
<td class="list-group-category-icon"></td>
{% endif %}
<!-- Calculate colspan number for category title -->
{% assign i = 1 %}
{% for item in content.items %}
{% assign i = i | plus: 1 %}
{% endfor %}
<td colspan="{{ i }}" class="list-group-category">{{ content.category }}</td>
</tr>
{% for item in content.items %}
<tr>
<td></td>
<td class="list-group-name">
<b>{{ item.name }}</b>
</td>
{% if item.level %}
<td class="list-group-level">{{ item.level }}</td>
{% endif %}
{% if item.school %}
<td class="list-group-school">{{ item.school }}
{% endif %}
{% if item.time %}
<br>
<span class="list-group-time">{{ item.time }}</span>
</td>
{% else %}
</td>
{% endif %}
{% if item.link %}
<td class="list-group-link">
<a href="{{ item.link }}" target="_blank" class="btncv z-depth-0">
{% if item.linkname %}{{ item.linkname }}{% else %}DOC{% endif %}
</a>
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endfor %}
</div>

View File

@ -1,29 +0,0 @@
<table class="table table-cv table-sm table-borderless table-responsive">
{% for content in entry.contents %}
<tr>
<td class="p-1 pr-2 font-weight-bold">
<b>{{ content.name }}</b>
</td>
{% if content.value %}
<td class="p-1 pl-2 font-weight-light text">{{ content.value }}</td>
{% endif %}
{% if content.links %}
<td class="p-1 pl-2 font-weight-light text">
<div class="container-pdf">
{% for item in content.links %}
{% if item.link %}
<div class="container-link-button">
{% if item.name %}
<a href="{{ item.link }}" target="_blank" class="btncv z-depth-0">{{ item.name }}</a>
{% else %}
<a href="{{ item.link }}" target="_blank" class="btncv z-depth-0">doc</a>
{% endif %}
</div>
{% endif %}
{% endfor %}
</div>
</td>
{% endif %}
</tr>
{% endfor %}
</table>

View File

@ -1,16 +0,0 @@
<ul class="card-text font-weight-light list-group list-group-flush">
{% for content in entry.contents %}
<li class="list-group-item">
<h5 class="font-italic">{{ content.title }}</h5>
{% if content.items %}
<ul class="subitems">
{% for subitem in content.items %}
<li>
<span class="subitem">{{ subitem }}</span>
</li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>

View File

@ -0,0 +1,31 @@
{% comment %}
Unified projects entry renderer for both formats
{% endcomment %}
<ul class="card-text font-weight-light list-group list-group-flush">
{% for entry in entries %}
<li class="list-group-item">
{% if entry.url %}
<h6 class="title font-weight-bold">
<a href="{{ entry.url }}" target="_blank">{{ entry.name }}</a>
</h6>
{% else %}
<h6 class="title font-weight-bold">{{ entry.name }}</h6>
{% endif %}
{% if entry.summary %}
<p>{{ entry.summary | markdownify | remove: '<p>' | remove: '</p>' }}</p>
{% endif %}
{% if entry.highlights %}
<ul class="items">
{% for item in entry.highlights %}
<li>
<span class="item">{{ item | markdownify | remove: '<p>' | remove: '</p>' }}</span>
</li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>

View File

@ -0,0 +1,70 @@
{% comment %}
Unified publications entry renderer for both formats
{% endcomment %}
<ul class="card-text font-weight-light list-group list-group-flush">
{% for entry in entries %}
<li class="list-group-item">
<div class="row">
{% capture pub_date %}
{% if entry.releaseDate %}{{ entry.releaseDate }}{% elsif entry.date %}{{ entry.date }}{% endif %}
{% endcapture %}
{% if pub_date != '' %}
<div class="col-xs-2 col-sm-2 col-md-2 text-center">
<table class="table-cv">
<tbody>
<tr>
<td>
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px">
{{- pub_date | split: '-' | slice: 0, 1 | join: '' -}}
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
{% if entry.url %}
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ entry.url }}">{{ entry.title | default: entry.name }}</a>
</h6>
{% elsif entry.title %}
<h6 class="title font-weight-bold ml-1 ml-md-4">{{ entry.title }}</h6>
{% endif %}
{% if entry.publisher %}
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">
<em>{{ entry.publisher }}</em>
</h6>
{% endif %}
{% if entry.summary %}
<p class="ml-1 ml-md-4">{{ entry.summary | markdownify | remove: '<p>' | remove: '</p>' }}</p>
{% endif %}
</div>
{% else %}
<div class="col-xs-12 col-sm-12 col-md-12">
{% if entry.url %}
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ entry.url }}">{{ entry.title | default: entry.name }}</a>
</h6>
{% elsif entry.title %}
<h6 class="title font-weight-bold ml-1 ml-md-4">{{ entry.title }}</h6>
{% endif %}
{% if entry.publisher %}
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">
<em>{{ entry.publisher }}</em>
</h6>
{% endif %}
{% if entry.summary %}
<p class="ml-1 ml-md-4">{{ entry.summary | markdownify | remove: '<p>' | remove: '</p>' }}</p>
{% endif %}
</div>
{% endif %}
</div>
</li>
{% endfor %}
</ul>

View File

@ -0,0 +1,15 @@
{% comment %}
Unified references entry renderer for both formats
{% endcomment %}
<ul class="card-text font-weight-light list-group list-group-flush">
{% for entry in entries %}
<li class="list-group-item">
{% if entry.icon %}
<i class="{{ entry.icon }}"></i>
{% endif %}
<strong>{{ entry.name }}</strong>
<p>{{ entry.reference | markdownify | remove: '<p>' | remove: '</p>' }}</p>
</li>
{% endfor %}
</ul>

View File

@ -0,0 +1,32 @@
{% comment %}
Unified skills entry renderer for both formats
{% endcomment %}
<div class="card-text font-weight-light">
{% for entry in entries %}
<div class="skill-item">
{% if entry.icon %}
<i class="{{ entry.icon }}"></i>
{% endif %}
<strong>
{{- entry.name -}}
{%- if entry.level %} ({{ entry.level }}){% endif %}:</strong
>
{% if entry.keywords %}
{% for keyword in entry.keywords %}
{% if forloop.last %}
{{ keyword }}
{% else %}
{{ keyword }},
{% endif %}
{% endfor %}
{% endif %}
</div>
{% endfor %}
</div>
<style>
.skill-item {
padding: 0.5rem 0;
}
</style>

View File

@ -1,118 +0,0 @@
<ul class="card-text font-weight-light list-group list-group-flush">
{% for content in entry.contents %}
<li class="list-group-item">
<div class="row">
{% if content.year %}
<div class="col-xs-2 col-sm-2 col-md-2 text-center" style="width: 75px">
<table class="table-cv">
<tbody>
<tr>
<td>
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px">
{{- content.year -}}
</span>
</td>
</tr>
{% if content.location %}
<tr>
<td>
<p class="location">
<i class="fa-solid fa-location-dot iconlocation"></i>
{{ content.location }}
</p>
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
{% endif %}
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
{% if content.title %}
<h6 class="title font-weight-bold ml-1 ml-md-4">{{ content.title }}</h6>
{% endif %}
{% if content.department or content.institution %}
<table class="table-cv ml-1 ml-md-4 institution">
<tbody>
{% if content.institution %}
<tr>
<td style="vertical-align: top; text-align: center" class="institution">
<i class="fa-solid fa-building-columns iconinstitution"></i>
</td>
<td class="institution">{{ content.institution }}</td>
</tr>
{% endif %}
{% if content.department %}
<tr>
<td style="vertical-align: top; text-align: center" class="department">
<i class="fa-regular fa-circle-dot icondepartment"></i>
</td>
<td class="department">{{ content.department }}</td>
</tr>
{% endif %}
</tbody>
</table>
{% endif %}
{% if content.maindescription %}
<div class="ml-1 ml-md-4">{{ content.maindescription }}</div>
{% endif %}
{% if content.description %}
<ul class="items">
{% for item in content.description %}
<li>
{% if item.contents %}
<span class="item-title">{{ item.title }}</span>
<ul class="subitems">
{% for subitem in item.contents %}
<li>
<span class="subitem">{{ subitem }}</span>
</li>
{% endfor %}
</ul>
{% else %}
<span class="item">{{ item }}</span>
{% endif %}
</li>
{% endfor %}
</ul>
{% endif %}
{% if content.items %}
<ul class="items">
{% for item in content.items %}
<li>
{% if item.contents %}
<span class="item-title">{{ item.title }}</span>
<ul class="subitems">
{% for subitem in item.contents %}
<li>
<span class="subitem">{{ subitem }}</span>
</li>
{% endfor %}
</ul>
{% else %}
<span class="item">{{ item }}</span>
{% endif %}
</li>
{% endfor %}
</ul>
{% endif %}
{% if content.linkitems %}
<div class="container-links ml-1 ml-md-4">
{% for item in content.linkitems %}
{% if item.link %}
<div class="container-link-button">
{% if item.linkname %}
<a href="{{ item.link }}" target="_blank" class="btncv z-depth-0">{{ item.linkname }}</a>
{% else %}
<a href="{{ item.link }}" target="_blank" class="btncv z-depth-0">doc</a>
{% endif %}
</div>
{% endif %}
{% endfor %}
</div>
{% endif %}
</div>
</div>
</li>
{% endfor %}
</ul>

View File

@ -1,19 +0,0 @@
<ul class="card-text font-weight-light list-group list-group-flush">
{% for content in data[1] %}
<li class="list-group-item">
<div class="row">
<div class="col-xs-2 col-sm-2 col-md-2 text-center date-column">
{% if content.date %} {% assign date = content.date | split: '-' | join: '.' %} {% else %} {% assign date = '' %} {% endif %}
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px"> {{ date }} </span>
</div>
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ content.url }}">{{ content.title }}</a>
</h6>
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">{{ content.awarder }}</h6>
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem; font-style: italic">{{ content.summary }}</h6>
</div>
</div>
</li>
{% endfor %}
</ul>

View File

@ -1,28 +0,0 @@
<table class="table table-cv table-sm table-borderless table-responsive table-cv-map">
{% assign skip_basics = 'image,profiles,location' | split: ',' %}
{% for content in data[1] %}
{%
if (content[1] == "") or (skip_basics contains
content[0])
%}
{% continue %}
{% endif %}
<tr>
<td class="p-1 pr-2 font-weight-bold">
<b>{{ content[0] | capitalize }}</b>
</td>
<td class="p-1 pl-2 font-weight-light text">
{% if content[0] == 'url' %}
<a href="{{ content[1] }}" target="_blank" rel="noopener noreferrer">{{ content[1] }}</a>
{% elsif content[0] == 'email' %}
<a href="mailto:{{ content[1] }}" target="_blank">{{ content[1] }}</a>
{% elsif content[0] == 'phone' %}
<a href="tel:{{ content[1] }}">{{ content[1] }}</a>
{% else %}
{{ content[1] }}
{% endif %}
</td>
</tr>
{% endfor %}
</table>

View File

@ -1,35 +0,0 @@
<div class="list-groups">
{% assign certificates = data[1] | sort: 'date' | reverse %}
{% for content in certificates %}
<div class="list-group col-md-6">
<table class="table-cv list-group-table">
<tbody>
<tr>
{% if content.icon %}
<td class="list-group-category-icon">
<i class="{{ content.icon }}"></i>
</td>
{% else %}
<td class="list-group-category-icon"></td>
{% endif %}
<!-- Calculate colspan number for category title -->
{% assign i = 1 %}
{% for item in content.items %}
{% assign i = i | plus: 1 %}
{% endfor %}
<td colspan="{{ i }}" class="list-group-category">
<a href="{{ content.url | default: # }}">{{ content.name }}</a>
</td>
</tr>
<tr>
<td></td>
<td class="list-group-name">
<b>{{ content.issuer }}</b>
</td>
<td class="list-group-name">{{ content.date }}</td>
</tr>
</tbody>
</table>
</div>
{% endfor %}
</div>

View File

@ -1,54 +0,0 @@
<ul class="card-text font-weight-light list-group list-group-flush">
{% assign education = data[1] | sort: 'startDate' | reverse %}
{% for content in education %}
<li class="list-group-item">
<div class="row">
<div class="col-xs-2 col-sm-2 col-md-2 text-center date-column">
{% if content.startDate and content.startDate != '' %}
{% assign startDate = content.startDate | split: '-' | slice: 0, 2 | join: '.' %}
{% assign endDate = content.endDate | split: '-' | slice: 0, 2 | join: '.' | default: 'Present' %}
{% assign date = startDate | append: ' - ' %}
{% assign date = date | append: endDate %}
{% else %}
{% assign date = null %}
{% endif %}
<table class="table-cv">
<tbody>
<tr>
<td>
{% if date %}
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px"> {{ date }} </span>
{% endif %}
</td>
</tr>
{% if content.location %}
<tr>
<td>
<p class="location">
<i class="fa-solid fa-location-dot iconlocation"></i>
{{ content.location }}
</p>
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ content.url }}">{{ content.studyType }}</a>
</h6>
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">{{ content.institution }}</h6>
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem; font-style: italic">{{ content.area }}</h6>
<ul class="items">
{% for item in content.courses %}
<li>
<span class="item">{{ item }}</span>
</li>
{% endfor %}
</ul>
</div>
</div>
</li>
{% endfor %}
</ul>

View File

@ -1,34 +0,0 @@
<div class="list-groups">
{% for content in data[1] %}
<div class="list-group col-md-6">
<table class="table-cv list-group-table">
<tbody>
<tr>
{% if content.icon %}
<td class="list-group-category-icon">
<i class="{{ content.icon }}"></i>
</td>
{% else %}
<td class="list-group-category-icon"></td>
{% endif %}
{% assign i = 1 %}
{% for item in content.keywords %}
{% assign i = i | plus: 1 %}
{% endfor %}
<td colspan="{{ i }}" class="list-group-category">{{ content.name }}</td>
</tr>
{% for item in content.keywords %}
<tr>
<td></td>
<td class="list-group-name">
<b>{{ item }}</b>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endfor %}
</div>

View File

@ -1,31 +0,0 @@
<div class="list-groups">
{% for content in data[1] %}
<div class="list-group col-md-6">
<table class="table-cv list-group-table">
<tbody>
<tr>
{% if content.icon %}
<td class="list-group-category-icon">
<i class="{{ content.icon }}"></i>
</td>
{% else %}
<td class="list-group-category-icon"></td>
{% endif %}
<!-- Calculate colspan number for category title -->
{% assign i = 1 %}
{% for item in content.items %}
{% assign i = i | plus: 1 %}
{% endfor %}
<td colspan="{{ i }}" class="list-group-category">{{ content.language }}</td>
</tr>
<tr>
<td></td>
<td class="list-group-name">
<b>{{ content.fluency }}</b>
</td>
</tr>
</tbody>
</table>
</div>
{% endfor %}
</div>

View File

@ -1,32 +0,0 @@
<ul class="card-text font-weight-light list-group list-group-flush">
{% for content in data[1] %}
<li class="list-group-item">
<div class="row">
<div class="col-xs-2 col-sm-2 col-md-2 text-center date-column">
{% if content.startDate %}
{% assign startDate = content.startDate | split: '-' | slice: 0, 2 | join: '.' %}
{% assign endDate = content.endDate | split: '-' | slice: 0, 2 | join: '.' | default: 'Present' %}
{% assign date = startDate | append: ' - ' %}
{% assign date = date | append: endDate %}
{% else %}
{% assign date = '' %}
{% endif %}
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px"> {{ date }} </span>
</div>
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ content.url }}">{{ content.name }}</a>
</h6>
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem; font-style: italic">{{ content.summary }}</h6>
<ul class="items">
{% for item in content.highlights %}
<li>
<span class="item">{{ item }}</span>
</li>
{% endfor %}
</ul>
</div>
</div>
</li>
{% endfor %}
</ul>

View File

@ -1,28 +0,0 @@
<ul class="card-text font-weight-light list-group list-group-flush">
{% assign publications = data[1] | sort: 'releaseDate' | reverse %}
{% for content in publications %}
<li class="list-group-item">
<div class="row">
<div class="col-xs-2 col-sm-2 col-md-2 text-center date-column">
{% if content.releaseDate %} {% assign date = content.releaseDate | split: '-' | join: '.' %} {% else %} {% assign date = '' %} {% endif %}
<table class="table-cv">
<tbody>
<tr>
<td>
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px">{{ date }}</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ content.url }}">{{ content.name }}</a>
</h6>
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">{{ content.publisher }}</h6>
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem; font-style: italic">{{ content.summary }}</h6>
</div>
</div>
</li>
{% endfor %}
</ul>

View File

@ -1,31 +0,0 @@
<div class="list-groups">
{% for content in data[1] %}
<div class="list-group col-md-6">
<table class="table-cv list-group-table">
<tbody>
<tr>
{% if content.icon %}
<td class="list-group-category-icon">
<i class="{{ content.icon }}"></i>
</td>
{% else %}
<td class="list-group-category-icon"></td>
{% endif %}
<!-- Calculate colspan number for category title -->
{% assign i = 1 %}
{% for item in content.items %}
{% assign i = i | plus: 1 %}
{% endfor %}
<td colspan="{{ i }}" class="list-group-category">{{ content.name }}</td>
</tr>
<tr>
<td></td>
<td class="list-group-name">
<b>{{ content.reference }}</b>
</td>
</tr>
</tbody>
</table>
</div>
{% endfor %}
</div>

View File

@ -1,33 +0,0 @@
<div class="list-groups">
{% for content in data[1] %}
<div class="list-group col-md-6" title="{{ content.level }}">
<table class="table-cv list-group-table">
<tbody>
<tr>
{% if content.icon %}
<td class="list-group-category-icon">
<i class="{{ content.icon }}"></i>
</td>
{% else %}
<td class="list-group-category-icon"></td>
{% endif %}
<!-- Calculate colspan number for category title -->
{% assign i = 1 %}
{% for item in content.items %}
{% assign i = i | plus: 1 %}
{% endfor %}
<td colspan="{{ i }}" class="list-group-category">{{ content.name }}</td>
</tr>
{% for item in content.keywords %}
<tr>
<td></td>
<td class="list-group-name">
<b>{{ item }}</b>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endfor %}
</div>

View File

@ -1,52 +0,0 @@
<ul class="card-text font-weight-light list-group list-group-flush">
{% assign volunteer = data[1] | sort: 'startDate' | reverse %}
{% for content in volunteer %}
<li class="list-group-item">
<div class="row">
<div class="col-xs-2 col-sm-2 col-md-2 text-center date-column">
{% if content.startDate %}
{% assign startDate = content.startDate | split: '-' | slice: 0, 2 | join: '.' %}
{% assign endDate = content.endDate | split: '-' | slice: 0, 2 | join: '.' | default: 'Present' %}
{% assign date = startDate | append: ' - ' %}
{% assign date = date | append: endDate %}
{% else %}
{% assign date = '' %}
{% endif %}
<table class="table-cv">
<tbody>
<tr>
<td>
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px"> {{ date }} </span>
</td>
</tr>
{% if content.location %}
<tr>
<td>
<p class="location">
<i class="fa-solid fa-location-dot iconlocation"></i>
{{ content.location }}
</p>
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ content.url }}">{{ content.position }}</a>
</h6>
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">{{ content.organization }}</h6>
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem; font-style: italic">{{ content.summary }}</h6>
<ul class="items">
{% for item in content.highlights %}
<li>
<span class="item">{{ item }}</span>
</li>
{% endfor %}
</ul>
</div>
</div>
</li>
{% endfor %}
</ul>

View File

@ -1,52 +0,0 @@
<ul class="card-text font-weight-light list-group list-group-flush">
{% assign work = data[1] | sort: 'startDate' | reverse %}
{% for content in work %}
<li class="list-group-item">
<div class="row">
<div class="col-xs-2 col-sm-2 col-md-2 text-center date-column">
{% if content.startDate %}
{% assign startDate = content.startDate | split: '-' | slice: 0, 2 | join: '.' %}
{% assign endDate = content.endDate | split: '-' | slice: 0, 2 | join: '.' | default: 'Present' %}
{% assign date = startDate | append: ' - ' %}
{% assign date = date | append: endDate %}
{% else %}
{% assign date = '' %}
{% endif %}
<table class="table-cv">
<tbody>
<tr>
<td>
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px"> {{ date }} </span>
</td>
</tr>
{% if content.location %}
<tr>
<td>
<p class="location">
<i class="fa-solid fa-location-dot iconlocation"></i>
{{ content.location }}
</p>
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
<h6 class="title font-weight-bold ml-1 ml-md-4">
<a href="{{ content.url }}">{{ content.position }}</a>
</h6>
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">{{ content.name }}</h6>
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem; font-style: italic">{{ content.summary }}</h6>
<ul class="items">
{% for item in content.highlights %}
<li>
<span class="item">{{ item }}</span>
</li>
{% endfor %}
</ul>
</div>
</div>
</li>
{% endfor %}
</ul>

View File

@ -1,127 +1,386 @@
--- ---
layout: default layout: default
--- ---
{% unless site.data.resume %} {% comment %}
<div class="post"> Unified CV layout that handles both RenderCV (YAML) and JSONResume (JSON) formats
<header class="post-header"> - If page.cv_format is set, it determines which format to render:
<h1 class="post-title"> - 'rendercv': Load and render only RenderCV data (site.data.cv.cv)
{{ page.title }} - 'jsonresume': Load and render only JSONResume data (site.data.resume)
{% if page.cv_pdf %} - If page.cv_format is not set, the legacy behavior applies:
<a - RenderCV data is in site.data.cv.cv
{% if page.cv_pdf contains '://' %} - JSONResume data is in site.data.resume
href="{{ page.cv_pdf }}" - RenderCV is prioritized if both exist
{% else %} Both formats use the same unified rendering includes for consistent output
href="{{ page.cv_pdf | relative_url }}" {% endcomment %}
{% endif %}
target="_blank"
rel="noopener noreferrer"
class="float-right"
>
<i class="fa-solid fa-file-pdf"></i>
</a>
{% endif %}
</h1>
{% if page.description %}
<p class="post-description">{{ page.description }}</p>
{% endif %}
</header>
<article> <div class="post">
<div class="cv"> <header class="post-header">
{% for entry in site.data.cv %} <h1 class="post-title">
<a class="anchor" id="{{ entry.title }}"></a> {{ page.title }}
{% if page.cv_pdf %}
<a
{% if page.cv_pdf contains '://' %}
href="{{ page.cv_pdf }}"
{% else %}
href="{{ page.cv_pdf | relative_url }}"
{% endif %}
target="_blank"
rel="noopener noreferrer"
class="float-right"
>
<i class="fa-solid fa-file-pdf"></i>
</a>
{% endif %}
</h1>
{% if page.description %}
<p class="post-description">{{ page.description }}</p>
{% endif %}
</header>
<article>
<div class="cv">
{% comment %} Determine which CV format to render {% endcomment %}
{% assign render_rendercv = false %}
{% assign render_jsonresume = false %}
{% if page.cv_format == 'rendercv' %}
{% assign render_rendercv = true %}
{% elsif page.cv_format == 'jsonresume' %}
{% assign render_jsonresume = true %}
{% else %}
{% comment %} Legacy behavior: RenderCV takes priority if both exist {% endcomment %}
{% if site.data.cv and site.data.cv.cv %}
{% assign render_rendercv = true %}
{% elsif site.data.resume %}
{% assign render_jsonresume = true %}
{% endif %}
{% endif %}
{% if render_rendercv and site.data.cv and site.data.cv.cv %}
{% comment %} RenderCV format {% endcomment %}
{% assign cv = site.data.cv.cv %}
<!-- Header/Contact Information -->
{% if cv.name or cv.label or cv.location or cv.email or cv.phone or cv.website %}
<div class="card mt-3 p-3"> <div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">{{ entry.title }}</h3> <h3 class="card-title font-weight-medium">Contact Information</h3>
<table class="table table-cv table-sm table-borderless">
{% if cv.name %}
<tr>
<td class="p-1 pr-2 font-weight-bold"><b>Name</b></td>
<td class="p-1 pl-2 font-weight-light">{{ cv.name }}</td>
</tr>
{% endif %}
{% if cv.label %}
<tr>
<td class="p-1 pr-2 font-weight-bold"><b>Professional Title</b></td>
<td class="p-1 pl-2 font-weight-light">{{ cv.label }}</td>
</tr>
{% endif %}
{% if cv.email %}
<tr>
<td class="p-1 pr-2 font-weight-bold"><b>Email</b></td>
<td class="p-1 pl-2 font-weight-light">{{ cv.email }}</td>
</tr>
{% endif %}
{% if cv.phone %}
<tr>
<td class="p-1 pr-2 font-weight-bold"><b>Phone</b></td>
<td class="p-1 pl-2 font-weight-light">{{ cv.phone }}</td>
</tr>
{% endif %}
{% if cv.address %}
<tr>
<td class="p-1 pr-2 font-weight-bold"><b>Location</b></td>
<td class="p-1 pl-2 font-weight-light">
{% if cv.address.street %}{{ cv.address.street }}, {% endif %}
{% if cv.address.city %}{{ cv.address.city }}, {% endif %}
{% if cv.address.region %}{{ cv.address.region }} {% endif %}
{% if cv.address.postalCode %}{{ cv.address.postalCode }}{% endif %}
</td>
</tr>
{% endif %}
{% if cv.website %}
<tr>
<td class="p-1 pr-2 font-weight-bold"><b>Website</b></td>
<td class="p-1 pl-2 font-weight-light">
<a href="{{ cv.website }}" target="_blank">{{ cv.website }}</a>
</td>
</tr>
{% endif %}
</table>
</div>
{% endif %}
<!-- Summary -->
{% if cv.summary %}
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Professional Summary</h3>
<p>{{ cv.summary | markdownify | remove: '<p>' | remove: '</p>' }}</p>
</div>
{% endif %}
<!-- RenderCV Sections - Merge Experience and Volunteer -->
{% comment %} First, combine Experience and Volunteer entries {% endcomment %}
{% assign combined_experience = cv.sections.Experience | concat: cv.sections.Volunteer %}
{% if combined_experience.size > 0 %}
<a class="anchor" id="experience"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Experience</h3>
<div> <div>
{% if entry.type == 'list' %} {% assign entries = combined_experience %}
{% include cv/list.liquid %} {% include cv/experience.liquid %}
{% elsif entry.type == 'map' %} </div>
{% include cv/map.liquid %} </div>
{% elsif entry.type == 'nested_list' %} {% endif %}
{% include cv/nested_list.liquid %}
{% elsif entry.type == 'time_table' %} {% comment %} Now render all other sections except Experience and Volunteer {% endcomment %}
{% include cv/time_table.liquid %} {% for section_pair in cv.sections %}
{% elsif entry.type == 'list_groups' %} {% assign section_title = section_pair[0] %}
{% include cv/list_groups.liquid %} {% assign section_entries = section_pair[1] %}
{% comment %} Skip Experience and Volunteer as we've already processed them combined {% endcomment %}
{% if section_title == 'Experience' or section_title == 'Volunteer' %}
{% continue %}
{% endif %}
<a class="anchor" id="{{ section_title | slugify }}"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">{{ section_title }}</h3>
<div>
{% if section_title == 'Education' %}
{% assign entries = section_entries %}
{% include cv/education.liquid %}
{% elsif section_title == 'Awards' or section_title == 'Honors and Awards' %}
{% assign entries = section_entries %}
{% include cv/awards.liquid %}
{% elsif section_title == 'Publications' %}
{% assign entries = section_entries %}
{% include cv/publications.liquid %}
{% elsif section_title == 'Skills' %}
{% assign entries = section_entries %}
{% include cv/skills.liquid %}
{% elsif section_title == 'Languages' %}
{% assign entries = section_entries %}
{% include cv/languages.liquid %}
{% elsif section_title == 'Interests' or section_title == 'Academic Interests' %}
{% assign entries = section_entries %}
{% include cv/interests.liquid %}
{% elsif section_title == 'Certificates' %}
{% assign entries = section_entries %}
{% include cv/certificates.liquid %}
{% elsif section_title == 'Projects' or section_title == 'Open Source Projects' %}
{% assign entries = section_entries %}
{% include cv/projects.liquid %}
{% elsif section_title == 'References' %}
{% assign entries = section_entries %}
{% include cv/references.liquid %}
{% else %} {% else %}
{{ entry.contents }} <!-- Generic section -->
{% for entry in section_entries %}
{% if entry.bullet %}
<ul class="card-text font-weight-light list-group list-group-flush">
<li class="list-group-item">{{ entry.bullet | markdownify | remove: '<p>' | remove: '</p>' }}</li>
</ul>
{% elsif entry.label %}
<div class="card-text font-weight-light">
<strong>{{ entry.label }}:</strong> {{ entry.details }}
</div>
{% endif %}
{% endfor %}
{% endif %} {% endif %}
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
</div>
</article>
</div>
{% else %}
<div class="post">
<header class="post-header">
<h1 class="post-title">
{{ page.title }}
{% if page.cv_pdf %}
<a
{% if page.cv_pdf contains '://' %}
href="{{ page.cv_pdf }}"
{% else %}
href="{{ page.cv_pdf | relative_url }}"
{% endif %}
target="_blank"
rel="noopener noreferrer"
class="float-right"
>
<i class="fa-solid fa-file-pdf"></i>
</a>
{% endif %}
</h1>
{% if page.description %}
<p class="post-description">{{ page.description }}</p>
{% endif %}
</header>
<article> {% elsif render_jsonresume and site.data.resume %}
<div class="cv"> {% comment %} JSONResume format {% endcomment %}
{% for data in site.data.resume %}
{% if site.jsonresume and site.jsonresume.size > 0 %} <!-- Contact Information -->
{% unless site.jsonresume contains data[0] %} {% if site.data.resume.basics %}
{% continue %}
{% endunless %}
{% endif %}
{% if data[0] == 'meta' or data[1].size == 0 %} {% continue %} {% endif %}
<a class="anchor" id="{{ data[0] }}"></a>
<div class="card mt-3 p-3"> <div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">{{ data[0] | capitalize }}</h3> <h3 class="card-title font-weight-medium">Contact Information</h3>
<div> {% assign basics = site.data.resume.basics %}
{% case data[0] %} <table class="table table-cv table-sm table-borderless">
{% when 'basics' %} {% if basics.name %}
{% include resume/basics.liquid %} <tr>
{% when 'education' %} <td class="p-1 pr-2 font-weight-bold"><b>Name</b></td>
{% include resume/education.liquid %} <td class="p-1 pl-2 font-weight-light">{{ basics.name }}</td>
{% when 'work' %} </tr>
{% include resume/work.liquid %} {% endif %}
{% when 'volunteer' %} {% if basics.label %}
{% include resume/volunteer.liquid %} <tr>
{% when 'projects' %} <td class="p-1 pr-2 font-weight-bold"><b>Professional Title</b></td>
{% include resume/projects.liquid %} <td class="p-1 pl-2 font-weight-light">{{ basics.label }}</td>
{% when 'awards' %} </tr>
{% include resume/awards.liquid %} {% endif %}
{% when 'skills' %} {% if basics.email %}
{% include resume/skills.liquid %} <tr>
{% when 'publications' %} <td class="p-1 pr-2 font-weight-bold"><b>Email</b></td>
{% include resume/publications.liquid %} <td class="p-1 pl-2 font-weight-light">{{ basics.email }}</td>
{% when 'languages' %} </tr>
{% include resume/languages.liquid %} {% endif %}
{% when 'interests' %} {% if basics.phone %}
{% include resume/interests.liquid %} <tr>
{% when 'certificates' %} <td class="p-1 pr-2 font-weight-bold"><b>Phone</b></td>
{% include resume/certificates.liquid %} <td class="p-1 pl-2 font-weight-light">{{ basics.phone }}</td>
{% when 'references' %} </tr>
{% include resume/references.liquid %} {% endif %}
{% else %} {% if basics.location %}
<tr>
<td class="p-1 pr-2 font-weight-bold"><b>Location</b></td>
<td class="p-1 pl-2 font-weight-light">
{% if basics.location.address %}{{ basics.location.address }}, {% endif %}
{% if basics.location.city %}{{ basics.location.city }}, {% endif %}
{% if basics.location.region %}{{ basics.location.region }} {% endif %}
{% if basics.location.postalCode %}{{ basics.location.postalCode }}{% endif %}
</td>
</tr>
{% endif %}
{% if basics.url %}
<tr>
<td class="p-1 pr-2 font-weight-bold"><b>Website</b></td>
<td class="p-1 pl-2 font-weight-light">
<a href="{{ basics.url }}" target="_blank">{{ basics.url }}</a>
</td>
</tr>
{% endif %}
</table>
</div>
{% endif %}
{% endcase %} <!-- Summary -->
{% if site.data.resume.basics.summary %}
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Professional Summary</h3>
<p>{{ site.data.resume.basics.summary | markdownify | remove: '<p>' | remove: '</p>' }}</p>
</div>
{% endif %}
<!-- JSONResume Sections - Merge work and volunteer into Experience -->
{% assign combined_experience = site.data.resume.work | concat: site.data.resume.volunteer %}
{% if combined_experience.size > 0 %}
<a class="anchor" id="experience"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Experience</h3>
<div>
{% assign entries = combined_experience %}
{% include cv/experience.liquid %}
</div> </div>
</div> </div>
{% endfor %} {% endif %}
</div>
</article> <!-- Education -->
</div> {% if site.data.resume.education.size > 0 %}
{% endunless %} <a class="anchor" id="education"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Education</h3>
<div>
{% assign entries = site.data.resume.education %}
{% include cv/education.liquid %}
</div>
</div>
{% endif %}
<!-- Awards -->
{% if site.data.resume.awards.size > 0 %}
<a class="anchor" id="awards"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Awards</h3>
<div>
{% assign entries = site.data.resume.awards %}
{% include cv/awards.liquid %}
</div>
</div>
{% endif %}
<!-- Publications -->
{% if site.data.resume.publications.size > 0 %}
<a class="anchor" id="publications"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Publications</h3>
<div>
{% assign entries = site.data.resume.publications %}
{% include cv/publications.liquid %}
</div>
</div>
{% endif %}
<!-- Skills -->
{% if site.data.resume.skills.size > 0 %}
<a class="anchor" id="skills"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Skills</h3>
<div>
{% assign entries = site.data.resume.skills %}
{% include cv/skills.liquid %}
</div>
</div>
{% endif %}
<!-- Languages -->
{% if site.data.resume.languages.size > 0 %}
<a class="anchor" id="languages"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Languages</h3>
<div>
{% assign entries = site.data.resume.languages %}
{% include cv/languages.liquid %}
</div>
</div>
{% endif %}
<!-- Interests -->
{% if site.data.resume.interests.size > 0 %}
<a class="anchor" id="interests"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Interests</h3>
<div>
{% assign entries = site.data.resume.interests %}
{% include cv/interests.liquid %}
</div>
</div>
{% endif %}
<!-- Certificates -->
{% if site.data.resume.certificates.size > 0 %}
<a class="anchor" id="certificates"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Certificates</h3>
<div>
{% assign entries = site.data.resume.certificates %}
{% include cv/certificates.liquid %}
</div>
</div>
{% endif %}
<!-- Projects -->
{% if site.data.resume.projects.size > 0 %}
<a class="anchor" id="projects"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">Projects</h3>
<div>
{% assign entries = site.data.resume.projects %}
{% include cv/projects.liquid %}
</div>
</div>
{% endif %}
<!-- References -->
{% if site.data.resume.references.size > 0 %}
<a class="anchor" id="references"></a>
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">References</h3>
<div>
{% assign entries = site.data.resume.references %}
{% include cv/references.liquid %}
</div>
</div>
{% endif %}
{% else %}
<p>No CV data found. Please configure either RenderCV (cv.yml) or JSONResume (resume.json) data.</p>
{% endif %}
</div>
</article>
</div>

View File

@ -1,10 +1,11 @@
--- ---
layout: cv layout: cv
permalink: /cv/ permalink: /cv/
title: cv title: CV
nav: true nav: true
nav_order: 5 nav_order: 5
cv_pdf: /assets/pdf/example_pdf.pdf # you can also use external links here cv_pdf: /assets/pdf/example_pdf.pdf # you can also use external links here
cv_format: rendercv # options: rendercv, jsonresume
description: This is a description of the page. You can modify it in '_pages/cv.md'. You can also change or remove the top pdf download button. description: This is a description of the page. You can modify it in '_pages/cv.md'. You can also change or remove the top pdf download button.
toc: toc:
sidebar: left sidebar: left

View File

@ -3,9 +3,8 @@
"name": "Albert Einstein", "name": "Albert Einstein",
"label": "Scientist", "label": "Scientist",
"image": "", "image": "",
"email": "albert@einstein.de", "email": "einstein@example.com",
"phone": "(912) 123-4567", "phone": "(912) 123-4567",
"url": "https://alshedivat.github.io/al-folio/",
"summary": "A German-born theoretical physicist, widely ranked among the greatest and most influential scientists of all time", "summary": "A German-born theoretical physicist, widely ranked among the greatest and most influential scientists of all time",
"location": { "location": {
"address": "2712 Broadway St", "address": "2712 Broadway St",
@ -14,23 +13,53 @@
"countryCode": "US", "countryCode": "US",
"region": "California" "region": "California"
}, },
"profiles": [ "profiles": []
{
"network": "Twitter",
"username": "AlbertEinstein",
"url": "https://twitter.com/AlbertEinstein"
}
]
}, },
"work": [ "work": [
{ {
"name": "Institute for Advanced Study, Princeton University", "name": "Institute for Advanced Study, Princeton University",
"position": "Professor of Theoretical Physics", "position": "Professor of Theoretical Physics",
"url": "https://example.com", "location": "Princeton University, NJ",
"startDate": "1933-01-01", "startDate": "1933-01-01",
"endDate": "1955-01-01", "endDate": "1955-01-01",
"summary": "Teaching at Palmer Physical Laboratory (now 302 Frist Campus Center). While not a professor at Princeton, I associated with the physics professors and continued to give lectures on campus.", "summary": "Teaching at Palmer Physical Laboratory (now 302 Frist Campus Center). While not a professor at Princeton, I associated with the physics professors and continued to give lectures on campus.",
"highlights": ["Relativity"] "highlights": ["Relativity", "Description 2."]
},
{
"name": "California Institute of Technology",
"position": "Visiting Professor",
"location": "Pasadena, California, US",
"startDate": "1933-01-01",
"endDate": "1933-01-01",
"summary": "",
"highlights": ["Description 1.", "Description 2."]
},
{
"name": "Kaiser Wilhelm Institute for Physics",
"position": "Director",
"location": "Berlin, Germany",
"startDate": "1917-01-01",
"endDate": "1933-01-01",
"summary": "",
"highlights": []
},
{
"name": "Karl-Ferdinand University",
"position": "Professor of Theoretical Physics",
"location": "Prague, Czechoslovakia",
"startDate": "1911-01-01",
"endDate": "1917-01-01",
"summary": "",
"highlights": []
},
{
"name": "University of Zurich",
"position": "Associate Professor of Theoretical Physics",
"location": "Zurich, Switzerland",
"startDate": "1909-01-01",
"endDate": "1911-01-01",
"summary": "",
"highlights": []
} }
], ],
"volunteer": [ "volunteer": [
@ -38,7 +67,6 @@
"organization": "People's Climate March", "organization": "People's Climate March",
"location": "Zurich, Switzerland", "location": "Zurich, Switzerland",
"position": "Lead Organizer", "position": "Lead Organizer",
"url": "https://example.com",
"startDate": "2014-04-01", "startDate": "2014-04-01",
"endDate": "2015-07-01", "endDate": "2015-07-01",
"summary": "Lead organizer for the New York City branch of the People's Climate March, the largest climate march in history.", "summary": "Lead organizer for the New York City branch of the People's Climate March, the largest climate march in history.",
@ -47,15 +75,27 @@
], ],
"education": [ "education": [
{ {
"institution": "University of Zurich, Zurich, Switzerland", "institution": "University of Zurich",
"location": "Zurich, Switzerland", "location": "Zurich, Switzerland",
"url": "https://www.uzh.ch/", "url": "https://www.uzh.ch/",
"area": "Software Development", "area": "Physics",
"studyType": "PhD", "studyType": "PhD",
"startDate": "1905-01-01", "startDate": "1900-01-01",
"endDate": "1905-01-01", "endDate": "1905-01-01",
"score": "10", "score": "",
"courses": ["Theory of Relativity"] "courses": ["Theory of Relativity"],
"highlights": ["Description 1.", "Description 2."]
},
{
"institution": "Eidgenössische Technische Hochschule",
"location": "Zurich, Switzerland",
"area": "Physics",
"studyType": "Federal teaching diploma",
"startDate": "1896-01-01",
"endDate": "1900-01-01",
"score": "",
"courses": [],
"highlights": ["Description 1.", "Description 2."]
} }
], ],
"awards": [ "awards": [
@ -65,6 +105,12 @@
"awarder": "Royal Swedish Academy of Sciences", "awarder": "Royal Swedish Academy of Sciences",
"url": "https://www.nobelprize.org/prizes/physics/1921/einstein/biographical/", "url": "https://www.nobelprize.org/prizes/physics/1921/einstein/biographical/",
"summary": "The Nobel Prizes are five separate prizes that, according to Alfred Nobel's will of 1895, are awarded to 'those who, during the preceding year, have conferred the greatest benefit to humankind.'" "summary": "The Nobel Prizes are five separate prizes that, according to Alfred Nobel's will of 1895, are awarded to 'those who, during the preceding year, have conferred the greatest benefit to humankind.'"
},
{
"title": "Max Planck Medal",
"date": "2029-01-01",
"awarder": "German Physical Society",
"summary": ""
} }
], ],
"certificates": [ "certificates": [
@ -72,48 +118,24 @@
"name": "Machine Learning", "name": "Machine Learning",
"date": "2018-01-01", "date": "2018-01-01",
"issuer": "Stanford University", "issuer": "Stanford University",
"url": "https://example.com",
"icon": "fa-solid fa-location-dot" "icon": "fa-solid fa-location-dot"
}, },
{ {
"name": "Quantum Computing", "name": "Quantum Computing",
"date": "2018-01-01", "date": "2018-01-01",
"issuer": "Stanford University", "issuer": "Stanford University",
"url": "https://example.com",
"icon": "fa-solid fa-tag" "icon": "fa-solid fa-tag"
}, },
{ {
"name": "Quantum Information", "name": "Quantum Information",
"date": "2018-01-01", "date": "2018-01-01",
"issuer": "Stanford University", "issuer": "Stanford University",
"url": "https://example.com",
"icon": "fa-solid fa-envelope" "icon": "fa-solid fa-envelope"
},
{
"name": "Quantum Cryptography",
"date": "2018-01-01",
"issuer": "Stanford University",
"url": "https://example.com",
"icon": "fa-solid fa-hashtag"
},
{
"name": "Quantum Communication",
"date": "2018-01-01",
"issuer": "Stanford University",
"url": "https://example.com",
"icon": "fa-solid fa-calendar"
},
{
"name": "Quantum Teleportation",
"date": "2018-01-01",
"issuer": "Stanford University",
"url": "https://example.com",
"icon": "fa-solid fa-clipboard-check"
} }
], ],
"publications": [ "publications": [
{ {
"name": "Zur Elektrody/namik bewegter Körper", "name": "Zur Elektrodynamik bewegter Körper",
"publisher": "Annalen der Physik", "publisher": "Annalen der Physik",
"releaseDate": "1905-06-30", "releaseDate": "1905-06-30",
"url": "https://en.wikisource.org/wiki/Translation:On_the_Electrodynamics_of_Moving_Bodies", "url": "https://en.wikisource.org/wiki/Translation:On_the_Electrodynamics_of_Moving_Bodies",
@ -179,12 +201,12 @@
{ {
"name": "Professor John Doe", "name": "Professor John Doe",
"icon": "fa-solid fa-laptop", "icon": "fa-solid fa-laptop",
"reference": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit. D" "reference": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit."
}, },
{ {
"name": "Professor John Doe", "name": "Professor Jane Smith",
"icon": "fa-solid fa-thumbtack", "icon": "fa-solid fa-thumbtack",
"reference": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit. D" "reference": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit."
} }
], ],
"projects": [ "projects": [
@ -193,8 +215,7 @@
"summary": "Quantum computing is the use of quantum-mechanical phenomena such as superposition and entanglement to perform computation. Computers that perform quantum computations are known as quantum computers.", "summary": "Quantum computing is the use of quantum-mechanical phenomena such as superposition and entanglement to perform computation. Computers that perform quantum computations are known as quantum computers.",
"highlights": ["Quantum Teleportation", "Quantum Cryptography"], "highlights": ["Quantum Teleportation", "Quantum Cryptography"],
"startDate": "2018-01-01", "startDate": "2018-01-01",
"endDate": "2018-01-01", "endDate": "2018-01-01"
"url": "https://example.com"
} }
] ]
} }

131
assets/rendercv/design.yaml Normal file
View File

@ -0,0 +1,131 @@
design:
theme: classic
page:
# size: us-letter
# top_margin: 0.7in
# bottom_margin: 0.7in
# left_margin: 0.7in
# right_margin: 0.7in
show_footer: false
show_top_note: false
# colors:
# body: rgb(0, 0, 0)
# name: rgb(0, 79, 144)
# headline: rgb(0, 79, 144)
# connections: rgb(0, 79, 144)
# section_titles: rgb(0, 79, 144)
# links: rgb(0, 79, 144)
# footer: rgb(128, 128, 128)
# top_note: rgb(128, 128, 128)
# typography:
# line_spacing: 0.6em
# alignment: justified
# date_and_location_column_alignment: right
# font_family:
# body: Source Sans 3
# name: Source Sans 3
# headline: Source Sans 3
# connections: Source Sans 3
# section_titles: Source Sans 3
# font_size:
# body: 10pt
# name: 30pt
# headline: 10pt
# connections: 10pt
# section_titles: 1.4em
# small_caps:
# name: false
# headline: false
# connections: false
# section_titles: false
# bold:
# name: true
# headline: false
# connections: false
# section_titles: true
# links:
# underline: false
# show_external_link_icon: false
# header:
# alignment: center
# photo_width: 3.5cm
# photo_position: left
# photo_space_left: 0.4cm
# photo_space_right: 0.4cm
# space_below_name: 0.7cm
# space_below_headline: 0.7cm
# space_below_connections: 0.7cm
# connections:
# phone_number_format: national
# hyperlink: true
# show_icons: true
# display_urls_instead_of_usernames: false
# separator: ''
# space_between_connections: 0.5cm
# section_titles:
# type: with_partial_line
# line_thickness: 0.5pt
# space_above: 0.5cm
# space_below: 0.3cm
# sections:
# allow_page_break: true
# space_between_regular_entries: 1.2em
# space_between_text_based_entries: 0.3em
# show_time_spans_in:
# - experience
# entries:
# date_and_location_width: 4.15cm
# side_space: 0.2cm
# space_between_columns: 0.1cm
# allow_page_break: false
# short_second_row: true
# summary:
# space_above: 0cm
# space_left: 0cm
# highlights:
# bullet: •
# nested_bullet: •
# space_left: 0.15cm
# space_above: 0cm
# space_between_items: 0cm
# space_between_bullet_and_text: 0.5em
# templates:
# footer: '*NAME -- PAGE_NUMBER/TOTAL_PAGES*'
# top_note: '*LAST_UPDATED CURRENT_DATE*'
# single_date: MONTH_ABBREVIATION YEAR
# date_range: START_DATE END_DATE
# time_span: HOW_MANY_YEARS YEARS HOW_MANY_MONTHS MONTHS
# one_line_entry:
# main_column: '**LABEL:** DETAILS'
# education_entry:
# main_column: |-
# **INSTITUTION**, AREA
# SUMMARY
# HIGHLIGHTS
# degree_column: '**DEGREE**'
# date_and_location_column: |-
# LOCATION
# DATE
# normal_entry:
# main_column: |-
# **NAME**
# SUMMARY
# HIGHLIGHTS
# date_and_location_column: |-
# LOCATION
# DATE
# experience_entry:
# main_column: |-
# **COMPANY**, POSITION
# SUMMARY
# HIGHLIGHTS
# date_and_location_column: |-
# LOCATION
# DATE
# publication_entry:
# main_column: |-
# **TITLE**
# SUMMARY
# AUTHORS
# URL (JOURNAL)
# date_and_location_column: DATE

View File

@ -0,0 +1,34 @@
locale:
language: english
# last_updated: Last updated in
# month: month
# months: months
# year: year
# years: years
# present: present
# month_abbreviations:
# - Jan
# - Feb
# - Mar
# - Apr
# - May
# - June
# - July
# - Aug
# - Sept
# - Oct
# - Nov
# - Dec
# month_names:
# - January
# - February
# - March
# - April
# - May
# - June
# - July
# - August
# - September
# - October
# - November
# - December

View File

@ -0,0 +1,14 @@
settings:
render_command:
# Paths must be relative to _data/cv.yaml
typst_path: ../assets/rendercv/rendercv_output/NAME_IN_SNAKE_CASE_CV.typ
pdf_path: ../assets/rendercv/rendercv_output/NAME_IN_SNAKE_CASE_CV.pdf
markdown_path: ../assets/rendercv/rendercv_output/NAME_IN_SNAKE_CASE_CV.md
html_path: ../assets/rendercv/rendercv_output/NAME_IN_SNAKE_CASE_CV.html
png_path: ../assets/rendercv/rendercv_output/NAME_IN_SNAKE_CASE_CV.png
dont_generate_markdown: true
dont_generate_html: true
dont_generate_typst: false
dont_generate_pdf: false
dont_generate_png: true
bold_keywords: []

View File

@ -1,3 +1,4 @@
nbconvert nbconvert
pyyaml pyyaml
rendercv[full]
scholarly scholarly