modifs.mineures sans commentaires
This commit is contained in:
parent
9418b9ff92
commit
559bc853b0
|
@ -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...]`
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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));
|
Loading…
Reference in New Issue