X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;ds=sidebyside;f=cards%2Flist.sh;h=677519113d01e96c6a4c75c8ea0db260d2ebbc70;hb=e090b8bd26739537e895d60b931f82b64d8db6c4;hp=cb33637cdbc36c5f4ca7e2166c8c572dc2302653;hpb=6655ac8dd9a786d394d628fed0fbc6e6008078c1;p=confetti diff --git a/cards/list.sh b/cards/list.sh index cb33637..6775191 100755 --- a/cards/list.sh +++ b/cards/list.sh @@ -2,25 +2,25 @@ . "${_EXEC}"/pdiread.sh -card_fullname(){ - local card="$1" n1 n2 n3 n4 n5 +unescape() { [ $# = 0 ] && sed -E 's;\\(.);\1;g' || printf %s "$*" |sed -E 's;\\(.);\1;g'; } +upcase=' y;abcdefghijklmnopqrstuvwxyzäöüé;ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜÉ;; ' - local N="$(pdi_value "$card" N)" - local FN="$(pdi_value "$card" FN)" - local NICKNAME="$(pdi_value "$card" NICKNAME)" +card_fullname(){ + local card="$1" N n1 n2 n3 n4 n5 - if [ "$FN" ]; then - printf %s "$FN" - elif [ "$N" ]; then + if pdi_value "$card" FN; then + return + elif N="$(pdi_value "$card" 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" + else + pdi_value "$card" NICKNAME fi } + card_item(){ local card="$1" local item cnt c @@ -30,13 +30,13 @@ card_item(){ cnt="$(pdi_count "$card" "$item")" case $item in - FN) printf '[h2 .item .FN ­%s]' "$(card_fullname "$card" |HTML)" + FN) printf '[h2 .item .FN ­%s]' "$(card_fullname "$card" |unescape |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)" + "$(pdi_value "$card" NICKNAME $c |unescape |HTML)" done ;; X-ZACK-JOINDATE|X-ZACK-LEAVEDATE) if [ $cnt -gt 0 ]; then @@ -59,7 +59,7 @@ card_item(){ ;; 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_attrib "$card" "$item" |sed -E 's;^(.*;)?TYPE="?(.+)"?(;.*)?$;\2;')" \ "$(pdi_value "$card" "$item" |grep -xE '[a-zA-Z0-9/+=]+')" fi ;; @@ -67,8 +67,8 @@ card_item(){ 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)" + "$(pdi_value "$card" EMAIL $c |unescape |HTML)" \ + "$(pdi_value "$card" EMAIL $c |unescape |HTML)" done fi ;; @@ -76,7 +76,7 @@ card_item(){ printf '[h3 %s]' "$(l10n "$item")" seq 1 $cnt |while read c; do printf '[span .item .%s ­%s]' "$item" \ - "$(pdi_value "$card" "$item" $c |HTML)" + "$(pdi_value "$card" "$item" $c |unescape |HTML)" done fi ;; @@ -105,7 +105,7 @@ print_card(){ $(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)" + "$(pdi_value "$(pdi_load "$_DATA/ical/$each")" SUMMARY |unescape |HTML)" done)] $(card_item "$card" CATEGORIES) ] @@ -118,8 +118,65 @@ print_card(){ fi } -list_cards(){ +filter_cards(){ + local filter f fex='x;p;' + + filter="$(printf %s "${filter}" \ + | sed -E 's;[]\/\(\)\\\^\$\?\.\+\*\;\[\{\}];\\\\&;g; + '"$upcase" + )^" + + while [ "$filter" ]; do + f="${filter%%^*}" filter="${filter#*^}" + case $f in + '') break + ;; + ANY:*) fex="/\n.*(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}" + ;; + NAME:*) fex="/\n(N|FN|NICKNAME)(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}" + ;; + STREET:*|ZIP:*) fex="/\nADR(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}" + ;; + *) fex="/\n${f%%:*}(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}" + ;; + esac + done + for cardfile in "${_DATA}"/vcard/*.vcf; do + printf '%s\n' "$cardfile" + cat "$cardfile" + done \ + | sed -En ':X; /\nEND:VCARD\r?$/!{ N; bX; }; h; s;\n.*$;;; x; s;^[^\n]+\n;;; + '"$upcase""$fex" +} + +order_cards() { + local cardfile card + echo ORDER $order >&2 + + while read cardfile; do + card="$(pdi_load "$cardfile")" + + case $order in + firstname) + printf '%s %s\n' "$(card_fullname "$card")" "$cardfile" + ;; + lastname) + printf '%s %s\n' "$(pdi_value "$card" N || card_fullname "$card")" "$cardfile" + ;; + bdate) + printf '%s %s\n' "$(pdi_value "$card" BDAY || printf 0000-00-00)" "$cardfile" + ;; + esac + done \ + | sort \ + | sed -E 's;^.*\t;;g' +} + +list_cards(){ + filter_cards \ + | order_cards \ + | while read cardfile; do print_card "$cardfile" done }