modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2024-06-29 11:04:09 +04:00
parent 9418b9ff92
commit 559bc853b0
3 changed files with 39 additions and 27 deletions

View File

@ -1,8 +1,3 @@
# TODO
* [ ] supporter les instances de Closure comme éléments de contenu: elle
retournent du contenu sous forme d'iterable (comme IContent)
# nulib\php\content # nulib\php\content
un contenu est une liste de valeurs, avec une syntaxe pour que certains éléments un contenu est une liste de valeurs, avec une syntaxe pour que certains éléments
@ -15,15 +10,17 @@ le contenu final est résolu selon les règles suivantes:
- Sinon, le contenu doit être un tableau, séquentiel ou associatif, ça n'a pas - Sinon, le contenu doit être un tableau, séquentiel ou associatif, ça n'a pas
d'incidence d'incidence
- les éléments scalaires ou instance d'objets sont pris tels quels - les éléments scalaires ou instance d'objets sont pris tels quels
- les Closure sont appelés dès la résolution, et leur valeur de retour est
considéré comme un contenu statique inséré tel quel dans le flux
- les tableaux représentent un traitement dynamique: appel de fonction, - les tableaux représentent un traitement dynamique: appel de fonction,
instanciation, etc. instanciation, etc. le contenu effectif n'est évalué que lors de l'affichage
Les syntaxes possibles sont: Les syntaxes possibles sont:
`[[], $args...]` `[[], $args...]`
: merge littéral: les valeurs $args... sont insérées dans le : contenu statique: les valeurs $args... sont insérées dans le flux du contenu
flux du contenu sans modification. c'est la seule façon d'insérer un tableau sans modification. c'est la seule façon d'insérer un tableau dans la liste des
dans la liste des valeurs valeurs
`["class_or_function", $args...]` `["class_or_function", $args...]`
`[["class_or_function"], $args...]` `[["class_or_function"], $args...]`

View File

@ -1,6 +1,7 @@
<?php <?php
namespace nur\sery\php\content; namespace nur\sery\php\content;
use Closure;
use nur\sery\cl; use nur\sery\cl;
use nur\sery\php\func; use nur\sery\php\func;
@ -25,6 +26,26 @@ class c {
} }
const nq = [self::class, "nq"]; const nq = [self::class, "nq"];
private static final function add_static_content(array &$dest, iterable $values, $key, bool $seq): void {
$sindex = 0;
foreach ($values as $skey => $svalue) {
if ($skey === $sindex) {
$sindex++;
if ($seq) {
$dest[] = $svalue;
} else {
# la première sous-clé séquentielle est ajoutée avec la clé du
# merge statique
$dest[$key] = $svalue;
$seq = true;
}
} else {
$dest[$skey] = $svalue;
}
}
}
/** résoudre le contenu, et retourner la liste des valeurs */ /** résoudre le contenu, et retourner la liste des valeurs */
static final function resolve($content, $object_or_class=null, bool $quote=true, ?array &$dest=null): array { static final function resolve($content, $object_or_class=null, bool $quote=true, ?array &$dest=null): array {
if ($dest === null) $dest = []; if ($dest === null) $dest = [];
@ -37,6 +58,15 @@ class c {
} else { } else {
$seq = false; $seq = false;
} }
if ($value instanceof Closure) {
# contenu dynamique: le contenu est la valeur de retour de la fonction
# ce contenu est rajouté à la suite après avoir été quoté avec self::q()
$func = $value;
func::ensure_func($func, $object_or_class, $args);
$values = self::q(func::call($func, ...$args));
self::add_static_content($dest, $values, $key, $seq);
continue;
}
if (is_array($value)) { if (is_array($value)) {
# contenu dynamique # contenu dynamique
if (count($value) == 0) continue; if (count($value) == 0) continue;
@ -44,25 +74,10 @@ class c {
$args = array_slice($value, 1); $args = array_slice($value, 1);
if ($func === []) { if ($func === []) {
# merge statique # merge statique
$sindex = 0; self::add_static_content($dest, $args, $key, $seq);
foreach ($args as $skey => $arg) {
if ($skey === $sindex) {
$sindex++;
if ($seq) {
$dest[] = $arg;
} else {
# la première sous-clé séquentielle est ajoutée avec la clé du
# merge statique
$dest[$key] = $arg;
$seq = true;
}
} else {
$dest[$skey] = $arg;
}
}
continue; continue;
} else { } else {
# chaque argument est aussi un contenu # chaque argument de la fonction à appeler est aussi un contenu
foreach ($args as &$arg) { foreach ($args as &$arg) {
$array = is_array($arg); $array = is_array($arg);
$arg = self::resolve($arg, $object_or_class, false); $arg = self::resolve($arg, $object_or_class, false);

View File

@ -5,7 +5,7 @@ use nur\sery\php\content\impl\html;
use nur\sery\wip\web\content\v; use nur\sery\wip\web\content\v;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class contentTest extends TestCase { class cTest extends TestCase {
function testTo_string() { function testTo_string() {
self::assertSame("", c::to_string(null)); self::assertSame("", c::to_string(null));
self::assertSame("", c::to_string(false)); self::assertSame("", c::to_string(false));