Bauke/cv
Bauke
/
cv
1
Fork 0

Compare commits

...

4 Commits

5 changed files with 78 additions and 7 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
.vscode/
build/
data/
cv.typ

View File

@ -23,12 +23,7 @@ args = ["trash", "build"]
[tasks.compile]
clear = true
dependencies = ["ensure-build-dir"]
command = "typst"
args = [
"compile",
"cv-${CV_LANG}.typ",
"build/CV-Bauke-${CV_LANG}.pdf"
]
script = "./compile-cv.zsh"
# Ensure that the build directory exists.
[tasks.ensure-build-dir]
@ -41,4 +36,4 @@ args = ["-p", "build"]
[tasks.watch]
clear = true
command = "watchexec"
args = ["-e", "toml,typ", "--no-vcs-ignore", "makers build"]
args = ["-e", "toml,typ", "-i", "cv.typ", "--no-vcs-ignore", "makers build"]

20
compile-cv.zsh Executable file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env zsh
# There's currently no way in Typst to provide values from the CLI in some way
# so until the next version lands and https://github.com/typst/typst/pull/2894
# becomes available, a script that renders a template has to be it for now.
# Define options based on environment variables or use default values.
include_links=${CV_INCLUDE_LINKS:-"true"}
language=${CV_LANG:-"en"}
typst_template="#import \"main.typ\": cv
#cv(
include_links: $include_links,
language: \"$language\",
)"
echo $typst_template > cv.typ
typst compile cv.typ "build/CV-Bauke-$CV_LANG.pdf"

View File

@ -0,0 +1,7 @@
#import "../utilities/localize.typ": localize
#let experience_section(data, language) = [
== #localize(data, "experience", language)
#eval(localize(data, "experience_body", language))
]

View File

@ -0,0 +1,48 @@
#import "../utilities/icon-with-text.typ": icon_with_text
#import "../utilities/localize.typ": localize
#let personal_project(data, language) = {
let icon_size = 1.4em
let personal_project_name = localize(data, "name", language)
let personal_project_heading = heading(level: 3, link(data.link, personal_project_name));
let personal_project_header = if "header_image" in data {
icon_with_text(
clip_icon: true,
icon: "../" + data.header_image,
icon_alt_text: personal_project_name,
icon_size: icon_size,
personal_project_heading,
)
} else {
personal_project_heading
}
// Use a grid to space out the header and the body.
grid(
gutter: 0.5em,
// Set the height explicitly so the ones with icons don't look different
// from the ones without.
box(
height: icon_size,
// Use another grid to position the title and date.
grid(
columns: (1fr, auto),
personal_project_header,
align(horizon, text(size: 0.9em, localize(data, "date", language))),
),
),
// The body can contain Typst code so we use `eval()` to render it.
eval(localize(data, "body", language)),
)
}
#let personal_projects_section(data, language) = [
== #localize(data.locale, "personal_projects", language)
#for data in data.personal_projects {
personal_project(data, language)
}
]