110 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace nur\b\io;
 | 
						|
 | 
						|
use nur\out;
 | 
						|
 | 
						|
trait Twriter {
 | 
						|
  function isatty(): bool {
 | 
						|
    $resource = $this->getResource();
 | 
						|
    return $resource !== null && stream_isatty($resource);
 | 
						|
  }
 | 
						|
 | 
						|
  /** @var int */
 | 
						|
  private $indentLevel = 0;
 | 
						|
 | 
						|
  /** @var string */
 | 
						|
  private $indentString = out::INDENT_STRING;
 | 
						|
 | 
						|
  /** réinitialiser l'indentation */
 | 
						|
  function resetIndent(?int $indentLevel=0, ?string $indentString=null): void {
 | 
						|
    if ($indentLevel !== null) $this->indentLevel = $indentLevel;
 | 
						|
    if ($indentString !== null) $this->indentString = $indentString;
 | 
						|
  }
 | 
						|
 | 
						|
  /** augmenter le niveau d'indentation et retourner le niveau précédent */
 | 
						|
  function indent(): int {
 | 
						|
    $indentLevel = $this->indentLevel;
 | 
						|
    $this->indentLevel++;
 | 
						|
    return $indentLevel;
 | 
						|
  }
 | 
						|
 | 
						|
  /** diminuer le niveau d'indentation */
 | 
						|
  function dedent(): void {
 | 
						|
    if ($this->indentLevel > 0) $this->indentLevel--;
 | 
						|
  }
 | 
						|
 | 
						|
  protected function getIndent(): string {
 | 
						|
    return str_repeat($this->indentString, $this->indentLevel);
 | 
						|
  }
 | 
						|
 | 
						|
  private function _Twriter__filterValues(array $values): array {
 | 
						|
    $nzs = [];
 | 
						|
    foreach ($values as $value) {
 | 
						|
      if ($value !== null && $value !== false) {
 | 
						|
        $nzs[] = $value;
 | 
						|
      }
 | 
						|
    }
 | 
						|
    return $nzs;
 | 
						|
  }
 | 
						|
 | 
						|
  private function _Twriter__indentLines(string $lines, bool $haveNl): string {
 | 
						|
    if ($haveNl) $lines = substr($lines, 0, -1);
 | 
						|
    $lines = str_replace("\n", "\n".$this->getIndent(), $lines);
 | 
						|
    if ($haveNl) $lines .= "\n";
 | 
						|
    return $lines;
 | 
						|
  }
 | 
						|
 | 
						|
  /** @var bool faut-il afficher une indentation avant la ligne courante? */
 | 
						|
  private $indent = true;
 | 
						|
 | 
						|
  protected function indentLines(string $lines, bool $updateIndent=true): string {
 | 
						|
    if ($this->indentLevel > 0) {
 | 
						|
      if ($this->indent) $lines = $this->getIndent().$lines;
 | 
						|
      $haveNl = substr($lines, -1) === "\n";
 | 
						|
      $lines = $this->_Twriter__indentLines($lines, $haveNl);
 | 
						|
      if ($updateIndent) $this->indent = $haveNl;
 | 
						|
    }
 | 
						|
    return $lines;
 | 
						|
  }
 | 
						|
 | 
						|
  function toString(string $sep, array $values, bool $updateIndent=true): string {
 | 
						|
    $lines = implode($sep, $this->_Twriter__filterValues($values));
 | 
						|
    $lines = $this->indentLines($lines, $updateIndent);
 | 
						|
    return $lines;
 | 
						|
  }
 | 
						|
 | 
						|
  function write(...$values): IWriter {
 | 
						|
    $this->_write($this->toString("", $values));
 | 
						|
    return $this;
 | 
						|
  }
 | 
						|
 | 
						|
  function wnl(...$values): IWriter {
 | 
						|
    $this->_write($this->toString("", $values));
 | 
						|
    $this->_write("\n");
 | 
						|
    $this->indent = true;
 | 
						|
    return $this;
 | 
						|
  }
 | 
						|
 | 
						|
  function print(...$values): IWriter {
 | 
						|
    $this->_write($this->toString(" ", $values));
 | 
						|
    return $this;
 | 
						|
  }
 | 
						|
 | 
						|
  function pnl(...$values): IWriter {
 | 
						|
    $this->_write($this->toString(" ", $values));
 | 
						|
    $this->_write("\n");
 | 
						|
    $this->indent = true;
 | 
						|
    return $this;
 | 
						|
  }
 | 
						|
 | 
						|
  function writeLines(?iterable $lines): IWriter {
 | 
						|
    if ($lines !== null) {
 | 
						|
      foreach ($lines as $line) {
 | 
						|
        $this->_write($this->indentLines($line));
 | 
						|
        $this->_write("\n");
 | 
						|
      }
 | 
						|
    }
 | 
						|
    return $this;
 | 
						|
  }
 | 
						|
}
 |