From 55a2685683424a27b35a22c9da7057819f0d34df Mon Sep 17 00:00:00 2001 From: George <31376482+george-gca@users.noreply.github.com> Date: Fri, 23 Jan 2026 12:36:14 -0300 Subject: [PATCH] Unify jsonresume and RenderCV CVs solutions (#3462) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/agents/customize.agent.md | 55 +-- .github/agents/docs.agent.md | 18 +- .github/workflows/render-cv.yml | 65 ++++ .gitignore | 15 +- CUSTOMIZE.md | 63 +++- _data/cv.yml | 268 ++++++++++----- _includes/cv/awards.liquid | 66 ++++ _includes/cv/certificates.liquid | 28 ++ _includes/cv/education.liquid | 93 ++++++ _includes/cv/experience.liquid | 91 +++++ _includes/cv/interests.liquid | 29 ++ _includes/cv/languages.liquid | 28 ++ _includes/cv/list.liquid | 5 - _includes/cv/list_groups.liquid | 51 --- _includes/cv/map.liquid | 29 -- _includes/cv/nested_list.liquid | 16 - _includes/cv/projects.liquid | 31 ++ _includes/cv/publications.liquid | 70 ++++ _includes/cv/references.liquid | 15 + _includes/cv/skills.liquid | 32 ++ _includes/cv/time_table.liquid | 118 ------- _includes/resume/awards.liquid | 19 -- _includes/resume/basics.liquid | 28 -- _includes/resume/certificates.liquid | 35 -- _includes/resume/education.liquid | 54 --- _includes/resume/interests.liquid | 34 -- _includes/resume/languages.liquid | 31 -- _includes/resume/projects.liquid | 32 -- _includes/resume/publications.liquid | 28 -- _includes/resume/references.liquid | 31 -- _includes/resume/skills.liquid | 33 -- _includes/resume/volunteer.liquid | 52 --- _includes/resume/work.liquid | 52 --- _layouts/cv.liquid | 481 ++++++++++++++++++++------- _pages/cv.md | 3 +- assets/json/resume.json | 115 ++++--- assets/rendercv/design.yaml | 131 ++++++++ assets/rendercv/locale.yaml | 34 ++ assets/rendercv/settings.yaml | 14 + requirements.txt | 1 + 40 files changed, 1459 insertions(+), 935 deletions(-) create mode 100644 .github/workflows/render-cv.yml create mode 100644 _includes/cv/awards.liquid create mode 100644 _includes/cv/certificates.liquid create mode 100644 _includes/cv/education.liquid create mode 100644 _includes/cv/experience.liquid create mode 100644 _includes/cv/interests.liquid create mode 100644 _includes/cv/languages.liquid delete mode 100644 _includes/cv/list.liquid delete mode 100644 _includes/cv/list_groups.liquid delete mode 100644 _includes/cv/map.liquid delete mode 100644 _includes/cv/nested_list.liquid create mode 100644 _includes/cv/projects.liquid create mode 100644 _includes/cv/publications.liquid create mode 100644 _includes/cv/references.liquid create mode 100644 _includes/cv/skills.liquid delete mode 100644 _includes/cv/time_table.liquid delete mode 100644 _includes/resume/awards.liquid delete mode 100644 _includes/resume/basics.liquid delete mode 100644 _includes/resume/certificates.liquid delete mode 100644 _includes/resume/education.liquid delete mode 100644 _includes/resume/interests.liquid delete mode 100644 _includes/resume/languages.liquid delete mode 100644 _includes/resume/projects.liquid delete mode 100644 _includes/resume/publications.liquid delete mode 100644 _includes/resume/references.liquid delete mode 100644 _includes/resume/skills.liquid delete mode 100644 _includes/resume/volunteer.liquid delete mode 100644 _includes/resume/work.liquid create mode 100644 assets/rendercv/design.yaml create mode 100644 assets/rendercv/locale.yaml create mode 100644 assets/rendercv/settings.yaml diff --git a/.github/agents/customize.agent.md b/.github/agents/customize.agent.md index 8703284..c6df8ad 100644 --- a/.github/agents/customize.agent.md +++ b/.github/agents/customize.agent.md @@ -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 diff --git a/.github/agents/docs.agent.md b/.github/agents/docs.agent.md index 60a4a49..8148ffe 100644 --- a/.github/agents/docs.agent.md +++ b/.github/agents/docs.agent.md @@ -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 diff --git a/.github/workflows/render-cv.yml b/.github/workflows/render-cv.yml new file mode 100644 index 0000000..766d799 --- /dev/null +++ b/.github/workflows/render-cv.yml @@ -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 diff --git a/.gitignore b/.gitignore index 7f75be7..1fee89b 100644 --- a/.gitignore +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/CUSTOMIZE.md b/CUSTOMIZE.md index 55526e8..08dbaa6 100644 --- a/CUSTOMIZE.md +++ b/CUSTOMIZE.md @@ -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 diff --git a/_data/cv.yml b/_data/cv.yml index 5885b30..080b9df 100644 --- a/_data/cv.yml +++ b/_data/cv.yml @@ -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: al-folio - 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: - - Hobbies: 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 Michelson–Morley 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 (1909–1911) and Prague (1911–1912), before he returned to ETH Zurich (1912–1914). + + 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. diff --git a/_includes/cv/awards.liquid b/_includes/cv/awards.liquid new file mode 100644 index 0000000..a57cac5 --- /dev/null +++ b/_includes/cv/awards.liquid @@ -0,0 +1,66 @@ +{% comment %} + Unified awards entry renderer for both formats +{% endcomment %} + + diff --git a/_includes/cv/certificates.liquid b/_includes/cv/certificates.liquid new file mode 100644 index 0000000..05613eb --- /dev/null +++ b/_includes/cv/certificates.liquid @@ -0,0 +1,28 @@ +{% comment %} + Unified certificates entry renderer for both formats +{% endcomment %} + + diff --git a/_includes/cv/education.liquid b/_includes/cv/education.liquid new file mode 100644 index 0000000..773e74f --- /dev/null +++ b/_includes/cv/education.liquid @@ -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 %} + + diff --git a/_includes/cv/experience.liquid b/_includes/cv/experience.liquid new file mode 100644 index 0000000..515a39b --- /dev/null +++ b/_includes/cv/experience.liquid @@ -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 %} + + diff --git a/_includes/cv/interests.liquid b/_includes/cv/interests.liquid new file mode 100644 index 0000000..f4997a7 --- /dev/null +++ b/_includes/cv/interests.liquid @@ -0,0 +1,29 @@ +{% comment %} + Unified interests entry renderer for both formats +{% endcomment %} + +
+ {% for entry in entries %} +
+ {% if entry.icon %} + + {% endif %} + {{ entry.name }}: + {% if entry.keywords %} + {% for keyword in entry.keywords %} + {% if forloop.last %} + {{ keyword }} + {% else %} + {{ keyword }}, + {% endif %} + {% endfor %} + {% endif %} +
+ {% endfor %} +
+ + diff --git a/_includes/cv/languages.liquid b/_includes/cv/languages.liquid new file mode 100644 index 0000000..5f58dd1 --- /dev/null +++ b/_includes/cv/languages.liquid @@ -0,0 +1,28 @@ +{% comment %} + Unified languages entry renderer for both formats + - RenderCV uses: name, summary + - JSONResume uses: language, fluency +{% endcomment %} + +
+ {% for entry in entries %} +
+ {% if entry.icon %} + + {% 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 %} + {{ lang_name }}: {{ fluency }} +
+ {% endfor %} +
+ + diff --git a/_includes/cv/list.liquid b/_includes/cv/list.liquid deleted file mode 100644 index 1cc2598..0000000 --- a/_includes/cv/list.liquid +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/_includes/cv/list_groups.liquid b/_includes/cv/list_groups.liquid deleted file mode 100644 index 1ca90e4..0000000 --- a/_includes/cv/list_groups.liquid +++ /dev/null @@ -1,51 +0,0 @@ -
- {% for content in entry.contents %} -
- - - - {% if content.icon %} - - {% else %} - - {% endif %} - - {% assign i = 1 %} - {% for item in content.items %} - {% assign i = i | plus: 1 %} - {% endfor %} - - - {% for item in content.items %} - - - - {% if item.level %} - - {% endif %} - {% if item.school %} - - {% else %} - - {% endif %} - {% if item.link %} - - {% endif %} - - {% endfor %} - -
{{ content.category }}
- {{ item.name }} - {{ item.level }}{{ item.school }} - {% endif %} - {% if item.time %} -
- {{ item.time }} -
-
- {% endfor %} -
diff --git a/_includes/cv/map.liquid b/_includes/cv/map.liquid deleted file mode 100644 index aee3419..0000000 --- a/_includes/cv/map.liquid +++ /dev/null @@ -1,29 +0,0 @@ - - {% for content in entry.contents %} - - - {% if content.value %} - - {% endif %} - {% if content.links %} - - {% endif %} - - {% endfor %} -
- {{ content.name }} - {{ content.value }} -
- {% for item in content.links %} - {% if item.link %} - - {% endif %} - {% endfor %} -
-
diff --git a/_includes/cv/nested_list.liquid b/_includes/cv/nested_list.liquid deleted file mode 100644 index 72200de..0000000 --- a/_includes/cv/nested_list.liquid +++ /dev/null @@ -1,16 +0,0 @@ - diff --git a/_includes/cv/projects.liquid b/_includes/cv/projects.liquid new file mode 100644 index 0000000..7f5dc86 --- /dev/null +++ b/_includes/cv/projects.liquid @@ -0,0 +1,31 @@ +{% comment %} + Unified projects entry renderer for both formats +{% endcomment %} + + diff --git a/_includes/cv/publications.liquid b/_includes/cv/publications.liquid new file mode 100644 index 0000000..22f530a --- /dev/null +++ b/_includes/cv/publications.liquid @@ -0,0 +1,70 @@ +{% comment %} + Unified publications entry renderer for both formats +{% endcomment %} + + diff --git a/_includes/cv/references.liquid b/_includes/cv/references.liquid new file mode 100644 index 0000000..8fc9456 --- /dev/null +++ b/_includes/cv/references.liquid @@ -0,0 +1,15 @@ +{% comment %} + Unified references entry renderer for both formats +{% endcomment %} + + diff --git a/_includes/cv/skills.liquid b/_includes/cv/skills.liquid new file mode 100644 index 0000000..a35e49b --- /dev/null +++ b/_includes/cv/skills.liquid @@ -0,0 +1,32 @@ +{% comment %} + Unified skills entry renderer for both formats +{% endcomment %} + +
+ {% for entry in entries %} +
+ {% if entry.icon %} + + {% endif %} + + {{- entry.name -}} + {%- if entry.level %} ({{ entry.level }}){% endif %}: + {% if entry.keywords %} + {% for keyword in entry.keywords %} + {% if forloop.last %} + {{ keyword }} + {% else %} + {{ keyword }}, + {% endif %} + {% endfor %} + {% endif %} +
+ {% endfor %} +
+ + diff --git a/_includes/cv/time_table.liquid b/_includes/cv/time_table.liquid deleted file mode 100644 index 11962df..0000000 --- a/_includes/cv/time_table.liquid +++ /dev/null @@ -1,118 +0,0 @@ - diff --git a/_includes/resume/awards.liquid b/_includes/resume/awards.liquid deleted file mode 100644 index 0540024..0000000 --- a/_includes/resume/awards.liquid +++ /dev/null @@ -1,19 +0,0 @@ - diff --git a/_includes/resume/basics.liquid b/_includes/resume/basics.liquid deleted file mode 100644 index 3f8d5bf..0000000 --- a/_includes/resume/basics.liquid +++ /dev/null @@ -1,28 +0,0 @@ - - {% assign skip_basics = 'image,profiles,location' | split: ',' %} - {% for content in data[1] %} - {% - if (content[1] == "") or (skip_basics contains - content[0]) - %} - {% continue %} - {% endif %} - - - - - - {% endfor %} -
- {{ content[0] | capitalize }} - - {% if content[0] == 'url' %} - {{ content[1] }} - {% elsif content[0] == 'email' %} - {{ content[1] }} - {% elsif content[0] == 'phone' %} - {{ content[1] }} - {% else %} - {{ content[1] }} - {% endif %} -
diff --git a/_includes/resume/certificates.liquid b/_includes/resume/certificates.liquid deleted file mode 100644 index 70ec00a..0000000 --- a/_includes/resume/certificates.liquid +++ /dev/null @@ -1,35 +0,0 @@ -
- {% assign certificates = data[1] | sort: 'date' | reverse %} - {% for content in certificates %} -
- - - - {% if content.icon %} - - {% else %} - - {% endif %} - - {% assign i = 1 %} - {% for item in content.items %} - {% assign i = i | plus: 1 %} - {% endfor %} - - - - - - - - -
- - - {{ content.name }} -
- {{ content.issuer }} - {{ content.date }}
-
- {% endfor %} -
diff --git a/_includes/resume/education.liquid b/_includes/resume/education.liquid deleted file mode 100644 index 8d0a74d..0000000 --- a/_includes/resume/education.liquid +++ /dev/null @@ -1,54 +0,0 @@ - diff --git a/_includes/resume/interests.liquid b/_includes/resume/interests.liquid deleted file mode 100644 index c5783c6..0000000 --- a/_includes/resume/interests.liquid +++ /dev/null @@ -1,34 +0,0 @@ -
- {% for content in data[1] %} -
- - - - {% if content.icon %} - - {% else %} - - {% endif %} - - {% assign i = 1 %} - {% for item in content.keywords %} - {% assign i = i | plus: 1 %} - {% endfor %} - - - - {% for item in content.keywords %} - - - - - {% endfor %} - -
- - {{ content.name }}
- {{ item }} -
-
- {% endfor %} -
diff --git a/_includes/resume/languages.liquid b/_includes/resume/languages.liquid deleted file mode 100644 index 36d7875..0000000 --- a/_includes/resume/languages.liquid +++ /dev/null @@ -1,31 +0,0 @@ -
- {% for content in data[1] %} -
- - - - {% if content.icon %} - - {% else %} - - {% endif %} - - {% assign i = 1 %} - {% for item in content.items %} - {% assign i = i | plus: 1 %} - {% endfor %} - - - - - - - -
- - {{ content.language }}
- {{ content.fluency }} -
-
- {% endfor %} -
diff --git a/_includes/resume/projects.liquid b/_includes/resume/projects.liquid deleted file mode 100644 index e7d94f2..0000000 --- a/_includes/resume/projects.liquid +++ /dev/null @@ -1,32 +0,0 @@ - diff --git a/_includes/resume/publications.liquid b/_includes/resume/publications.liquid deleted file mode 100644 index 206c45d..0000000 --- a/_includes/resume/publications.liquid +++ /dev/null @@ -1,28 +0,0 @@ - diff --git a/_includes/resume/references.liquid b/_includes/resume/references.liquid deleted file mode 100644 index 2236568..0000000 --- a/_includes/resume/references.liquid +++ /dev/null @@ -1,31 +0,0 @@ -
- {% for content in data[1] %} -
- - - - {% if content.icon %} - - {% else %} - - {% endif %} - - {% assign i = 1 %} - {% for item in content.items %} - {% assign i = i | plus: 1 %} - {% endfor %} - - - - - - - -
- - {{ content.name }}
- {{ content.reference }} -
-
- {% endfor %} -
diff --git a/_includes/resume/skills.liquid b/_includes/resume/skills.liquid deleted file mode 100644 index 672fd05..0000000 --- a/_includes/resume/skills.liquid +++ /dev/null @@ -1,33 +0,0 @@ -
- {% for content in data[1] %} -
- - - - {% if content.icon %} - - {% else %} - - {% endif %} - - {% assign i = 1 %} - {% for item in content.items %} - {% assign i = i | plus: 1 %} - {% endfor %} - - - {% for item in content.keywords %} - - - - - {% endfor %} - -
- - {{ content.name }}
- {{ item }} -
-
- {% endfor %} -
diff --git a/_includes/resume/volunteer.liquid b/_includes/resume/volunteer.liquid deleted file mode 100644 index 2acd1ad..0000000 --- a/_includes/resume/volunteer.liquid +++ /dev/null @@ -1,52 +0,0 @@ - diff --git a/_includes/resume/work.liquid b/_includes/resume/work.liquid deleted file mode 100644 index 82f677a..0000000 --- a/_includes/resume/work.liquid +++ /dev/null @@ -1,52 +0,0 @@ - diff --git a/_layouts/cv.liquid b/_layouts/cv.liquid index 7ab4686..e60d3e9 100644 --- a/_layouts/cv.liquid +++ b/_layouts/cv.liquid @@ -1,127 +1,386 @@ --- layout: default --- -{% unless site.data.resume %} -
-
-

- {{ page.title }} - {% if page.cv_pdf %} - - - - {% endif %} -

- {% if page.description %} -

{{ page.description }}

- {% endif %} -
+{% 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 %} -
-
- {% for entry in site.data.cv %} - +
+
+

+ {{ page.title }} + {% if page.cv_pdf %} + + + + {% endif %} +

+ {% if page.description %} +

{{ page.description }}

+ {% endif %} +
+ +
+
+ {% 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 %} + + + {% if cv.name or cv.label or cv.location or cv.email or cv.phone or cv.website %}
-

{{ entry.title }}

+

Contact Information

+ + {% if cv.name %} + + + + + {% endif %} + {% if cv.label %} + + + + + {% endif %} + {% if cv.email %} + + + + + {% endif %} + {% if cv.phone %} + + + + + {% endif %} + {% if cv.address %} + + + + + {% endif %} + {% if cv.website %} + + + + + {% endif %} +
Name{{ cv.name }}
Professional Title{{ cv.label }}
Email{{ cv.email }}
Phone{{ cv.phone }}
Location + {% 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 %} +
Website + {{ cv.website }} +
+
+ {% endif %} + + + {% if cv.summary %} +
+

Professional Summary

+

{{ cv.summary | markdownify | remove: '

' | remove: '

' }}

+
+ {% endif %} + + + {% comment %} First, combine Experience and Volunteer entries {% endcomment %} + {% assign combined_experience = cv.sections.Experience | concat: cv.sections.Volunteer %} + {% if combined_experience.size > 0 %} + +
+

Experience

- {% 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 %} +
+
+ {% 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 %} + + +
+

{{ section_title }}

+
+ {% 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 }} + + {% for entry in section_entries %} + {% if entry.bullet %} +
    +
  • {{ entry.bullet | markdownify | remove: '

    ' | remove: '

    ' }}
  • +
+ {% elsif entry.label %} +
+ {{ entry.label }}: {{ entry.details }} +
+ {% endif %} + {% endfor %} {% endif %}
{% endfor %} -
-
-
-{% else %} -
-
-

- {{ page.title }} - {% if page.cv_pdf %} - - - - {% endif %} -

- {% if page.description %} -

{{ page.description }}

- {% endif %} -
-
-
- {% 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 %} - + {% elsif render_jsonresume and site.data.resume %} + {% comment %} JSONResume format {% endcomment %} + + + {% if site.data.resume.basics %}
-

{{ data[0] | capitalize }}

-
- {% 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 %} +

Contact Information

+ {% assign basics = site.data.resume.basics %} + + {% if basics.name %} + + + + + {% endif %} + {% if basics.label %} + + + + + {% endif %} + {% if basics.email %} + + + + + {% endif %} + {% if basics.phone %} + + + + + {% endif %} + {% if basics.location %} + + + + + {% endif %} + {% if basics.url %} + + + + + {% endif %} +
Name{{ basics.name }}
Professional Title{{ basics.label }}
Email{{ basics.email }}
Phone{{ basics.phone }}
Location + {% 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 %} +
Website + {{ basics.url }} +
+
+ {% endif %} - {% endcase %} + + {% if site.data.resume.basics.summary %} +
+

Professional Summary

+

{{ site.data.resume.basics.summary | markdownify | remove: '

' | remove: '

' }}

+
+ {% endif %} + + + {% assign combined_experience = site.data.resume.work | concat: site.data.resume.volunteer %} + {% if combined_experience.size > 0 %} + +
+

Experience

+
+ {% assign entries = combined_experience %} + {% include cv/experience.liquid %}
- {% endfor %} -
-
-
-{% endunless %} + {% endif %} + + + {% if site.data.resume.education.size > 0 %} + +
+

Education

+
+ {% assign entries = site.data.resume.education %} + {% include cv/education.liquid %} +
+
+ {% endif %} + + + {% if site.data.resume.awards.size > 0 %} + +
+

Awards

+
+ {% assign entries = site.data.resume.awards %} + {% include cv/awards.liquid %} +
+
+ {% endif %} + + + {% if site.data.resume.publications.size > 0 %} + +
+

Publications

+
+ {% assign entries = site.data.resume.publications %} + {% include cv/publications.liquid %} +
+
+ {% endif %} + + + {% if site.data.resume.skills.size > 0 %} + +
+

Skills

+
+ {% assign entries = site.data.resume.skills %} + {% include cv/skills.liquid %} +
+
+ {% endif %} + + + {% if site.data.resume.languages.size > 0 %} + +
+

Languages

+
+ {% assign entries = site.data.resume.languages %} + {% include cv/languages.liquid %} +
+
+ {% endif %} + + + {% if site.data.resume.interests.size > 0 %} + +
+

Interests

+
+ {% assign entries = site.data.resume.interests %} + {% include cv/interests.liquid %} +
+
+ {% endif %} + + + {% if site.data.resume.certificates.size > 0 %} + +
+

Certificates

+
+ {% assign entries = site.data.resume.certificates %} + {% include cv/certificates.liquid %} +
+
+ {% endif %} + + + {% if site.data.resume.projects.size > 0 %} + +
+

Projects

+
+ {% assign entries = site.data.resume.projects %} + {% include cv/projects.liquid %} +
+
+ {% endif %} + + + {% if site.data.resume.references.size > 0 %} + +
+

References

+
+ {% assign entries = site.data.resume.references %} + {% include cv/references.liquid %} +
+
+ {% endif %} + + {% else %} +

No CV data found. Please configure either RenderCV (cv.yml) or JSONResume (resume.json) data.

+ {% endif %} +
+
+
diff --git a/_pages/cv.md b/_pages/cv.md index b0b112b..a197a36 100644 --- a/_pages/cv.md +++ b/_pages/cv.md @@ -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 diff --git a/assets/json/resume.json b/assets/json/resume.json index 5ab5eca..d974bb6 100644 --- a/assets/json/resume.json +++ b/assets/json/resume.json @@ -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" } ] } diff --git a/assets/rendercv/design.yaml b/assets/rendercv/design.yaml new file mode 100644 index 0000000..ca2162a --- /dev/null +++ b/assets/rendercv/design.yaml @@ -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 diff --git a/assets/rendercv/locale.yaml b/assets/rendercv/locale.yaml new file mode 100644 index 0000000..bf1f395 --- /dev/null +++ b/assets/rendercv/locale.yaml @@ -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 diff --git a/assets/rendercv/settings.yaml b/assets/rendercv/settings.yaml new file mode 100644 index 0000000..3b0fc30 --- /dev/null +++ b/assets/rendercv/settings.yaml @@ -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: [] diff --git a/requirements.txt b/requirements.txt index 78b0dcf..1e9a533 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ nbconvert pyyaml +rendercv[full] scholarly