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;
 | 
						|
  }
 | 
						|
}
 |