from nodes import *
from error import *
+from misc import typeOf
def decodeName( name ) :
elif isinstance( node , basestring ) :
return Text( node )
else :
- raise Error( 'Invalid expression to build tree' )
+ raise Error( 'Invalid expression of type %s to build tree' % typeOf( node ) )
+
+def iterFlatten( sequence ) :
+
+ if isinstance( sequence , basestring ) or isinstance( sequence , Node ) :
+ yield sequence
+ else :
+ for item in sequence :
+ for sub in iterFlatten( item ) :
+ yield sub
class Tags :
if name == '_doc_' :
def fun( *contents ) :
- children = [ ensureNode( child ) for child in contents if child ]
+ children = [ ensureNode( child ) for child in iterFlatten( contents ) if child ]
return Document( children )
elif name == '_comment_' :
def fun( contents ) :
k , contents = contents[ 0 ] , contents[ 1 : ]
kwargs.update( k )
attributes = [ Attribute( n , v ) for n , v in kws( kwargs ).items() ]
- children = [ ensureNode( child ) for child in contents if child ]
+ children = []
+ for item in iterFlatten( contents ) :
+ if isinstance( item , Attribute ) :
+ attributes.append( item )
+ elif item :
+ children.append( ensureNode( item ) )
+ else :
+ # discard
+ pass
return Element( decodeName( name ) , attributes , children )
self.__dict__[ name ] = fun