visual updates, allow ordering of vcards
[confetti] / pages / attendees.sh
1 #!/bin/sh
2
3 [ "$_GET[\"choice\"]" = "del_filter" ] && _GET["filter"]="" && _GET["filtertype"]="" 
4 listcards() {
5   case "$_GET[\"filtertype\"]" in
6     any)
7        grep -il "$_GET[\"filter\"]" ${_DATA}/vcard/*vcf
8       ;;
9     name)
10        egrep -xil "(FN|NICKNAME|N)(;.+)*:.*$_GET[\"filter\"].*" ${_DATA}/vcard/*vcf
11       ;;
12     street)
13        egrep -xil "(ADR)(;.+)*:([^;]*;){2}$_GET[\"filter\"].*" ${_DATA}/vcard/*vcf
14       ;;
15     zip)
16        egrep -xil "(ADR)(;.+)*:([^;]*;){5}$_GET[\"filter\"].*" ${_DATA}/vcard/*vcf
17       ;;
18     telephone)
19        egrep -xil "(TEL)(;.+)*:.*$_GET[\"filter\"].*" ${_DATA}/vcard/*vcf
20       ;;
21     birth)
22        egrep -xil "(BDAY)(;.+)*:$_GET[\"filter\"].*" ${_DATA}/vcard/*vcf
23       ;;
24     course)
25       ;;
26     *) ls -1 ${_DATA}/vcard/*vcf
27       ;;
28   esac |case "$_GET[\"order\"]" in
29     firstname)
30       while read file; do
31         fn=$(sed -rn 's:^N(;.+)*\:([^;]*;){1} *([^;]*).*$:\3:p' "$file")
32         echo "$fn\t$file"
33       done
34       ;;
35     lastname)
36       while read file; do
37         ln=$(sed -rn 's:^N(;.+)*\:([^;]*;){0} *([^;]*).*$:\3:p' "$file")
38         echo "$ln\t$file"
39       done
40       ;;
41     bdate)
42       while read file; do
43         bd=$(sed -rn 's:^BDAY(;.+)*\:(.*)$:\2:p' "$file")
44         echo "$bd\t$file"
45       done
46       ;;
47     *)
48       sed -r 's:^.*$:x\t&:'
49       ;;
50   esac |sort |sed -r 's:^.*\t(.*/)([^/]+)$:\2:'
51 }
52
53 vcf_parse() {
54   tr -d '\n' <"$1" |sed -r 's:\r ::g;s:\r:\n:g' \
55   | sed -rn '
56     s:^PHOTO:001 PHOTO:p;
57     s:^X-MS-CARDPICTURE:001 PHOTO:p;
58     s:^LOGO:002 LOGO:p;
59     s:^FN:003 FN:p;
60     s:^N[\:;]:004 &:p
61     s:^NICKNAME:005 NICKNAME:p;
62     s:^SOUND:006 SOUND:p;
63     s:^GENDER:007 GENDER:p;
64     s:^X-GENDER:007 GENDER:p;
65     s:^KIND:008 KIND:p;
66     s:^TITLE:009 TITLE:p;
67     s:^ROLE:010 ROLE:p;
68     s:^ORG:011 ORG:p;
69     s:^MEMBER:012 MEMBER:p;
70     s:^CATEGORIES:013 CATEGORIES:p;
71     s:^ANNIVERSARY:014 ANNIVERSARY:p;
72     s:^X-ANNIVERSARY:014 ANNIVERSARY:p;
73     s:^X-EVOLUTION-ANNIVERSARY:014 ANNIVERSARY:p;
74     s:^X-KADDRESSBOOK-X-Anniversary:014 ANNIVERSARY:p;
75     s:^BDAY:015 BDAY:p;
76     s:^EMAIL:016 EMAIL:p;
77     s:^TEL:017 TEL:p;
78     s:^IMPP:018 IMPP:p;
79     s:^X-AIM(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:aim\:\2:p;
80     s:^X-ICQ(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:aim\:\2:p;
81     s:^X-GOOGLE-TALK(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:xmpp\:\2:p;
82     s:^X-JABBER(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:xmpp\:\2:p;
83     s:^X-MSN(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:msn\:\2:p;
84     s:^X-YAHOO(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:ymsgr\:\2:p;
85     s:^X-SIP(;[^"\:]+|;"[^"]+")*\:(sip\:)?(.*)$:018 IMPP\1\:sip\:\3:p;
86     s:^ADR:019 ADR:p;
87     s:^LABEL(;[^"\:]+|;"[^"]+")*\:(.*)$:019 ADR;LABEL="\2"\1\::p;
88     s:^URL:021 URL:p;
89     s:^X-EVOLUTION-BLOG-URL:021 URL:p;
90     s:^LANG:022 LANG:p;
91     s:^NOTE:023 NOTE:p;
92     s:^UID:026 UID:p;
93
94     s:^RELATED:025 RELATED:p;
95     s:^AGENT:025 RELATED\;TYPE=agent:p;
96     s:^X-ASSISTANT:025 RELATED\;TYPE=assistant;VALUE=text:p;
97     s:^X-EVOLUTION-ASSISTANT:025 RELATED\;TYPE=assistant;VALUE=text:p;
98     s:^X-KADDRESSBOOK-X-AssistantsName:025 RELATED\;TYPE=assistant;VALUE=text:p;
99     s:^X-MANAGER:025 RELATED\;TYPE=manager;VALUE=text:p;
100     s:^X-EVOLUTION-MANAGER:025 RELATED\;TYPE=manager;VALUE=text:p;
101     s:^X-KADDRESSBOOK-X-ManagersName:025 RELATED\;TYPE=manager;VALUE=text:p;
102     s:^X-SPOUSE:025 RELATED\;TYPE=spouse;VALUE=text:p;
103     s:^X-EVOLUTION-SPOUSE:025 RELATED\;TYPE=spouse;VALUE=text:p;
104     s:^X-KADDRESSBOOK-X-SpouseName:025 RELATED\;TYPE=spouse;VALUE=text:p;
105
106     s:^BEGIN.*$:000 &:p;
107     s:^CALADRURI.*$::;
108     s:^CALURI.*$::;
109     s:^CLASS.*$::;
110     s:^CLIENTPIDMAP.*$::;
111     s:^END.*$:100 &:p;
112     s:^FBURL.*$::;
113     s:^GEO.*$::;
114     s:^MAILER.*$::;
115     s:^NAME.*$::;
116     s:^PRODID.*$::;
117     s:^PROFILE.*$::;
118     s:^REV.*$::;
119     s:^SORT-STRING.*$::;
120     s:^SOURCE.*$::;
121     s:^TZ.*$::;
122     s:^VERSION.*$:000 VERSION\:4.0:p;
123     s:^XML.*$::;
124
125     s:^([A-Z].*)$:024 \1:p;
126     ' \
127   |sort |while read -r line; do
128     case "$line" in
129       00[012]*)
130         echo -E "$line"
131         ;;
132       003*)
133         fn=$(echo -E "$line" |sed -r 's:^[0-9]{3} ([^;\:]+)(;[^"\:]+|;"[^"]+")*\:(.*)$:\3:g' |tr -d '\r')
134         ;;
135       004*)
136         n=$(echo -E "$line" \
137           |sed -rn 's:^([0-9]{3} )([^;\:]+)(;[^"\:]+|;"[^"]+")*\:([^;]*)(\;[^;]*)(\;[^;]*)?(\;[^;]*)?(\;[^;]*)?$:\7 \5 \6 \4 \8:gp' \
138           |sed -r 's:,: :;s:\;: :g;s: +: :g' \
139           |tr -d '\r'
140         )
141         echo -E "$line"
142         ;;
143       005*)
144         nick=$(echo -E "$line" |sed -r 's:^[0-9]{3} ([^;\:]+)(;[^"\:]+|;"[^"]+")*\:(.*)$:\3:g' |tr -d '\r')
145         echo -E "$line"
146         ;;
147       *)
148         [ -n "$n" ] && fn="$n"
149         #[ -n "$fn" -a -n "$nick" ] && fn="$fn aka. $nick"
150         [ -n "$fn" ] && echo -E "003 FN:$fn" \
151                       || echo -E "003 FN:$nick"
152         echo -E "$line"
153         cat
154         ;;
155     esac
156   done |tr -d '\r' \
157   | sed -r 's:^[0-9]{3} ([^;\:]+)(;[^"\:]+|;"[^"]+")*\:(.*)$:key="\1"\nvalue="\3"\ntag=\2:g' \
158   | while read -r line; do
159     case "$line" in
160       key=*) echo -E "$line"
161         ;;
162       value=*) echo -E "$line"
163         ;;
164       tag=*) ot=''
165              echo -E "$line" \
166              | sed -r 's:^tag=::;s:\;([A-Z+_-]+="[^"]+"|[A-Z+_-]+=[^\;]+):\n\1:g;' \
167              | sed -r 's:([A-Z+_-]+)="?(.*)"?:tag\[\1\]="\2":g' \
168              | sed -r '/^ *$/d' \
169              | sort |while read -r tag; do
170                nt="$(echo -E "$tag" |sed -r 's:^tag\[([A-Z+_-]+)\]="(.*)"$:\1:')"
171                nv="$(echo -E "$tag" |sed -r 's:^tag\[([A-Z+_-]+)\]="(.*)"$:\2:')"
172                [ "$nt" = "$ot" ] && vl="$nv,$vl" || vl="$nv"
173                echo -E "tag[$nt]=\"$vl\""
174                ot="$nt"
175              done
176         ;;
177     esac
178   done
179 }
180
181 view_attendee() {  #Parameter: Cardfile
182   id="$1"
183   cardfile="$_DATA/vcard/${id}"
184   cachefile="$_DATA/cache/${id}.cache"
185   unset key
186   if [ "$cachefile" -nt "$cardfile" ]; then
187     cat "$cachefile"
188   else
189     declare -A tags
190     declare -A values
191     vcf_parse "$cardfile" |while read -r line; do
192       declare -A tag
193       case "$line" in
194         value*) eval "$line";;
195         tag*)   eval "$line";;
196         key*)
197           if [ -z "$key" ]; then
198             eval "$line"
199           else
200             values[$key]="$value"
201             for t in ${(k)tag}; do
202               tags[${key}_$t]="$tag[$t]"
203             done
204             eval "$line"
205             if [ -n "$values[$key]" ]; then
206               n=0
207               while [ -n "$values[$key$n]" ]; do n=$(($n + 1)); done
208               key=$key$n
209             fi
210             unset value
211             unset tag
212           fi
213         ;;
214       esac
215     done
216     . ${_EXEC}/templates/view_attendee.sh |tee "$cachefile"
217   fi
218 }
219
220 edit_attendee() {  #Parameter: Cardfile
221   id="$1"
222   cardfile="$_DATA/vcard/$id"
223   tempfile="$_DATA/temp/$id"
224   [ -f "$tempfile" ] && cardfile="$tempfile"
225   unset key
226
227   declare -A tags
228   declare -A values
229   vcf_parse "$cardfile" |while read -r line; do
230     declare -A tag
231     case "$line" in
232       value*) eval "$line";;
233       tag*)   eval "$line";;
234       key*)
235         if [ -z "$key" ]; then
236           eval "$line"
237         else
238           [ -n "$value" ] && values[$key]="$value" || values[$key]='\r'
239           for t in ${(k)tag}; do
240             tags[${key}_$t]="$tag[$t]"
241           done
242           eval "$line"
243           if [ -n "$values[$key]" ]; then
244             n=0
245             while [ -n "$values[${key}${n}]" ]; do n=$(($n + 1)); done
246             key=$key$n
247           fi
248             unset value
249             unset tag
250         fi
251       ;;
252     esac
253   done
254   . ${_EXEC}/templates/edit_attendee.sh
255 }
256
257 case "$1" in
258   title)
259     echo "Teilnehmende"
260   ;;
261   css)
262     . ${_EXEC}/templates/attendees.css.sh
263   ;;
264   body)
265     . ${_EXEC}/templates/text_attendee.sh
266     . ${_EXEC}/templates/attendees.html.sh
267   ;;
268 esac
269