Compare commits

..

No commits in common. "main" and "2026-init" have entirely different histories.

3 changed files with 190 additions and 161 deletions

View file

@ -1,6 +1,9 @@
(load (sb-ext:posix-getenv "ASDF")) (load (sb-ext:posix-getenv "ASDF"))
(asdf:load-system 'str)
(asdf:load-system 'alexandria)
(asdf:load-system 'cl-dates) (asdf:load-system 'cl-dates)
;; week is 7 days ;; week is 7 days
;; 52 weeks in a year ;; 52 weeks in a year
;; 13 weeks in a quarter ;; 13 weeks in a quarter
@ -20,22 +23,20 @@
(defun week-number (date) (defun week-number (date)
(mod (cl-dates:week-number date) 52)) (mod (cl-dates:week-number date) 52))
(defun write-page-header (stream header-text) (defun write-page-cycle (stream cl-date year-number quarter-number cycle-number)
(format stream " (format stream "
#set page( #set page(
paper: \"a4\", paper: \"a4\",
flipped: true, flipped: true,
header: align(bottom)[~A], header: [
margin: ( Y~d
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q~d
x: 0.5cm #h(1fr)
)) C~d
" header-text) ],
) margin: 0.5cm)
" year-number quarter-number cycle-number)
(defun write-page-cycle (stream cl-date year-number quarter-number cycle-number)
(write-page-header stream (format nil "Y~d #h(1fr) Q~d #h(1fr) C~d" year-number quarter-number cycle-number))
(format stream "#table( (format stream "#table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -49,35 +50,45 @@
(format stream ",[#h(1fr) ~A]" (cl-dates:month->string mm)) (format stream ",[#h(1fr) ~A]" (cl-dates:month->string mm))
(format stream ",[#h(1fr) ~d]" dd)))))) (format stream ",[#h(1fr) ~d]" dd))))))
(format stream ")~%")) (format stream ")~%"))
(defun write-page-reset-week (stream cl-date year-number quarter-number) (defun write-page-reset-week (stream cl-date year-number quarter-number)
(write-page-header stream (format nil "Y~d #h(1fr) Q~d #h(1fr) Reset Week" year-number quarter-number)) (format stream "
(format stream "#table( #set page(
columns: (1fr, 1fr, 1fr), paper: \"a4\",
rows: (1fr), flipped: true,
align(center)[_Going In_]") header: [
(loop for day from 0 to 6 Y~d
do (let* ((week-day (+ cl-date day)) #h(1fr)
(day-of-week (cl-dates:dow->string (cl-dates:day-of-week week-day)))) Q~d
(multiple-value-bind (yy mm dd) (cl-dates:date->ymd week-day) #h(1fr)
(if (= 1 dd) Reset Week
(format stream ",[~A #h(1fr) ~A]~%" day-of-week (cl-dates:month->string mm)) ],
(format stream ",[~A #h(1fr) ~d]~%" day-of-week dd)) margin: 0.5cm)
))) " year-number quarter-number)
(format stream ",align(center)[_Coming Out_]") (format stream "#table(
(format stream ")~%")) columns: (1fr, 1fr, 1fr),
rows: (1fr),
align(center)[_Going In_]
")
(loop for day from 0 to 6
do (let* ((week-day (+ cl-date day))
(day-of-week (cl-dates:dow->string (cl-dates:day-of-week week-day))))
(multiple-value-bind (yy mm dd) (cl-dates:date->ymd week-day)
(if (= 1 dd)
(format stream ",[~A #h(1fr) ~A]~%" day-of-week (cl-dates:month->string mm))
(format stream ",[~A #h(1fr) ~d]~%" day-of-week dd))
)))
(format stream ",align(center)[_Coming Out_]")
(format stream ")~%")
)
(defun write-pages-quarter (stream cl-date year-number quarter-number) (defun write-pages-quarter (stream cl-date year-number quarter-number)
(loop for c from 0 to 2 do (write-page-cycle stream (add-weeks cl-date (* c 4)) year-number quarter-number (+ c 1))) (loop for c from 0 to 2 do (write-page-cycle stream (add-weeks cl-date (* c 4)) year-number quarter-number (+ c 1)))
(write-page-reset-week stream (add-weeks cl-date 12) year-number quarter-number)) (write-page-reset-week stream (add-weeks cl-date 12) year-number quarter-number))
(with-open-file (stream "main.typ" (with-open-file (stream "main.typ"
:direction :output :direction :output
:if-exists :supersede :if-exists :supersede
:if-does-not-exist :create) :if-does-not-exist :create)
(format stream "/* This is an auto-generated file (format stream "/* This is an auto-generated file
You can run `sbcl --script ./cal.lisp` to create a new one */~%") You can run `sbcl --script ./cal.lisp` to create a new one */~%")
(write-page-reset-week stream (cl-dates:ymd->date 2025 12 22) 2025 4)
(let ((year-start (cl-dates:ymd->date 2025 12 29))) (let ((year-start (cl-dates:ymd->date 2025 12 29)))
(loop for q from 0 to 3 do (write-pages-quarter stream (add-weeks year-start (* q 13)) 2026 (+ q 1))) (loop for q from 0 to 3 do (write-pages-quarter stream (add-weeks year-start (* q 13)) 2026 (+ q 1)))
)) ))

View file

@ -33,6 +33,9 @@
inherit (pkgs) lib; inherit (pkgs) lib;
sbcl = pkgs.sbcl.withPackages (ps: [ sbcl = pkgs.sbcl.withPackages (ps: [
ps.str
ps.cl-heap
ps.alexandria
inputs.cl-dates.packages.x86_64-linux.default inputs.cl-dates.packages.x86_64-linux.default
]); ]);

273
main.typ
View file

@ -4,33 +4,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2025 #h(1fr) Q4 #h(1fr) Reset Week], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q1
x: 0.5cm #h(1fr)
)) C1
#table( ],
columns: (1fr, 1fr, 1fr), margin: 0.5cm)
rows: (1fr),
align(center)[_Going In_],[Monday #h(1fr) 22]
,[Tuesday #h(1fr) 23]
,[Wednesday #h(1fr) 24]
,[Thursday #h(1fr) 25]
,[Friday #h(1fr) 26]
,[Saturday #h(1fr) 27]
,[Sunday #h(1fr) 28]
,align(center)[_Coming Out_])
#set page(
paper: "a4",
flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q1 #h(1fr) C1],
margin: (
top: 1.5cm,
bottom: 0.5cm,
x: 0.5cm
))
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -43,12 +24,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q1 #h(1fr) C2], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q1
x: 0.5cm #h(1fr)
)) C2
],
margin: 0.5cm)
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -61,12 +44,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q1 #h(1fr) C3], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q1
x: 0.5cm #h(1fr)
)) C3
],
margin: 0.5cm)
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -79,16 +64,19 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q1 #h(1fr) Reset Week], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q1
x: 0.5cm #h(1fr)
)) Reset Week
],
margin: 0.5cm)
#table( #table(
columns: (1fr, 1fr, 1fr), columns: (1fr, 1fr, 1fr),
rows: (1fr), rows: (1fr),
align(center)[_Going In_],[Monday #h(1fr) 23] align(center)[_Going In_]
,[Monday #h(1fr) 23]
,[Tuesday #h(1fr) 24] ,[Tuesday #h(1fr) 24]
,[Wednesday #h(1fr) 25] ,[Wednesday #h(1fr) 25]
,[Thursday #h(1fr) 26] ,[Thursday #h(1fr) 26]
@ -100,12 +88,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q2 #h(1fr) C1], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q2
x: 0.5cm #h(1fr)
)) C1
],
margin: 0.5cm)
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -118,12 +108,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q2 #h(1fr) C2], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q2
x: 0.5cm #h(1fr)
)) C2
],
margin: 0.5cm)
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -136,12 +128,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q2 #h(1fr) C3], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q2
x: 0.5cm #h(1fr)
)) C3
],
margin: 0.5cm)
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -154,16 +148,19 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q2 #h(1fr) Reset Week], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q2
x: 0.5cm #h(1fr)
)) Reset Week
],
margin: 0.5cm)
#table( #table(
columns: (1fr, 1fr, 1fr), columns: (1fr, 1fr, 1fr),
rows: (1fr), rows: (1fr),
align(center)[_Going In_],[Monday #h(1fr) 22] align(center)[_Going In_]
,[Monday #h(1fr) 22]
,[Tuesday #h(1fr) 23] ,[Tuesday #h(1fr) 23]
,[Wednesday #h(1fr) 24] ,[Wednesday #h(1fr) 24]
,[Thursday #h(1fr) 25] ,[Thursday #h(1fr) 25]
@ -175,12 +172,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q3 #h(1fr) C1], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q3
x: 0.5cm #h(1fr)
)) C1
],
margin: 0.5cm)
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -193,12 +192,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q3 #h(1fr) C2], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q3
x: 0.5cm #h(1fr)
)) C2
],
margin: 0.5cm)
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -211,12 +212,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q3 #h(1fr) C3], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q3
x: 0.5cm #h(1fr)
)) C3
],
margin: 0.5cm)
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -229,16 +232,19 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q3 #h(1fr) Reset Week], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q3
x: 0.5cm #h(1fr)
)) Reset Week
],
margin: 0.5cm)
#table( #table(
columns: (1fr, 1fr, 1fr), columns: (1fr, 1fr, 1fr),
rows: (1fr), rows: (1fr),
align(center)[_Going In_],[Monday #h(1fr) 21] align(center)[_Going In_]
,[Monday #h(1fr) 21]
,[Tuesday #h(1fr) 22] ,[Tuesday #h(1fr) 22]
,[Wednesday #h(1fr) 23] ,[Wednesday #h(1fr) 23]
,[Thursday #h(1fr) 24] ,[Thursday #h(1fr) 24]
@ -250,12 +256,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q4 #h(1fr) C1], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q4
x: 0.5cm #h(1fr)
)) C1
],
margin: 0.5cm)
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -268,12 +276,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q4 #h(1fr) C2], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q4
x: 0.5cm #h(1fr)
)) C2
],
margin: 0.5cm)
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -286,12 +296,14 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q4 #h(1fr) C3], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q4
x: 0.5cm #h(1fr)
)) C3
],
margin: 0.5cm)
#table( #table(
columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
rows: (auto, 1fr), rows: (auto, 1fr),
@ -304,16 +316,19 @@
#set page( #set page(
paper: "a4", paper: "a4",
flipped: true, flipped: true,
header: align(bottom)[Y2026 #h(1fr) Q4 #h(1fr) Reset Week], header: [
margin: ( Y2026
top: 1.5cm, #h(1fr)
bottom: 0.5cm, Q4
x: 0.5cm #h(1fr)
)) Reset Week
],
margin: 0.5cm)
#table( #table(
columns: (1fr, 1fr, 1fr), columns: (1fr, 1fr, 1fr),
rows: (1fr), rows: (1fr),
align(center)[_Going In_],[Monday #h(1fr) 21] align(center)[_Going In_]
,[Monday #h(1fr) 21]
,[Tuesday #h(1fr) 22] ,[Tuesday #h(1fr) 22]
,[Wednesday #h(1fr) 23] ,[Wednesday #h(1fr) 23]
,[Thursday #h(1fr) 24] ,[Thursday #h(1fr) 24]