forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			117 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| 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,
 | |
|             'data' => $data,
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function doctype($name, $type = 0, $id = null, $quirks = false)
 | |
|     {
 | |
|         $args = array(
 | |
|             $name,
 | |
|             $type,
 | |
|             $id,
 | |
|             $quirks,
 | |
|         );
 | |
|         $this->store('doctype', $args);
 | |
|     }
 | |
| 
 | |
|     public function startTag($name, $attributes = array(), $selfClosing = false)
 | |
|     {
 | |
|         $args = func_get_args();
 | |
|         $this->store('startTag', $args);
 | |
|         if ('pre' == $name || 'script' == $name) {
 | |
|             return Elements::TEXT_RAW;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function endTag($name)
 | |
|     {
 | |
|         $this->store('endTag', array(
 | |
|             $name,
 | |
|         ));
 | |
|     }
 | |
| 
 | |
|     public function comment($cdata)
 | |
|     {
 | |
|         $this->store('comment', array(
 | |
|             $cdata,
 | |
|         ));
 | |
|     }
 | |
| 
 | |
|     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(
 | |
|             $cdata,
 | |
|         ));
 | |
|     }
 | |
| 
 | |
|     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());
 | |
|     }
 | |
| }
 |