modifs.mineures sans commentaires
This commit is contained in:
parent
8011646209
commit
cd7a96f181
|
@ -1,11 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\sery\output;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface IPrintable: un objet qui peut écrire du contenu sur la sortie
|
|
||||||
* standard
|
|
||||||
*/
|
|
||||||
interface IPrintable {
|
|
||||||
/** afficher le contenu */
|
|
||||||
function print(): void;
|
|
||||||
}
|
|
|
@ -3,8 +3,9 @@ namespace nur\sery\output\std;
|
||||||
|
|
||||||
use Exception;
|
use Exception;
|
||||||
use nulib\cl;
|
use nulib\cl;
|
||||||
use nur\sery\output\IContent;
|
use nur\sery\sys\content;
|
||||||
use nur\sery\output\IPrintable;
|
use nur\sery\sys\IContent;
|
||||||
|
use nur\sery\sys\IPrintable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class StdOutput: affichage sur STDOUT, STDERR ou dans un fichier quelconque
|
* Class StdOutput: affichage sur STDOUT, STDERR ou dans un fichier quelconque
|
||||||
|
@ -181,37 +182,12 @@ class StdOutput {
|
||||||
return preg_replace('/\x1B\[.*?m/', "", $text);
|
return preg_replace('/\x1B\[.*?m/', "", $text);
|
||||||
}
|
}
|
||||||
|
|
||||||
static function flatten($values, ?array &$dest=null): array {
|
|
||||||
if ($dest === null) $dest = [];
|
|
||||||
if ($values === null) return $dest;
|
|
||||||
if (is_string($values)) {
|
|
||||||
$dest[] = $values;
|
|
||||||
return $dest;
|
|
||||||
} elseif (!is_array($values)) {
|
|
||||||
if ($values instanceof IContent) {
|
|
||||||
$values = $values->getContent();
|
|
||||||
} elseif ($values instanceof IPrintable) {
|
|
||||||
ob_start(null, 0, PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_FLUSHABLE);
|
|
||||||
$values->print();
|
|
||||||
$dest[] = ob_get_clean();
|
|
||||||
return $dest;
|
|
||||||
} elseif (!is_iterable($values)) {
|
|
||||||
$dest[] = strval($values);
|
|
||||||
return $dest;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach ($values as $value) {
|
|
||||||
self::flatten($value, $dest);
|
|
||||||
}
|
|
||||||
return $dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getIndent(int $indentLevel): string {
|
function getIndent(int $indentLevel): string {
|
||||||
return str_repeat($this->indent, $indentLevel);
|
return str_repeat($this->indent, $indentLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLines(bool $withNl, ...$values): array {
|
function getLines(bool $withNl, ...$values): array {
|
||||||
$values = self::flatten($values);
|
$values = content::flatten($values);
|
||||||
if (!$values) return [];
|
if (!$values) return [];
|
||||||
$text = implode("", $values);
|
$text = implode("", $values);
|
||||||
if ($text === "") return [""];
|
if ($text === "") return [""];
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
namespace nur\sery\output;
|
namespace nur\sery\sys;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface IContent: un objet capable de produire du contenu à afficher
|
* Interface IContent: un objet capable de produire du contenu à afficher
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
namespace nur\sery\sys;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface IPrintable: un objet qui écrit du contenu sur la sortie standard
|
||||||
|
*/
|
||||||
|
interface IPrintable {
|
||||||
|
/** afficher le contenu */
|
||||||
|
function print(): void;
|
||||||
|
}
|
|
@ -0,0 +1,108 @@
|
||||||
|
<?php
|
||||||
|
namespace nur\sery\sys;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class content: gestionnaire de contenu (statique ou dynamique)
|
||||||
|
*/
|
||||||
|
class content {
|
||||||
|
/**
|
||||||
|
* applatir $contents, et retourner une liste de valeurs scalaires:
|
||||||
|
* - les instances de IContent et IPrintable sont remplacées par leur contenu
|
||||||
|
* - les autres objets sont transformés en chaine de caractère avec strval()
|
||||||
|
*/
|
||||||
|
static function flatten($contents, ?array &$dest=null): array {
|
||||||
|
if ($dest === null) $dest = [];
|
||||||
|
if ($contents === null) return $dest;
|
||||||
|
if ($contents instanceof IContent) {
|
||||||
|
$contents = $contents->getContent();
|
||||||
|
} elseif ($contents instanceof IPrintable) {
|
||||||
|
ob_start(null, 0, PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_FLUSHABLE);
|
||||||
|
$contents->print();
|
||||||
|
$dest[] = ob_get_clean();
|
||||||
|
return $dest;
|
||||||
|
} elseif (!is_iterable($contents)) {
|
||||||
|
$dest[] = $contents;
|
||||||
|
return $dest;
|
||||||
|
}
|
||||||
|
foreach ($contents as $value) {
|
||||||
|
self::flatten($value, $dest);
|
||||||
|
}
|
||||||
|
return $dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* résoudre tout le contenu statique: il ne restera plus qu'une liste de
|
||||||
|
* chaines ou d'instances de IContent, IPrintable ou des objets quelconques
|
||||||
|
*/
|
||||||
|
static function resolve_static($contents, $dest_class=null, bool $quote=true, ?array &$dest=null): array {
|
||||||
|
if ($dest === null) $dest = [];
|
||||||
|
if ($contents === null) return $dest;
|
||||||
|
if (is_string($contents)) {
|
||||||
|
if ($quote) $contents = htmlspecialchars($contents);
|
||||||
|
$dest[] = $contents;
|
||||||
|
return $dest;
|
||||||
|
} elseif ($contents instanceof IContent) {
|
||||||
|
$dest[] = $contents;
|
||||||
|
return $dest;
|
||||||
|
} elseif ($contents instanceof IPrintable) {
|
||||||
|
$dest[] = $contents;
|
||||||
|
return $dest;
|
||||||
|
} elseif (!is_iterable($contents)) {
|
||||||
|
$dest[] = $contents;
|
||||||
|
return $dest;
|
||||||
|
}
|
||||||
|
foreach ($contents as $content) {
|
||||||
|
if ($content === null) continue;
|
||||||
|
elseif (is_string($content)) $dest[] = $content;
|
||||||
|
elseif ($contents instanceof IContent) $dest[] = $content;
|
||||||
|
elseif ($contents instanceof IPrintable) $dest[] = $content;
|
||||||
|
elseif (!is_array($content)) $dest[] = $content;
|
||||||
|
else {
|
||||||
|
# ici, $content est soit:
|
||||||
|
# - un appel de fonction ou méthode statique d'une des formes suivantes:
|
||||||
|
# - [class, method, ...args]
|
||||||
|
# - [null, method, ...args]
|
||||||
|
# - [[class, method], ...args]
|
||||||
|
# - [[null, method], ...args]
|
||||||
|
# - ou une définition d'objet d'une des formes suivantes
|
||||||
|
# - [class, ...args]
|
||||||
|
# - [[class], ...args]
|
||||||
|
$class = false;
|
||||||
|
if (array_key_exists(0, $content) && is_array($content[0])) {
|
||||||
|
# $content est de la forme [func_or_class, ...args]
|
||||||
|
$func = $content[0];
|
||||||
|
$args = array_slice($content, 1);
|
||||||
|
if (func::is_class($func)) {
|
||||||
|
$class = true;
|
||||||
|
func::fix_class_args($func, $args);
|
||||||
|
} else {
|
||||||
|
func::ensure_func($func, $dest_class, $args);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# $content est de la forme $func
|
||||||
|
$func = $content;
|
||||||
|
if (func::is_class($func)) {
|
||||||
|
$class = true;
|
||||||
|
func::fix_class_args($func, $args);
|
||||||
|
} else {
|
||||||
|
func::ensure_func($func, $dest_class, $args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# chaque argument est un contenu statique
|
||||||
|
foreach ($args as &$arg) {
|
||||||
|
$arg = self::resolve_static($arg, $dest_class, false);
|
||||||
|
$arg = self::flatten($arg);
|
||||||
|
switch (count($arg)) {
|
||||||
|
case 0: $arg = null; break;
|
||||||
|
case 1: $arg = $arg[0]; break;
|
||||||
|
default: $arg = implode("", $arg);
|
||||||
|
}
|
||||||
|
}; unset($arg);
|
||||||
|
# puis appeler la fonction
|
||||||
|
if ($class) $content = func::cons($func, ...$args);
|
||||||
|
else $content = func::call($func, ...$args);
|
||||||
|
$dest[] = $content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue