2011-10-05 06:22:53 +02:00
< ? php
/*
* This file is part of Twig .
*
2018-05-10 12:24:53 +02:00
* ( c ) Fabien Potencier
* ( c ) Armin Ronacher
2011-10-05 06:22:53 +02:00
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
/**
* Represents a node in the AST .
*
2013-08-01 21:20:12 +02:00
* @ author Fabien Potencier < fabien @ symfony . com >
2011-10-05 06:22:53 +02:00
*/
2013-08-01 21:20:12 +02:00
class Twig_Node implements Twig_NodeInterface
2011-10-05 06:22:53 +02:00
{
protected $nodes ;
protected $attributes ;
protected $lineno ;
protected $tag ;
2018-05-10 12:24:53 +02:00
private $name ;
2011-10-05 06:22:53 +02:00
/**
* Constructor .
*
* The nodes are automatically made available as properties ( $this -> node ) .
* The attributes are automatically made available as array items ( $this [ 'name' ]) .
*
2018-05-10 12:24:53 +02:00
* @ param array $nodes An array of named nodes
* @ param array $attributes An array of attributes ( should not be nodes )
* @ param int $lineno The line number
* @ param string $tag The tag name associated with the Node
2011-10-05 06:22:53 +02:00
*/
public function __construct ( array $nodes = array (), array $attributes = array (), $lineno = 0 , $tag = null )
{
2018-05-10 12:24:53 +02:00
foreach ( $nodes as $name => $node ) {
if ( ! $node instanceof Twig_NodeInterface ) {
2020-01-20 02:48:53 +01:00
@ trigger_error ( sprintf ( 'Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.' , ( is_object ( $node ) ? get_class ( $node ) : null ) === $node ? 'null' : gettype ( $node ), $name , get_class ( $this )), E_USER_DEPRECATED );
2018-05-10 12:24:53 +02:00
}
}
2011-10-05 06:22:53 +02:00
$this -> nodes = $nodes ;
$this -> attributes = $attributes ;
$this -> lineno = $lineno ;
$this -> tag = $tag ;
}
public function __toString ()
{
$attributes = array ();
foreach ( $this -> attributes as $name => $value ) {
$attributes [] = sprintf ( '%s: %s' , $name , str_replace ( " \n " , '' , var_export ( $value , true )));
}
$repr = array ( get_class ( $this ) . '(' . implode ( ', ' , $attributes ));
if ( count ( $this -> nodes )) {
foreach ( $this -> nodes as $name => $node ) {
$len = strlen ( $name ) + 4 ;
$noderepr = array ();
foreach ( explode ( " \n " , ( string ) $node ) as $line ) {
$noderepr [] = str_repeat ( ' ' , $len ) . $line ;
}
$repr [] = sprintf ( ' %s: %s' , $name , ltrim ( implode ( " \n " , $noderepr )));
}
$repr [] = ')' ;
} else {
$repr [ 0 ] .= ')' ;
}
return implode ( " \n " , $repr );
}
2018-05-10 12:24:53 +02:00
/**
* @ deprecated since 1.16 . 1 ( to be removed in 2.0 )
*/
2011-10-05 06:22:53 +02:00
public function toXml ( $asDom = false )
{
2018-05-10 12:24:53 +02:00
@ trigger_error ( sprintf ( '%s is deprecated since version 1.16.1 and will be removed in 2.0.' , __METHOD__ ), E_USER_DEPRECATED );
2011-10-05 06:22:53 +02:00
$dom = new DOMDocument ( '1.0' , 'UTF-8' );
$dom -> formatOutput = true ;
$dom -> appendChild ( $xml = $dom -> createElement ( 'twig' ));
$xml -> appendChild ( $node = $dom -> createElement ( 'node' ));
$node -> setAttribute ( 'class' , get_class ( $this ));
foreach ( $this -> attributes as $name => $value ) {
$node -> appendChild ( $attribute = $dom -> createElement ( 'attribute' ));
$attribute -> setAttribute ( 'name' , $name );
$attribute -> appendChild ( $dom -> createTextNode ( $value ));
}
foreach ( $this -> nodes as $name => $n ) {
if ( null === $n ) {
continue ;
}
$child = $n -> toXml ( true ) -> getElementsByTagName ( 'node' ) -> item ( 0 );
$child = $dom -> importNode ( $child , true );
$child -> setAttribute ( 'name' , $name );
$node -> appendChild ( $child );
}
2018-05-10 12:24:53 +02:00
return $asDom ? $dom : $dom -> saveXML ();
2011-10-05 06:22:53 +02:00
}
public function compile ( Twig_Compiler $compiler )
{
foreach ( $this -> nodes as $node ) {
$node -> compile ( $compiler );
}
}
2018-05-10 12:24:53 +02:00
public function getTemplateLine ()
{
return $this -> lineno ;
}
/**
* @ deprecated since 1.27 ( to be removed in 2.0 )
*/
2011-10-05 06:22:53 +02:00
public function getLine ()
{
2018-05-10 12:24:53 +02:00
@ trigger_error ( 'The ' . __METHOD__ . ' method is deprecated since version 1.27 and will be removed in 2.0. Use getTemplateLine() instead.' , E_USER_DEPRECATED );
2011-10-05 06:22:53 +02:00
return $this -> lineno ;
}
public function getNodeTag ()
{
return $this -> tag ;
}
/**
2018-05-10 12:24:53 +02:00
* @ return bool
2011-10-05 06:22:53 +02:00
*/
public function hasAttribute ( $name )
{
return array_key_exists ( $name , $this -> attributes );
}
/**
2018-05-10 12:24:53 +02:00
* @ return mixed
2011-10-05 06:22:53 +02:00
*/
public function getAttribute ( $name )
{
if ( ! array_key_exists ( $name , $this -> attributes )) {
2013-08-01 21:20:12 +02:00
throw new LogicException ( sprintf ( 'Attribute "%s" does not exist for Node "%s".' , $name , get_class ( $this )));
2011-10-05 06:22:53 +02:00
}
return $this -> attributes [ $name ];
}
/**
2018-05-10 12:24:53 +02:00
* @ param string $name
* @ param mixed $value
2011-10-05 06:22:53 +02:00
*/
public function setAttribute ( $name , $value )
{
$this -> attributes [ $name ] = $value ;
}
public function removeAttribute ( $name )
{
unset ( $this -> attributes [ $name ]);
}
/**
2018-05-10 12:24:53 +02:00
* @ return bool
2011-10-05 06:22:53 +02:00
*/
public function hasNode ( $name )
{
return array_key_exists ( $name , $this -> nodes );
}
/**
2018-05-10 12:24:53 +02:00
* @ return Twig_Node
2011-10-05 06:22:53 +02:00
*/
public function getNode ( $name )
{
if ( ! array_key_exists ( $name , $this -> nodes )) {
2013-08-01 21:20:12 +02:00
throw new LogicException ( sprintf ( 'Node "%s" does not exist for Node "%s".' , $name , get_class ( $this )));
2011-10-05 06:22:53 +02:00
}
return $this -> nodes [ $name ];
}
public function setNode ( $name , $node = null )
{
2018-05-10 12:24:53 +02:00
if ( ! $node instanceof Twig_NodeInterface ) {
2020-01-20 02:48:53 +01:00
@ trigger_error ( sprintf ( 'Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.' , ( is_object ( $node ) ? get_class ( $node ) : null ) === $node ? 'null' : gettype ( $node ), $name , get_class ( $this )), E_USER_DEPRECATED );
2018-05-10 12:24:53 +02:00
}
2011-10-05 06:22:53 +02:00
$this -> nodes [ $name ] = $node ;
}
public function removeNode ( $name )
{
unset ( $this -> nodes [ $name ]);
}
public function count ()
{
return count ( $this -> nodes );
}
public function getIterator ()
{
return new ArrayIterator ( $this -> nodes );
}
2018-05-10 12:24:53 +02:00
public function setTemplateName ( $name )
{
$this -> name = $name ;
foreach ( $this -> nodes as $node ) {
if ( null !== $node ) {
$node -> setTemplateName ( $name );
}
}
}
public function getTemplateName ()
{
return $this -> name ;
}
/**
* @ deprecated since 1.27 ( to be removed in 2.0 )
*/
public function setFilename ( $name )
{
@ trigger_error ( 'The ' . __METHOD__ . ' method is deprecated since version 1.27 and will be removed in 2.0. Use setTemplateName() instead.' , E_USER_DEPRECATED );
$this -> setTemplateName ( $name );
}
/**
* @ deprecated since 1.27 ( to be removed in 2.0 )
*/
public function getFilename ()
{
@ trigger_error ( 'The ' . __METHOD__ . ' method is deprecated since version 1.27 and will be removed in 2.0. Use getTemplateName() instead.' , E_USER_DEPRECATED );
return $this -> name ;
}
2011-10-05 06:22:53 +02:00
}
2018-05-10 12:24:53 +02:00
class_alias ( 'Twig_Node' , 'Twig\Node\Node' , false );
class_exists ( 'Twig_Compiler' );