update location of addrbook sub-folder in address conversion scripts
[claws.git] / tools / vcard2xml.py
old mode 100644 (file)
new mode 100755 (executable)
index 48962c3..dd6b614
@@ -1,11 +1,12 @@
-#!/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
 """
 
 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
   (at your option) any later version.
    
   This program is distributed in the hope that it will be useful, but
@@ -17,10 +18,10 @@ Copyright 
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
   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 
 
  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
 
 
  tested with evolution 1.2.x, and 1.4.x
 
@@ -30,15 +31,70 @@ import string
 import sys
 import time
 import os
 import sys
 import time
 import os
+import StringIO
 
 keywds = ('x-evolution-file-as','fn', 'n','email;internet','nickname', 'url', 'org')
 
 
 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    ##
 ################################################################################
 
 
 ################################################################################
 ##  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 :
        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 :
                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)),':')
                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:
                        if d.has_key(s[0]) :
                                d[s[0]].append(s[1])
                        elif len(s) > 1:
@@ -72,25 +128,31 @@ def readVCARD (file) :
        return d
 
 ##################################################################################
        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)
 ###############################################################################################
 
 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
              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 = '', '', '', '', ''
 
 
        fn, ln, nick, cn, a = '', '', '', '', ''
 
-       if len(name) == 2 :
+       if len(name) >= 2 :
                fn = name[0]
                ln = name[1]
        elif len(name) ==1 :
                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<address uid=\"' + str(uid[0]) + '\" alias=\"' + nick  + '\" email=\"' + c + '\" remarks=\"\" />\n'
        else :
                        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
                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:] :
        a += '\t</address-list>\n'
        a += '\t<attribute-list>\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}
 
 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!!!'
                print 'finished processing...\n'
        except IOError, err :
                print 'Caught an IOError : ',err,'\t ABORTING!!!'
@@ -151,12 +217,12 @@ def execute () :
        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'+
        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-Claws 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
                sys.exit(1)
 
        in_file = None
        out_file = None
-       path_to_out = os.environ['HOME']+'/.sylpheed-claws/'
+       path_to_out = os.environ['HOME']+'/.claws-mail/addrbook/'
        adr_idx = 'addrbook--index.xml'
        adr_idx_file = None
        tmp_adr_idx_file= None
        adr_idx = 'addrbook--index.xml'
        adr_idx_file = None
        tmp_adr_idx_file= None
@@ -189,7 +255,7 @@ def execute () :
                        tmp_adr_idx_file = open(path_to_out+adr_idx+'.tmp')
                        adr_idx_file = open(path_to_out+adr_idx,'w')
                except Exception, e :
                        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-Claws 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')
                        sys.exit(1)
                try :
                        out_file = open(path_to_out+sys.argv[2],'w')