141 lines
2.9 KiB
Typst
141 lines
2.9 KiB
Typst
#import "localize.typ": localize
|
|
|
|
#let languages = ("fr", "en")
|
|
|
|
#set page(
|
|
paper: "a4",
|
|
columns: 2,
|
|
margin: 10mm,
|
|
)
|
|
|
|
#languages.map(language => [
|
|
|
|
#set text(lang: language)
|
|
#let accent-color = rgb(0x06, 0x92, 0xaa, 255)
|
|
|
|
#let load-section(path) = localize(language, yaml(path))
|
|
|
|
#let education = load-section("_data/sections/education.yml")
|
|
#let experiences = load-section("_data/sections/experiences.yml")
|
|
#let hobbies = load-section("_data/sections/hobbies.yml")
|
|
#let languages = load-section("_data/sections/languages.yml")
|
|
#let skills = load-section("_data/sections/skills.yml")
|
|
#let introduction = load-section("_data/introduction.yml")
|
|
|
|
#let data = yaml("data.yml")
|
|
#let words = localize(language, yaml("_data/words.yml"))
|
|
|
|
#let tr(key) = key.split(".").fold(words, (d, k) => d.at(k)).at(language)
|
|
|
|
#let date-range(date) = [ #date.begin --- #date.end ]
|
|
|
|
#let dotted-line = line(length: 100%, stroke: (paint: black, thickness: 1pt, dash: "loosely-dotted"))
|
|
|
|
#set text(font: "Atkinson Hyperlegible Next", size: 10pt)
|
|
|
|
#show heading.where(level: 1): it => block(width: 100%, text(32pt, it.body))
|
|
|
|
#show heading.where(level: 2): it => text(
|
|
14pt,
|
|
fill: accent-color,
|
|
it.body,
|
|
)
|
|
#show heading.where(level: 3): it => text(
|
|
12pt,
|
|
it.body,
|
|
)
|
|
|
|
#let contact-section = [
|
|
== Contact \
|
|
1 Rue Auguste Renoir \
|
|
38400 Saint-Martin-d'Hères \
|
|
(+33) 06 58 92 15 86 \
|
|
#for email in data.emails [
|
|
#link("mailto:" + email) \
|
|
]
|
|
#link("https://rpqt.fr")
|
|
]
|
|
|
|
#place(
|
|
top + left,
|
|
float: true,
|
|
scope: "parent",
|
|
grid(
|
|
columns: (1.3fr, 5fr, 3fr),
|
|
align(horizon, image("profile-circle.png", width: 100%)),
|
|
align(center + horizon, [
|
|
= Romain Paquet
|
|
]),
|
|
align(
|
|
right,
|
|
contact-section,
|
|
)
|
|
)
|
|
)
|
|
|
|
#place(
|
|
top + left,
|
|
float: true,
|
|
scope: "parent",
|
|
[
|
|
#line(length: 100%)
|
|
#introduction
|
|
#line(length: 100%)
|
|
]
|
|
)
|
|
|
|
== #experiences.title
|
|
|
|
#experiences.items.map(experience => [
|
|
=== #experience.organisation.name --- _#(experience.position)_ \
|
|
#date-range(experience.date), #experience.city
|
|
|
|
*#words.context*: #eval(experience.description.context, mode: "markup")
|
|
|
|
*#words.tasks*:
|
|
#experience.description.tasks.map(t => [ - #t ]).join()
|
|
|
|
*#words.themes*: #experience.themes.join(", ")
|
|
|
|
*#words.stack*: #experience.stack.join(", ")
|
|
|
|
]).join(dotted-line);
|
|
|
|
== #skills.title
|
|
|
|
#eval(skills.content, mode: "markup")
|
|
|
|
#colbreak()
|
|
|
|
== #education.title
|
|
|
|
#education.items.map(ed => [
|
|
|
|
=== #ed.school \
|
|
#date-range(ed.date)
|
|
|
|
#eval(ed.description, mode: "markup")
|
|
]).join(dotted-line)
|
|
|
|
== #languages.title
|
|
|
|
#languages.items.filter(
|
|
lang => not lang.keys().contains("_needed")
|
|
).map(lang => [
|
|
#lang.flag #lang.name #if lang.keys().contains("level") [ (#lang.level) ]
|
|
]).join([ --- ])
|
|
|
|
== #hobbies.title
|
|
|
|
#for hobby in hobbies.items [
|
|
#if hobby.keys().contains("items") [
|
|
*#hobby.name*
|
|
#hobby.items.map(i => [ - #i]).join()
|
|
] else [
|
|
*#hobby.name* -- #hobby.at("content")
|
|
]
|
|
|
|
]
|
|
|
|
]).join()
|