update location of addrbook sub-folder in address conversion scripts
[claws.git] / tools / vcard2xml.py
old mode 100644 (file)
new mode 100755 (executable)
index 5ededf0..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
-  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
@@ -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.
 
-  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
 
@@ -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,25 +128,31 @@ def readVCARD (file) :
        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 :
@@ -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 :
+               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:] :
@@ -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('<?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!!!'
@@ -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'+
-               '\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
@@ -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 :
-                       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')