#NEWLINE# def unparse_node( node , is_expr = False ) : #NEWLINE# #INDENT# if isinstance ( node , ( basestring , int , float ) ) : #NEWLINE# #INDENT# return repr ( node ) #NEWLINE# #UNINDENT# if isinstance ( node , InlineHTML ) : #NEWLINE# #INDENT# return str ( node . data ) #NEWLINE# #UNINDENT# if isinstance ( node , Constant ) : #NEWLINE# #INDENT# if ( node . name . lower ( ) == 'null' ) : #NEWLINE# #INDENT# return 'None' #NEWLINE# #UNINDENT# return str ( node . name ) #NEWLINE# #UNINDENT# if isinstance ( node , Variable ) : #NEWLINE# #INDENT# return str ( node . name [ 1 : ] ) #NEWLINE# #UNINDENT# if isinstance ( node , Echo ) : #NEWLINE# #INDENT# return ( '{{ %s }}' % '' . join ( ( unparse_node ( x , True ) for x in node . nodes ) ) ) #NEWLINE# #UNINDENT# if isinstance ( node , ( Include , Require ) ) : #NEWLINE# #INDENT# return ( '{%% include %s -%%}' % unparse_node ( node . expr , True ) ) #NEWLINE# #UNINDENT# if isinstance ( node , Block ) : #NEWLINE# #INDENT# return '' . join ( ( unparse_node ( x ) for x in node . nodes ) ) #NEWLINE# #UNINDENT# if isinstance ( node , ArrayOffset ) : #NEWLINE# #INDENT# return ( '%s[%s]' % ( unparse_node ( node . node , True ) , unparse_node ( node . expr , True ) ) ) #NEWLINE# #UNINDENT# if isinstance ( node , ObjectProperty ) : #NEWLINE# #INDENT# return ( '%s.%s' % ( unparse_node ( node . node , True ) , node . name ) ) #NEWLINE# #UNINDENT# if isinstance ( node , Array ) : #NEWLINE# #INDENT# elems = [ ] #NEWLINE# for elem in node . nodes : #NEWLINE# #INDENT# elems . append ( unparse_node ( elem , True ) ) #NEWLINE# #UNINDENT# if ( node . nodes and ( node . nodes [ 0 ] . key is not None ) ) : #NEWLINE# #INDENT# return ( '{%s}' % ', ' . join ( elems ) ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# return ( '[%s]' % ', ' . join ( elems ) ) #NEWLINE# #UNINDENT# #UNINDENT# if isinstance ( node , ArrayElement ) : #NEWLINE# #INDENT# if node . key : #NEWLINE# #INDENT# return ( '%s: %s' % ( unparse_node ( node . key , True ) , unparse_node ( node . value , True ) ) ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# return unparse_node ( node . value , True ) #NEWLINE# #UNINDENT# #UNINDENT# if isinstance ( node , Assignment ) : #NEWLINE# #INDENT# if ( isinstance ( node . node , ArrayOffset ) and ( node . node . expr is None ) ) : #NEWLINE# #INDENT# return ( '{%% do %s.append(%s) -%%}' % ( unparse_node ( node . node . node , None ) , unparse_node ( node . expr , True ) ) ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# return ( '{%% set %s = %s -%%}' % ( unparse_node ( node . node , True ) , unparse_node ( node . expr , True ) ) ) #NEWLINE# #UNINDENT# #UNINDENT# if isinstance ( node , UnaryOp ) : #NEWLINE# #INDENT# op = op_map . get ( node . op , node . op ) #NEWLINE# return ( '(%s %s)' % ( op , unparse_node ( node . expr , True ) ) ) #NEWLINE# #UNINDENT# if isinstance ( node , BinaryOp ) : #NEWLINE# #INDENT# op = op_map . get ( node . op , node . op ) #NEWLINE# return ( '(%s %s %s)' % ( unparse_node ( node . left , True ) , op , unparse_node ( node . right , True ) ) ) #NEWLINE# #UNINDENT# if isinstance ( node , TernaryOp ) : #NEWLINE# #INDENT# return ( '(%s if %s else %s)' % ( unparse_node ( node . iftrue , True ) , unparse_node ( node . expr , True ) , unparse_node ( node . iffalse , True ) ) ) #NEWLINE# #UNINDENT# if isinstance ( node , IsSet ) : #NEWLINE# #INDENT# if ( len ( node . nodes ) == 1 ) : #NEWLINE# #INDENT# return ( '(%s is defined)' % unparse_node ( node . nodes [ 0 ] , True ) ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# tests = [ ( '(%s is defined)' % unparse_node ( n , True ) ) for n in node . nodes ] #NEWLINE# return ( ( '(' + ' and ' . join ( tests ) ) + ')' ) #NEWLINE# #UNINDENT# #UNINDENT# if isinstance ( node , Empty ) : #NEWLINE# #INDENT# return ( '(not %s)' % unparse_node ( node . expr , True ) ) #NEWLINE# #UNINDENT# if isinstance ( node , Silence ) : #NEWLINE# #INDENT# return unparse_node ( node . expr , True ) #NEWLINE# #UNINDENT# if isinstance ( node , Cast ) : #NEWLINE# #INDENT# filter = '' #NEWLINE# if ( node . type in ( 'int' , 'float' , 'string' ) ) : #NEWLINE# #INDENT# filter = ( '|%s' % node . type ) #NEWLINE# #UNINDENT# return ( '%s%s' % ( unparse_node ( node . expr , True ) , filter ) ) #NEWLINE# #UNINDENT# if isinstance ( node , If ) : #NEWLINE# #INDENT# body = unparse_node ( node . node ) #NEWLINE# for elseif in node . elseifs : #NEWLINE# #INDENT# body += ( '{%% elif %s -%%}%s' % ( unparse_node ( elseif . expr , True ) , unparse_node ( elseif . node ) ) ) #NEWLINE# #UNINDENT# if node . else_ : #NEWLINE# #INDENT# body += ( '{%% else -%%}%s' % unparse_node ( node . else_ . node ) ) #NEWLINE# #UNINDENT# return ( '{%% if %s -%%}%s{%% endif -%%}' % ( unparse_node ( node . expr , True ) , body ) ) #NEWLINE# #UNINDENT# if isinstance ( node , While ) : #NEWLINE# #INDENT# dummy = Foreach ( node . expr , None , ForeachVariable ( '$XXX' , False ) , node . node ) #NEWLINE# return unparse_node ( dummy ) #NEWLINE# #UNINDENT# if isinstance ( node , Foreach ) : #NEWLINE# #INDENT# var = node . valvar . name [ 1 : ] #NEWLINE# if node . keyvar : #NEWLINE# #INDENT# var = ( '%s, %s' % ( node . keyvar . name [ 1 : ] , var ) ) #NEWLINE# #UNINDENT# return ( '{%% for %s in %s -%%}%s{%% endfor -%%}' % ( var , unparse_node ( node . expr , True ) , unparse_node ( node . node ) ) ) #NEWLINE# #UNINDENT# if isinstance ( node , Function ) : #NEWLINE# #INDENT# name = node . name #NEWLINE# params = [ ] #NEWLINE# for param in node . params : #NEWLINE# #INDENT# params . append ( param . name [ 1 : ] ) #NEWLINE# #UNINDENT# params = ', ' . join ( params ) #NEWLINE# body = '\n    ' . join ( ( unparse_node ( node ) for node in node . nodes ) ) #NEWLINE# return ( '{%% macro %s(%s) -%%}\n    %s\n{%%- endmacro -%%}\n\n' % ( name , params , body ) ) #NEWLINE# #UNINDENT# if isinstance ( node , Return ) : #NEWLINE# #INDENT# return ( '{{ %s }}' % unparse_node ( node . node , True ) ) #NEWLINE# #UNINDENT# if isinstance ( node , FunctionCall ) : #NEWLINE# #INDENT# if node . name . endswith ( 'printf' ) : #NEWLINE# #INDENT# params = [ unparse_node ( x . node , True ) for x in node . params [ 1 : ] ] #NEWLINE# if is_expr : #NEWLINE# #INDENT# return ( '%s %% (%s,)' % ( unparse_node ( node . params [ 0 ] . node , True ) , ', ' . join ( params ) ) ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# return ( '{{ %s %% (%s,) }}' % ( unparse_node ( node . params [ 0 ] . node , True ) , ', ' . join ( params ) ) ) #NEWLINE# #UNINDENT# #UNINDENT# params = ', ' . join ( ( unparse_node ( param . node , True ) for param in node . params ) ) #NEWLINE# if is_expr : #NEWLINE# #INDENT# return ( '%s(%s)' % ( node . name , params ) ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# return ( '{{ %s(%s) }}' % ( node . name , params ) ) #NEWLINE# #UNINDENT# #UNINDENT# if isinstance ( node , MethodCall ) : #NEWLINE# #INDENT# params = ', ' . join ( ( unparse_node ( param . node , True ) for param in node . params ) ) #NEWLINE# if is_expr : #NEWLINE# #INDENT# return ( '%s.%s(%s)' % ( unparse_node ( node . node , True ) , node . name , params ) ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# return ( '{{ %s.%s(%s) }}' % ( unparse_node ( node . node , True ) , node . name , params ) ) #NEWLINE# #UNINDENT# #UNINDENT# if is_expr : #NEWLINE# #INDENT# return ( 'XXX(%r)' % str ( node ) ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# return ( '{# XXX %s #}' % node )