diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89f9ac0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +out/ diff --git a/split_vcard.py b/split_vcard.py new file mode 100755 index 0000000..cb26655 --- /dev/null +++ b/split_vcard.py @@ -0,0 +1,74 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +import argparse +import vobject +import os +import quopri +import re + +def input(): + parser = argparse.ArgumentParser() + parser.add_argument('vcard', + type=argparse.FileType('r'), + help='Vcard file to parse') + args = parser.parse_args() + return args + +# Remove FN +# Add N;CHARSET=ISO-8859-1;ENCODING=QUOTED-PRINTABLE:; +def legacy_encoding_filter(given_name, family_name, serialized_vcard): + # Ugly hack to get charset latin-1 + quoted printable syntax + gname = quopri.encodestring(unicode(quopri.decodestring(given_name), "utf-8").encode('latin-1')) + fname = quopri.encodestring(unicode(quopri.decodestring(family_name), "utf-8").encode('latin-1')) + + print "given : %s ; Family : %s" % (gname, fname) + + ret = re.sub(r'^FN:.*\n', + r'', + serialized_vcard, + flags=re.MULTILINE) + # Do not forget \r ! + ret = re.sub(r'^N:(.*)', + r'N;CHARSET=ISO-8859-1;ENCODING=QUOTED-PRINTABLE:%s;%s\r' + % (fname, gname), + ret, + flags=re.MULTILINE) + return ret + +if __name__ == "__main__": + args = input() + print("*** Parsing Vcard : ***") + + vlist = vobject.readComponents(args.vcard) + + print("Creating output directory :") + try: + os.mkdir("out/") + except OSError: + print "Output directory already exist" + + for i, vcard in enumerate(vlist): + try: + print "*** VCARD number %d ***" % i + try: + if vcard.tel: + print "Creating single vcard file" + filename = quopri.decodestring(str(vcard.n.value).strip().replace(" ", "_")) + print "filename : '%s'" % filename + # Save to file + with open("out/%s.vcf" % filename, 'w') as f: + f.write(legacy_encoding_filter(vcard.n.value.given, + vcard.n.value.family, + vcard.serialize())) + except (AttributeError) as e: +# print "No vcard.tel for vcard number %d" % i + continue + except: + print "Uncatched exception" + except (vobject.base.ValidateError) as e: +# print "VCARD not valid : %s" % e + continue + except: + print "Uncatched exception" + args.vcard.close() diff --git a/vcard_test_file/Nokia.vcf b/vcard_test_file/Nokia.vcf new file mode 100644 index 0000000..a4dc69e --- /dev/null +++ b/vcard_test_file/Nokia.vcf @@ -0,0 +1,5 @@ +BEGIN:VCARD +VERSION:2.1 +N;CHARSET=ISO-8859-1;ENCODING=QUOTED-PRINTABLE:Test;=E9=E7=E0 +TEL;PREF;VOICE:+33600000000 +END:VCARD diff --git a/vcard_test_file/vcard_test_file_1.vcf b/vcard_test_file/vcard_test_file_1.vcf new file mode 100644 index 0000000..39aafc0 --- /dev/null +++ b/vcard_test_file/vcard_test_file_1.vcf @@ -0,0 +1,14 @@ +begin:vcard +fn:test 1 +n:1;test +tel;cell:+33 6 00 00 00 00 +version:2.1 +end:vcard + +begin:vcard +fn;quoted-printable:test =C3=A9=C3=A0=C3=A9=C3=A7 2 +n;quoted-printable:2;test =C3=A9=C3=A7=C3=A0 +tel;cell:+33 7 00 00 00 00 +version:2.1 +end:vcard + diff --git a/vcard_test_file/vcard_test_file_2.vcf b/vcard_test_file/vcard_test_file_2.vcf new file mode 100644 index 0000000..8400fa6 --- /dev/null +++ b/vcard_test_file/vcard_test_file_2.vcf @@ -0,0 +1,7 @@ +begin:vcard +fn;quoted-printable:test =C3=A9=C3=A0=C3=A9=C3=A7 2 +n;quoted-printable:2;test =C3=A9=C3=A7=C3=A0 +tel;cell:+33 7 00 00 00 00 +version:2.1 +end:vcard +