Transformer Wikini en bibliothèque de code
Dans le cadre du site web de Tela Botanica, nous avons été amené à utiliser des Wikini. Nous avons voulu rendre accessible le contenu du Wikini depuis notre CMS en lecture seulement.
Cela a été facilement réalisable grâce à la présence de la classe
Wiki.
Les modifications effectué sur la version 0.3 de Wikini
Dans wakka.php
Récupération de tous les fichiers et dossier de Wikini et mise dans un dossier spécifique.
Suppression dans le
wakka.php de tout le code à l'exterieur de la classe
Wiki sauf les contantes définissant les versions de Wakka et de Wikkini.
Remplacement des
print par des
return dans le
switch en fin de classe
Wiki.
Utilisation du chemin des formatters défini dans le fichier de config:
<?php
function Format($text, $formatter = "wakka")
{
//Modification : inclusion d'un chemin d'accès provenant du fichier de config.
return $this->IncludeBuffered($formatter.".php", "<i>Impossible de trouver le formateur \"$formatter\"</i>", compact("text"), $this->config["formatters_path"] );
}
?>
Dans formatters/wakka.php
Ajout des lignes commentées avec
ATTENTION (voir le code ci-dessous) pour éviter les
Warning de PHP. Je pense que ces modifications pourraient être apporté au fichier actuel.
<?php
// indented text
else if (preg_match("/\n(\t+|([ ]{1})+)(-|([0-9,a-z,A-Z]+)\))?/s", $thing, $matches))
{
// new line
$result .= ($br ? "<br />\n" : "");
// we definitely want no line break in this one.
$br = 0;
// find out which indent type we want
if ( ! isset( $matches[3]) ) $matches[3] = false;//ATTENTION : ajout de cette ligne
$newIndentType = $matches[3];
if (!$newIndentType) { $opener = "<div class=\"indent\">"; $closer = "</div>"; $br = 1; }
else if ($newIndentType == "-") { $opener = "<ul>\n"; $closer = "</li>\n</ul>"; $li = 1; }
else {
if ( ! isset( $matches[4]) ) $matches[4] = '';//ATTENTION : ajout de cette ligne
$opener = "<ol type=\"".$matches[4]."\">\n"; $closer = "</li>\n</ol>"; $li = 1;
}
// get new indent level
if (strpos($matches[1],"\t")) $newIndentLevel = strlen($matches[1]);
else
{
$newIndentLevel=$oldIndentLevel;
$newIndentLength = strlen($matches[1]);
if ($newIndentLength>$oldIndentLength)
{
$newIndentLevel++;
$newIndentSpace[$newIndentLength]=$newIndentLevel;
}
else if ($newIndentLength<$oldIndentLength)
if ( ! isset( $newIndentSpace[$newIndentLength] ) ) $newIndentSpace[$newIndentLength] = 0;//ATTENTION : ajout de cette ligne
$newIndentLevel=$newIndentSpace[$newIndentLength];
}
$op=0;
if ($newIndentLevel > $oldIndentLevel)
{
for ($i = 0; $i < $newIndentLevel - $oldIndentLevel; $i++)
{
$result .= $opener;
$op=1;
array_push($indentClosers, $closer);
}
}
else if ($newIndentLevel < $oldIndentLevel)
{
for ($i = 0; $i < $oldIndentLevel - $newIndentLevel; $i++)
{
$op=1;
$result .= array_pop($indentClosers);
if ($oldIndentLevel && isset($li)) $result .= "</li>";//ATTENTION : ajout de isset($li) à la place de$li
}
}
if (isset($li) && $op) $result .= "<li>";
else if (isset($li))
$result .= "</li>\n<li>";
$oldIndentLevel = $newIndentLevel;
$oldIndentLength= $newIndentLength;
return $result;
}
?>
Dans le tableau $wakkaDefaultConfig
Ajout d'une ligne pour indiquer le chemin des
formatters :
"formatters_path" => "php/lib/wikini/formatters",
L'application pour visualiser le contenu en lecture seule
Le contenu des pages que je visualise avec cette application n'ont pas de lien vers les pages de fonctionnement du Wikini (
DerniersChangements,
ParametresUtilisateur....).
<?php
$wikini_config_defaut = array(
'wakka_version' => '',
'debug' => 'yes',
"mysql_host" => HOTE,
"mysql_database" => BD_WIKINI,
"mysql_user" => UTILISATEUR,
"mysql_password" => MDP,
"table_prefix" => "wikini_",
"root_page" => "NomDeVotrePremierPage",
"wakka_name" => "NomDeVotreSiteWikini",
"base_url" => 'votre_url_de_base_dans_application_de_visualisation',
"rewrite_mode" => '0',
'meta_keywords' => 'vos_mots_clés',
'meta_description' => 'Le code de nomenclature de St Louis.',
"action_path" => "php/lib/wikini/actions", //Exemple de chemin d'accès
"handler_path" => "php/lib/wikini/handlers", //Exemple de chemin d'accès
"formatters_path" => "php/lib/wikini/formatters", //Exemple de chemin d'accès
"header_action" => "header",
"footer_action" => "footer",
"navigation_links" => "DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur",
"referrers_purge_time" => 24,
"pages_purge_time" => 90,
"default_write_acl" => "*",
"default_read_acl" => "*",
"default_comment_acl" => "*",
"preview_before_save" => "0");;
// Démarrage de la session php
session_start();
// Récupération du nom de la page wikini recherchée
if ( ! isset( $_REQUEST["wiki"] ) ) {
$wiki = 'NomDeVotrePremierePage';
}
else {
$wiki = $_REQUEST["wiki"];
}
// Gestion de la variable de session "linktracking"
if ( ! isset( $_SESSION["linktracking"] ) ) {
$_SESSION["linktracking"] = 1;
}
// Suppression des slash.
$wiki = preg_replace("/^\//", "", $wiki);
// split into page/method
if ( preg_match( "#^(.+?)/(.*)$#", $wiki, $matches ) ) {
list(, $page, $method) = $matches;
}
else if ( preg_match( "#^(.*)$#", $wiki, $matches ) ) {
list(, $page) = $matches;
}
// create wiki object
$wiki = new Wiki( $wikini_config_defaut );
// Vérification de la méthode d'affichage employée!
if ( ! isset( $method ) ) {
$method = '';//la valeur vide fonctionne bien.
}
//Récupération du contenu de la page Wikini
$sortie = $wiki->Run($page, $method);
echo $sortie;
?>
Amélioration des fichiers du Wikini version 0.4
Ce travail m'a permis de repérer quelques parties du code de Wikini qui pourraient être améliorée.
Je liste ici quelques suggestion à discuter :
- ajouter dans le fichier de config le chemin d'accès aux fichiers formatters. C'est déjà le cas pour le dossier handlers et actions. Pourquoi pas aussi pour formatters?
- ajouter les lignes évitant les warning PHP dans formatters/wakka.php
- ajouter error_reporting(E_ALL); quand on passe en mode débogage