summaryrefslogtreecommitdiff
path: root/bin/vtono.sh
diff options
context:
space:
mode:
Diffstat (limited to 'bin/vtono.sh')
-rwxr-xr-xbin/vtono.sh78
1 files changed, 78 insertions, 0 deletions
diff --git a/bin/vtono.sh b/bin/vtono.sh
new file mode 100755
index 0000000..dd4f8b6
--- /dev/null
+++ b/bin/vtono.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+
+die()
+{
+ : "${1:?}"
+
+ printf "\033[31;1merr: %b\033[0m\n" "$1" 1>&2
+ exit "${2:-1}"
+}
+
+warn()
+{
+ : "${1:?}"
+ printf "\033[33;1mwarn: %b\033[0m\n" "$*" 1>&2
+}
+
+########
+# MAIN #
+# ######
+
+name=
+no=
+vcf=
+nos=
+
+if [ -z "$1" ] \
+ || [ "$(file --brief --dereference --mime-type "$1")" != "text/vcard" ]; then
+ die "no or invalid input"
+else
+ vcf="$1"
+ shift
+fi
+
+strings "$vcf" | while read -r line; do
+ case "$line" in
+ 'FN:'*)
+ name="${line##*:}"
+ ;;
+ 'TEL;TYPE='*':'*)
+ # avoid repetitions in same vacrd entry
+ no="${line##*:}"
+ case "$nos" in
+ *"$no"*)
+ continue
+ ;;
+ esac
+ nos="${nos}:${no}"
+
+ # make sure $no is E.164-formatted
+ case "$no" in
+ *-*)
+ no="$(printf "%s" "$no" | tr -d '-')"
+ ;;
+ esac
+ case "$no" in
+ +[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
+ # gotta go fast \+[0-9]{12}
+ ;;
+ +974[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) # qatar
+ # gotta go fast \+974{8}
+ ;;
+ *)
+ warn "illegal format: ${name}, ${no}"
+ continue;
+ ;;
+ esac
+
+ [ "$1" = "-w" ] &&
+ continue
+
+ [ -n "$no" ] &&
+ printf "%s : %s\n" "$no" "$name"
+ ;;
+ 'END:VCARD')
+ nos=
+ ;;
+ esac
+done