# === strip trailing CR (but keep CRs in property value) ===
# s;\r$;;; # already done in in previous filter
- # unscramble aggregated fields
- :disag
- s;^([^:]+:)((.*[^\])?(\\\\)*),;\1\2\n\1;;
- t disag;
-
# === Normalise various known vendor properties ===
s;^X-MS-CARDPICTURE(\;|:);PHOTO\1;;
s;^X-GENDER(\;|:);GENDER\1;;
# === Insert empty attribute fields where no attributes are present ===
s;^([^;:]+):;\1\;:;;
+
+ # unscramble aggregated fields
+ :disag
+ s;^([^:]+:)((.*[^\])?(\\\\)*),;\1\2\n\1;;
+ t disag;
'
}
pdi_attrib(){
local card=":$1" name="$2" cnt="${3:-1}"
while [ $cnt -gt 0 ]; do
+ [ "${card#*${BR}${name};}" = "$card" ] && return 1
card="${card#*${BR}${name};}"
cnt=$((cnt - 1))
done
pdi_value(){
local card="${BR}$1" name="$2" cnt="${3:-1}"
while [ $cnt -gt 0 ]; do
+ [ "${card#*${BR}${name};*:}" = "$card" ] && return 1
card="${card#*${BR}${name};*:}"
cnt=$((cnt - 1))
done