83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace dokuwiki\Parsing\Handler;
 | |
| 
 | |
| /**
 | |
|  * Generic call writer class to handle nesting of rendering instructions
 | |
|  * within a render instruction. Also see nest() method of renderer base class
 | |
|  *
 | |
|  * @author    Chris Smith <chris@jalakai.co.uk>
 | |
|  */
 | |
| class Nest extends AbstractRewriter
 | |
| {
 | |
|     protected $closingInstruction;
 | |
| 
 | |
|     /**
 | |
|      * @inheritdoc
 | |
|      *
 | |
|      * @param  CallWriterInterface $CallWriter     the parser's current call writer, i.e. the one above us in the chain
 | |
|      * @param  string     $close          closing instruction name, this is required to properly terminate the
 | |
|      *                                    syntax mode if the document ends without a closing pattern
 | |
|      */
 | |
|     public function __construct(CallWriterInterface $CallWriter, $close = "nest_close")
 | |
|     {
 | |
|         parent::__construct($CallWriter);
 | |
|         $this->closingInstruction = $close;
 | |
|     }
 | |
| 
 | |
|     /** @inheritdoc */
 | |
|     public function writeCall($call)
 | |
|     {
 | |
|         $this->calls[] = $call;
 | |
|     }
 | |
| 
 | |
|     /** @inheritdoc */
 | |
|     public function writeCalls($calls)
 | |
|     {
 | |
|         $this->calls = array_merge($this->calls, $calls);
 | |
|     }
 | |
| 
 | |
|     /** @inheritdoc */
 | |
|     public function finalise()
 | |
|     {
 | |
|         $last_call = end($this->calls);
 | |
|         $this->writeCall(array($this->closingInstruction,array(), $last_call[2]));
 | |
| 
 | |
|         $this->process();
 | |
|         $this->callWriter->finalise();
 | |
|         unset($this->callWriter);
 | |
|     }
 | |
| 
 | |
|     /** @inheritdoc */
 | |
|     public function process()
 | |
|     {
 | |
|         // merge consecutive cdata
 | |
|         $unmerged_calls = $this->calls;
 | |
|         $this->calls = array();
 | |
| 
 | |
|         foreach ($unmerged_calls as $call) $this->addCall($call);
 | |
| 
 | |
|         $first_call = reset($this->calls);
 | |
|         $this->callWriter->writeCall(array("nest", array($this->calls), $first_call[2]));
 | |
| 
 | |
|         return $this->callWriter;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param array $call
 | |
|      */
 | |
|     protected function addCall($call)
 | |
|     {
 | |
|         $key = count($this->calls);
 | |
|         if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) {
 | |
|             $this->calls[$key-1][1][0] .= $call[1][0];
 | |
|         } elseif ($call[0] == 'eol') {
 | |
|             // do nothing (eol shouldn't be allowed, to counter preformatted fix in #1652 & #1699)
 | |
|         } else {
 | |
|             $this->calls[] = $call;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
| }
 |