# nulib-base

* [nulib\schema](src/schema/TODO.md)
* [nulib\cache](src/cache/TODO.md)
* [nulib\app\cli](src/app/cli/TODO.md)

## Vrac

* classe de base `profile_manager` qui permet de gérer des profils
* class Tool permettant d'appliquer un traitement à une valeur scalaire
  * ArrayTool permet d'appliquer les traitement à tous les éléments du tableau
  * les traitements sont une suite d'opérations à faire, ou de filtres à
    appliquer, qui ne sont appliqués que lors du parcours effectif de la liste
  * exemple
    ```php
    $result = ArrayTool::with($source)
      ->filterKey("key")
      ->filter("value")
      ->add("value", "key")
      ->addAll($iterable)
      ->all();
    ```
    déterminer le genre de traitements que l'on peut offrir
* syntaxe pour CTable: définition des en-têtes et des valeurs des colonnes dans
  la même expression
  ~~~php
  new CTable($rows, [
    "contents" => [
      ## champ
      ["Nom", "nom"],
      ["Prénom", "prenom"],
      ## fonction
      ["Age", function(Cursor $cursor) {
        return (new Date())->diff($cursor->row["date_naissance"]);
      }],
      ## Pas de contenu
      ["Vide", null],
      ## Contenu dynamique
      ["Contenu", [
        "before",
        v::span("hello"),
        Cursor::dyn("name"),
        "after",
        Cursor::dyn(function(Cursor $cursor) {
          return $cursor["surname"];
        }),
      ]],
      ## colspan
      ["First",
        function() { return "sur deux colonnes"; },
	      "colspan" => 2,
      ],
      ["Second", null],
      ## colspan dynamique
      # la valeur de Element n'est évaluée que si colspan==null
      ["Groupe", function(Cursor $row) {
        $break = $breaker->shouldBreakOn($row["code_groupe"]));
        if ($break) {
          $row->set("colspan", 2);
          return "{$row["code_groupe"]} {$row["libelle_groupe"]}";
        } else {
          $row->set("colspan", null);
          return null;
        }
      }, "colspan" => function(Cursor $row) {
        return $row->get("colspan");
      }],
      ["Element", function(Cursor $row) {
        return $row["libelle_element"];
      }]
    ],
  ]);
  ~~~
  bien entendu, bien que ce ne soit pas démontré ici, le premier argument
  (l'en-tête) est un contenu, pas seulement une chaine

  chaque élément de contenu défini header, body et footer
  ~~~php
  $element = ["header" => [], "body" => [], "footer" => []];
  ~~~

  colspan peut être utilisé dans header, body ou footer. si spécifié dans
  $element, colspan s'applique à body
  ~~~php
  # les deux suivants sont équivalents
  $element = ["myheader", "mybody", "colspan" => 2, "myfooter"];
  $element = [
    "header" => [
      "content" => "myheader",
    ],
    "body" => [
      "content" => "mybody",
      "colspan" => 2,
    ],
    "footer" => [
      "content" => "myfooter",
    ],
  ];
  ~~~

  si $element est une fonction, il retourne la valeur de l'élement
  ~~~php
  $element = function() {
    return ["header", "body"];
  }
  ~~~

  clé "enabled" permet d'activer dynamiquement un élément
  ~~~php
  $element = function() {
    return ["header", "body", "enabled" => $includeElement];
  }
  ~~~

  clé "func" pour spécifier la fonction dans un contexte statique
  ~~~php
  $element = ["func" => [My::class, "get_element"]];
  ~~~
  func n'est considéré que si $element était un tableau à la base
  s'il y a d'autres clés, elles sont fusionnées avec le résultat de $func()
  (dont les clés sont prioritaires)

* Cursor::dyn permet d'insérer une valeur qui sera évaluée plus tard lors de la
  résolution du contenu
* pour Cursor, CTable, etc., un paramètre "params_func" permet de générer une
  partie des paramètres de façon dynamique.
  c'est juste du sucre, c'est strictement équivalent à construire le tableau
  des paramètres avant d'instancier l'objet.

-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary