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 nulib\cl;
 | 
			
		||||
use nur\sery\output\IContent;
 | 
			
		||||
use nur\sery\output\IPrintable;
 | 
			
		||||
use nur\sery\sys\content;
 | 
			
		||||
use nur\sery\sys\IContent;
 | 
			
		||||
use nur\sery\sys\IPrintable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class StdOutput: affichage sur STDOUT, STDERR ou dans un fichier quelconque
 | 
			
		||||
@ -181,37 +182,12 @@ class StdOutput {
 | 
			
		||||
    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 {
 | 
			
		||||
    return str_repeat($this->indent, $indentLevel);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function getLines(bool $withNl, ...$values): array {
 | 
			
		||||
    $values = self::flatten($values);
 | 
			
		||||
    $values = content::flatten($values);
 | 
			
		||||
    if (!$values) return [];
 | 
			
		||||
    $text = implode("", $values);
 | 
			
		||||
    if ($text === "") return [""];
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
<?php
 | 
			
		||||
namespace nur\sery\output;
 | 
			
		||||
namespace nur\sery\sys;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Interface IContent: un objet capable de produire du contenu à afficher
 | 
			
		||||
							
								
								
									
										10
									
								
								src/sys/IPrintable.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/sys/IPrintable.php
									
									
									
									
									
										Normal file
									
								
							@ -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;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										108
									
								
								src/sys/content.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								src/sys/content.php
									
									
									
									
									
										Normal file
									
								
							@ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user