- s:^PHOTO:001 PHOTO:p;
- s:^X-MS-CARDPICTURE:001 PHOTO:p;
- s:^LOGO:002 LOGO:p;
- s:^FN:003 FN:p;
- s:^N[\:;]:004 &:p
- s:^NICKNAME:005 NICKNAME: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(;[^"\:]+|;"[^"]+")*\:(.*)$:019 ADR;LABEL="\2"\1\::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:^UID:026 UID:p;
+ # === turn property names to upper case, strip group names ===
+ h; s;^([^;:]+);;;
+ x; s;^([^;:\.]+\.)?([^;:]+).*$;\2;;
+ y;abcdefghijklmnopqrstuvwxyz;ABCDEFGHIJKLMNOPQRSTUVWXYZ;
+ G; s;\n;;;
+
+ # === strip trailing CR (but keep CRs in property value) ===
+ s;\r$;;;
+
+ # === Normalise various known vendor properties ===
+ s;^X-MS-CARDPICTURE(\;|:);PHOTO\1;;
+ s;^X-GENDER(\;|:);GENDER\1;;
+ s;^X-ANNIVERSARY(\;|:);ANNIVERSARY\1;;
+ s;^X-EVOLUTION-ANNIVERSARY(\;|:);ANNIVERSARY\1;;
+ s;^X-KADDRESSBOOK-X-ANNIVERSARY(\;|:);ANNIVERSARY\1;;
+ s;^X-EVOLUTION-BLOG-URL(\;|:);URL\1;;
+ s;^AGENT(\;|:);RELATED\;VALUE=text\;TYPE=agent\1;;
+ s;^X-ASSISTANT(\;|:);RELATED\;VALUE=text\;TYPE=assistant\1;;
+ s;^X-EVOLUTION-ASSISTANT(\;|:);RELATED\;VALUE=text\;TYPE=assistant\1;;
+ s;^X-KADDRESSBOOK-X-ASSISTANTSNAME(\;|:);RELATED\;VALUE=text\;TYPE=assistant\1;;
+ s;^X-MANAGER(\;|:);RELATED\;VALUE=text\;TYPE=manager\1;;
+ s;^X-EVOLUTION-MANAGER(\;|:);RELATED\;VALUE=text\;TYPE=manager\1;;
+ s;^X-KADDRESSBOOK-X-MANAGERSNAME(\;|:);RELATED\;VALUE=text\;TYPE=manager\1;;
+ s;^X-SPOUSE(\;|:);RELATED\;VALUE=text\;TYPE=spouse\1;;
+ s;^X-EVOLUTION-SPOUSE(\;|:);RELATED\;VALUE=text\;TYPE=spouse\1;;
+ s;^X-KADDRESSBOOK-X-SPOUSENAME(\;|:);RELATED\;VALUE=text\;TYPE=spouse\1;;
+
+ # === Normalise obsolete vendor IM properties ===
+ s;^X-AIM((\;[A-z0-9-]+|\;[A-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):;IMPP\1:aim:;;
+ s;^X-ICQ((\;[A-z0-9-]+|\;[A-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):;IMPP\1:aim:;;
+ s;^X-GOOGLE-TALK((\;[A-z0-9-]+|\;[A-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):;IMPP\1:xmpp:;;
+ s;^X-JABBER((\;[A-z0-9-]+|\;[A-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):;IMPP\1:xmpp:;;
+ s;^X-MSN((\;[A-z0-9-]+|\;[A-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):;IMPP\1:msn:;;
+ s;^X-YAHOO((\;[A-z0-9-]+|\;[A-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):;IMPP\1:ymsgr:;;
+ s;^X-SIP((\;[A-z0-9-]+|\;[A-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):(sip:)?;IMPP\1:sip:;;