X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=tools%2Fvcard2xml.py;h=dd6b6146b295d17660765b09af2028f8fe745533;hp=594e67d2b49a96c6c5980a24e9c15c0dae011734;hb=77aa92a2d98f660b7d484fee928066d5a6db8889;hpb=52ffd8b40681da6440860a820acfc67b25470bf1 diff --git a/tools/vcard2xml.py b/tools/vcard2xml.py old mode 100644 new mode 100755 index 594e67d2b..dd6b6146b --- a/tools/vcard2xml.py +++ b/tools/vcard2xml.py @@ -1,4 +1,5 @@ -#!/usr/bin/python2.2 +#!/usr/bin/env python +# -*- coding: latin-1 -*- """ Copyright © 2003 Bogdan Sumanariu @@ -30,15 +31,70 @@ import string import sys import time import os +import StringIO keywds = ('x-evolution-file-as','fn', 'n','email;internet','nickname', 'url', 'org') +def normalizeLongLines(file): + """ + Skip line breaks after 72 chars + """ + buf = '' + + line = file.readline() + while line: + if line[0] == ' ': + buf = buf.rstrip('\n') + line = line.lstrip(); + buf += line + else: + buf += line + line = file.readline() + + return buf + +def getEmailAddress(vcard): + """ + Get email address. + Supported formats: + - email;something + - email;type=something + something := (internet,work,home, other) + """ + + for key in vcard: + items = key.split(';') + if len(items) == 2: + if items[0].lower() == 'email': + list = vcard[key] + return list[0] + else: + if key.lower() == 'email': + list = vcard[key] + return list[0] + + return "" + +def findName(vcard): + """ + Find a version 3.0 name + """ + for key in vcard: + items = key.split(';') + if len(items) == 2: + if items[0].lower() == 'n': + return vcard[key] + else: + if key.lower() == 'n': + return vcard[key] + + return None ################################################################################ ## reads a vcard and stores as hash pairs key/value where value is a list ## ################################################################################ -def readVCARD (file) : +def readVCARD (buffer) : """ @@ -54,14 +110,14 @@ def readVCARD (file) : bgn,end = -1, -1; d = dict() while r and bgn < 0 : - r = file.readline() + r = buffer.readline() if len (r) == 0 : return dict() if string.find('begin',string.lower(string.strip(r))) : bgn = 1 while r and end < 0 : - r = file.readline() + r = buffer.readline() s = string.split(string.lower(string.strip(r)),':') - if s[0] <> '' : + if s[0] <> '' : if d.has_key(s[0]) : d[s[0]].append(s[1]) elif len(s) > 1: @@ -72,7 +128,6 @@ def readVCARD (file) : return d ################################################################################## - ############################################################################################### ## writes on a given file an xml representation for claws-mail addressbook received as a hash ## @@ -86,11 +141,18 @@ def writeXMLREPR (vcard,file,uid) : XML schema) """ if len (vcard.keys()) == 0 : return - name = string.split(vcard.get(keywds[2])[0],';') + item = vcard.get(keywds[2]); + if item: + name = string.split(item[0],';') + else: + """ version 3.0 n ?""" + name = findName(vcard) + if not name: + return fn, ln, nick, cn, a = '', '', '', '', '' - if len(name) == 2 : + if len(name) >= 2 : fn = name[0] ln = name[1] elif len(name) ==1 : @@ -111,8 +173,9 @@ def writeXMLREPR (vcard,file,uid) : uid[0] = uid[0] + 1 a += '\t\t
\n' else : + email = getEmailAddress(vcard) uid[0] = uid[0]+1 - a += '\t\t
\n' + a += '\t\t
\n' a += '\t\n' a += '\t\n' for key in keywds[5:] : @@ -129,17 +192,20 @@ def writeXMLREPR (vcard,file,uid) : def convert (in_f, o_f, name='INBOX') : d = {'d':1} - uid = [int(time.time())] - try : - print 'proccessing...\n' - o_f.write('\n\n'); - - while len(d.keys()) > 0 : - d = readVCARD(in_f) - writeXMLREPR (d, o_f, uid) - uid[0] = uid [0]+1 - - o_f.write('\n') + uid = [int(time.time())] + + try : + print 'proccessing...\n' + o_f.write('\n\n'); + + buf = normalizeLongLines(in_f) + buffer = StringIO.StringIO(buf) + while len(d.keys()) > 0 : + d = readVCARD(buffer) + writeXMLREPR (d, o_f, uid) + uid[0] = uid [0]+1 + + o_f.write('\n') print 'finished processing...\n' except IOError, err : print 'Caught an IOError : ',err,'\t ABORTING!!!' @@ -156,7 +222,7 @@ def execute () : in_file = None out_file = None - path_to_out = os.environ['HOME']+'/.claws-mail/' + path_to_out = os.environ['HOME']+'/.claws-mail/addrbook/' adr_idx = 'addrbook--index.xml' adr_idx_file = None tmp_adr_idx_file= None