externalise cgi engine
[confetti] / actions / generate_courselist.sh
1 #!/bin/zsh
2
3 # Copyright 2014 Paul Hänsch
4 #
5 # This file is part of Confetti.
6
7 # Confetti is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11
12 # Confetti is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU Affero General Public License for more details.
16
17 # You should have received a copy of the GNU Affero General Public License
18 # along with Confetti.  If not, see <http://www.gnu.org/licenses/>. 
19
20 pdflatex="$(where pdflatex |head -n1 || echo false)"
21 course="$_GET[\"course\"]"
22 fromdate=$_GET['fromdate']
23 fromdate=$(date -d "$fromdate" +%s)
24 [ -z "$fromdate" ] && fromdate=$(date +%s)
25
26 . ${_EXEC}/pages/courses.sh loadfunctions
27 . ${_EXEC}/pages/attendees.sh loadfunctions
28
29 tex_clean() { #in dire need for improvement
30   echo "$*" |tr -d '{&}\'
31 }
32
33
34 list_attendee() {  #Parameter: Cardfile
35   id="$1"
36   cardfile="$_DATA/vcard/${id}"
37   unset key
38
39   declare -A tags
40   declare -A values
41   vcf_parse "$cardfile" |while read -r line; do
42     declare -A tag
43     case "$line" in
44       value*) eval "$line";;
45       tag*)   eval "$line";;
46       key*)
47         if [ -z "$key" ]; then
48           eval "$line"
49         else
50           values[$key]="$(tex_clean "$value")"
51           for t in ${(k)tag}; do
52             tags[${key}_$t]="$tag[$t]"
53           done
54           eval "$line"
55           if [ -n "$values[$key]" ]; then
56             n=0
57             while [ -n "$values[$key$n]" ]; do n=$(($n + 1)); done
58             key=$key$n
59           fi
60           unset value
61           unset tag
62         fi
63       ;;
64     esac
65   done
66
67   tel=''
68   for n in TEL TEL{0..10}; do if (echo "$values[$n]" |grep -Eq '[0-9]'); then
69     [ -n "$tel" ] && tel="$tel\\newline $values[$n]" || tel="$values[$n]"
70   fi; done
71   note=''
72   for n in NOTE NOTE{0..10}; do if [ -n "$values[$n]" ]; then
73     [ -n "$note" ] && note="$note\\newline $values[$n]" || note="$values[$n]"
74   fi; done
75   echo -E "$values[FN] & $values[BDAY] & $tel & $note"
76 }
77
78 get_dates() {  #Parameter: Calendarfile
79   calendarfile="$_DATA/ical/$course"
80   unset key
81
82   declare -A tags
83   declare -A values
84   ics_parse "$calendarfile" |while read -r line; do
85     declare -A tag
86     case "$line" in
87       value*) eval "$line";;
88       tag*)   eval "$line";;
89       key*)
90         if [ -z "$key" ]; then
91           eval "$line"
92         else
93           values[$key]="$(tex_clean "$value")"
94           for t in ${(k)tag}; do
95             tags[${key}_$t]="$tag[$t]"
96           done
97           eval "$line"
98           if [ -n "$values[$key]" ]; then
99             n=0
100             while [ -n "$values[$key$n]" ]; do n=$(($n + 1)); done
101             key=$key$n
102           fi
103           unset value
104           unset tag
105         fi
106       ;;
107     esac
108   done
109
110   dtstart="$values[DTSTART]"
111   [ -z "$dtstart" ] && dtstart=$(date +%Y%m%dT%H%M%S)
112   echo "$dtstart" |case "$dtstart" in
113     *Z)    sed -rn 's:^([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2})([0-9]{2})([0-9]{2})Z$:\1-\2-\3 \4\:\5\:\6 UTC:p';;
114     TZID*) sed -rn 's:^TZID=(.+)\:([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2})([0-9]{2})([0-9]{2})$:TZ="\1" \2-\3-\4 \5\:\6\:\7:p';;
115     *)     sed -rn 's:^([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2})([0-9]{2})([0-9]{2})$:\1-\2-\3 \4\:\5\:\6:p';;
116   esac |read dts_date
117   rrule="$values[RRULE]"
118   rr_int="$(echo $rrule |sed -rn 's:^.*INTERVAL=([0-9]+)(;.*)?$:\1:p')"
119   rr_freq="$(echo $rrule |sed -rn 's:^.*FREQ=(YEARLY|MONTHLY|WEEKLY|DAILY)(;.*)?$:\1:p')"
120   case "$rr_freq" in;
121     YEARLY) rec="$rr_int year";;
122     MONTHLY) rec="$rr_int month";;
123     DAILY) rec="$rr_int day";;
124     *) rec="$rr_int week";;
125   esac
126
127   next_date="$dts_date"
128   n=10
129   while [ $n -gt 0 ]; do
130     if [ "$(date -d "$next_date" +%s)" -gt "$(date +%s)" ]; then
131       dtlist="$dtlist & $(date -d "$next_date" +"%d. %b.")"
132       n=$(($n - 1))
133     fi
134     next_date="$(date -d "$next_date + $rec" +%Y-%m-%d)"
135   done
136
137   echo "$dtlist"
138 }
139
140 if [ -r "${_DATA}/ical/${course}" ]; then
141   . ${_EXEC}/templates/course_print.sh >"${_DATA}/temp/courselist_${course}.tex"
142   [ -e "${_DATA}/temp/courselist_${course}.pdf" ] && rm "${_DATA}/temp/courselist_${course}.pdf"
143   "$pdflatex" -halt-on-error -output-directory "${_DATA}/temp/" "${_DATA}/temp/courselist_${course}.tex" |debug >/dev/null
144   "$pdflatex" -halt-on-error -output-directory "${_DATA}/temp/" "${_DATA}/temp/courselist_${course}.tex" |debug >/dev/null
145 fi
146 if [ -r "${_DATA}/temp/courselist_${course}.pdf" ]; then
147   echo 'Content-Type: application/x-pdf\n'
148   cat "${_DATA}/temp/courselist_${course}.pdf"
149 fi