#!/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')"