2 # Desc: Prints mediawiki code for a journal month in the bk4 wiki.
3 # Usage: /bin/bash mw_create_month_journal.sh [int year] [int month]
6 # Example: /bin/bash mw_create_month_journal.sh 2023 03 > output.txt
12 yell
() { echo "$0: $*" >&2; } # print script path and all args to stderr
13 die
() { yell
"$*"; exit 111; } # same as yell() but non-zero exit status
14 must
() { "$@" || die
"cannot $*"; } # runs args as command, reports args if command fails
18 if [[ $# -ne 2 ]]; then die
"FATAL:Invalid arg count:$#"; fi;
19 ## Strip leading zeros (because August/octal)
20 yyyy
="$((10#${yyyy}))";
24 if [[ ! $yyyy =~
$re ]]; then die
"FATAL:Invalid year string:$yyyy"; fi;
25 if [[ ! $yyyy -ge 1582 ]]; then die
"FATAL:Invalid year string:$yyyy"; fi;
27 if [[ $mm -lt 1 ]] ||
[[ $mm -gt 12 ]]; then die
"FATAL:Invalid month:$mm"; fi;
32 if [[ $mm -gt 1 ]]; then
35 yyyy_prev
="$((yyyy - 1))";
37 if [[ $mm -lt 12 ]]; then
40 yyyy_next
="$((yyyy + 1))";
43 mm_prev
="$((mm - 1))";
44 mm_next
="$((mm + 1))";
45 if [[ $mm_prev -lt 1 ]]; then mm_prev
="$((mm_prev + 12))"; fi;
46 if [[ $mm_next -gt 12 ]]; then mm_next
="$((mm_next - 12))"; fi;
48 if [[ ! $
((yyyy
% 4)) -eq 0 ]]; then
49 ### Year is not evenly divisible by 4.
51 elif [[ ! $
((yyyy
% 100)) -eq 0 ]]; then
52 ### Year is not evenly divisible by 100.
54 elif [[ ! $
((yyyy
% 400)) -eq 0 ]]; then
55 ### year is not evenly divisible by 400.
58 ### year is divisible by 4, 100, and 400
62 # Form and print header
63 printf "Journal for [[%d]]-%02d. " "$yyyy" "$mm";
64 printf "Preceded by [[%d-%02d]]. " "$yyyy_prev" "$mm_prev";
65 printf "Followed by [[%d-%02d]]. " "$yyyy_next" "$mm_next";
68 printf "==Events==\n";
75 for (( dd=1; dd <= 31; dd++ )); do
76 if [[ $mm -eq 2 ]] && [[ $dd -eq 29 ]] && \
77 [[ $leapyear == "no" ]]; then break; fi;
78 if [[ $mm -eq 2 ]] && [[ $dd -ge 30 ]]; then break; fi;
79 if [[ $mm -eq 4 ]] && [[ $dd -ge 31 ]]; then break; fi;
80 if [[ $mm -eq 6 ]] && [[ $dd -ge 31 ]]; then break; fi;
81 if [[ $mm -eq 9 ]] && [[ $dd -ge 31 ]]; then break; fi;
82 if [[ $mm -eq 11 ]] && [[ $dd -ge 31 ]]; then break; fi;
83 printf "==%4d-%02d-%02d==\n" "$yyyy" "$mm" "$dd";
84 fs_iso8601_alt
="+%G-W%V-%u, %Y-%j, %a"; # alternate ISO-8601 dates
85 date_alt
="$(date --date="$yyyy-$mm-$dd" "$fs_iso8601_alt")";
86 printf "%s\n" "$date_alt";
91 # Form and print footer
95 printf "%s\n%s\n%s\n" "$s1" "$s2" "$s3";
98 printf "==See Also==\n";
101 printf "==Ext. Links==\n";
104 s1
="[[Category:Journals by month]]";