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