# nulib\web\content

un contenu de tag (ou "contag") est un type spécial de contenu permettant de
gérer aussi les attributs du tag avec une syntaxe particulière.

les règles diffèrent légèrement d'un contenu classique:
- Si le contenu n'est pas un tableau:
  - une chaine est quotée avec `htmlspecialchars()`
  - un scalaire ou une instance d'objet sont pris tels quels
- Sinon, le contenu doit être un tableau, séquentiel ou associatif
  - les Closure sont appelés dès la résolution, et leur valeur de retour est
    inséré tel quel dans le flux
  - les éléments séquentiels scalaires ou instance d'objets sont pris tels quels
  - les éléments associatifs sont des attributs, et sont fusionnés le cas échéant
  - les éléments séquentiels de type tableau sont évalues récursivement avec les 
    mêmes règles (sauf la partie chaine quotée avec `htmlspecialchars()`)
  - il n'y a pas de syntaxe pour les éléments dynamiques comme les contenus
    classiques

Par exemple, les deux contenus web suivants sont équivalents:
~~~php
# ce contenu:
$content1 = [
  "before",
  "class" => "first",
  ["class" => "second"],
  function() { return func($arg); },
  "attr" => [
    "static",
    "true" => true,
    "false" => false,
  ],
  "after",
];
# donne le même résultat que:
$content2 = [
  "class" => "first second",
  "attr" => "static true",
  "before",
  ...cl::with(func("arg")),
  "after",
];
~~~

lors de la définition d'attributs,
- les valeurs séquentielles sont prises telles quelles
- les valeurs associatives permettent de faire des définitions conditionnelles
- les Closure sont appelés dès la résolution, et leur valeur de retour est
  inséré tel quel dans le flux

Par exemple, les deux contenus web suivants sont équivalents:
~~~php
# ce contenu:
$content1 = [
  "class" => function() { return func($arg); },
];
# donne le même résultat que:
$content2 = [
  "class" => func($arg),
];
~~~
De même, les deux contenus web suivants sont équivalents:
~~~php
# si $is_primary && !$is_danger
# alors ce contenu:
$content1 = [
  "class" => [
    "btn",
    "btn-primary" => $is_primary,
    "btn-danger" => $is_danger,
    "btn-default" => !$is_primary && !$is_danger,
  ],
];
# donne le même résultat que:
$content2 = [
  "class" => "btn btn-primary",
];
~~~


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