5 changed files with 101 additions and 0 deletions
@ -0,0 +1 @@ |
|||
out/ |
@ -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:<familyName>;<Name> |
|||
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() |
@ -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 |
@ -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 |
|||
|
@ -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 |
|||
|
Loading…
Reference in new issue