#! /usr/bin/env python

"""
Extends ElementTree to allow easy construction of Mapserver Mapfiles

See mapfiler.py for copyright information.
"""

# --------------------------------------------------------------------
#
# Adapted from ElementTree Toolkit
#
# --------------------------------------------------------------------
# The ElementTree toolkit is
#
# Copyright (c) 1999-2004 by Fredrik Lundh
# --------------------------------------------------------------------

# ------------------------------------------------------------------------
# 
# Copyright (c) 2006 Allan Doyle
# Copyright (c) 2006 EOGEO
#
#  Permission is hereby granted, free of charge, to any person
#  obtaining a copy of this software and associated documentation
#  files (the "Software"), to deal in the Software without
#  restriction, including without limitation the rights to use, copy,
#  modify, merge, publish, distribute, sublicense, and/or sell copies
#  of the Software, and to permit persons to whom the Software is
#  furnished to do so, subject to the following conditions:
# 
#  The above copyright notice and this permission notice shall be
#  included in all copies or substantial portions of the Software.
# 
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
#  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
#  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
#  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#  DEALINGS IN THE SOFTWARE.
# 
# ------------------------------------------------------------------------

# python includes
import re

# package includes
from elementtree.ElementTree import *

class MapElementTree(ElementTree):
    _pad = ' '
    _level = 0
    
    def __init__(self, element=None, file=None):
        ElementTree.__init__(self, element, file)

    def _write(self, file, node, encoding, namespaces):
        self._pad = self._pad + ' '
        # write XML to file
        tag = node.tag
        if tag is Comment:
            file.write("%s# %s\n" % (self._pad[0:self._level], node.text))
        else:
            items = node.items()
            if self._level > 0:
                file.write("\n")
            file.write(self._pad[0:self._level] + tag)
            file.write("\n")
            self._level = self._level + 1

            if items:
                items.sort() # lexical order
                for k, v in items:
                    file.write('%s%s %s\n' % (self._pad[0:self._level], k,v))
            if node.text or node:
                if node.text:
                    file.write(re.sub("\t", self._pad[0:self._level], node.text))
                    file.write("\n")
                for n in node:
                    self._write(file, n, encoding, namespaces)
                    self._level = self._level - 1
            file.write("%sEND\n" % self._pad[0:self._level-1])
        if node.tail:
            file.write(node.tail)




