diff --git a/cv/cv.typ b/cv/cv.typ index 6c39a1e..5e99202 100644 --- a/cv/cv.typ +++ b/cv/cv.typ @@ -31,7 +31,6 @@ #if (uservars.at("headingsmallcaps", default:false)) { smallcaps(it.body) } else { - // upper(it.body) it.body } #v(-0.75em) #line(length: 100%, stroke: 1pt + black) // draw a line @@ -109,15 +108,17 @@ ] } -#let cvwork(info, isbreakable: true) = { +#let cvwork(lang, info, isbreakable: true) = { if info.experience != none {block[ - == Work Experience - #for w in info.experience { + == #utils.getWithLang(lang, info.experience.title) + #for w in info.experience.content { + let wwith = utils.getWithLang(lang, w.with) + let wwhere = utils.getWithLang(lang, w.where) block(width: 100%, breakable: isbreakable)[ #if w.url != none [ - *#link(w.url)[#w.with]* #h(1fr) *#w.where* \ + *#link(utils.getWithLang(lang, w.url))[#wwith]* #h(1fr) *#wwhere* \ ] else [ - *#w.with* #h(1fr) *#w.where* \ + *#wwith* #h(1fr) *#wwhere* \ ] ] // create a block layout for each work entry @@ -126,14 +127,14 @@ if index != 0 {v(0.6em)} block(width: 100%, breakable: isbreakable, above: 0.6em)[ // parse ISO date strings into datetime objects - #let start = utils.strpdate(p.startDate) - #let end = utils.strpdate(p.endDate) + #let start = utils.strpdate(lang, p.startDate) + #let end = utils.strpdate(lang, p.endDate) // line 2: position and date range - #text(style: "italic")[#p.what] #h(1fr) + #text(style: "italic")[#utils.getWithLang(lang, p.what)] #h(1fr) #start #sym.dash.en #end \ // highlights or description - #for hi in p.why [ - - #eval(hi, mode: "markup") + #for hi in utils.getWithLang(lang, p.why) [ + - #eval(utils.getWithLang(lang, hi), mode: "markup") ] ] index = index + 1 @@ -142,12 +143,12 @@ ]} } -#let cveducation(info, isbreakable: true) = { +#let cveducation(lang, info, isbreakable: true) = { if info.education != none {block[ == Education #for edu in info.education { - let start = utils.strpdate(edu.startDate) - let end = utils.strpdate(edu.endDate) + let start = utils.strpdate(lang, edu.startDate) + let end = utils.strpdate(lang, edu.endDate) let edu-items = "" if edu.honors != none {edu-items = edu-items + "- *Honors*: " + edu.honors.join(", ") + "\n"} @@ -176,13 +177,13 @@ ]} } -#let cvaffiliations(info, isbreakable: true) = { +#let cvaffiliations(lang, info, isbreakable: true) = { if info.affiliations != none {block[ == Leadership & Activities #for org in info.affiliations { // parse ISO date strings into datetime objects - let start = utils.strpdate(org.startDate) - let end = utils.strpdate(org.endDate) + let start = utils.strpdate(lang, org.startDate) + let end = utils.strpdate(lang, org.endDate) // create a block layout for each affiliation entry block(width: 100%, breakable: isbreakable)[ @@ -206,13 +207,13 @@ ]} } -#let cvprojects(info, isbreakable: true) = { +#let cvprojects(lang, info, isbreakable: true) = { if info.projects != none {block[ == Projects #for project in info.projects { // parse ISO date strings into datetime objects - let start = utils.strpdate(project.startDate) - let end = utils.strpdate(project.endDate) + let start = utils.strpdate(lang, project.startDate) + let end = utils.strpdate(lang, project.endDate) // create a block layout for each project entry block(width: 100%, breakable: isbreakable)[ // line 1: project name @@ -232,12 +233,12 @@ ]} } -#let cvawards(info, isbreakable: true) = { +#let cvawards(lang, info, isbreakable: true) = { if info.awards != none {block[ == Honors & Awards #for award in info.awards { // parse ISO date strings into datetime objects - let date = utils.strpdate(award.date) + let date = utils.strpdate(lang, award.date) // create a block layout for each award entry block(width: 100%, breakable: isbreakable)[ // line 1: award title and location @@ -259,13 +260,13 @@ ]} } -#let cvcertificates(info, isbreakable: true) = { +#let cvcertificates(lang, info, isbreakable: true) = { if info.certificates != none {block[ == Licenses & Certifications #for cert in info.certificates { // parse ISO date strings into datetime objects - let date = utils.strpdate(cert.date) + let date = utils.strpdate(lang, cert.date) // create a block layout for each certificate entry block(width: 100%, breakable: isbreakable)[ // line 1: certificate name @@ -281,12 +282,12 @@ ]} } -#let cvpublications(info, isbreakable: true) = { +#let cvpublications(lang, info, isbreakable: true) = { if info.publications != none {block[ == Research & Publications #for pub in info.publications { // parse ISO date strings into datetime objects - let date = utils.strpdate(pub.releaseDate) + let date = utils.strpdate(lang, pub.releaseDate) // create a block layout for each publication entry block(width: 100%, breakable: isbreakable)[ // line 1: publication title diff --git a/cv/utils.typ b/cv/utils.typ index 8abc926..28e39f3 100644 --- a/cv/utils.typ +++ b/cv/utils.typ @@ -1,42 +1,42 @@ +#let months = yaml("../data/months.yaml") + + +#let getWithLang(lang, data) = { + if type(data) == dictionary { + data.at(lang) + } else { + data + } +} + +#let display = getWithLang("fr", months.at("short")).at(1) + // Helper Functions -#let monthname(n, display: "short") = { +#let monthname(lang, n, display: "short") = { n = int(n) let month = "" - if n == 1 { month = "January" } - else if n == 3 { month = "March" } - else if n == 2 { month = "February" } - else if n == 4 { month = "April" } - else if n == 5 { month = "May" } - else if n == 6 { month = "June" } - else if n == 7 { month = "July" } - else if n == 8 { month = "August" } - else if n == 9 { month = "September" } - else if n == 10 { month = "October" } - else if n == 11 { month = "November" } - else if n == 12 { month = "December" } - else { result = none } - if month != none { - if display == "short" { - month = month.slice(0, 3) - } else { - month - } + let displayMonths = getWithLang(lang, months.at(display)) + + if (n > 0 and n <= 12) { + month = displayMonths.at(n - 1) } + month } -#let strpdate(isodate) = { +#let strpdate(lang, isodate) = { let date = "" - if lower(isodate) != "present" { + let isodate = getWithLang(lang, isodate) + if (regex("\d{4}-\d{2}-\d{2}") in isodate) { date = datetime( year: int(isodate.slice(0, 4)), month: int(isodate.slice(5, 7)), day: int(isodate.slice(8, 10)) ) - date = date.display("[month repr:short]") + " " + date.display("[year repr:full]") - } else if lower(isodate) == "present" { - date = "Present" + date = monthname(lang, date.month()) + " " + date.display("[year repr:full]") + } else { + date = isodate } return date } \ No newline at end of file diff --git a/data/en/experience.yaml b/data/en/experience.yaml index 3cd6042..3cc55d2 100644 --- a/data/en/experience.yaml +++ b/data/en/experience.yaml @@ -1,32 +1,63 @@ -- where: Paris, France - with: Diggers - url: https://diggers-consulting.com/ - what: - - startDate: 2022-02-04 - endDate: present - what: Data Engineer Consultant - Natixis - why: - - Management, design and implementation of multi-stream data producer computing and sending up to 1 billion messages per day. - - Implementation of financial data computation in a distributed environment. - - Scala, SQL, Spark, Kafka, Hive, Typelevel -- where: Montrouge, France - with: Crédit Agricole Leasing & Factoring - url: https://www.ca-leasingfactoring.com/ - what: - - startDate: 2021-04-16 - endDate: 2021-10-16 - what: Data Scientist Intern - why: - - "Feature Engineering via network modeling \\& analysis giving a 10\\% score improvement for prediction models" - - Development of a multi-environment pipeline execution program allowing the usage of tools missing in one or another - - Python, Scala, SQL, Spark, Pandas, Hive, XGBoost, iGraph, GraphX -- with: University Association IP7 - where: Paris, France - url: http://ip7.informatique.univ-paris-diderot.fr:8080/ - what: - - what: Volunteer - startDate: 2018-09-01 - endDate: 2021-06-01 - why: - - "Help in setting up a programming contest \\& writing algorithmic problems" - - Facilitator for multiple Linux installation parties +title: + en: Work Experience + fr: Expérience Professionnelle +content: + - where: + en: Paris, France + fr: Paris (75) + with: Diggers + url: https://diggers-consulting.com/ + what: + - startDate: 2022-02-04 + endDate: + en: present + fr: actuellement + what: + en: Data Engineer Consultant - Natixis + fr: Consultant Data Engineer - Natixis + why: + en: + - Management, design and implementation of multi-stream data producer computing and sending up to 1 billion messages per day. + - Implementation of financial data computation in a distributed environment. + - Scala, SQL, Spark, Kafka, Hive, Typelevel + fr: + - Gestion, conception et développement d'un service d'alimentation de données multi-flux calculant et produisant jusqu'à 1 milliard de messages par jour. + - Développement de batchs de calculs de données financières en environnement distribué. + - Scala, SQL, Spark, Kafka, Hive, Typelevel + - where: + en: Montrouge, France + fr: Montrouge (92) + with: Crédit Agricole Leasing & Factoring + url: https://www.ca-leasingfactoring.com/ + what: + - startDate: 2021-04-16 + endDate: 2021-10-16 + what: + en: Data Scientist Intern + fr: Data Scientist Stagiaire + why: + - en: "Feature Engineering via network modeling \\& analysis giving a 10\\% score improvement for prediction models" + fr: "Feature engineering via modélisation \\& analyse de graphes augmentant les scores des modèles de prédictions de 10\\%" + - en: Development of a multi-environment pipeline execution program allowing the usage of tools missing in one or another + fr: Développement d'une solution d'exécution de chaînes de traitement multi-environnements permettant un plus large choix d'outils. + - Python, Scala, SQL, Spark, Pandas, Hive, XGBoost, iGraph, GraphX + - with: + en: University Association IP7 + fr: Association Universitaire IP7 + where: + en: Paris, France + fr: Paris (75) + url: http://ip7.informatique.univ-paris-diderot.fr:8080/ + what: + - what: + en: Volunteer + fr: Bénévole + startDate: 2018-09-01 + endDate: 2021-06-01 + why: + en: + - "Help in setting up a programming contest \\& writing algorithmic problems" + - Facilitator for multiple Linux installation parties + fr: + - "Mise en place d’un concours de programmation \\& écriture de problèmes algorithmiques" + - Animateur de plusieurs install party Linux \ No newline at end of file diff --git a/data/months.yaml b/data/months.yaml new file mode 100644 index 0000000..2de980d --- /dev/null +++ b/data/months.yaml @@ -0,0 +1,54 @@ +long: + en: + - January + - February + - March + - April + - May + - June + - July + - August + - September + - October + - November + - December + fr: + - Janvier + - Février + - Mars + - Avril + - Mai + - Juin + - Juillet + - Août + - Septembre + - Octobre + - Novembre + - Décembre +short: + en: + - Jan + - Feb + - Mar + - Apr + - May + - Jun + - Jul + - Aug + - Sep + - Oct + - Nov + - Dec + fr: + - Janv. + - Févr. + - Mars + - Avr. + - Mai + - Juin + - Juill. + - Août + - Sept. + - Oct. + - Nov. + - Déc. \ No newline at end of file diff --git a/main.typ b/main.typ index 35f8960..6ba05d4 100644 --- a/main.typ +++ b/main.typ @@ -3,10 +3,10 @@ #let language = "en" #let cvdata = ( - personal: yaml(("data/", language, "/personal.yaml").join()), - experience: yaml(("data/", language, "/experience.yaml").join()), - education: yaml(("data/", language, "/education.yaml").join()), - skills: yaml(("data/", language, "/skills.yaml").join()) + personal: yaml(("data/", "en", "/personal.yaml").join()), + experience: yaml(("data/", "en", "/experience.yaml").join()), + education: yaml(("data/", "en", "/education.yaml").join()), + skills: yaml(("data/", "en", "/skills.yaml").join()) ) #let uservars = ( @@ -42,7 +42,7 @@ #show: doc => cvinit(doc) #cvheading(cvdata, uservars) -#cvwork(cvdata) +#cvwork(language, cvdata) // #cveducation(cvdata) // #cvskills(cvdata) #endnote() \ No newline at end of file