--- /dev/null
+#!/bin/sh
+
+. "${_EXEC}"/pdiread.sh
+
+card_fullname(){
+ local card="$1" n1 n2 n3 n4 n5
+
+ local N="$(pdi_value "$card" N)"
+ local FN="$(pdi_value "$card" FN)"
+ local NICKNAME="$(pdi_value "$card" NICKNAME)"
+
+ if [ "$FN" ]; then
+ printf %s "$FN"
+ elif [ "$N" ]; then
+ IFS=\; read n1 n2 n3 n4 n5 <<-EOF
+ $(pdi_value "$card" N)
+ EOF
+ printf '%s %s %s %s %s' "$n4" "$n2" "$n3" "$n1" "$n5"
+ elif [ "$NICKNAME" ]; then
+ printf '"%s"' "$NICKNAME"
+ fi
+}
+
+card_item(){
+ local card="$1"
+ local item cnt c
+ shift 1
+
+ for item in $@; do
+ cnt="$(pdi_count "$card" "$item")"
+
+ case $item in
+ FN) printf '[h2 .item .FN ­%s]' "$(card_fullname "$card" |HTML)"
+ ;;
+ GENDER) printf '[span .item .GENDER ­%s]' "$(pdi_value "$card" GENDER |l10n)"
+ ;;
+ NICKNAME) seq 1 $cnt |while read c; do
+ printf '[span .item .NICKNAME ­aka. "%s"]' \
+ "$(pdi_value "$card" NICKNAME $c |HTML)"
+ done
+ ;;
+ X-ZACK-JOINDATE|X-ZACK-LEAVEDATE) if [ $cnt -gt 0 ]; then
+ printf '[span .item .%s [b %s:] %s]' \
+ "$item" "$(l10n "${item}_short")" \
+ "$(pdi_value "$card" "$item" |HTML)"
+ fi
+ ;;
+ BDAY) if [ $cnt -gt 0 ]; then
+ printf '[span .item .BDAY [b *:] %s]' \
+ "$(pdi_value "$card" BDAY |grep -xE '[0-9-]+')"
+ fi
+ ;;
+ SOUND) if [ $cnt -gt 0 ]; then
+ printf '[audio .item .SOUND controls="controls"
+ [source type="audio/ogg" src="data:audio/ogg;base64,%s"]
+ ]' \
+ "$(pdi_value "$card" SOUND |grep -xE '[a-zA-Z0-9/+=]+')"
+ fi
+ ;;
+ PHOTO|LOGO) if [ $cnt -gt 0 ]; then
+ printf '[img .item .%s src="data:image/%s;base64,%s"]' "$item" \
+ "$(pdi_attrib "$card" "$item" |sed -r 's;^(.*;)?TYPE="?(.+)"?(;.*)?$;\2;')" \
+ "$(pdi_value "$card" "$item" |grep -xE '[a-zA-Z0-9/+=]+')"
+ fi
+ ;;
+ EMAIL) if [ $cnt -gt 0 ]; then
+ printf '[h3 %s]' "$(l10n EMAIL)"
+ seq 1 $cnt |while read c; do
+ printf '[a .item .EMAIL href="mailto:%s" ­%s]' \
+ "$(pdi_value "$card" EMAIL $c |HTML)" \
+ "$(pdi_value "$card" EMAIL $c |HTML)"
+ done
+ fi
+ ;;
+ *) if [ $cnt -gt 0 ]; then
+ printf '[h3 %s]' "$(l10n "$item")"
+ seq 1 $cnt |while read c; do
+ printf '[span .item .%s ­%s]' "$item" \
+ "$(pdi_value "$card" "$item" $c |HTML)"
+ done
+ fi
+ ;;
+ esac
+ done
+}
+
+print_card(){
+ local cardfile="$1"
+ local cachefile="${_DATA}/cache/${cardfile##*/}.cache"
+
+ if [ "$cachefile" -nt "$cardfile" -a "$cachefile" -nt "${_EXEC}/cards" ]; then
+ cat "$cachefile"
+ else
+ local card="$(pdi_load "$cardfile")"
+ tee "$cachefile" <<-EOF
+ [div .card #${cardfile##*/}
+ [div .section .basic ­$(
+ card_item "$card" FN GENDER NICKNAME BDAY X-ZACK-JOINDATE X-ZACK-LEAVEDATE SOUND PHOTO LOGO
+ )]
+ [div .section .phone ­$(card_item "$card" TEL)]
+ [div .section .message ­$(card_item "$card" EMAIL IMPP URL)]
+ [div .section .address ­$(card_item "$card" ADR)]
+ [div .section .note ­$(card_item "$card" NOTE)]
+ [div .section .attendance [h3 $(l10n course_attendance) ] [ul ­
+ $(grep -F " ${cardfile##*/}" "$_DATA/mappings/attendance" |while read each discard; do
+ printf '[li [a .item .attendance href="/courses#%s" ­%s]]' \
+ "$each" \
+ "$(pdi_value "$(pdi_load "$_DATA/ical/$each")" SUMMARY |HTML)"
+ done)]
+ $(card_item "$card" CATEGORIES)
+ ]
+ [div .control
+ [a .item href="/cards/${cardfile##*/}?action=edit" $(l10n edit)]
+ [a .item href="/cards/${cardfile##*/}?action=export" $(l10n vcf_export)]
+ ]
+ ]
+ EOF
+ fi
+}
+
+list_cards(){
+ for cardfile in "${_DATA}"/vcard/*.vcf; do
+ print_card "$cardfile"
+ done
+}
+++ /dev/null
-# Copyright 2014 - 2017 Paul Hänsch
-#
-# This file is part of Confetti.
-#
-# Confetti is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Confetti is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with Confetti. If not, see <http://www.gnu.org/licenses/>.
-
-list_items(){
- item="$1"
- [ -n "${values[$item]+x}" ] && \
- printf '<h3>%s</h3>\n' "$(l10n $item)"
- for n in "$item" "$item"{0..100}; do
- if [ -z "${values[$n]+x}" ]; then
- break
- else case "$item" in
- EMAIL)
- printf '<a class="item EMAIL" href="mailto:%s">%s</a>\n' \
- "$(attribsafe "${values[$n]}")" "$(htmlsafe "${values[$n]}")"
- ;;
- *)
- printf '<span class="item %s">%s</span>\n' \
- "$item" "$(htmlsafe ${values[$n]})"
- ;;
- esac; fi
- done
-}
-
-list_section(){
- printf '<div class="section %s">' "$1"
- shift 1
- for each in $@; do
- list_items "$each"
- done
- printf '</div>'
-}
-
-n=$(printf %s "$values[N+3] $values[N+1] $values[N+2] $values[N+0] $values[N+4]" \
- | sed -r ':X;$!{N;bX}; s;^[\n ]+;;; s;[\n ]+$;;; s;[\r\t\n ]+; ;g;'
- )
-fullname="${n:-${values[FN]:-${values[NICKNAME]}}}"
-
-hi_company="${values[X-HEALTH-INSURANCE+0]}"
- hi_number="${values[X-HEALTH-INSURANCE+1]}"
- hi_status="${values[X-HEALTH-INSURANCE+2]}"
-
-printf '<div class="section basic">
- <h2 class="item FN">%s</h2>
-' "$fullname"
-[ -n "$values[GENDER]" ] && printf '
- <span class="item GENDER">%s</span>
- ' "$(l10n "$values[GENDER]")"
-
-for n in NICKNAME NICKNAME{0..100}; do
- [ -z "${values[$n]+x}" ] && break \
- || printf '
- <span class="item NICKNAME">aka. %s</span>
- ' "$(htmlsafe ${values[$n]})"
-done
-
-[ -n "$values[BDAY]" ] && printf '
- <span class="item BDAY"><b>*:</b> %s</span>
- ' "$(htmlsafe "$values[BDAY]")"
-[ -n "$values[X-ZACK-JOINDATE]" ] && printf '
- <span class="item X-ZACK-JOINDATE"><b>%s:</b> %s</span>
- ' "$(l10n label_join)" "$(htmlsafe "$values[X-ZACK-JOINDATE]")"
-[ -n "$values[X-ZACK-LEAVEDATE]" ] && printf '
- <span class="item X-ZACK-LEAVEDATE"><b>%s:</b >%s</span>
- ' "$(l10n label_leave)" "$(htmlsafe "$values[X-ZACK-LEAVEDATE]")"
-
-[ -n "$values[SOUND]" ] && printf '
- <audio controls="controls" class="item SOUND">
- <source type="audio/ogg" src="data:audio/ogg;base64,%s" />
- </audio>' "$values[SOUND]"
-
-[ -n "$values[PHOTO]" ] && printf '
- <img class="item PHOTO" src="data:image/%s;base64,%s" />
- ' "${values[PHOTO_TYPE]}" "${values[PHOTO]}"
-
-[ -n "$values[LOGO]" ] && printf '
- <img class="item PHOTO" src="data:image/%s;base64,%s" />
- ' "${values[LOGO_TYPE]}" "${values[LOGO]}"
-
-if [ "$PROFILE" = circus ]; then
- printf '</div>'
-
- list_section phone TEL
- list_section message EMAIL IMPP URL
- list_section address ADR
- list_section note NOTE
-
- printf '<div class="section attendance"><h3>%s</h3><ul>' "$(l10n course_attendance)"
- sed -rn 's:(.*)\t'"$id"'$:\1:p' "$_DATA/mappings/attendance" |while read each; do
- cname="$(sed -rn 's:^SUMMARY\:(.*)$:\1:p' "$_DATA/ical/$each")"
- printf ' <li><a class="item attendance" href="?p=courses#%s">%s</a></li>' "$each" "$(htmlsafe $cname)"
- done
- printf '</ul>'
- list_items CATEGORIES
- printf '</div>'
-
-elif [ "$PROFILE" = medical ]; then
- list_items ADR
- list_items URL
- printf '</div>'
-
- list_section phone TEL EMAIL IMPP
-
- printf '<div class="section insurance"><h3>%s</h3>' "$(l10n X-HEALTH-INSURANCE)"
- [ -n "$hi_company" ] && printf '<span class="item hi_comapany">%s</span>' \
- "$(htmlsafe "$hi_company")"
- [ -n "$hi_number" ] && printf '<span class="item hi_number"><label>%s:</label> %s</span>' \
- "$(l10n hi_number)" "$(htmlsafe "$hi_number")"
- [ -n "$hi_status" ] && printf '<span class="item hi_status"><label>%s:</label> %s</span>' \
- "$(l10n hi_status)" "$(htmlsafe "$hi_status")"
- printf '</div>'
-
- list_section note NOTE X-CLIENT-REFERRAL
-
- printf '<div class="section prescriptions"><h3>%s</h3><ul>' "$(l10n prescriptions)"
- declare -A mpx
- find "$_DATA/prescriptions/" -name "${id%.vcf}.*.mpx" \
- | while read pfile; do
- mpx=(); cat "$pfile" |while read -r line; do
- val="${line#*:}"
- mpx[${line%%:*}]="$(htmlsafe "${val//\\n/$BR}")"
- done
- printf '<li><a href="?p=prescriptions&client=%s#%s" >%s: %s - %s</a></li>' \
- "${id}" "${pfile##*/}" "${mpx[date]}" "${mpx[indicator]}" \
- "$([ -n "${mpx[remidy]}" ] && printf '%s %s' "${mpx[quantity]}" "${mpx[remidy]}"
- for n in {0..10}; do
- [ -n "${mpx[remidy${n}]}" ] && printf ', %s %s' "${mpx[quantity${n}]}" "${mpx[remidy${n}]}"
- done
- )"
- done |sort -r
- printf '</ul></div>'
-fi