Faire des tableaux XTHML en Wiki dans Dotclear 1

Publié le 14 avril 2008 par Zenstyle

Les ingrédients

Pour cela, il va être nécessaire de modifier un seul et même fichier, class.wiki2xhtml.basic.php qui se trouve dans le dossier /inc/classes/. Il va falloir le modifier en plusieurs points :

1. On crée la syntaxe qui va entourer notre tableau en wiki. Pour cela, trouvez la ligne contenant :
'em' => array("",""),

et ajoutez avant :

'table' => array('[[',']]'),
2. On défini le masque afin de repérer cette syntaxe. Trouvez alors les lignes contenant :
# Paragraphe
else {
	$type = 'p';
	$line = trim($line);
}

et ajoutez avant :

elseif (preg_match('/^\[{2}(.*)\]{2}$/',$line,$cap)){
	$type = 'table';
}
3. On défini la fonction qui va s'exécuter lorsque l'on rencontrera cette syntaxe. Trouvez alors les lignes contenant :
case 'a':
	$res = $this->__parseLink($res,$tag,$attr,$type);
	break;

et ajoutez avant :

case 'table':
	$res = $this->__parseTable($res,$attr);
	break;
4. Enfin, on créer la fonction qui va modifier notre syntaxe en tableau XHTML. Trouvez donc les lignes contenant :
# Mots wiki (pour héritage)
function parseWikiWord($str,&$tag,&$attr,&$type)

et ajoutez avant :

function __parseTable($str,&$attr)
{

	  $res = $align = '';
	  $tab = explode('||',$str);
	  $lines = explode('::',$tab[0]);
	  
 	  if (!empty($tab[2])) {
 		$tab[2] = strtoupper($tab[2]);
		if ($tab[2] == 'G' || $tab[2] == 'L') {
			$align .= ' style="float:left; margin: 0 1em 1em 0;"';
		} elseif ($tab[2] == 'D' || $tab[2] == 'R') {
			$align .= ' style="float:right; margin: 0 0 1em 1em;"';
		} elseif ($tab[2] == 'C') {
			$align .= ' style="margin-left:auto; margin-right: auto;"';
		}
	  }
		
	  if(!empty($tab[1])){
		$attr .= ' summary="'.$tab[1].'"';
		$res .= '<caption'. ? $align : '').
		'>'.$tab[1].'</caption>'."\n";
	  }
		
	  $attr .= $align;

	  foreach($lines as $num => $line)
	  {
	        $cols = '';
		$tblock = ($num == 0) ? '<thead>%s</thead>'."\n" : '<tbody>%s</tbody>'."\n";
		$tcol = ($num == 0) ? '<th>%s</th>'."\n" : '<td>%s</td>'."\n";
		$datas = $this->__splitTagsAttr($line);
		foreach($datas as $data)
		{
			$cols .= sprintf($tcol,trim($data));
		}
		$res .= sprintf($tblock,'<tr>'.$cols.'</tr>'."\n");
	  }
		
	  return $res;

}

La recette

C'est bien beau tout ça mais comment on les fait concrètement nos tableaux hein? Rien de plus simple voilà la syntaxe à utiliser [1]

[[ Légende 1|Légende 2 :: Donnée 1 ligne 1|Donnée2 ligne 1 :: Donnée 1 ligne 2|Donnée2 ligne 2 || Voilà la description du tableau (pour le summary et le caption) || C (ou G OU D) ]]

Vous voyez, c'est pas vraiment compliqué? Le dernier argument avec le C ou D, c'est exactement comme pour les images, cela permet de placer le tableau à gauche, au centre ou à droite mais il est optionnel. Il en va de même pour la description du tableau.

Je crois que je n'ai rien oublié, si vous constatez des problèmes / défauts, vous pouvez m'en parler dans les commentaires que je mette éventuellement à jour

Notes

[1] je vous la fais courte hein