63 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\data\template;
 | |
| 
 | |
| use nur\b\io\FileReader;
 | |
| use nur\b\io\IReader;
 | |
| use nur\b\io\IWriter;
 | |
| use nur\b\ValueException;
 | |
| use nur\data\expr\SimpleContext;
 | |
| 
 | |
| class StreamTemplate extends SimpleContext implements ITemplate {
 | |
|   use TTemplate;
 | |
| 
 | |
|   /**
 | |
|    * retourner un nom de fichier à utiliser par défaut en entrée si l'argument
 | |
|    * $input n'est pas spécifié.
 | |
|    */
 | |
|   protected function INPUT(): ?string {
 | |
|     return static::INPUT;
 | |
|   } const INPUT = null;
 | |
| 
 | |
|   /** @var IReader */
 | |
|   private $input;
 | |
| 
 | |
|   /** @var IWriter */
 | |
|   private $output;
 | |
| 
 | |
|   /** @var bool */
 | |
|   private $autoClose;
 | |
| 
 | |
|   function __construct(IWriter $output, ?IReader $input=null, bool $autoClose=true) {
 | |
|     parent::__construct();
 | |
|     $this->input = $input;
 | |
|     $this->output = $output;
 | |
|     $this->autoClose = $autoClose;
 | |
|     $this->context = $this;
 | |
|   }
 | |
| 
 | |
|   protected function ensureInput(): IReader {
 | |
|     $input = $this->input;
 | |
|     if ($input === null) {
 | |
|       $input = $this->INPUT();
 | |
|       if ($input === null) {
 | |
|         throw new ValueException("input is required");
 | |
|       }
 | |
|       $input = new FileReader($input);
 | |
|     }
 | |
|     return $input;
 | |
|   }
 | |
| 
 | |
|   /** retourner true */
 | |
|   function apply() {
 | |
|     $context = $this->getContext();
 | |
|     $input = $this->ensureInput();
 | |
|     $output = $this->output;
 | |
|     foreach ($input as $line) {
 | |
|       $line = $this->applyRules($line, $context);
 | |
|       $output->wnl($line);
 | |
|     }
 | |
|     $output->close($this->autoClose);
 | |
|     return true;
 | |
|   }
 | |
| }
 |