omit fullname function (which is now in pdi_load)
[confetti] / cards / list.sh
1 #!/bin/sh
2
3 . "${_EXEC}"/pdiread.sh
4
5 unescape() { [ $# = 0 ] && sed -E 's;\\(.);\1;g' || printf %s "$*" |sed -E 's;\\(.);\1;g'; }
6 upcase=' y;abcdefghijklmnopqrstuvwxyzäöüé;ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜÉ;; '
7
8 card_item(){
9   local card="$1"
10   local item cnt c
11   shift 1
12
13   for item in $@; do
14     cnt="$(pdi_count "$card" "$item")"
15
16     case $item in
17       FN) printf '[h2 .item .FN ­%s]' "$(pdi_value "$card" FN |unescape |HTML)"
18         ;;
19       GENDER) printf '[span .item .GENDER ­%s]' "$(pdi_value "$card" GENDER |l10n)"
20         ;;
21       NICKNAME) seq 1 $cnt |while read c; do
22           printf '[span .item .NICKNAME ­aka. "%s"]' \
23                  "$(pdi_value "$card" NICKNAME $c |unescape |HTML)"
24         done
25         ;;
26       X-ZACK-JOINDATE|X-ZACK-LEAVEDATE) if [ $cnt -gt 0 ]; then
27           printf '[span .item .%s [b %s:] %s]' \
28                  "$item" "$(l10n "${item}_short")" \
29                  "$(pdi_value "$card" "$item" |HTML)"
30         fi
31         ;;
32       BDAY) if [ $cnt -gt 0 ]; then
33           printf '[span .item .BDAY [b *:] %s]' \
34                  "$(pdi_value "$card" BDAY |grep -xE '[0-9-]+')"
35         fi
36         ;;
37       SOUND) if [ $cnt -gt 0 ]; then
38           printf '[audio .item .SOUND controls="controls"
39                     [source type="audio/ogg" src="data:audio/ogg;base64,%s"]
40                   ]' \
41                  "$(pdi_value "$card" SOUND |grep -xE '[a-zA-Z0-9/+=]+')"
42         fi
43         ;;
44       PHOTO|LOGO) if [ $cnt -gt 0 ]; then 
45           printf '[img .item .%s src="data:image/%s;base64,%s"]' "$item" \
46                  "$(pdi_attrib "$card" "$item" |sed -E 's;^(.*;)?TYPE="?(.+)"?(;.*)?$;\2;')" \
47                  "$(pdi_value "$card" "$item" |grep -xE '[a-zA-Z0-9/+=]+')"
48         fi
49         ;;
50       EMAIL) if [ $cnt -gt 0 ]; then
51           printf '[h3 %s]' "$(l10n EMAIL)"
52           seq 1 $cnt |while read c; do
53             printf '[a .item .EMAIL href="mailto:%s" ­%s]' \
54                    "$(pdi_value "$card" EMAIL $c |unescape |HTML)" \
55                    "$(pdi_value "$card" EMAIL $c |unescape |HTML)"
56           done
57         fi
58         ;;
59       *) if [ $cnt -gt 0 ]; then
60           printf '[h3 %s]' "$(l10n "$item")"
61           seq 1 $cnt |while read c; do
62             printf '[span .item .%s ­%s]' "$item" \
63                    "$(pdi_value "$card" "$item" $c |unescape |HTML)"
64           done
65         fi
66         ;;
67     esac
68   done
69 }
70
71 print_card(){
72   local cardfile="$1"
73   local cachefile="${_DATA}/cache/${cardfile##*/}.cache"
74
75   if [ "$cachefile" -nt "$cardfile" -a "$cachefile" -nt "${_EXEC}/cards" ]; then
76     cat "$cachefile"
77   else
78     local card="$(pdi_load "$cardfile")"
79     tee "$cachefile" <<-EOF
80     [div .card #${cardfile##*/}
81       [div .section .basic &shy;$(
82         card_item "$card" FN GENDER NICKNAME BDAY X-ZACK-JOINDATE X-ZACK-LEAVEDATE SOUND PHOTO LOGO
83       )]
84       [div .section .phone   &shy;$(card_item "$card" TEL)]
85       [div .section .message &shy;$(card_item "$card" EMAIL IMPP URL)]
86       [div .section .address &shy;$(card_item "$card" ADR)]
87       [div .section .note    &shy;$(card_item "$card" NOTE)]
88       [div .section .attendance [h3 $(l10n course_attendance) ] [ul &shy;
89         $(grep -F "     ${cardfile##*/}" "$_DATA/mappings/attendance" |while read each discard; do
90           printf '[li [a .item .attendance href="/courses#%s" &shy;%s]]' \
91                  "$each" \
92                  "$(pdi_value "$(pdi_load "$_DATA/ical/$each")" SUMMARY |unescape |HTML)"
93         done)]
94         $(card_item "$card" CATEGORIES)
95       ]
96       [div .control
97         [a .item href="/cards/${cardfile##*/}?action=edit" $(l10n edit)]
98         [a .item href="/cards/${cardfile##*/}?action=export" $(l10n vcf_export)]
99       ]
100     ]
101         EOF
102   fi
103 }
104
105 filter_cards(){
106   local filter f fex='x;p;'
107
108   filter="$(printf %s "${filter}" \
109             | sed -E 's;[]\/\(\)\\\^\$\?\.\+\*\;\[\{\}];\\\\&;g;
110                       '"$upcase"
111            )^"
112
113   while [ "$filter" ]; do
114     f="${filter%%^*}" filter="${filter#*^}"
115     case $f in
116       '') break
117         ;;
118       ANY:*) fex="/\n.*(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
119         ;;
120       NAME:*) fex="/\n(N|FN|NICKNAME)(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
121         ;;
122       STREET:*|ZIP:*) fex="/\nADR(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
123         ;;
124       *) fex="/\n${f%%:*}(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
125         ;;
126     esac
127   done
128
129   for cardfile in "${_DATA}"/vcard/*.vcf; do
130     printf '%s\n' "$cardfile"
131     cat "$cardfile"
132   done \
133   | sed -En ':X; /\nEND:VCARD\r?$/!{ N; bX; }; h; s;\n.*$;;; x; s;^[^\n]+\n;;;
134              '"$upcase""$fex"
135 }
136
137 order_cards() {
138   local cardfile card
139
140   while read cardfile; do
141     card="$(pdi_load "$cardfile")"
142
143     case $order in
144       firstname)
145         printf '%s      %s\n' "$(pdi_value "$card" FN)" "$cardfile"
146         ;;
147       lastname)
148         printf '%s      %s\n' "$(pdi_value "$card" N || pdi_value "$card" FN)" "$cardfile"
149         ;;
150       bdate)
151         printf '%s      %s\n' "$(pdi_value "$card" BDAY || printf 0000-00-00)" "$cardfile"
152         ;;
153     esac
154   done \
155   | sort \
156   | sed -E 's;^.*\t;;g'
157 }
158
159 list_cards(){
160   filter_cards \
161   | order_cards \
162   | while read cardfile; do
163     print_card "$cardfile"
164   done
165 }