#if 0 /*
# -----------------------------------------------------------------------
# bins.py - Python interface to bins data files.
# -----------------------------------------------------------------------
# $Id: bins.py 313 2004-05-04 22:02:59Z dischi $
#
# -----------------------------------------------------------------------
# $Log$
# Revision 1.2  2004/05/04 22:02:59  dischi
# fix crash with empty exif tag
#
# Revision 1.1  2003/06/08 19:55:22  dischi
# added bins metadata support
#
#
# -----------------------------------------------------------------------
# This file Copyright (C) 2002 John Cooper
#
# This program 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
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# ----------------------------------------------------------------------- */
#endif


from xml.sax import make_parser, ContentHandler
from xml.sax.handler import feature_namespaces
import string
import os
import re


def normalize_whitespace(text):
    # Remove Redundant whitespace from a string
    return ' '.join(text.split())

RE_TEXT = re.compile("^[ \n\t]*(.*[^ \n\t])[ \n\t]*$").match

# remove redundant whitespaces/tabs/newlines at the beginning and the end
def normalize_text(text):
    m = RE_TEXT(text)
    if m:
        return m.group(1)
    return text


def format_text(text):
    while len(text) and text[0] in (' ', '\t', '\n'):
        text = text[1:]
    text = re.sub('\n[\t *]', ' ', text)
    while len(text) and text[-1] in (' ', '\t', '\n'):
        text = text[:-1]
    return text


class BinsDiscription(ContentHandler):
    """
    This is a handler for getting the information from a bins Album.
    """
    def __init__(self):
        self.desc = {}
	self.exif = {}
        self.inDisc = 0
        self.inField = 0
	self.inExif = 0
	self.inTag = 0

    def startElement(self,name,attrs):
        # Check that we  have a discription section
        if name == u'description':
            self.inDisc = 1
        if name == u'field':
            self.thisField = normalize_whitespace(attrs.get('name', ''))
            self.inField = 1
            self.desc[self.thisField] = ''
	if name == u'exif':
	    self.inExif = 1
	if name == u'tag':
	    self.inTag = 1
	    self.thisTag = normalize_whitespace(attrs.get('name', ''))
	    self.exif[self.thisTag] = ''


    def characters(self,ch):
        if self.inDisc:
            if self.inField:
                self.desc[self.thisField] = self.desc[self.thisField] + ch
        if self.inExif:
	    if self.inTag:
	        self.exif[self.thisTag] = self.exif[self.thisTag] + ch

 
    def endElement(self,name):
        if name == 'discription':
            self.inDisc = 0
        if name == 'field':
            self.desc[self.thisField] = normalize_text(self.desc[self.thisField])
            self.inField = 0
	if name == 'exif':
            try:
                self.exif[self.thisTag] = normalize_text(self.exif[self.thisTag])
            except:
                pass
            self.inExif = 0
                
	if name == 'tag':
	    self.inTag = 0

def get_bins_desc(binsname):
     parser = make_parser()
     parser.setFeature(feature_namespaces,0)
     dh = BinsDiscription()
     parser.setContentHandler(dh)
     # check that the xml file exists for a dir or image
     if os.path.isfile(binsname + '/album.xml'):
         binsname = binsname + '/album.xml'
     elif os.path.isfile(binsname + '.xml'):
         binsname = binsname + '.xml'
     else:
         dh.desc['title'] == os.path.basename(dirname)

     # Check that there is a title
     parser.parse(binsname)

     # remove whitespace at the beginning
     for d in dh.desc:
         dh.desc[d] = format_text(dh.desc[d])
     for d in dh.exif:
         dh.exif[d] = format_text(dh.exif[d])

     return {'desc':dh.desc , 'exif':dh.exif}


if __name__ == '__main__':
    parser = make_parser()
    parser.setFeature(feature_namespaces,0)
    dh = GetAlbum()
    parser.setContentHandler(dh)
    parser.parse('album.xml')
    print dh.desc
