a scraper for jobs in the region with connected telegram bot to send my new jobs every day
176 lines
4.8 KiB
Typst
176 lines
4.8 KiB
Typst
// Gemeinsames, eigenständiges Layout für beide Bewerbungsdokumente.
|
|
#let accent = rgb("#0395de")
|
|
#let ink = rgb("#333333")
|
|
#let dark-ink = rgb("#414141")
|
|
#let gray-ink = rgb("#3a3a5d")
|
|
#let rule-ink = rgb("#5d5d5d")
|
|
#let pale = rgb("#999999")
|
|
|
|
#let today = datetime.today()
|
|
#let month-names = (
|
|
"Januar", "Februar", "März", "April", "Mai", "Juni",
|
|
"Juli", "August", "September", "Oktober", "November", "Dezember",
|
|
)
|
|
#let today-de = (
|
|
str(today.day()) + ". " + month-names.at(today.month() - 1) +
|
|
" " + str(today.year())
|
|
)
|
|
|
|
#let document-base(body) = {
|
|
set text(font: "Source Sans Pro", lang: "de", size: 9pt, weight: 300, fill: ink)
|
|
set par(leading: 0.48em)
|
|
body
|
|
}
|
|
|
|
#let name-mark(
|
|
person,
|
|
size: 22pt,
|
|
family: "Roboto",
|
|
first-weight: 100,
|
|
first-smallcaps: false,
|
|
) = [
|
|
#text(font: family, size: size, weight: first-weight, fill: gray-ink)[
|
|
#if first-smallcaps { smallcaps(person.first) } else { person.first }
|
|
]#h(3pt)#text(font: family, size: size, weight: 700, fill: ink)[#person.last]
|
|
]
|
|
|
|
#let fa(glyph) = text(font: "FontAwesome", size: 0.95em)[#glyph]
|
|
|
|
#let cover-header(person) = block(width: 100%)[
|
|
#align(center)[
|
|
#name-mark(person, size: 32pt)
|
|
#v(1pt)
|
|
#text(font: "Source Sans Pro", size: 7.6pt, weight: 400, fill: accent)[
|
|
#smallcaps(person.position)
|
|
]
|
|
#v(2pt)
|
|
#text(font: "Roboto", size: 8pt, weight: 400, style: "italic", fill: pale)[
|
|
#person.street, #person.city
|
|
]
|
|
#v(3pt)
|
|
#text(font: "Roboto", size: 6.8pt, weight: 400, fill: ink)[
|
|
#fa("\u{f10b}") #person.mobile #h(7pt)|#h(7pt)
|
|
#fa("\u{f0e0}") #person.email #h(7pt)|#h(7pt)
|
|
#fa("\u{f092}") #person.github #h(7pt)|#h(7pt)
|
|
#fa("\u{f169}") #person.xing
|
|
]
|
|
]
|
|
]
|
|
|
|
#let cv-header(person) = block(width: 100%, below: 33pt)[
|
|
#grid(
|
|
columns: (1fr, 1.8fr, 1fr),
|
|
column-gutter: 6pt,
|
|
align: (left, center, right),
|
|
[
|
|
#text(font: "Roboto", size: 8pt, weight: 400, style: "italic", fill: pale)[
|
|
#person.street\
|
|
#person.city
|
|
]
|
|
],
|
|
align(center)[
|
|
#name-mark(
|
|
person,
|
|
family: "Source Sans Pro",
|
|
first-weight: 400,
|
|
first-smallcaps: true,
|
|
)
|
|
#v(2pt)
|
|
#text(font: "Source Sans Pro", size: 7.6pt, weight: 400, fill: accent)[
|
|
#smallcaps("Lebenslauf")
|
|
]
|
|
],
|
|
[
|
|
#text(font: "Roboto", size: 6.8pt, weight: 400, fill: ink)[
|
|
#fa("\u{f10b}") #person.mobile\
|
|
#fa("\u{f0e0}") #person.email\
|
|
#fa("\u{f169}") #person.xing\
|
|
#fa("\u{f092}") #person.github
|
|
]
|
|
],
|
|
)
|
|
]
|
|
|
|
#let cv-footer(person) = context grid(
|
|
columns: (1fr, 1fr, 1fr),
|
|
align: (left, center, right),
|
|
text(font: "Source Sans Pro", size: 8pt, weight: 400, fill: pale)[#smallcaps(today-de)],
|
|
text(font: "Source Sans Pro", size: 8pt, weight: 400, fill: pale)[
|
|
#smallcaps(person.first + " " + person.last + " · Lebenslauf")
|
|
],
|
|
text(font: "Source Sans Pro", size: 8pt, weight: 400, fill: pale)[#counter(page).display()],
|
|
)
|
|
|
|
#let cover-footer(person) = align(center)[
|
|
#text(font: "Source Sans Pro", size: 8pt, fill: pale, weight: 400)[
|
|
#smallcaps(person.first + " " + person.last)
|
|
]
|
|
]
|
|
|
|
#let section(accent-part, rest) = block(
|
|
width: 100%,
|
|
above: 8pt,
|
|
below: 5pt,
|
|
breakable: false,
|
|
)[
|
|
#grid(
|
|
columns: (auto, 1fr),
|
|
column-gutter: 2pt,
|
|
align: horizon,
|
|
text(font: "Source Sans Pro", size: 16pt, weight: 700)[
|
|
#text(fill: accent)[#accent-part]#text(fill: ink)[#rest]
|
|
],
|
|
line(length: 100%, stroke: 0.9pt + rule-ink),
|
|
)
|
|
]
|
|
|
|
#let bullet-list(items) = {
|
|
for item in items {
|
|
block(width: 100%)[
|
|
#grid(
|
|
columns: (7pt, 1fr),
|
|
column-gutter: 1pt,
|
|
[•],
|
|
item,
|
|
)
|
|
]
|
|
v(-5pt)
|
|
}
|
|
}
|
|
|
|
#let entry(role, organization, location, period, items) = block(
|
|
width: 100%,
|
|
above: 15pt,
|
|
below: 18pt,
|
|
breakable: false,
|
|
)[
|
|
#grid(
|
|
columns: (1fr, auto),
|
|
column-gutter: 8pt,
|
|
row-gutter: 9pt,
|
|
text(font: "Source Sans Pro", size: 10pt, weight: 700, fill: dark-ink)[#organization],
|
|
text(font: "Source Sans Pro", size: 9pt, weight: 300, style: "italic", fill: accent)[#location],
|
|
text(font: "Source Sans Pro", size: 8pt, weight: 400, fill: gray-ink)[#smallcaps(role)],
|
|
text(font: "Source Sans Pro", size: 8pt, weight: 300, style: "italic", fill: gray-ink)[#period],
|
|
)
|
|
#parbreak()
|
|
#v(1pt)
|
|
#block(width: 100%)[
|
|
#text(font: "Source Sans Pro", size: 9pt, weight: 300, fill: ink)[#bullet-list(items)]
|
|
]
|
|
]
|
|
|
|
#let skills(body, above: 16pt, below: 12pt) = block(
|
|
width: 100%,
|
|
inset: (top: above, bottom: below),
|
|
body,
|
|
)
|
|
|
|
#let skill(label, value) = grid(
|
|
columns: (45mm, 1fr),
|
|
column-gutter: 5mm,
|
|
align: (right, left),
|
|
text(font: "Source Sans Pro", size: 10pt, weight: 700, fill: dark-ink)[#label],
|
|
text(font: "Source Sans Pro", size: 9pt, weight: 300, fill: ink)[#value],
|
|
)
|