2018-11-23 12:29:20 +00:00
< ? php
2019-01-24 08:00:03 +00:00
2018-11-23 12:29:20 +00:00
namespace Masterminds\HTML5\Tests\Parser ;
use Masterminds\HTML5\Elements ;
use Masterminds\HTML5\Parser\EventHandler ;
/**
* This testing class gathers events from a parser and builds a stack of events .
* It is useful for checking the output of a tokenizer .
*
* IMPORTANT :
*
* The startTag event also kicks the parser into TEXT_RAW when it encounters
* script or pre tags . This is to match the behavior required by the HTML5 spec ,
* which says that the tree builder must tell the tokenizer when to switch states .
*/
class EventStack implements EventHandler
{
protected $stack ;
public function __construct ()
{
$this -> stack = array ();
}
/**
* Get the event stack .
*/
public function events ()
{
return $this -> stack ;
}
public function depth ()
{
return count ( $this -> stack );
}
public function get ( $index )
{
return $this -> stack [ $index ];
}
protected function store ( $event , $data = null )
{
$this -> stack [] = array (
'name' => $event ,
2019-01-24 08:00:03 +00:00
'data' => $data ,
2018-11-23 12:29:20 +00:00
);
}
public function doctype ( $name , $type = 0 , $id = null , $quirks = false )
{
$args = array (
$name ,
$type ,
$id ,
2019-01-24 08:00:03 +00:00
$quirks ,
2018-11-23 12:29:20 +00:00
);
$this -> store ( 'doctype' , $args );
}
public function startTag ( $name , $attributes = array (), $selfClosing = false )
{
$args = func_get_args ();
$this -> store ( 'startTag' , $args );
2019-01-24 08:00:03 +00:00
if ( 'pre' == $name || 'script' == $name ) {
2018-11-23 12:29:20 +00:00
return Elements :: TEXT_RAW ;
}
}
public function endTag ( $name )
{
$this -> store ( 'endTag' , array (
2019-01-24 08:00:03 +00:00
$name ,
2018-11-23 12:29:20 +00:00
));
}
public function comment ( $cdata )
{
$this -> store ( 'comment' , array (
2019-01-24 08:00:03 +00:00
$cdata ,
2018-11-23 12:29:20 +00:00
));
}
public function cdata ( $data )
{
$this -> store ( 'cdata' , func_get_args ());
}
public function text ( $cdata )
{
// fprintf(STDOUT, "Received TEXT event with: " . $cdata);
$this -> store ( 'text' , array (
2019-01-24 08:00:03 +00:00
$cdata ,
2018-11-23 12:29:20 +00:00
));
}
public function eof ()
{
$this -> store ( 'eof' );
}
public function parseError ( $msg , $line , $col )
{
// throw new EventStackParseError(sprintf("%s (line %d, col %d)", $msg, $line, $col));
// $this->store(sprintf("%s (line %d, col %d)", $msg, $line, $col));
$this -> store ( 'error' , func_get_args ());
}
public function processingInstruction ( $name , $data = null )
{
$this -> store ( 'pi' , func_get_args ());
}
}