]> git.plutz.net Git - confetti/blobdiff - cards/list.sh
implemented card ordering
[confetti] / cards / list.sh
index cb33637cdbc36c5f4ca7e2166c8c572dc2302653..677519113d01e96c6a4c75c8ea0db260d2ebbc70 100755 (executable)
@@ -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 &shy;%s]' "$(card_fullname "$card" |HTML)"
+      FN) printf '[h2 .item .FN &shy;%s]' "$(card_fullname "$card" |unescape |HTML)"
         ;;
       GENDER) printf '[span .item .GENDER &shy;%s]' "$(pdi_value "$card" GENDER |l10n)"
         ;;
       NICKNAME) seq 1 $cnt |while read c; do
           printf '[span .item .NICKNAME &shy;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" &shy;%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 &shy;%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" &shy;%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
 }