about summary refs log tree commit diff
path: root/Functions/Calendar/calendar_read
blob: ed163887fb63fa1040adbad7365668bf87882a14 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# Utility for "calendar" to read entries into the array calendar_entries.
# This should be local to the caller.
# The only argument is the file to read.  We expect options etc. to
# be correct.
#
# This is based on Emacs calendar syntax, which has two implications:
#  - Lines beginning with whitespace are continuation lines.
#    Hence we have to read the entire file first to determine entries.
#  - Lines beginning with "&" are inhibited from producing marks in
#    Emacs calendar window.  This is irrelevant to us, so we
#    we simply remove leading ampersands.  This is necessary since
#    we expect the date to start at the beginning of the line.
#
# TODO: Emacs has some special handling for entries where the first line
# has only the date and continuation lines indicate times.  Actually,
# it doesn't parse the times as far as I can see, but if we want to
# handle that format sensibly we would need to here.  It could
# be tricky to get right.

local calendar=$1 line
local -a lines

lines=(${(f)"$(<$calendar)"})

calendar_entries=()
# ignore blank lines
for line in $lines; do
  if [[ $line = [[:space:]]* ]]; then
    if (( ${#calendar_entries} )); then
      calendar_entries[-1]+=$'\n'$line
    fi
  else
    calendar_entries+=(${line##\&})
  fi
done