135 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur;
 | |
| 
 | |
| use nur\b\io\FileWriter;
 | |
| use nur\b\io\IOException;
 | |
| use nur\b\io\IWriter;
 | |
| 
 | |
| /**
 | |
|  * Class writer: des outils pour écrire des valeurs vers une destination
 | |
|  */
 | |
| class writer {
 | |
|   const OUTPUT_MAP = [
 | |
|     "-" => "php://stdout",
 | |
|     "/dev/stdout" => "php://stdout",
 | |
|     "/dev/stderr" => "php://stderr",
 | |
|   ];
 | |
|   const OUTPUT_MODES = [
 | |
|     "php://stdout" => "w",
 | |
|     "php://stderr" => "w",
 | |
|   ];
 | |
| 
 | |
|   /** indiquer si $output désigne une des sorties standard (stdout ou stderr) */
 | |
|   static final function is_stdxxx($output): bool {
 | |
|     if ($output === null) return true;
 | |
|     if (!is_string($output)) return false;
 | |
|     if (array_key_exists($output, self::OUTPUT_MAP)) {
 | |
|       $output = self::OUTPUT_MAP[$output];
 | |
|     }
 | |
|     return array_key_exists($output, self::OUTPUT_MODES);
 | |
|   }
 | |
| 
 | |
|   /** indiquer si $file désigne un nom de fichier local utilisable en écriture */
 | |
|   static final function is_file($file): bool {
 | |
|     if (!is_string($file)) return false;
 | |
|     if (array_key_exists($file, self::OUTPUT_MAP)) {
 | |
|       $file = self::OUTPUT_MAP[$file];
 | |
|     }
 | |
|     if (substr($file, 0, 7) === "file://") return true;
 | |
|     return !preg_match('/^[a-z]+:\/\//', $file);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * ouvrir le cas échéant le fichier spécifié pour écriture
 | |
|    *
 | |
|    * @throws IOException
 | |
|    */
 | |
|   static final function with($output, ?string $mode=null): IWriter {
 | |
|     if ($output instanceof IWriter) return $output;
 | |
|     if ($mode === null) $mode = FileWriter::DEFAULT_MODE;
 | |
|     if (!is_resource($output)) {
 | |
|       if (array_key_exists($output, self::OUTPUT_MAP)) {
 | |
|         $output = self::OUTPUT_MAP[$output];
 | |
|       }
 | |
|       if (array_key_exists($output, self::OUTPUT_MODES)) {
 | |
|         $mode = self::OUTPUT_MODES[$output];
 | |
|       }
 | |
|     }
 | |
|     return new FileWriter($output, $mode);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * écrire une suite de valeurs collées les unes aux autres dans la destination
 | |
|    *
 | |
|    * @throws IOException
 | |
|    */
 | |
|   static final function write($output, ...$values): void {
 | |
|     if ($output === null) {
 | |
|       out::write(...$values);
 | |
|     } else {
 | |
|       $close = !($output instanceof IWriter);
 | |
|       self::with($output)->write(...$values)->close($close);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * afficher une suite de valeurs collées les unes aux autres suivie d'un saut
 | |
|    * à la ligne
 | |
|    *
 | |
|    * @throws IOException
 | |
|    */
 | |
|   static final function wnl($output, ...$values): void {
 | |
|     if ($output === null) {
 | |
|       out::wnl(...$values);
 | |
|     } else {
 | |
|       $close = !($output instanceof IWriter);
 | |
|       self::with($output)->wnl(...$values)->close($close);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * écrire une suite de valeurs séparées par des espaces dans la destination
 | |
|    *
 | |
|    * @throws IOException
 | |
|    */
 | |
|   static final function print($output, ...$values): void {
 | |
|     if ($output === null) {
 | |
|       out::print(...$values);
 | |
|     } else {
 | |
|       $close = !($output instanceof IWriter);
 | |
|       self::with($output)->print(...$values)->close($close);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * afficher une suite de valeurs séparées par des espaces suivi d'un saut à la ligne
 | |
|    *
 | |
|    * @throws IOException
 | |
|    */
 | |
|   static final function pnl($output, ...$values): void {
 | |
|     if ($output === null) {
 | |
|       out::pnl(...$values);
 | |
|     } else {
 | |
|       $close = !($output instanceof IWriter);
 | |
|       self::with($output)->pnl(...$values)->close($close);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * écrire une suite de lignes dans la destination
 | |
|    *
 | |
|    * @throws IOException
 | |
|    */
 | |
|   static final function write_lines($output, iterable $lines): void {
 | |
|     if ($output === null) {
 | |
|       foreach ($lines as $line) {
 | |
|         echo $line;
 | |
|         echo "\n";
 | |
|       }
 | |
|     } else {
 | |
|       $close = !($output instanceof IWriter);
 | |
|       self::with($output)->writeLines($lines)->close($close);
 | |
|     }
 | |
|   }
 | |
| }
 |