grace/typst_web_magic

Typst SSG powering grace.pink and words.gay

git clone https://git.gae.moe/grace/typst_web_magic

Grace Yoderadded template, readme, and minor changes5b6c1ba

main
1.5 KiB63 linesraw

#let page( title: none, subtitle: none, description: none, author: none, date: none, collection: none, path: none, pdf: auto, preview: auto, ) = ( title: title, subtitle: subtitle, description: description, author: author, date: date, collection: collection, path: path, pdf: pdf, preview: preview, )

#let post(collection: "blog", ..args) = page(collection: collection, ..args)

#let authors(author) = { let entries = if author == none { () } else if type(author) == array { author } else { (author,) } entries.map(entry => if type(entry) == str { (name: entry, url: none) } else { (name: entry.name, url: entry.at("url", default: none)) }) }

#let normalize-page(entry, defaults) = { let result = entry for (key, value) in defaults { if result.at(key, default: none) in (none, auto) { result.insert(key, value) } } result.by = authors(result.author) result.author = result.by.map(author => author.name) result }

#let author-text(author) = context { for (i, entry) in authors(author).enumerate() { if i > 0 { [, ] } if entry.url == none { entry.name } else if target() == "html" { html.a(class: "author-link", href: entry.url, entry.name) } else { link(entry.url, entry.name) } } }

#let format-date(date) = date.display("[month repr:long] [year]")

#let date-key(entry) = if entry.date == none { "" } else { entry.date.display("[year]-[month padding:zero]-[day padding:zero]") }

1#let page(
2  title: none,
3  subtitle: none,
4  description: none,
5  author: none,
6  date: none,
7  collection: none,
8  path: none,
9  pdf: auto,
10  preview: auto,
11) = (
12  title: title,
13  subtitle: subtitle,
14  description: description,
15  author: author,
16  date: date,
17  collection: collection,
18  path: path,
19  pdf: pdf,
20  preview: preview,
21)
22
23#let post(collection: "blog", ..args) = page(collection: collection, ..args)
24
25#let authors(author) = {
26  let entries = if author == none { () } else if type(author) == array { author } else { (author,) }
27  entries.map(entry => if type(entry) == str {
28    (name: entry, url: none)
29  } else {
30    (name: entry.name, url: entry.at("url", default: none))
31  })
32}
33
34#let normalize-page(entry, defaults) = {
35  let result = entry
36  for (key, value) in defaults {
37    if result.at(key, default: none) in (none, auto) {
38      result.insert(key, value)
39    }
40  }
41  result.by = authors(result.author)
42  result.author = result.by.map(author => author.name)
43  result
44}
45
46#let author-text(author) = context {
47  for (i, entry) in authors(author).enumerate() {
48    if i > 0 { [, ] }
49    if entry.url == none {
50      entry.name
51    } else if target() == "html" {
52      html.a(class: "author-link", href: entry.url, entry.name)
53    } else {
54      link(entry.url, entry.name)
55    }
56  }
57}
58
59#let format-date(date) = date.display("[month repr:long] [year]")
60
61#let date-key(entry) = if entry.date == none { "" } else {
62  entry.date.display("[year]-[month padding:zero]-[day padding:zero]")
63}