diff --git a/cal.lisp b/cal.lisp index 449f2a3..3b5fde4 100644 --- a/cal.lisp +++ b/cal.lisp @@ -1,6 +1,9 @@ (load (sb-ext:posix-getenv "ASDF")) +(asdf:load-system 'str) +(asdf:load-system 'alexandria) (asdf:load-system 'cl-dates) + ;; week is 7 days ;; 52 weeks in a year ;; 13 weeks in a quarter @@ -20,22 +23,20 @@ (defun week-number (date) (mod (cl-dates:week-number date) 52)) -(defun write-page-header (stream header-text) - (format stream " +(defun write-page-cycle (stream cl-date year-number quarter-number cycle-number) + (format stream " #set page( paper: \"a4\", flipped: true, - header: align(bottom)[~A], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) - " header-text) - ) - -(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)) + header: [ + Y~d + #h(1fr) + Q~d + #h(1fr) + C~d + ], + margin: 0.5cm) + " year-number quarter-number cycle-number) (format stream "#table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -49,35 +50,45 @@ (format stream ",[#h(1fr) ~A]" (cl-dates:month->string mm)) (format stream ",[#h(1fr) ~d]" dd)))))) (format stream ")~%")) - (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 "#table( - 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 ")~%")) - + (format stream " + #set page( + paper: \"a4\", + flipped: true, + header: [ + Y~d + #h(1fr) + Q~d + #h(1fr) + Reset Week + ], + margin: 0.5cm) + " year-number quarter-number) + (format stream "#table( + 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) (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)) - (with-open-file (stream "main.typ" :direction :output :if-exists :supersede :if-does-not-exist :create) (format stream "/* This is an auto-generated file 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))) (loop for q from 0 to 3 do (write-pages-quarter stream (add-weeks year-start (* q 13)) 2026 (+ q 1))) )) diff --git a/flake.nix b/flake.nix index 7fa1bd1..ad05600 100644 --- a/flake.nix +++ b/flake.nix @@ -33,6 +33,9 @@ inherit (pkgs) lib; sbcl = pkgs.sbcl.withPackages (ps: [ + ps.str + ps.cl-heap + ps.alexandria inputs.cl-dates.packages.x86_64-linux.default ]); diff --git a/main.typ b/main.typ index 1e9d66b..3551d52 100644 --- a/main.typ +++ b/main.typ @@ -4,33 +4,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2025 #h(1fr) Q4 #h(1fr) Reset Week], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) - #table( - columns: (1fr, 1fr, 1fr), - 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 - )) + header: [ + Y2026 + #h(1fr) + Q1 + #h(1fr) + C1 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -43,12 +24,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q1 #h(1fr) C2], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q1 + #h(1fr) + C2 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -61,12 +44,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q1 #h(1fr) C3], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q1 + #h(1fr) + C3 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -79,16 +64,19 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q1 #h(1fr) Reset Week], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q1 + #h(1fr) + Reset Week + ], + margin: 0.5cm) #table( - columns: (1fr, 1fr, 1fr), - rows: (1fr), - align(center)[_Going In_],[Monday #h(1fr) 23] + columns: (1fr, 1fr, 1fr), + rows: (1fr), + align(center)[_Going In_] + ,[Monday #h(1fr) 23] ,[Tuesday #h(1fr) 24] ,[Wednesday #h(1fr) 25] ,[Thursday #h(1fr) 26] @@ -100,12 +88,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q2 #h(1fr) C1], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q2 + #h(1fr) + C1 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -118,12 +108,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q2 #h(1fr) C2], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q2 + #h(1fr) + C2 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -136,12 +128,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q2 #h(1fr) C3], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q2 + #h(1fr) + C3 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -154,16 +148,19 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q2 #h(1fr) Reset Week], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q2 + #h(1fr) + Reset Week + ], + margin: 0.5cm) #table( - columns: (1fr, 1fr, 1fr), - rows: (1fr), - align(center)[_Going In_],[Monday #h(1fr) 22] + columns: (1fr, 1fr, 1fr), + rows: (1fr), + align(center)[_Going In_] + ,[Monday #h(1fr) 22] ,[Tuesday #h(1fr) 23] ,[Wednesday #h(1fr) 24] ,[Thursday #h(1fr) 25] @@ -175,12 +172,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q3 #h(1fr) C1], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q3 + #h(1fr) + C1 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -193,12 +192,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q3 #h(1fr) C2], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q3 + #h(1fr) + C2 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -211,12 +212,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q3 #h(1fr) C3], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q3 + #h(1fr) + C3 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -229,16 +232,19 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q3 #h(1fr) Reset Week], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q3 + #h(1fr) + Reset Week + ], + margin: 0.5cm) #table( - columns: (1fr, 1fr, 1fr), - rows: (1fr), - align(center)[_Going In_],[Monday #h(1fr) 21] + columns: (1fr, 1fr, 1fr), + rows: (1fr), + align(center)[_Going In_] + ,[Monday #h(1fr) 21] ,[Tuesday #h(1fr) 22] ,[Wednesday #h(1fr) 23] ,[Thursday #h(1fr) 24] @@ -250,12 +256,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q4 #h(1fr) C1], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q4 + #h(1fr) + C1 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -268,12 +276,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q4 #h(1fr) C2], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q4 + #h(1fr) + C2 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -286,12 +296,14 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q4 #h(1fr) C3], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q4 + #h(1fr) + C3 + ], + margin: 0.5cm) #table( columns: (auto ,1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr), rows: (auto, 1fr), @@ -304,16 +316,19 @@ #set page( paper: "a4", flipped: true, - header: align(bottom)[Y2026 #h(1fr) Q4 #h(1fr) Reset Week], - margin: ( - top: 1.5cm, - bottom: 0.5cm, - x: 0.5cm - )) + header: [ + Y2026 + #h(1fr) + Q4 + #h(1fr) + Reset Week + ], + margin: 0.5cm) #table( - columns: (1fr, 1fr, 1fr), - rows: (1fr), - align(center)[_Going In_],[Monday #h(1fr) 21] + columns: (1fr, 1fr, 1fr), + rows: (1fr), + align(center)[_Going In_] + ,[Monday #h(1fr) 21] ,[Tuesday #h(1fr) 22] ,[Wednesday #h(1fr) 23] ,[Thursday #h(1fr) 24]