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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
  d'incidence
 | 
			
		||||
  - 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,
 | 
			
		||||
    instanciation, etc.
 | 
			
		||||
    instanciation, etc. le contenu effectif n'est évalué que lors de l'affichage
 | 
			
		||||
 | 
			
		||||
Les syntaxes possibles sont:
 | 
			
		||||
 | 
			
		||||
`[[], $args...]`
 | 
			
		||||
: merge littéral: les valeurs $args... sont insérées dans le
 | 
			
		||||
  flux du contenu sans modification. c'est la seule façon d'insérer un tableau
 | 
			
		||||
  dans la liste des valeurs
 | 
			
		||||
: contenu statique: les valeurs $args... sont insérées dans le flux du contenu
 | 
			
		||||
  sans modification. c'est la seule façon d'insérer un tableau dans la liste des
 | 
			
		||||
  valeurs
 | 
			
		||||
 | 
			
		||||
`["class_or_function", $args...]`
 | 
			
		||||
`[["class_or_function"], $args...]`
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
<?php
 | 
			
		||||
namespace nur\sery\php\content;
 | 
			
		||||
 | 
			
		||||
use Closure;
 | 
			
		||||
use nur\sery\cl;
 | 
			
		||||
use nur\sery\php\func;
 | 
			
		||||
 | 
			
		||||
@ -25,6 +26,26 @@ class c {
 | 
			
		||||
  }
 | 
			
		||||
  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 */
 | 
			
		||||
  static final function resolve($content, $object_or_class=null, bool $quote=true, ?array &$dest=null): array {
 | 
			
		||||
    if ($dest === null) $dest = [];
 | 
			
		||||
@ -37,6 +58,15 @@ class c {
 | 
			
		||||
      } else {
 | 
			
		||||
        $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)) {
 | 
			
		||||
        # contenu dynamique
 | 
			
		||||
        if (count($value) == 0) continue;
 | 
			
		||||
@ -44,25 +74,10 @@ class c {
 | 
			
		||||
        $args = array_slice($value, 1);
 | 
			
		||||
        if ($func === []) {
 | 
			
		||||
          # merge statique
 | 
			
		||||
          $sindex = 0;
 | 
			
		||||
          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;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          self::add_static_content($dest, $args, $key, $seq);
 | 
			
		||||
          continue;
 | 
			
		||||
        } else {
 | 
			
		||||
          # chaque argument est aussi un contenu
 | 
			
		||||
          # chaque argument de la fonction à appeler est aussi un contenu
 | 
			
		||||
          foreach ($args as &$arg) {
 | 
			
		||||
            $array = is_array($arg);
 | 
			
		||||
            $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 PHPUnit\Framework\TestCase;
 | 
			
		||||
 | 
			
		||||
class contentTest extends TestCase {
 | 
			
		||||
class cTest extends TestCase {
 | 
			
		||||
  function testTo_string() {
 | 
			
		||||
    self::assertSame("", c::to_string(null));
 | 
			
		||||
    self::assertSame("", c::to_string(false));
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user