Mercurial > fife-parpg
diff engine/extensions/serializers/__init__.py @ 0:4a0efb7baf70
* Datasets becomes the new trunk and retires after that :-)
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 29 Jun 2008 18:44:17 +0000 |
parents | |
children | 9a1529f9625e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/extensions/serializers/__init__.py Sun Jun 29 18:44:17 2008 +0000 @@ -0,0 +1,84 @@ +import fife, sys, os +from traceback import print_exc + +__all__ = ('ET', 'SerializerError', 'InvalidFormat', 'WrongFileType', 'NameClash', 'NotFound', 'warn', 'root_subfile', 'reverse_root_subfile') + +try: + import xml.etree.cElementTree as ET +except: + import xml.etree.ElementTree as ET + +class SerializerError(Exception): + pass + +class InvalidFormat(SerializerError): + pass + +class WrongFileType(SerializerError): + pass + +class NameClash(SerializerError): + pass + +class NotFound(SerializerError): + pass + +def warn(self, msg): + print 'Warning (%s): %s' % (self.filename, msg) + +def root_subfile(masterfile, subfile): + ''' + Returns new path for given subfile (path), which is rooted against masterfile + E.g. if masterfile is ./../foo/bar.xml and subfile is ./../foo2/subfoo.xml, + returned path is ../foo2/subfoo.xml + NOTE: masterfile is expected to be *file*, not directory. subfile can be either + ''' + s = '/' + + masterfile = norm_path(os.path.abspath(masterfile)) + subfile = norm_path(os.path.abspath(subfile)) + + master_fragments = masterfile.split(s) + sub_fragments = subfile.split(s) + + master_leftovers = [] + sub_leftovers = [] + + for i in xrange(len(master_fragments)): + try: + if master_fragments[i] == sub_fragments[i]: + master_leftovers = master_fragments[i+1:] + sub_leftovers = sub_fragments[i+1:] + except IndexError: + break + + pathstr = '' + for f in master_leftovers[:-1]: + pathstr += '..' + s + pathstr += s.join(sub_leftovers) + return pathstr + +def reverse_root_subfile(masterfile, subfile): + ''' + does inverse operation to root_subfile. E.g. + E.g. if masterfile is ./../foo/bar.xml and subfile is ../foo2/subfoo.xml, + returned path ./../foo2/subfoo.xml + Usually this function is used to convert saved paths into engine relative paths + NOTE: masterfile is expected to be *file*, not directory. subfile can be either + ''' + s = '/' + + masterfile = norm_path(os.path.abspath(masterfile)).split(s)[:-1] + subfile = norm_path(os.path.abspath( s.join(masterfile) + s + subfile )) + masterfile = norm_path(os.getcwd()) + s + 'foo.bar' # cheat a little to satisfy root_subfile + return root_subfile(masterfile, subfile) + +def norm_path(path): + ''' + Makes the path use '/' delimited separators. FIFE always uses these delimiters, but some os-related + routines will default to os.path.sep. + ''' + if os.path.sep == '/': + return path + + return '/'.join(path.split(os.path.sep))