X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;f=macros%2Fcalendar;h=66dcf1f5664fffc0cd629bf09542ab5248e7a89f;hb=11ae66b8f347ea9714716b558ba98a7524f9afb8;hp=e2fa8aa6820b9bdd4e96068e35a355a91bd0c1ee;hpb=71c5f8ed8020d14fa73c084a14fe3082a3977000;p=shellwiki diff --git a/macros/calendar b/macros/calendar index e2fa8aa..66dcf1f 100755 --- a/macros/calendar +++ b/macros/calendar @@ -43,7 +43,7 @@ while [ $# -gt 0 ]; do case $1 in fi;; esac; done -[ "$*" ] || set -- "*" +[ "$*" ] || set -- "." [ "$depth" -ge 0 -o "$depth" -le 0 ] 2>&- || depth=0 read DY DM DD <<-EOF @@ -68,6 +68,7 @@ rrexpand() { local junk1 start end rrfreq rrint rrend evtitle evlink junk2 while read -r junk1 start end rrfreq rrint rrend evtitle evlink junk2; do + [ ! "$start" ] && continue # empty line [ "$rrend" -eq -1 ] && rrend=9999999999 if [ "$start" -lt "$dend" ] && @@ -77,6 +78,10 @@ rrexpand() { week) rrex_week;; month) rrex_month;; year) rrex_year;; + weekday) + [ "$rrfreq" -ge 0 ] && rrex_weekday \ + || rrex_lastweekday + ;; *): printf '%i %i %s %s\n' "$start" "$end" "$evtitle" "$evlink" ;; @@ -172,6 +177,48 @@ rrex_year() { done } +rrex_weekday() { + # helper for rrexpand: Nth weekday of a month (e.g. 2nd tuesday, etc.) + local nstart nend + + nth=$(( ( $(date -ud @$start +%_d) - 1) / 7)) + + nend=$(( 0 * 604800 - (dstart - end) % 604800 + dstart )) + nstart=$(( start - end + nend)) + + while [ "$nstart" -lt "$rrend" -a "$nstart" -lt "$dend" ]; do + [ "$nstart" -ge "$start" -a "$nstart" -ge "$dstart" ] \ + && [ "$(( ( $(date -ud @$nstart +%_d) -1) / 7 ))" -eq "$nth" ] \ + && printf '%i %i %s %s\n' "$nstart" "$nend" "$evtitle" "$evlink" + nstart="$((nstart + 7 * 86400))" + nend="$((nstart - start + end))" + done +} + +rrex_lastweekday() { + # helper for rrexpand: Nth last weekday of a month (e.g. 2nd last tuesday, etc.) + local nstart nend Y m d nth + + read Y m d <<-EOF + $(date -ud @$start +"%Y %_m %_d") + EOF + nth=$(( ( $(numdays $Y $m) - d ) / 7)) + + nend=$(( 0 * 604800 - (dstart - end) % 604800 + dstart )) + nstart=$(( start - end + nend)) + + while [ "$nstart" -lt "$rrend" -a "$nstart" -lt "$dend" ]; do + read Y m d <<-EOF + $(date -ud @$nstart +"%Y %_m %_d") + EOF + [ "$nstart" -ge "$start" -a "$nstart" -ge "$dstart" ] \ + && [ "$(( ( $(numdays $Y $m) - d ) / 7 ))" -eq "$nth" ] \ + && printf '%i %i %s %s\n' "$nstart" "$nend" "$evtitle" "$evlink" + nstart="$((nstart + 7 * 86400))" + nend="$((nstart - start + end))" + done +} + events="$( for dir in "$@"; do page_glob "$dir" "$depth" @@ -228,7 +275,6 @@ cal_month() { dcnt=$((iday - idow * 86400 + ws * 86400)) dow=$ws dcal="$(date -ud @"$dcnt" +%d)" - events="$( printf %s\\n "$events" \ | rrexpand "$dcnt" "$((dcnt + 42 * 86400))" \ @@ -245,7 +291,7 @@ cal_month() { printf '' "$dcal" evlist="$( - printf %s\\n "$events" \ + printf %s "${events}${events:+${BR}}" \ | while read start end title link; do if [ "$((start / 86400))" -lt "$((dcnt / 86400))" -a "$end" -gt "$dcnt" ]; then printf '
  • %s
  • ' \ @@ -253,7 +299,7 @@ cal_month() { "$(UNSTRING "${link#*#}" |URL)" \ "$(UNSTRING "$title" |HTML)" elif [ "$((start / 86400))" -eq "$((dcnt / 86400))" ]; then - printf '
  • %s - %s
  • ' \ + printf '
  • %s - %s
  • ' \ "$(date -ud @"$start" +%H:%M)" \ "$(UNSTRING "${link%%#*}" |URL)" \ "$(UNSTRING "${link#*#}" |URL)" \ @@ -277,5 +323,5 @@ cal_month() { printf '' } -%rem cal_list +# cal_list cal_month