ordering of vcard attributes + parsing of name (n,fn,nickname)
authorpaul <paul@plutz.net>
Sun, 6 Oct 2013 21:44:56 +0000 (21:44 +0000)
committerpaul <paul@plutz.net>
Sun, 6 Oct 2013 21:44:56 +0000 (21:44 +0000)
svn path=/trunk/; revision=9

index.cgi
pages/attendees.sh

index f012782..327135f 100755 (executable)
--- a/index.cgi
+++ b/index.cgi
@@ -7,7 +7,8 @@ die() {
 }
 debug() { #change to false to disable debugging
   #true && echo "$*" >>debug
-  true && echo "$*" >>/dev/stderr
+  true && [ -n "$*" ] && echo "$*" >>/dev/stderr
+  true && [ -z "$*" ] && tee /dev/stderr
 }
 
 # this program is supposed to be symlinked into a http root directory
index c1e0eb2..75092c1 100755 (executable)
@@ -6,7 +6,105 @@ listcards() {
 
 vcf_parse() {
   tr -d '\n' <"$1" |sed -r 's:\r ::g;s:\r:\n:g' \
-  | sed -r 's:^([^;]+)(;[^"]+|;"[^"]+")*\:(.*)$:key=\1\nvalue=\3\ntag=\2:g'
+  | sed -rn '
+    s:^PHOTO:001 PHOTO:p;
+    s:^X-MS-CARDPICTURE:001 PHOTO:p;
+    s:^LOGO:002 LOGO:p;
+    s:^FN:003 FN:p;
+    s:^NICKNAME:005 NICKNAME:p;
+    s:^N:004 N:p
+    s:^SOUND:006 SOUND:p;
+    s:^GENDER:007 GENDER:p;
+    s:^X-GENDER:007 GENDER:p;
+    s:^KIND:008 KIND:p;
+    s:^TITLE:009 TITLE:p;
+    s:^ROLE:010 ROLE:p;
+    s:^ORG:011 ORG:p;
+    s:^MEMBER:012 MEMBER:p;
+    s:^CATEGORIES:013 CATEGORIES:p;
+    s:^ANNIVERSARY:014 ANNIVERSARY:p;
+    s:^X-ANNIVERSARY:014 ANNIVERSARY:p;
+    s:^X-EVOLUTION-ANNIVERSARY:014 ANNIVERSARY:p;
+    s:^X-KADDRESSBOOK-X-Anniversary:014 ANNIVERSARY:p;
+    s:^BDAY:015 BDAY:p;
+    s:^EMAIL:016 EMAIL:p;
+    s:^TEL:017 TEL:p;
+    s:^IMPP:018 IMPP:p;
+    s:^X-AIM(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:aim\:\2:p;
+    s:^X-ICQ(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:aim\:\2:p;
+    s:^X-GOOGLE-TALK(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:xmpp\:\2:p;
+    s:^X-JABBER(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:xmpp\:\2:p;
+    s:^X-MSN(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:msn\:\2:p;
+    s:^X-YAHOO(;[^"\:]+|;"[^"]+")*\:(.*)$:018 IMPP\1\:ymsgr\:\2:p;
+    s:^X-SIP(;[^"\:]+|;"[^"]+")*\:(sip\:)?(.*)$:018 IMPP\1\:sip\:\3:p;
+    s:^ADR:019 ADR:p;
+    s:^LABEL:020 LABEL:p;
+    s:^URL:021 URL:p;
+    s:^X-EVOLUTION-BLOG-URL:021 URL:p;
+    s:^LANG:022 LANG:p;
+    s:^NOTE:023 NOTE:p;
+
+    s:^RELATED:025 RELATED:p;
+    s:^AGENT:025 RELATED\;TYPE=agent:p;
+    s:^X-ASSISTANT:025 RELATED\;TYPE=assistant;VALUE=text:p;
+    s:^X-EVOLUTION-ASSISTANT:025 RELATED\;TYPE=assistant;VALUE=text:p;
+    s:^X-KADDRESSBOOK-X-AssistantsName:025 RELATED\;TYPE=assistant;VALUE=text:p;
+    s:^X-MANAGER:025 RELATED\;TYPE=manager;VALUE=text:p;
+    s:^X-EVOLUTION-MANAGER:025 RELATED\;TYPE=manager;VALUE=text:p;
+    s:^X-KADDRESSBOOK-X-ManagersName:025 RELATED\;TYPE=manager;VALUE=text:p;
+    s:^X-SPOUSE:025 RELATED\;TYPE=spouse;VALUE=text:p;
+    s:^X-EVOLUTION-SPOUSE:025 RELATED\;TYPE=spouse;VALUE=text:p;
+    s:^X-KADDRESSBOOK-X-SpouseName:025 RELATED\;TYPE=spouse;VALUE=text:p;
+
+    s:^BEGIN.*$::;
+    s:^CALADRURI.*$::;
+    s:^CALURI.*$::;
+    s:^CLASS.*$::;
+    s:^CLIENTPIDMAP.*$::;
+    s:^END.*$::;
+    s:^FBURL.*$::;
+    s:^GEO.*$::;
+    s:^MAILER.*$::;
+    s:^NAME.*$::;
+    s:^PRODID.*$::;
+    s:^PROFILE.*$::;
+    s:^REV.*$::;
+    s:^SORT-STRING.*$::;
+    s:^SOURCE.*$::;
+    s:^TZ.*$::;
+    s:^UID.*$::;
+    s:^VERSION.*$::;
+    s:^XML.*$::;
+
+    s:^([A-Z].*)$:024 \1:p;
+    ' \
+  | sort |while read -r line; do
+    case "$line" in
+      001*)
+       echo -E "$line"
+       ;;
+      002*)
+       echo -E "$line"
+       ;;
+      003*)
+       fn=$(echo "$line" |sed -r 's:^[0-9]{3} ([^;\:]+)(;[^"\:]+|;"[^"]+")*\:(.*)$:\3:g' |tr -d '\r')
+       ;;
+      004*)
+       n=$(echo "$line" |sed -rn 's:^([0-9]{3} )([^;\:]+)(;[^"\:]+|;"[^"]+")*\:([^;]*)(\;[^;]*)(\;[^;]*)?(\;[^;]*)?(\;[^;]*)?$:\7 \5 \6 \4 \8:gp' |sed -r 's:,: :;s:\;: :g;s: +: :g' |tr -d '\r')
+       ;;
+      005*)
+       nick=$(echo "$line" |sed -r 's:^[0-9]{3} ([^;\:]+)(;[^"\:]+|;"[^"]+")*\:(.*)$:\3:g' |tr -d '\r')
+       ;;
+      *) [ -n "$fn" -a -n "$nick" ] && fn="$fn aka. $nick"
+         [ -n "$n"  -a -n "$nick" ] &&  n="$n aka. $nick"
+        [ -n "$fn" -a -z "$n" ] && echo "003 FN:$fn"
+        [ -n "$n" ]             && echo "003 FN:$n"
+        [ -z "$fn" -a -z "$n" ] && echo "003 FN:$nick"
+        echo -E "$line"
+        cat
+       ;;
+    esac
+  done | sed -r 's:^[0-9]{3} ([^;\:]+)(;[^"\:]+|;"[^"]+")*\:(.*)$:key=\1\nvalue=\3\ntag=\2:g'
 }
 
 case "$1" in