]> git.plutz.net Git - confetti/blobdiff - pages/cards.sh
introduce combined filter engine
[confetti] / pages / cards.sh
index b0e7e9413010282e436a05fe2957e01e038d4358..506022ff727bcd9ba0507f9945806c093394456a 100755 (executable)
@@ -64,52 +64,42 @@ list_categories() {
 }
 
 listcards() {
-  case "${_GET[filtertype]}" in
-    any)
-       grep -il "${_GET[filter]}" ${_DATA}/vcard/*vcf
-      ;;
-    name)
-       egrep -xil "(FN|NICKNAME|N)(;.+)*:.*${_GET[filter]}.*" ${_DATA}/vcard/*vcf
-      ;;
-    street)
-       egrep -xil "(ADR)(;.+)*:([^;]*;){2}${_GET[filter]}.*" ${_DATA}/vcard/*vcf
-      ;;
-    zip)
-       egrep -xil "(ADR)(;.+)*:([^;]*;){5}${_GET[filter]}.*" ${_DATA}/vcard/*vcf
-      ;;
-    telephone)
-       egrep -xil "(TEL)(;.+)*:.*${_GET[filter]}.*" ${_DATA}/vcard/*vcf
-      ;;
-    birth)
-       egrep -xil "(BDAY)(;.+)*:${_GET[filter]}.*" ${_DATA}/vcard/*vcf
-      ;;
-    course)
-      ;;
-    *) ls -1 ${_DATA}/vcard/*vcf 2>/dev/null
-      ;;
-  esac |case "${_GET[order]}" in
-    firstname)
-      while read file; do
-        fn=$(sed -rn 's:^N(;.+)*\:([^;]*;){1} *([^;]*).*$:\3:p' "$file")
-       echo "$fn\t$file"
-      done
-      ;;
-    lastname)
-      while read file; do
-        ln=$(sed -rn 's:^N(;.+)*\:([^;]*;){0} *([^;]*).*$:\3:p' "$file")
-       echo "$ln\t$file"
-      done
-      ;;
-    bdate)
-      while read file; do
-        bd=$(sed -rn 's:^BDAY(;.+)*\:(.*)$:\2:p' "$file")
-       echo "$bd\t$file"
-      done
-      ;;
-    *)
-      sed -r 's:^.*$:x\t&:'
-      ;;
-  esac |sort |sed -r 's:^.*\t(.*/)([^/]+)$:\2:'
+  filterex='s;^([^\n]+)\n.*$;\1;p'
+  printf '%s\n' "${_GET[filter]}" |tr '^' '\n' \
+  | sed -r 's;[]\/\(\)\\\^\$\?\.\+\*\;\[\{\}];\\\\&;g' \
+  | while read each; do
+    case $each in
+        name:*) expr='(FN|NICKNAME|N)(\;[^\n]+)*:[^\n]*'"(${each#*:})";;
+      street:*) expr='ADR(\;[^\n]+)*:([^\;]*;){2}[^\;\n]*'"(${each#*:})";;
+         zip:*) expr='ADR(\;[^\n]+)*:([^\;]*;){5}[^\;\n]*'"(${each#*:})";;
+      any:*|:*) expr="[^\n]*"'(\;[^\n]+)*:[^\n]*'"(${each#*:})";;
+           *:*) expr="${each%%:*}"'(\;[^\n]+)*:[^\n]*'"(${each#*:})";;
+             *) expr="(${each})";;
+    esac
+    filterex='/(^|\n)'"${expr}"'/{'"${filterex}"'}'
+  done
+
+  for file in "${_DATA}/vcard/"*.vcf; do
+    case "${_GET[order]}" in
+      firstname)
+        printf '%s\t%s\n' "$(sed -rn 's:^N(;.+)*\:([^;]*;){1} *([^;]*).*$:\3:p' "$file")" "$file"
+        ;;
+      lastname)
+        printf '%s\t%s\n' "$(sed -rn 's:^N(;.+)*\:([^;]*;){0} *([^;]*).*$:\3:p' "$file")" "$file"
+        ;;
+      bdate)
+        printf '%s\t%s\n' "$(sed -rn 's:^BDAY(;.+)*\:(.*)$:\2:p' "$file")" "$file"
+        ;;
+      *)  printf 'x\t%s\n' "$file"
+        ;;
+    esac
+  done \
+  | sort -u |sed -r 's;^.*\t;;' \
+  | while read n; do
+    { printf '%s\n' "$n"; cat "$n"; } \
+    | sed -rn ':X;N;$!bX; {'"$filterex"'}'
+  done \
+  | sed -r 's;^(.*/)*;;;'
 }
 
 vcf_parse() {