#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
|