grace/typst_web_magic
Typst SSG powering grace.pink and words.gay
git clone https://git.gae.moe/grace/typst_web_magic
5b6c1ba
main
#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 ( 2title : none , 3subtitle : none , 4description : none , 5author : none , 6date : none , 7collection : none , 8path : none , 9: auto , 10preview : auto , 11) =( 12title : title , 13subtitle : subtitle , 14description : description , 15author : author , 16date : date , 17collection : collection , 18path : path , 19: , 20preview : preview , 21) 22 23# let post ( collection : "blog" , .. args ) = page ( collection : collection , .. args ) 24 25# let authors ( author ) = { 26let entries = if author == none { () } else if type ( author ) == array { author } else { ( author ,) } 27entries . 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 ) = { 35let result = entry 36for ( key , value ) in defaults { 37if result . at ( key , default : none ) in ( none , auto ) { 38result . insert ( key , value ) 39} 40} 41result . by = authors ( result . author ) 42result . author = result . by . map ( author => author . name ) 43result 44} 45 46# let author-text ( author ) = context { 47for ( i , entry ) in authors ( author ). enumerate () { 48if i > 0 { [, ] } 49if entry . url == none { 50entry . name 51} else if target () == "html" { 52html . a ( class : "author-link" , href : entry . url , entry . name ) 53} else { 54link ( 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 { 62entry . date . display ( "[year]-[month padding:zero]-[day padding:zero]" ) 63}