-#!/usr/bin/python2.2
+#!/usr/bin/env python
+# -*- coding: latin-1 -*-
"""
Copyright © 2003 Bogdan Sumanariu <zarrok@yahoo.com>
This file is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- script name : evolutionvcard2sylpheed.py
+ script name : evolutionvcard2claws.py
script purpose : convert an evolution addressbook VCARD file
- into a Sylpheed addressbook
+ into a Claws Mail addressbook
tested with evolution 1.2.x, and 1.4.x
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) :
"""
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:
return d
##################################################################################
-
###############################################################################################
-## writes on a given file an xml representation for sylpheed addressbook received as a hash ##
+## writes on a given file an xml representation for claws-mail addressbook received as a hash ##
###############################################################################################
def writeXMLREPR (vcard,file,uid) :
"""
based on <vcard> and <uid> writes only recognized tags (the ones defined in <keywds> list)
- NOTE: <url> and <org> tag will be written as attributes (there are such tags in sylpheed's
+ NOTE: <url> and <org> tag will be written as attributes (there are such tags in claws-mail's
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 :
uid[0] = uid[0] + 1
a += '\t\t<address uid=\"' + str(uid[0]) + '\" alias=\"' + nick + '\" email=\"' + c + '\" remarks=\"\" />\n'
else :
+ email = getEmailAddress(vcard)
uid[0] = uid[0]+1
- a += '\t\t<address uid=\"' + str(uid[0]) + '\" alias=\"' + nick + '\" email=\"\" remarks=\"\" />\n'
+ a += '\t\t<address uid=\"' + str(uid[0]) + '\" alias=\"' + nick + '\" email=\"' + email + '\" remarks=\"\" />\n'
a += '\t</address-list>\n'
a += '\t<attribute-list>\n'
for key in keywds[5:] :
def convert (in_f, o_f, name='INBOX') :
d = {'d':1}
- uid = [int(time.time())]
- try :
- print 'proccessing...\n'
- o_f.write('<?xml version="1.0" encoding="ISO-8859-1" ?>\n<address-book name="'+name+'" >\n');
-
- while len(d.keys()) > 0 :
- d = readVCARD(in_f)
- writeXMLREPR (d, o_f, uid)
- uid[0] = uid [0]+1
-
- o_f.write('\n</address-book>')
+ uid = [int(time.time())]
+
+ try :
+ print 'proccessing...\n'
+ o_f.write('<?xml version="1.0" encoding="ISO-8859-1" ?>\n<address-book name="'+name+'" >\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</address-book>')
print 'finished processing...\n'
except IOError, err :
print 'Caught an IOError : ',err,'\t ABORTING!!!'
if len(sys.argv) <> 3 and len(sys.argv) <> 2 :
print str("\nUsage: vcard2xml.py source_file [destination_file]\n\n" +
'\tWhen only <source_file> is specified will overwrite the existing addressbook.\n'+
- '\tWhen both arguments are suplied will create a new additional addressbook named \n\tas the destination file.'+'\n\tNOTE: in both cases the sylpheed must be closed and ran at least once.\n\n')
+ '\tWhen both arguments are suplied will create a new additional addressbook named \n\tas the destination file.'+'\n\tNOTE: in both cases the Claws Mail must be closed and ran at least once.\n\n')
sys.exit(1)
in_file = None
out_file = None
- path_to_out = os.environ['HOME']+'/.sylpheed/'
+ path_to_out = os.environ['HOME']+'/.claws-mail/addrbook/'
adr_idx = 'addrbook--index.xml'
adr_idx_file = None
tmp_adr_idx_file= None
tmp_adr_idx_file = open(path_to_out+adr_idx+'.tmp')
adr_idx_file = open(path_to_out+adr_idx,'w')
except Exception, e :
- print 'Could not open <', path_to_out+adr_idx,'> file. Make sure you started sylpheed at least once.'
+ print 'Could not open <', path_to_out+adr_idx,'> file. Make sure you started Claws Mail at least once.'
sys.exit(1)
try :
out_file = open(path_to_out+sys.argv[2],'w')