# nulib\php\content

un contenu (ou "content") est une liste de valeurs, avec une syntaxe pour que
certains éléments soient dynamiquement calculés.

le contenu final est résolu selon les règles suivantes:
- 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, ç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 i.e dans
    l'exemple suivant $c1 et $c2 sont globalement équivalents:
    ~~~php
    $closure = function() { ... }
    $c1 = [...$before, $closure, ...$after];
    $c2 = [...$before, ...c::q($closure()), ...$after];
    # $c1 == $c2, sauf si $closure() retourne des valeurs qui peuvent être
    # considérées comme du contenu dynamique
    ~~~
  - les tableaux représentent un traitement dynamique: appel de fonction,
    instanciation, etc. le contenu effectif n'est évalué que lors de l'affichage

Les syntaxes possibles sont:

`[[], $args...]`
: 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 (on peut aussi utiliser une Closure, mais ce n'est pas toujours
  possible, notamment si le contenu est une constante)

`["class_or_function", $args...]`
`[["class_or_function"], $args...]`
`[["function", $args0...], $args1...]`
`[["class", null, $args0...], $args1...]`
: instantiation ou appel de fonction

`["->method", $args...]`
`[["->method"], $args...]`
`[[null, "method"], $args...]`
`[[null, "method", $args0...], $args1...]`
: appel de méthode sur l'objet contexte spécifié lors de la résolution du contenu

`[[$object, "method"], $args...]`
`[[$object, "method", $args0...], $args1...]`
: appel de méthode sur l'objet spécifié 

`[["class", "method"], $args...]`
`[["class", "method", $args0...], $args1...]`
: appel de méthode statique de la classe spécifiée

Le fait de transformer un contenu en une liste de valeurs statiques s'appelle
la résolution. la résolution se fait par rapport à un objet contexte, qui est
utilisé lors des appels de méthodes.

Lors des appels de fonctions ou des instanciations, les $arguments sont tous des
contenus:
- une valeur scalaire ou une instance est passée inchangée
- un tableau est traité comme un contenu avec les règles ci-dessus

## Affichage d'un contenu

Deux interfaces sont utilisées pour modéliser un élément de contenu à afficher:
- IContent: objet capable de produire du contenu
- IPrintable: objet capable d'afficher un contenu

Tous les autres éléments de contenus sont transformés en string avant affichage.
Un système de formatters permet de définir des fonctions ou méthodes à utiliser
pour formatter des objets de certains types.

Lors de l'affichage du contenu, deux éléments contigûs $a et $b sont affichés
séparés par un espace si $a se termine par un mot (éventuellement terminé par
un point '.') et $b commence par un mot.

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