fzf-vcal/fzf-cal
2025-05-30 20:39:19 +02:00

97 lines
2.7 KiB
Bash
Executable File

#!/bin/sh
set -eu
. "$HOME/.config/fzf-vcal/config"
__load_weeks() {
# TODO: Make sensitive to failures. I don't want to miss appointments!
file_weeks=$(mktemp)
find "$ROOT" -type f -name '*.ics' -print0 |
xargs -0 -P0 \
awk -f "src/weeks.awk" >"$file_weeks"
dates=$(awk -F'|' '{ print $1; print $2 }' "$file_weeks")
file_dates=$(mktemp)
echo "$dates" | date --file="/dev/stdin" +"%s" >"$file_dates"
awk -f "src/merge.awk" "$file_dates" "$file_weeks"
rm "$file_weeks" "$file_dates"
}
if [ -z "${WEEKLY_DATA:-}" ]; then
WEEKLY_DATA=$(__load_weeks)
export WEEKLY_DATA
fi
__list() {
weeknr=$(date -d "$DISPLAY_DATE" +"%s")
weeknr=$(((weeknr - 259200) / 604800)) # shift, because epoch origin is a Thursday
files=$(echo "$WEEKLY_DATA" | grep "^$weeknr " | cut -d " " -f 2)
dayofweek=$(date -d "$DISPLAY_DATE" +"%u")
delta=$((1 - dayofweek))
startofweek=$(date -d "$DISPLAY_DATE -$delta days" +"%D")
# loop over files
sef=$({
IFS=';'
set -- $files
for file in "$@"; do
file="$ROOT/$file"
awk -f "src/parse.awk" "$file"
done
})
if [ -n "$sef" ]; then
sef=$(echo "$sef" | while IFS= read -r line; do
set -- $line
starttime="$1"
shift
endtime="$1"
shift
description="$*"
for i in $(seq 0 7); do
daystart=$(date -d "$startofweek +$i days 00:00:00" +"%s")
dayend=$(date -d "$startofweek +$i days 23:59:59" +"%s")
if [ "$starttime" -gt "$daystart" ] && [ "$starttime" -lt "$dayend" ]; then
s=$(date -d "@$starttime" +"%H:%M")
s="$s -"
elif [ "$starttime" -le "$daystart" ] && [ "$endtime" -gt "$daystart" ]; then
s="00:00 -"
else
continue
fi
if [ "$endtime" -gt "$daystart" ] && [ "$endtime" -lt "$dayend" ]; then
e=$(date -d "@$endtime" +"%H:%M")
e="- $e"
elif [ "$endtime" -ge "$dayend" ] && [ "$starttime" -lt "$dayend" ]; then
e="- 00:00"
else
continue
fi
echo "$i $s$e >$description"
done
done)
fi
sef=$({
echo "$sef"
seq 0 7
} | sort -n)
echo "$sef" | awk -v startofweek="$startofweek" -f "src/weekview.awk"
#seq -f "$startofweek +%g days" 0 6 |
# LC_ALL=c xargs -I {} date -d "{}" +"%a %e %b %Y"
}
DISPLAY_DATE="today"
if [ "${1:-}" = "--date" ]; then
DISPLAY_DATE="$2"
echo "Jumping to date $2!"
fi
DISPLAY_DATE=$(date -d "$DISPLAY_DATE" +"%D")
DISPLAY_DATE_PREV=$(date -d "$DISPLAY_DATE -1 week" +"%D")
DISPLAY_DATE_NEXT=$(date -d "$DISPLAY_DATE +1 week" +"%D")
__list |
fzf \
--tac \
--no-sort \
--ansi \
--bind="ctrl-p:become($0 --date '$DISPLAY_DATE_PREV')" \
--bind="ctrl-n:become($0 --date '$DISPLAY_DATE_NEXT')"