fix: small misc issues with build (#118)

Auto formatted all typst code and fixed CI issue due to using upload artifacts v4 (actions/upload-artifact@v4/docs/MIGRATION.md)
This commit is contained in:
Paul T
2025-05-22 14:32:45 -04:00
committed by GitHub
parent 076afdd74e
commit ac7c078341
10 changed files with 192 additions and 348 deletions

View File

@@ -65,7 +65,7 @@ jobs:
uses: actions/upload-artifact@v4
if: always()
with:
name: diffs
name: diffs-typst-${{ matrix.typst-version }}
path: |
tests/**/diff/*.png
tests/**/out/*.png

View File

@@ -1,9 +1,7 @@
#import "../lib.typ"
#import "@preview/tidy:0.4.1"
#let docs = tidy.parse-module(
read("../lib.typ"),
name: "Modern CV",
scope: (resume: lib),
)
#let docs = tidy.parse-module(read("../lib.typ"), name: "Modern CV", scope: (
resume: lib,
))
#tidy.show-module(docs, style: tidy.styles.minimal)

259
lib.typ
View File

@@ -9,27 +9,13 @@
#let default-location-color = rgb("#333333")
// const icons
#let linkedin-icon = box(
fa-icon("linkedin", fill: color-darknight),
)
#let github-icon = box(
fa-icon("github", fill: color-darknight),
)
#let gitlab-icon = box(
fa-icon("gitlab", fill: color-darknight),
)
#let bitbucket-icon = box(
fa-icon("bitbucket", fill: color-darknight),
)
#let twitter-icon = box(
fa-icon("twitter", fill: color-darknight),
)
#let google-scholar-icon = box(
fa-icon("google-scholar", fill: color-darknight),
)
#let orcid-icon = box(
fa-icon("orcid", fill: color-darknight),
)
#let linkedin-icon = box(fa-icon("linkedin", fill: color-darknight))
#let github-icon = box(fa-icon("github", fill: color-darknight))
#let gitlab-icon = box(fa-icon("gitlab", fill: color-darknight))
#let bitbucket-icon = box(fa-icon("bitbucket", fill: color-darknight))
#let twitter-icon = box(fa-icon("twitter", fill: color-darknight))
#let google-scholar-icon = box(fa-icon("google-scholar", fill: color-darknight))
#let orcid-icon = box(fa-icon("orcid", fill: color-darknight))
#let phone-icon = box(fa-icon("square-phone", fill: color-darknight))
#let email-icon = box(fa-icon("envelope", fill: color-darknight))
#let birth-icon = box(fa-icon("cake", fill: color-darknight))
@@ -87,11 +73,14 @@
]
}
#let __coverletter_footer(author, language, date, lang_data, use-smallcaps: true) = {
set text(
fill: gray,
size: 8pt,
)
#let __coverletter_footer(
author,
language,
date,
lang_data,
use-smallcaps: true,
) = {
set text(fill: gray, size: 8pt)
__justify_align_3[
#__apply_smallcaps(date, use-smallcaps)
][
@@ -100,7 +89,7 @@
let name = __format_author_name(author, language)
name + " · " + linguify("cover-letter", from: lang_data)
},
use-smallcaps
use-smallcaps,
)
][
#context {
@@ -110,10 +99,7 @@
}
#let __resume_footer(author, language, lang_data, date, use-smallcaps: true) = {
set text(
fill: gray,
size: 8pt,
)
set text(fill: gray, size: 8pt)
__justify_align_3[
#__apply_smallcaps(date, use-smallcaps)
][
@@ -122,7 +108,7 @@
let name = __format_author_name(author, language)
name + " · " + linguify("resume", from: lang_data)
},
use-smallcaps
use-smallcaps,
)
][
#context {
@@ -150,20 +136,14 @@
/// Right section for the justified headers
/// - body (content): The body of the right header
#let secondary-right-header(body) = {
set text(
size: 11pt,
weight: "medium",
)
set text(size: 11pt, weight: "medium")
body
}
/// Right section of a tertiaty headers.
/// - body (content): The body of the right header
#let tertiary-right-header(body) = {
set text(
weight: "light",
size: 9pt,
)
set text(weight: "light", size: 9pt)
body
}
@@ -171,10 +151,7 @@
/// - primary (content): The primary section of the header
/// - secondary (content): The secondary section of the header
#let justified-header(primary, secondary) = {
set block(
above: 0.7em,
below: 0.7em,
)
set block(above: 0.7em, below: 0.7em)
pad[
#__justify_align[
== #primary
@@ -220,7 +197,7 @@
show-footer: true,
language: "en",
font: ("Source Sans Pro", "Source Sans 3"),
header-font: ("Roboto"),
header-font: "Roboto",
paper-size: "a4",
use-smallcaps: true,
body,
@@ -261,21 +238,12 @@
)
// set paragraph spacing
set par(
spacing: 0.75em,
justify: true,
)
set par(spacing: 0.75em, justify: true)
set heading(
numbering: none,
outlined: false,
)
set heading(numbering: none, outlined: false)
show heading.where(level: 1): it => [
#set text(
size: 16pt,
weight: "regular",
)
#set text(size: 16pt, weight: "regular")
#set align(left)
#set block(above: 1em)
#let color = if colored-headers {
@@ -288,20 +256,12 @@
]
show heading.where(level: 2): it => {
set text(
color-darkgray,
size: 12pt,
style: "normal",
weight: "bold",
)
set text(color-darkgray, size: 12pt, style: "normal", weight: "bold")
it.body
}
show heading.where(level: 3): it => {
set text(
size: 10pt,
weight: "regular",
)
set text(size: 10pt, weight: "regular")
__apply_smallcaps(it.body, use-smallcaps)
}
@@ -309,16 +269,11 @@
align(center)[
#pad(bottom: 5pt)[
#block[
#set text(
size: 32pt,
style: "normal",
font: header-font,
)
#set text(size: 32pt, style: "normal", font: header-font)
#if language == "zh" or language == "ja" [
#text(
accent-color,
weight: "thin",
)[#author.firstname]#text(weight: "bold")[#author.lastname]
#text(accent-color, weight: "thin")[#author.firstname]#text(
weight: "bold",
)[#author.lastname]
] else [
#text(accent-color, weight: "thin")[#author.firstname]
#text(weight: "bold")[#author.lastname]
@@ -329,26 +284,17 @@
}
let positions = {
set text(
accent-color,
size: 9pt,
weight: "regular",
)
set text(accent-color, size: 9pt, weight: "regular")
align(center)[
#__apply_smallcaps(
author.positions.join(
text[#" "#sym.dot.c#" "],
),
use-smallcaps
author.positions.join(text[#" "#sym.dot.c#" "]),
use-smallcaps,
)
]
}
let address = {
set text(
size: 9pt,
weight: "regular",
)
set text(size: 9pt, weight: "regular")
align(center)[
#if ("address" in author) [
#author.address
@@ -362,11 +308,7 @@
let separator = box(width: 5pt)
align(center)[
#set text(
size: 9pt,
weight: "regular",
style: "normal",
)
#set text(size: 9pt, weight: "regular", style: "normal")
#block[
#align(horizon)[
#if ("birth" in author) [
@@ -401,25 +343,33 @@
#if ("bitbucket" in author) [
#separator
#bitbucket-icon
#box[#link("https://bitbucket.org/" + author.bitbucket)[#author.bitbucket]]
#box[#link(
"https://bitbucket.org/" + author.bitbucket,
)[#author.bitbucket]]
]
#if ("linkedin" in author) [
#separator
#linkedin-icon
#box[
#link("https://www.linkedin.com/in/" + author.linkedin)[#author.firstname #author.lastname]
#link(
"https://www.linkedin.com/in/" + author.linkedin,
)[#author.firstname #author.lastname]
]
]
#if ("twitter" in author) [
#separator
#twitter-icon
#box[#link("https://twitter.com/" + author.twitter)[\@#author.twitter]]
#box[#link(
"https://twitter.com/" + author.twitter,
)[\@#author.twitter]]
]
#if ("scholar" in author) [
#let fullname = str(author.firstname + " " + author.lastname)
#separator
#google-scholar-icon
#box[#link("https://scholar.google.com/citations?user=" + author.scholar)[#fullname]]
#box[#link(
"https://scholar.google.com/citations?user=" + author.scholar,
)[#fullname]]
]
#if ("orcid" in author) [
#separator
@@ -439,7 +389,7 @@
if profile-picture != none {
grid(
columns: (100% - 4cm, 4cm),
rows: (100pt),
rows: 100pt,
gutter: 10pt,
[
#name
@@ -472,16 +422,8 @@
/// This formats the item for the resume entries. Typically your body would be a bullet list of items. Could be your responsibilities at a company or your academic achievements in an educational background section.
/// - body (content): The body of the resume entry
#let resume-item(body) = {
set text(
size: 10pt,
style: "normal",
weight: "light",
fill: color-darknight,
)
set block(
above: 0.75em,
below: 1.25em,
)
set text(size: 10pt, style: "normal", weight: "light", fill: color-darknight)
set block(above: 0.75em, below: 1.25em)
set par(leading: 0.65em)
block(above: 0.5em)[
#body
@@ -525,11 +467,7 @@
/// *Example:*
/// #example(`resume.resume-gpa("3.5", "4.0")`)
#let resume-gpa(numerator, denominator) = {
set text(
size: 12pt,
style: "italic",
weight: "light",
)
set text(size: 12pt, style: "italic", weight: "light")
text[Cumulative GPA: #box[#strong[#numerator] / #denominator]]
}
@@ -558,11 +496,7 @@
== #category
],
align(left)[
#set text(
size: 11pt,
style: "normal",
weight: "light",
)
#set text(size: 11pt, style: "normal", weight: "light")
#items.join(", ")
],
)
@@ -575,10 +509,11 @@
#let default-closing(lang_data) = {
align(bottom)[
#text(weight: "light", style: "italic")[ #linguify(
"attached",
#text(weight: "light", style: "italic")[
#linguify("attached", from: lang_data)#sym.colon #linguify(
"curriculum-vitae",
from: lang_data,
)#sym.colon #linguify("curriculum-vitae", from: lang_data)]
)]
]
}
@@ -602,7 +537,7 @@
accent-color: default-accent-color,
language: "en",
font: ("Source Sans Pro", "Source Sans 3"),
header-font: ("Roboto"),
header-font: "Roboto",
show-footer: true,
closing: none,
paper-size: "a4",
@@ -623,11 +558,9 @@
show: body => context {
set document(
author: author.firstname + " " + author.lastname,
title: lflib._linguify(
"cover-letter",
lang: language,
from: lang_data,
).ok,
title: lflib
._linguify("cover-letter", lang: language, from: lang_data)
.ok,
)
body
}
@@ -654,25 +587,13 @@
)
// set paragraph spacing
set par(
spacing: 0.75em,
justify: true,
)
set par(spacing: 0.75em, justify: true)
set heading(
numbering: none,
outlined: false,
)
set heading(numbering: none, outlined: false)
show heading: it => [
#set block(
above: 1em,
below: 1em,
)
#set text(
size: 16pt,
weight: "regular",
)
#set block(above: 1em, below: 1em)
#set text(size: 16pt, weight: "regular")
#align(left)[
#text[#strong[#text(accent-color)[#it.body]]]
@@ -684,16 +605,11 @@
align(right)[
#pad(bottom: 5pt)[
#block[
#set text(
size: 32pt,
style: "normal",
font: header-font,
)
#set text(size: 32pt, style: "normal", font: header-font)
#if language == "zh" or language == "ja" [
#text(
accent-color,
weight: "thin",
)[#author.firstname]#text(weight: "bold")[#author.lastname]
#text(accent-color, weight: "thin")[#author.firstname]#text(
weight: "bold",
)[#author.lastname]
] else [
#text(accent-color, weight: "thin")[#author.firstname]
#text(weight: "bold")[#author.lastname]
@@ -705,27 +621,17 @@
}
let positions = {
set text(
accent-color,
size: 9pt,
weight: "regular",
)
set text(accent-color, size: 9pt, weight: "regular")
align(right)[
#__apply_smallcaps(
author.positions.join(
text[#" "#sym.dot.c#" "],
),
use-smallcaps
author.positions.join(text[#" "#sym.dot.c#" "]),
use-smallcaps,
)
]
}
let address = {
set text(
size: 9pt,
weight: "bold",
fill: color-gray,
)
set text(size: 9pt, weight: "bold", fill: color-gray)
align(right)[
#if ("address" in author) [
#author.address
@@ -761,7 +667,9 @@
author_list.push[
#linkedin-icon
#box[
#link("https://www.linkedin.com/in/" + author.linkedin)[#author.firstname #author.lastname]
#link(
"https://www.linkedin.com/in/" + author.linkedin,
)[#author.firstname #author.lastname]
]
]
}
@@ -780,11 +688,7 @@
align(right)[
#set text(
size: 8pt,
weight: "light",
style: "normal",
)
#set text(size: 8pt, weight: "light", style: "normal")
#author_list.join(separator)
]
}
@@ -792,7 +696,7 @@
let letter-heading = {
grid(
columns: (1fr, 2fr),
rows: (100pt),
rows: 100pt,
align(left + horizon)[
#block(
clip: true,
@@ -815,10 +719,9 @@
let signature = {
align(bottom)[
#pad(bottom: 2em)[
#text(weight: "light")[#linguify(
"sincerely",
from: lang_data,
)#if language != "de" [#sym.comma]] \
#text(weight: "light")[#linguify("sincerely", from: lang_data)#if (
language != "de"
) [#sym.comma]] \
#text(weight: "bold")[#author.firstname #author.lastname] \ \
]
]

View File

@@ -1,4 +1,3 @@
#!/usr/bin/env bash
set -eu
find . -iname "*.typ" | xargs typstyle -i

View File

@@ -26,7 +26,7 @@
// set this to `none` to show the default or remove it completely
closing: [],
// see typst "page" documentation for more options
paper-size: "us-gov-legal"
paper-size: "us-gov-legal",
)
#hiring-entity-info(entity-info: (
@@ -36,10 +36,7 @@
city: "MOUNTAIN VIEW, CA 94043",
))
#letter-heading(
job-position: "Software Engineer",
addressee: "Sir or Madame",
)
#letter-heading(job-position: "Software Engineer", addressee: "Sir or Madame")
= About Me
#coverletter-content[

View File

@@ -26,10 +26,7 @@
city: "MOUNTAIN VIEW, CA 94043",
))
#letter-heading(
job-position: "Software Engineer",
addressee: "Sir or Madame",
)
#letter-heading(job-position: "Software Engineer", addressee: "Sir or Madame")
#coverletter-content[
#lorem(100)

View File

@@ -56,10 +56,7 @@
#lorem(72)
]
#resume-entry(
title: "Intern",
location: "Example City, EX",
)
#resume-entry(title: "Intern", location: "Example City, EX")
#resume-item[
- #lorem(20)
@@ -95,15 +92,21 @@
= Skills
#resume-skill-item(
"Languages",
(strong("C++"), strong("Python"), "Java", "C#", "JavaScript", "TypeScript"),
)
#resume-skill-item("Languages", (
strong("C++"),
strong("Python"),
"Java",
"C#",
"JavaScript",
"TypeScript",
))
#resume-skill-item("Spoken Languages", (strong("English"), "Spanish"))
#resume-skill-item(
"Programs",
(strong("Excel"), "Word", "Powerpoint", "Visual Studio"),
)
#resume-skill-item("Programs", (
strong("Excel"),
"Word",
"Powerpoint",
"Visual Studio",
))
= Education

View File

@@ -1,13 +1,8 @@
#import "@local/modern-cv:0.8.0": *
// setup the document like we do for the resume
#let font = ("Source Sans 3")
#set text(
font: font,
size: 11pt,
fill: color-darkgray,
fallback: true,
)
#let font = "Source Sans 3"
#set text(font: font, size: 11pt, fill: color-darkgray, fallback: true)
#set page(
paper: "a4",
@@ -19,21 +14,12 @@
// set paragraph spacing
#set par(spacing: 0.75em, justify: true)
#set heading(
numbering: none,
outlined: false,
)
#set heading(numbering: none, outlined: false)
#show heading.where(level: 1): it => [
#set block(
above: 1em,
below: 1em,
)
#set text(
size: 16pt,
weight: "regular",
)
#set block(above: 1em, below: 1em)
#set text(size: 16pt, weight: "regular")
#align(left)[
#let color = if colored-headers {
@@ -48,20 +34,12 @@
]
#show heading.where(level: 2): it => {
set text(
color-darkgray,
size: 12pt,
style: "normal",
weight: "bold",
)
set text(color-darkgray, size: 12pt, style: "normal", weight: "bold")
it.body
}
#show heading.where(level: 3): it => {
set text(
size: 10pt,
weight: "regular",
)
set text(size: 10pt, weight: "regular")
smallcaps[#it.body]
}
@@ -77,19 +55,10 @@
)
// resume-entry also support omitting the date and description
#resume-entry(
title: "Title",
location: "Location",
)
#resume-entry(title: "Title", location: "Location")
#resume-certification(
"Certified Scrum Master (CSM)",
"Jan 2022",
)
#resume-certification("Certified Scrum Master (CSM)", "Jan 2022")
#resume-skill-item(
"Programming",
(strong["C++"], "Python", "Java"),
)
#resume-skill-item("Programming", (strong["C++"], "Python", "Java"))
#resume-gpa("3.5", "4.0")

View File

@@ -1,13 +1,8 @@
#import "@local/modern-cv:0.8.0": *
// setup the document like we do for the resume
#let font = ("Source Sans 3")
#set text(
font: font,
size: 11pt,
fill: color-darkgray,
fallback: true,
)
#let font = "Source Sans 3"
#set text(font: font, size: 11pt, fill: color-darkgray, fallback: true)
#set page(
paper: "a4",
@@ -19,21 +14,12 @@
// set paragraph spacing
#set par(spacing: 0.75em, justify: true)
#set heading(
numbering: none,
outlined: false,
)
#set heading(numbering: none, outlined: false)
#show heading.where(level: 1): it => [
#set block(
above: 1em,
below: 1em,
)
#set text(
size: 16pt,
weight: "regular",
)
#set block(above: 1em, below: 1em)
#set text(size: 16pt, weight: "regular")
#align(left)[
#let color = if colored-headers {
@@ -48,20 +34,12 @@
]
#show heading.where(level: 2): it => {
set text(
color-darkgray,
size: 12pt,
style: "normal",
weight: "bold",
)
set text(color-darkgray, size: 12pt, style: "normal", weight: "bold")
it.body
}
#show heading.where(level: 3): it => {
set text(
size: 10pt,
weight: "regular",
)
set text(size: 10pt, weight: "regular")
smallcaps[#it.body]
}