Syntaxe wiki pour les tableaux dans wiki2xhtml

Mise en place d'une syntaxe wiki pour les tableaux dans la fonction php wiki2xhtml. Le code n'est vraiment pas très propre ni pertinent mais j'ai codé ça dans l'urgence. D'ailleurs, si quelqu'un à une idée, qu'il n'hésite pas...

Mise à jour (10 mai 2006) : Réécriture complète de la syntaxe wiki pour les tableaux. La précédente version, d'une compléxité et d'une maladresse affligeantes, souffrait de certains bugs.

La syntaxe est la suivante :

||!! Légende du tableau
||! en-tête ||! en-tête ||! en-tête
|| cellule  || cellule  || cellule
|| cellule  || cellule  || cellule
1. Syntaxe wiki pour construire un tableau avec wiki2xhtml.
  • Le contenu du tableau doit toujours commencer par une double barre (||).
  • 2 points d'exclamation accolés à la double barre introduisent la légende du tableau.
  • 1 point d'axclamation accolé à une double barre définit une cellule d'en-tête (th).
  • les double barres seules définissent une cellule de tableau classique (td).
  • les espaces séparant le texte des symboles wiki sont obligatoires ; peu importe leur nombre, ils sont ensuite effacés.

La syntaxe wiki de la figure 1 donnera le code HTML suivant :

<table>
    <caption>Légende du tableau</caption>
    <tr><th>en-tête</th><th>en-tête</th><th>en-tête</th></tr>
    <tr><td>cellule</td><td>cellule</td><td>cellule</td></tr>
    <tr><td>cellule</td><td>cellule</td><td>cellule</td></tr>
</table>
2. Code HTML généré par la syntaxe wiki.

Voici le code PHP à insérer dans différentes parties de la classe wiki2xhtml :

# --------------------------------------
# A insérer dans la fonction __getLine :
# --------------------------------------
elseif (preg_match('/^\|{2}(!{0,2} .*)$/',$line,$cap)) {
  $type = 'table';
  $line = $this->__tableRow($cap[1]);
}
# --------------------------------------
# A insérer dans la fonction __openLine :
# --------------------------------------
elseif ($open && $type == 'table') {
  $line = "<table>\n".$line;
}
# --------------------------------------
# A insérer dans la fonction __closeLine :
# --------------------------------------
elseif ($close && $pre_type == 'table') {
  return "</table>\n";
}
3. Fonctions de wiki2xhtml à modifier pour tenir compte de la syntaxe tableau.

Ensuite, il suffit d'ajouter la fonction __tableRow() suivante à la classe wiki2xhtml :

# --------------------------------------
# __tableRow() : traiter les lignes d'un tableau
# --------------------------------------
function __tableRow($row) {
  # si cellules
  if (strpos($row,"||")) {
    $cells = explode("||",$row);
    foreach($cells as $val) {
      if ($val=="") {continue;}
      # si cellule en-tête
      if (strpos($val,"!")=== 0) {
        $r .= "<th>".trim(substr($val,1))."</th>";
      }
      # sinon cellule normale
      else {
        $r .= "<td>".trim($val)."</td>";
      }
    }
    $r = "<tr>".$r."</tr>";
  }
  # sinon, légende
  else {
    $r = "<caption>".trim(substr($row,2))."</caption>";
  }
  return $r;
}
4. Nouvelle fonction qui gère les lignes du tableau.

Comme je l'ai dit, si quelqu'un a une solution plus pertinente, je suis preneur.