97 lines
2.7 KiB
Bash
Executable File
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')"
|