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)
- **File Structure:**
- `_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.)
- `_posts/` Blog posts in Markdown (format: `YYYY-MM-DD-title.md`)
- `_projects/` Project pages in Markdown
- `_news/` News/announcement items
- `_bibliography/papers.bib` Publications in BibTeX format
- `_sass/` SCSS/SASS stylesheets (colors, themes, layout)
- `assets/` Static assets (images, PDFs, JSON resume, custom CSS/JS)
- `.github/workflows/` GitHub Actions for deployment and CI/CD
- `assets/` Static assets (images, PDFs, custom CSS/JS)
- `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
@ -132,11 +134,14 @@ npx prettier . --write
### 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`
- Or use YAML format in `_data/cv.yml` (delete resume.json to use this)
- Add education, work experience, skills, awards, publications
- **Choose your format:** Users select either RenderCV (`_data/cv.yml`) or JSONResume (`assets/json/resume.json`) — they pick ONE format
- **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
- **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
@ -470,24 +475,24 @@ Help users avoid these frequent errors:
## Quick Reference Map
| User wants to... | Files to modify | Key documentation |
| ----------------------- | ------------------------------------------- | --------------------------------- |
| Change personal info | `_config.yml`, `_pages/about.md` | CUSTOMIZE.md § Configuration |
| 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 |
| Add publications | `_bibliography/papers.bib` | CUSTOMIZE.md § Publications |
| Add blog post | `_posts/YYYY-MM-DD-title.md` | CUSTOMIZE.md § Blog posts |
| Create project | `_projects/name.md` | CUSTOMIZE.md § Projects |
| Add news item | `_news/announcement.md` | CUSTOMIZE.md § News |
| Change theme color | `_sass/_themes.scss` | CUSTOMIZE.md § Theme colors |
| Add social links | `_data/socials.yml` | CUSTOMIZE.md § Social media |
| Enable/disable features | `_config.yml` | CUSTOMIZE.md § Configuration |
| Remove pages | Delete from `_pages/`, update nav | CUSTOMIZE.md § Removing content |
| Fix deployment issues | `_config.yml` (url/baseurl) | FAQ.md, INSTALL.md |
| Test changes locally | Docker setup | INSTALL.md § Docker |
| 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 |
| Customize fonts/spacing | `_sass/_variables.scss` | CUSTOMIZE.md § Customization |
| User wants to... | Files to modify | Key documentation |
| ----------------------- | ------------------------------------------------------------------- | --------------------------------- |
| Change personal info | `_config.yml`, `_pages/about.md` | CUSTOMIZE.md § Configuration |
| Add profile picture | `assets/img/prof_pic.jpg` | CUSTOMIZE.md § About page |
| 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 blog post | `_posts/YYYY-MM-DD-title.md` | CUSTOMIZE.md § Blog posts |
| Create project | `_projects/name.md` | CUSTOMIZE.md § Projects |
| Add news item | `_news/announcement.md` | CUSTOMIZE.md § News |
| Change theme color | `_sass/_themes.scss` | CUSTOMIZE.md § Theme colors |
| Add social links | `_data/socials.yml` | CUSTOMIZE.md § Social media |
| Enable/disable features | `_config.yml` | CUSTOMIZE.md § Configuration |
| Remove pages | Delete from `_pages/`, update nav | CUSTOMIZE.md § Removing content |
| Fix deployment issues | `_config.yml` (url/baseurl) | FAQ.md, INSTALL.md |
| Test changes locally | Docker setup | INSTALL.md § Docker |
| 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 |
| Customize fonts/spacing | `_sass/_variables.scss` | CUSTOMIZE.md § Customization |
## 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
- `_projects/`, `_news/`, `_books/` Jekyll collections
- `_layouts/`, `_includes/` Liquid templates
- `_includes/cv/` Unified CV component renderers (awards, education, experience, skills, languages, etc.)
- `_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
- `.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
@ -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
- 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:**
@ -92,9 +97,10 @@ You are a documentation specialist for the al-folio Jekyll theme project.
1. **Update configuration documentation** when `_config.yml` changes
2. **Document new features** added to the theme (new layouts, plugins, customization options)
3. **Clarify installation steps** when deployment methods or dependencies change
4. **Update troubleshooting** in FAQ when common issues arise
5. **Maintain consistency** across all documentation files
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. **Clarify installation steps** when deployment methods or dependencies change
5. **Update troubleshooting** in FAQ when common issues arise
6. **Maintain consistency** across all documentation files
## 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
.bundle
.sass-cache
.DS_store
.idea
.jekyll-cache
.jekyll-metadata
.DS_store
.ruby-version
.sass-cache
.tweet-cache
Gemfile.lock
assets/libs/
node_modules/
vendor
.idea
.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)
- [Key Integration Points](#key-integration-points)
- [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)
- [Configuring external service URLs](#configuring-external-service-urls)
- [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
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

View File

@ -1,97 +1,189 @@
- title: General Information
type: map
contents:
- name: Full Name
value: Albert Einstein
- name: Date of Birth
value: 14th March 1879
- name: Languages
value: English, German
cv:
name: Albert Einstein
label: Scientist
email: einstein@example.com
location: Princeton, NJ
image: ""
summary: A German-born theoretical physicist, widely ranked among the greatest and most influential scientists of all time
- title: Education
type: time_table
contents:
- title: PhD
institution: University of Zurich, Zurich, Switzerland
year: 1905
description:
- 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.
social_networks:
- network: X
username: AlbertEinstein
- network: GitHub
username: example
- network: LinkedIn
username: example
- title: Experience
type: time_table
contents:
- title: Professor of Theoretical Physics
institution: Institute for Advanced Study, Princeton University
year: 1933 - 1955
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.
address:
street: 2712 Broadway St
city: San Francisco
region: California
postalCode: CA 94115
countryCode: US
- title: Director
institution: Kaiser Wilhelm Institute for Physics, Berlin, Germany.
year: 1917-1933
sections:
Education:
- 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: Karl-Ferdinand University, Prague, Czechoslovakia
year: 1911 - 1917
description:
- institution: Eidgenössische Technische Hochschule
location: Zurich, Switzerland
area: Physics
studyType: Federal teaching diploma
start_date: 1896
end_date: 1900
highlights:
- Description 1.
- Description 2.
- title: Associate Professor of Theoretical Physics
institution: University of Zurich, Zurich, Switzerland
year: 1909 - 1911
Experience:
- company: Institute for Advanced Study, Princeton University
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
type: time_table
contents:
- title: <a href="https://github.com/alshedivat/al-folio">al-folio</a>
year: 2015-now
description: A beautiful, simple, clean, and responsive Jekyll theme for academics.
- company: California Institute of Technology
position: Visiting Professor
location: Pasadena, California, US
start_date: 1933
end_date: 1933
highlights:
- Description 1.
- Description 2.
- title: Honors and Awards
type: time_table
contents:
- year: 1921
items:
- Nobel Prize in Physics
- Matteucci Medal
- year: 2029
items:
- Max Planck Medal
- company: Kaiser Wilhelm Institute for Physics
position: Director
location: Berlin, Germany
start_date: 1917
end_date: 1933
- title: Academic Interests
type: nested_list
contents:
- title: Topic 1.
items:
- Description 1.
- Description 2.
- title: Topic 2.
items:
- Description 1.
- Description 2.
- company: Karl-Ferdinand University
position: Professor of Theoretical Physics
location: Prague, Czechoslovakia
start_date: 1911
end_date: 1917
- title: Other Interests
type: list
contents:
- <u>Hobbies:</u> Hobby 1, Hobby 2, etc.
- company: University of Zurich
position: Associate Professor of Theoretical Physics
location: Zurich, Switzerland
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
---
{% unless site.data.resume %}
<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>
{% comment %}
Unified CV layout that handles both RenderCV (YAML) and JSONResume (JSON) formats
- If page.cv_format is set, it determines which format to render:
- 'rendercv': Load and render only RenderCV data (site.data.cv.cv)
- 'jsonresume': Load and render only JSONResume data (site.data.resume)
- If page.cv_format is not set, the legacy behavior applies:
- RenderCV data is in site.data.cv.cv
- JSONResume data is in site.data.resume
- RenderCV is prioritized if both exist
Both formats use the same unified rendering includes for consistent output
{% endcomment %}
<article>
<div class="cv">
{% for entry in site.data.cv %}
<a class="anchor" id="{{ entry.title }}"></a>
<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>
<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">
<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>
{% if entry.type == 'list' %}
{% include cv/list.liquid %}
{% elsif entry.type == 'map' %}
{% include cv/map.liquid %}
{% elsif entry.type == 'nested_list' %}
{% include cv/nested_list.liquid %}
{% elsif entry.type == 'time_table' %}
{% include cv/time_table.liquid %}
{% elsif entry.type == 'list_groups' %}
{% include cv/list_groups.liquid %}
{% assign entries = combined_experience %}
{% include cv/experience.liquid %}
</div>
</div>
{% endif %}
{% comment %} Now render all other sections except Experience and Volunteer {% endcomment %}
{% for section_pair in cv.sections %}
{% assign section_title = section_pair[0] %}
{% 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 %}
{{ 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 %}
</div>
</div>
{% 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>
<div class="cv">
{% for data in site.data.resume %}
{% if site.jsonresume and site.jsonresume.size > 0 %}
{% unless site.jsonresume contains data[0] %}
{% continue %}
{% endunless %}
{% endif %}
{% if data[0] == 'meta' or data[1].size == 0 %} {% continue %} {% endif %}
<a class="anchor" id="{{ data[0] }}"></a>
{% elsif render_jsonresume and site.data.resume %}
{% comment %} JSONResume format {% endcomment %}
<!-- Contact Information -->
{% if site.data.resume.basics %}
<div class="card mt-3 p-3">
<h3 class="card-title font-weight-medium">{{ data[0] | capitalize }}</h3>
<div>
{% case data[0] %}
{% when 'basics' %}
{% include resume/basics.liquid %}
{% when 'education' %}
{% include resume/education.liquid %}
{% when 'work' %}
{% include resume/work.liquid %}
{% when 'volunteer' %}
{% include resume/volunteer.liquid %}
{% when 'projects' %}
{% include resume/projects.liquid %}
{% when 'awards' %}
{% include resume/awards.liquid %}
{% when 'skills' %}
{% include resume/skills.liquid %}
{% when 'publications' %}
{% include resume/publications.liquid %}
{% when 'languages' %}
{% include resume/languages.liquid %}
{% when 'interests' %}
{% include resume/interests.liquid %}
{% when 'certificates' %}
{% include resume/certificates.liquid %}
{% when 'references' %}
{% include resume/references.liquid %}
{% else %}
<h3 class="card-title font-weight-medium">Contact Information</h3>
{% assign basics = site.data.resume.basics %}
<table class="table table-cv table-sm table-borderless">
{% if basics.name %}
<tr>
<td class="p-1 pr-2 font-weight-bold"><b>Name</b></td>
<td class="p-1 pl-2 font-weight-light">{{ basics.name }}</td>
</tr>
{% endif %}
{% if basics.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">{{ basics.label }}</td>
</tr>
{% endif %}
{% if basics.email %}
<tr>
<td class="p-1 pr-2 font-weight-bold"><b>Email</b></td>
<td class="p-1 pl-2 font-weight-light">{{ basics.email }}</td>
</tr>
{% endif %}
{% if basics.phone %}
<tr>
<td class="p-1 pr-2 font-weight-bold"><b>Phone</b></td>
<td class="p-1 pl-2 font-weight-light">{{ basics.phone }}</td>
</tr>
{% endif %}
{% 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>
{% endfor %}
</div>
</article>
</div>
{% endunless %}
{% endif %}
<!-- Education -->
{% if site.data.resume.education.size > 0 %}
<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
permalink: /cv/
title: cv
title: CV
nav: true
nav_order: 5
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.
toc:
sidebar: left

View File

@ -3,9 +3,8 @@
"name": "Albert Einstein",
"label": "Scientist",
"image": "",
"email": "albert@einstein.de",
"email": "einstein@example.com",
"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",
"location": {
"address": "2712 Broadway St",
@ -14,23 +13,53 @@
"countryCode": "US",
"region": "California"
},
"profiles": [
{
"network": "Twitter",
"username": "AlbertEinstein",
"url": "https://twitter.com/AlbertEinstein"
}
]
"profiles": []
},
"work": [
{
"name": "Institute for Advanced Study, Princeton University",
"position": "Professor of Theoretical Physics",
"url": "https://example.com",
"location": "Princeton University, NJ",
"startDate": "1933-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.",
"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": [
@ -38,7 +67,6 @@
"organization": "People's Climate March",
"location": "Zurich, Switzerland",
"position": "Lead Organizer",
"url": "https://example.com",
"startDate": "2014-04-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.",
@ -47,15 +75,27 @@
],
"education": [
{
"institution": "University of Zurich, Zurich, Switzerland",
"institution": "University of Zurich",
"location": "Zurich, Switzerland",
"url": "https://www.uzh.ch/",
"area": "Software Development",
"area": "Physics",
"studyType": "PhD",
"startDate": "1905-01-01",
"startDate": "1900-01-01",
"endDate": "1905-01-01",
"score": "10",
"courses": ["Theory of Relativity"]
"score": "",
"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": [
@ -65,6 +105,12 @@
"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",
"date": "2029-01-01",
"awarder": "German Physical Society",
"summary": ""
}
],
"certificates": [
@ -72,48 +118,24 @@
"name": "Machine Learning",
"date": "2018-01-01",
"issuer": "Stanford University",
"url": "https://example.com",
"icon": "fa-solid fa-location-dot"
},
{
"name": "Quantum Computing",
"date": "2018-01-01",
"issuer": "Stanford University",
"url": "https://example.com",
"icon": "fa-solid fa-tag"
},
{
"name": "Quantum Information",
"date": "2018-01-01",
"issuer": "Stanford University",
"url": "https://example.com",
"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": [
{
"name": "Zur Elektrody/namik bewegter Körper",
"name": "Zur Elektrodynamik bewegter Körper",
"publisher": "Annalen der Physik",
"releaseDate": "1905-06-30",
"url": "https://en.wikisource.org/wiki/Translation:On_the_Electrodynamics_of_Moving_Bodies",
@ -179,12 +201,12 @@
{
"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. 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",
"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": [
@ -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.",
"highlights": ["Quantum Teleportation", "Quantum Cryptography"],
"startDate": "2018-01-01",
"endDate": "2018-01-01",
"url": "https://example.com"
"endDate": "2018-01-01"
}
]
}

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
pyyaml
rendercv[full]
scholarly