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