#let toVersions(commits: (("2025-11-19", "u80864958", "msg"),), persons: dictionary, final: false) = { let versions = () for commit in commits.rev() { let v = version(0, 0, 0) let message = str(commit.at(2)) if versions.len() > 0 { // versions.at(-1).v v = versions.at(-1).v if message.starts-with("fix") or message.starts-with("chore") { v = version(v.at(0), v.at(1), v.at(2) + 1) } else if message.starts-with("feat") { v = version(v.at(0), v.at(1) + 1, 0) } } if message.contains(":") { message = commit.at(2).split(":").slice(1).flatten().at(0).trim() } versions.push( ( date: toml(bytes("date = " + commit.at(0))).date, v: v, author: persons.at(default: persons.at(persons.keys().at(0)), commit.at(1)), topic: message, ), ) } if final { versions.push( ( date: datetime.today(), v: version(1, 0, 0), author: persons.at(persons.keys().at(0)), topic: "Finalisierung", ), ) } return versions } #let parseCurrentVersion( commits: (("2025-11-19", "u80864958", "init"),), persons: ( "u80864958": "Niklas Breitenstein", "u80864987": "Johar Naamneh", ), final: false, ) = { return toVersions(commits: commits, persons: persons, final: final).at(-1).v } #let versionhistoryTable( commits: (("2025-11-19", "u80864958", "init"),), persons: ( "u80864958": "Niklas Breitenstein", "u80864987": "Johar Naamneh", ), final: false, ) = { let versions = toVersions(commits: commits, persons: persons, final: final) set heading(numbering: none) [= Änderungsverzeichnis] set par(justify: false) figure( table( columns: (6em, 6em, 2fr, 2.7fr), table.header([Version], [Datum], [Name], [Themen]), ..versions .map(v => ( [v#v.v], v.date.display("[day].[month].[year]"), v.author, v.topic, )) .flatten(), ), caption: [Änderungsverzeichnis], ) }