########################################################################
# $Header: /var/local/cvsroot/4Suite/Ft/Xml/XPath/ParsedAbbreviatedAbsoluteLocationPath.py,v 1.7 2005-03-07 02:25:58 mbrown Exp $
"""
A parsed token that represents an abbreviated absolute location path.

Copyright 2005 Fourthought, Inc. (USA).
Detailed license and copyright information: http://4suite.org/COPYRIGHT
Project home, documentation, distributions: http://4suite.org/
"""

from xml.dom import Node
from Ft.Lib.Set import Unique

class ParsedAbbreviatedAbsoluteLocationPath:
    def __init__(self, rel):
        self._rel = rel
        return

    def _descendants(self, context, nodeset):
        for child in context.node.childNodes:
            context.node = child
            results = self._rel.select(context)
            # Ensure no duplicates
            if results:
                nodeset.extend(results)
                nodeset = Unique(nodeset)
            if child.nodeType == Node.ELEMENT_NODE:
                nodeset = self._descendants(context, nodeset)
        return nodeset

    def evaluate(self, context):
        state = context.copy()

        # Start at the document node
        context.node = context.node.rootNode

        nodeset = self._descendants(context, self._rel.select(context))

        context.set(state)
        return nodeset
    select = evaluate

    def pprint(self, indent=''):
        print indent + str(self)
        self._rel.pprint(indent + '  ')

    def __str__(self):
        return '<AbbreviatedAbsoluteLocationPath at %x: %s>' % (
            id(self),
            repr(self)
            )

    def __repr__(self):
        return '//%r' % self._rel

