Modifications apportées au Wikini 0.4.3 vers le WikiniMST

Fonction attacher

Ajouts formatages

Tableaux

Notification mail
//send e-mail notifications====================================
            if ($this->config[notifier_mail]=="oui")
            {
            if ($_POST["notifyWrite"] == "true") {
                $writeACL = $this->LoadAcl($this->GetPageTag(), "write");
                $allUsers = explode("\n", $writeACL["list"]);
                foreach ($allUsers as $userName) {
                    $user = $this->LoadUser($userName);
                    $mailTo = $user["email"];
                    $mailSubject = "Avis de modification de la page ".$this->GetPageTag();
                    $mailHeaders = "From: wikini@recitmst.qc.ca\r\n".
                                   "X-Mailer: PHP/" . phpversion();
                    $mailMessage = "La page ".$this->GetPageTag()." a été modifiée\n".
                                   "\nPour voir les modifications suivez ce lien: ".
                                   $this->href("", "", "")."\n".
                                   "\nSi vous ne désirez plus recevoir de notification, veuillez en avertir le propriétaire de la page ".$this->GetPageTag().".";
                    mail($mailTo, $mailSubject, $mailMessage, $mailHeaders);
                }
            }
            }//fin send e-mail notifications==============================


et aussi à la ligne 112

//Vérifie si on peut envoyer un avis de modification et met le formulaire dasn une variable pour l'afficher plus bas.
	if ($this->config[notifier_mail]=="oui")
		{
		$notifier_mail="<input type=\"checkbox\" name=\"notifyWrite\" value=\"true\">Envoyer un avis de modification\n";
		}


puis "$notifier_mail". //pour le mail à la ligne 130 et 156


Les boutons de mise en page
$this->FormOpen("edit","","post","wikini").
			"<center><a title=\"Gras\" href='#' onclick='insertTags(\"**\",\"**\",\"\")'><img alt=\"Gras\" src=\"images/gras.png\" style=\"border: 0px solid ;\"></a> &nbsp;&nbsp; 
    			
			<a title=\"Italique\" href='#' onclick='insertTags(\"//\",\"//\",\"\")'><img alt=\"Italique\" src=\"images/italique.png\" style=\"border: 0px solid ;\"></a> &nbsp;&nbsp;
			
			<a title=\"Rouge\" href='#' onclick='insertTags(\"#R#\",\"#R#\",\"Rouge\")'><img alt=\"Rouge\" src=\"images/rouge.png\" style=\"border: 0px solid ;\"></a> &nbsp;&nbsp;
			
			<a title=\"Bleu\" href='#' onclick='insertTags(\"#B#\",\"#B#\",\"\")'><img alt=\"Bleu\" src=\"images/bleu.png\" style=\"border: 0px solid ;\"></a>&nbsp;&nbsp;
			
			<a title=\"Surbrillance\" href='#' onclick='insertTags(\"~~\",\"~~\",\"\")'><img alt=\"Surbrillance\" src=\"images/surbrillance.png\" style=\"border: 0px solid ;\"></a> &nbsp;&nbsp;
    			
			<a title=\"Encadrer\" href='#' onclick='insertTags(\":::\",\":::\",\"\")'><img alt=\"Encadrer\" src=\"images/cadre.png\" style=\"border: 0px solid ;\"></a> &nbsp;&nbsp;
    			
			<a title=\"Lien\" href='#' onclick='insertTags(\"[[\",\"]]\",\"\")'><img alt=\"Lien\" src=\"images/lien.png\" style=\"border: 0px solid ;\"></a>&nbsp;&nbsp;
			
			<a title=\"Centrer\" href='#' onclick='insertTags(\"#C#\",\"#C#\",\"\")'><img alt=\"Centrer\" src=\"images/centre.png\" style=\"border: 0px solid ;\"></a> &nbsp;&nbsp;
			
			<a title=\"Souliger\" href='#' onclick='insertTags(\"__\",\"__\",\"\")'><img alt=\"Souligner\" src=\"images/souligne.png\" style=\"border: 0px solid ;\"></a> &nbsp;&nbsp;
			
			<a title=\"Liste\" href='#' onclick='insertTags(\" -\",\"\",\"\")'><img alt=\"Liste\" src=\"images/puce.png\" style=\"border: 0px solid ;\"></a> &nbsp;&nbsp;
			
			<a title=\"Liste #\" href='#' onclick='insertTags(\" 1)\",\"\",\"\")'><img alt=\"Liste #\" src=\"images/numero.png\" style=\"border: 0px solid ;\"></a> &nbsp;&nbsp;
			
			<a title=\"Ligne\" href='#' onclick='insertTags(\"----\",\"\",\"\")'><img alt=\"Ligne\" src=\"images/ligne.png\" style=\"border: 0px solid ;\"></a>  </center><p>".



function FormOpen($method = "", $tag = "", $formMethod = "post", $formname= "")
	{
		$result = "<form name=\"".$formname."\" action=\"".$this->href($method, $tag)."\" method=\"".$formMethod."\">\n";
		if (!$this->config["rewrite_mode"]) $result .= "<input type=\"hidden\" name=\"wiki\" value=\"".$this->MiniHref($method, $tag)."\" />\n";
		return $result;
	}


<script type="text/javascript">
	function fKeyDown()	{ if (event.keyCode == 9) {
					event.returnValue= false;
					document.selection.createRange().text = String.fromCharCode(9) } }

function escapeQuotes(text) {

	text=text.replace(/'/g,"\\'");
	text=text.replace(/\n/g,"\\n");
	return text;
}

// apply tagOpen/tagClose to selection in textarea,
// use sampleText instead of selection if there is none
// copied and adapted from phpBB
function insertTags(tagOpen, tagClose, sampleText) {

    var txtarea = document.wikini.body;
	// IE
	if(document.selection) {
		var theSelection = document.selection.createRange().text;
		if(!theSelection) { theSelection=sampleText;}
		txtarea.focus();
		if(theSelection.charAt(theSelection.length - 1) == " "){// exclude ending space char, if any
			theSelection = theSelection.substring(0, theSelection.length - 1);
			document.selection.createRange().text = tagOpen + theSelection + tagClose + " ";
		} else {
			document.selection.createRange().text = tagOpen + theSelection + tagClose;
		}
	// Mozilla
	} else if(txtarea.selectionStart || txtarea.selectionStart == '0') {
 		var startPos = txtarea.selectionStart;
		var endPos = txtarea.selectionEnd;
		var myText = (txtarea.value).substring(startPos, endPos);
		if(!myText) { myText=sampleText;}
		if(myText.charAt(myText.length - 1) == " "){ // exclude ending space char, if any
			subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " "; 
		} else {
			subst = tagOpen + myText + tagClose; 
		}
		txtarea.value = txtarea.value.substring(0, startPos) + subst + txtarea.value.substring(endPos, txtarea.value.length);
		txtarea.focus();
		var cPos=startPos+(tagOpen.length+myText.length+tagClose.length);
		txtarea.selectionStart=cPos;
		txtarea.selectionEnd=cPos;
	// All others
	} else {
		// Append at the end: Some people find that annoying
		//txtarea.value += tagOpen + sampleText + tagClose;
		//txtarea.focus();
		tagOpen=tagOpen.replace(/\n/g,"");
		tagClose=tagClose.replace(/\n/g,"");
		document.infoform.infobox.value=tagOpen+sampleText+tagClose;
		txtarea.focus();
	}
	// reposition cursor if possible
	if (txtarea.createTextRange) txtarea.caretPos = document.selection.createRange().duplicate();
}


</script>



Gestion des groupes
<i>Pour chaque droit d'accès, les règles sont lues de bas en
   haut, à raison de <b>exactement une seule règle par ligne</b>. En l'absence
de règle, l'accès est refusé à tout le monde. Syntaxe :
<ul>
<li><tt>NomUtilisateur</tt> : Droit d'accès
       (lecture/écriture/commentaires) accordé à
       <tt>NomUtilisteur</tt></li>
<li><tt>@legroupe</tt> : Droit d'accès accordé au groupe
       <tt>legroupe</tt></li>
<li><tt>*</tt> : Droit d'accès accordé à tout le monde</li>
<li><tt>+</tt> : Droit d'accès accordé uniquement aux personnes
  identifiées</li>
<li><tt>!NomUtilisateur</tt> : Droit d'accès refusé à
       <tt>NomUtilisteur</tt></li>
<li><tt>!@legroupe</tt> : Droit d'accès refusé au groupe
       <tt>legroupe</tt></li>
<li><tt>!*</tt> : Droit d'accès refusé à tout le monde</li>
<li><tt>!+</tt> : Droit d'accès refusé aux personnes
  identifiées</li>
</ul>
</i>


  • Ajout de ceci à la ligne 643 du fichier wakka.php
  • // a group entry
                                   case "@":
                                     {
                                       if (! preg_match("/^[@](.*)$/",
                                                       $line, $matches))
                                        break;
                                      $line = $matches[1];
                                      if (!$this->UserInGroup($line))
                                        {
                                          return $negate;
                                        }
                                      else
                                       {
                                          return !$negate;
    				                                           }
                                     }
    

    // Return the associative array, key=group name, value=list of
           // logins in group
            function LoadGroup($grname = "")
           {
             if ($grname)
               $query = "select * from ".$this->config["table_prefix"]."groups where grname = '".$grname."'order by grname asc, grmember asc";
             else
               $query = "select * from ".$this->config["table_prefix"]."groups order by grname asc, grmember asc";
             $r = $this->Query($query);
             if (! $r)
              return 0;
           // Group by lines
            $grps = array();
            while (list ($grname, $grmb) = mysql_fetch_row($r))
    	           $grps[$grname] .= $grmb."\n";
             mysql_free_result($r);
             return $grps;
    	        }
    
            // Save the list of users in the group
            function SaveGroup($grname, $userslist)
            {
             $grname = trim($grname);
             $lst = explode("\n", $userslist);
             $this->Query("delete from ".$this->config["table_prefix"]."groups where grname='".$grname."'", $this->dblink);
             foreach ($lst as $login)
               {
                 $login = trim($login);
                 if (! $login)
                   continue;
    
                 mysql_query("insert into ".$this->config["table_prefix"]."groups set grname = '".mysql_escape_string($grname)."', grmember = '".mysql_escape_string($login)."'", $this->dblink);
               }
           }
    
            // return true if user is in the given group
           function UserInGroup($group, $user = "")
            {
             if (!$user)
               $user = $this->GetUserName();
    
              return $this->LoadSingle("select grname from ".$this->config["table_prefix"]."groups where grname = '".mysql_escape_string($group)."' and grmember =
    '".mysql_escape_string($user)."'");
            }
    




    Calendrier


    Passage de 0.4.1 à 0.4.2
    http://www.wikini.net/wakka.php?wiki=WikiNiChangeLog042


    Bogue javascript
    - La page ParametresUtilisateur provoque des erreurs javascript dès qu'on tape une lettre dans les champs textbox (avec Internet Explorer).
    Solution :
    dans header.php remplacer
    
    <script type="text/javascript" src="ACeditor.js"></script>
    
    par 
    
    <?php if ($this->GetMethod() == "edit") {
    echo "<script type=\"text/javascript\" src=\"ACeditor.js\"></script>";
    }
    ?> BouiaW, 21 nov. 2004 #R#
    



    Désactivation des commentaires.
    Ajout d'une condition au fichier /handlers/page/show.php ->if ($this->config[comments_disable]=="0")
    Ajout de la variable dans le fichier wakka.config.php et dans writeconfig.php (lors de l'installation).


    Action nbrpages
    Ajout du fichier /actions/nbrpages.php
    Page du développeur: http://www.wikini.net/wakka.php?wiki=JeanYves

    Correcteur orthographique
    Code de départ: http://www.cscv.qc.ca/recit/cyberediteur/
    Ajout du fichier /handlers/page/correction.php
    Modification du fichier /handlers/page/edit.php
    //Ajout ou non du bouton pour la correction--PL
    	if ($this->config[correction_disable]=="0")
    	{
    	$correction="<input name=\"submit\" type=\"submit\" value=\"Correction\" />\n";
    	
    	}
    
    
    elseif ($_POST["submit"] == "Correction")
    	{
    	        
    		echo "<div class=\"prev_alert\"><strong>À corriger</strong></div>";
    		$pl=$this->Format($body);
    		require_once("correction.php");
    		$output .=
    		
    			$this->FormOpen("edit").
    			"<input type=\"hidden\" name=\"previous\" value=\"".$previous."\" />\n".
    			"<input type=\"hidden\" name=\"body\" value=\"".htmlentities($body)."\" />\n".
    			"<br />\n".
    			"<input name=\"submit\" type=\"submit\" value=\"Enregistrer\" accesskey=\"s\" />\n".
    			"<input name=\"submit\" type=\"submit\" value=\"R&eacute;&eacute;diter \" accesskey=\"p\" />\n".
    			"<input type=\"button\" value=\"Annulation\" onclick=\"document.location='".$this->href("")."';\" />\n".
    			"$notifier_mail". //pour le mail
    			$this->FormClose()."\n";
    	}
    



    Retrait de la fonction referrers
    wakka.php: effacer les fonctions faisant références au referrers (LogReferrer?, LoadReferrers?, PurgeReferrers?), effacer $this->PurgeReferrers(); et $this->LogReferrer();.
    Supprimer les fichiers referrers.php et referrers_sites.php du répertoire /handlers/page/
    Dans /setup/install.php, on retire la création de la table referrers.

    Imprimer une page
    Ajout du fichier /handlers/page/imprime.php
    Ajout d'un fichier wakka.imprime.css
    Modification du /actions/footer.php (ajout lien vers page/imprime).


    Action UserLogin
    Retrait du formulaire d'enregistrement de nouveaux utilisateurs dans /actions/usersettings.php et enregistrement sous le nom de userlogin.php.


    Handler prez
     




    Action indiquer
    <?php
    /*
    Copyright 2004  .... OF SUCH DAMAGE.
    */
    $texte = $this->getParameter("texte"); 
    $ici = $this->getParameter("ici");
    $voir = $this->getParameter("voir");
    $haut = $this->getParameter("haut");
    $bas = $this->getParameter("bas");
    echo "<div class=\"ancrer\">";
    if(!empty($haut))  echo '<a href="#'. $haut .'">Haut</a>&nbsp;';
    if(!empty($bas))  echo '<a href="#'. $bas .'">Bas</a>&nbsp;';
    echo "</div>";
    echo "<div class=\"ancre\">";
    if(!empty($ici)) echo '<b><A NAME="'.$ici.'"></A></b> &nbsp;';
    if(!empty($voir))  echo '<a href="#'. $voir .'">'. $voir .'</a>&nbsp;';
    if(!empty($texte) ) echo '<b><A NAME="'.$texte.'"></A></b> &nbsp;'. $this->Format($texte);
    echo "</div>";
    ?> 
    
    
    Voici le style correspondant. À noter que les lien Haut et Bas seront situés à droite pour différencier.
    
    .ancrer {
    	float: right;
    }
    .ancre a {
    	color: red;
    }
    



    Commentaires + groupe
    ligne 208 du fichier wakka.php
      -de if ($this->HasAccess("write", $tag)) à if ($this->HasAccess("write", $tag) OR $comment_on != "")
    


    Fonction Freemind (code utilisé: http://wikka.jsnx.com/FreeMind)
    on met le fichier freemindbrowser.jar dans la racine du wikinimst.
    
    ajouté des styles dans wakka.css (.floatr {float: right; width: 48%; margin: 0.5%; padding: 0.5%; background: #EEE;}) et imprime.css (.floatr {display: none;})
    
    ========================================================================
    ajouté dans attach.class.php
    
     function showAsMindmap($fullFilename){//pour freemind
    	$mindmap_url = $this->wiki->href("download",$this->wiki->GetPageTag(),"file=$this->file");
    		$height = "550";
    		$mindmap_url_fullscreen = "3rdparty/plugins/freemind/fullscreen.php?url=$mindmap_url";
    	
    		$output =
    
    		"<applet code=\"freemind.main.FreeMindApplet.class\" archive=\"freemindbrowser.jar\" width=\"100%\" height=\"$height\">\n".
    		"	<param name=\"type\" value=\"application/x-java-applet;version=1.4\" />\n".
    		"	<param name=\"scriptable\" value=\"false\" />\n".
    		"	<param name=\"modes\" value=\"freemind.modes.browsemode.BrowseMode\" />\n".
    		"	<param name=\"browsemode_initial_map\" value=\"$mindmap_url\" />\n".
    		"	<param name=\"initial_mode\" value=\"Browse\" />\n".
    		"	<param name=\"selection_method\" value=\"selection_method_direct\" />\n".
    		"</applet>\n".
    		"<br />\n".
    		"<span class=\"floatr\"><a href=\"$mindmap_url\">Télécharger ce réseau de concept</a> :: Utiliser <a href=\"http://freemind.sourceforge.net/\">Freemind</a> pour l'éditer. Plein écran: cliquer sur Imprimer ci-dessous.</span><div style=\"clear:both;\"></div>\n";
    	
    		print($output);
    	}
    function isFreemind(){//pour freemind
    		return preg_match("/.(mm)$/i",$this->file)==1;
    	}
    
    =========================================================================
    et modifié la fonction doAttach de ça: 
    
    function doAttach(){
    		$this->CheckParams();
    		if ($this->attachErr) {
    			echo $this->attachErr;
    			return;
    		}
    		$fullFilename = $this->GetFullFilename();
    		//test d'existance du fichier
    		if((!file_exists($fullFilename))||($fullFilename=='')){
    			$this->showFileNotExits();
    			return;
    		}
          //le fichier existe : affichage en fonction du type
          if($this->isPicture()){
          	$this->showAsImage($fullFilename);
          }
    	else{
          	$this->showAsLink($fullFilename);
          }
    	}
    
    à ça:
    
    function doAttach(){
    		$this->CheckParams();
    		if ($this->attachErr) {
    			echo $this->attachErr;
    			return;
    		}
    		$fullFilename = $this->GetFullFilename();
    		//test d'existance du fichier
    		if((!file_exists($fullFilename))||($fullFilename=='')){
    			$this->showFileNotExits();
    			return;
    		}
          //le fichier existe : affichage en fonction du type
          if($this->isPicture()){
          	$this->showAsImage($fullFilename);
          }
    	elseif($this->isFreemind()){//pour freemind
          	$this->showAsMindmap($fullFilename);
          }
    	else{
          	$this->showAsLink($fullFilename);
          }
    	}
    



    Fontion Geogebra
    Mettre geogebra.jar à la racine du WikiNiMST.
    Ajouter la fonction suivante dans attach.class.php
    
    /**
    	* Affiche le fichier geogebra dans une boite.
    	*/
    	function showAsGeogebra($fullFilename){//pour geogebra
    	$geogebra_url = $this->wiki->href("download",$this->wiki->GetPageTag(),"file=$this->file");
    		//$height = "550";
    		//$mindmap_url_fullscreen = "3rdparty/plugins/freemind/fullscreen.php?url=$mindmap_url";
    	
    		$output =
    
    		
    		"<applet code=\"geogebra.GeoGebraApplet\" archive=\"geogebra.jar\" width=\"100%\" height=\"450\">\n".
    			
    		"	<param name=\"filename\" value=\"$geogebra_url\" />\n".
    		"	<param name=\"framePossible\" value=\"false\" />\n".
    	
    		"</applet>\n".
    
    
    		"<br />\n".
    		"<span class=\"floatr\"><a href=\"$geogebra_url\">Télécharger ce fichier GeoGebra</a> :: Utiliser <a href=\"http://www.geogebra.at/\">GeoGebra</a> pour l'éditer. Plein écran: cliquer sur Imprimer ci-dessous.</span><div style=\"clear:both;\"></div>\n";
    	
    		print($output);
    		$this->showUpdateLink();
    	}
    
    puis modifié la fonction suivante 
    	/**
    	* Affiche l'attachement
    	*/
    	function doAttach(){
    		$this->CheckParams();
    		if ($this->attachErr) {
    			echo $this->attachErr;
    			return;
    		}
    		$fullFilename = $this->GetFullFilename();
    		//test d'existance du fichier
    		if((!file_exists($fullFilename))||($fullFilename=='')){
    			$this->showFileNotExits();
    			return;
    		}
    		//le fichier existe : affichage en fonction du type
    		if($this->isPicture()){
    			$this->showAsImage($fullFilename);
    		}
    			elseif($this->isFreemind()){//pour freemind
    			$this->showAsMindmap($fullFilename);
    		}
    			elseif($this->isGeogebra()){//pour geogebra
    			$this->showAsGeogebra($fullFilename);
    		}
    			else{
    			$this->showAsLink($fullFilename);
    		}
    	}
    
    Finalement pour reconnaître que c'est un fichier geogebra on cré la fonction
    
    function isGeogebra(){//pour geogebra
    		return preg_match("/.(ggb)$/i",$this->file)==1;
    	}
    




    Fonction Geonext
    Mettre geonext.jar à la racine du WikiNiMST.

    ajouter dans attach.class.php
    
    	/**
    	* Affiche le fichier geonext dans une boite.
    	*/
    	function showAsGeonext($fullFilename){//pour geogebra
    	$geonext_url = $this->wiki->href("download",$this->wiki->GetPageTag(),"file=$this->file");
    		//$height = "550";
    		//$mindmap_url_fullscreen = "3rdparty/plugins/freemind/fullscreen.php?url=$mindmap_url";
    	
    		$output =
    		
    		"<applet id=\"umf_rect\" code=\"geonext.Geonext.class\" archive=\"geonext.jar\" width=\"100%\" height=\"500\">\n".
    		"	<param name=\"geonext\" value=\"file:$fullFilename\" />\n".
    		"	<param name=\"scriptable\" value=\"true\" />\n".
    		"	<param name=\"MAYSCRIPT\" value=\"true\" />\n".
    	
    		"</applet>\n".
    
    
    		"<br />\n".
    		"<span class=\"floatr\"><a href=\"$geonext_url\">Télécharger ce fichier GeoNext</a> :: Utiliser <a href=\"http://www.geogebra.at/\">GeoNext</a> pour l'éditer. Plein écran: cliquer sur Imprimer ci-dessous.</span><div style=\"clear:both;\"></div>\n";
    	
    		print($output);
    		$this->showUpdateLink();
    	
    	}
    
    ainsi que 
    
    function isGeonext(){//pour geogebra
    		return preg_match("/.(gxt)$/i",$this->file)==1;
    	}
    
    et on ajoute dans la fonction doAttach
    
    elseif($this->isGeonext()){//pour geogebra
    			$this->showAsGeonext($fullFilename);
    		}
    



    Fonction Geolabo

    Ajouter geoweb.jar à la racine du WikiNiMST

    Ajout de la fonction suivante dasn attach.class.php:
    
     	/**
    	* Affiche le fichier geolabo dans une boite.
    	*/
    	function showAsGeolabo($fullFilename){//pour geolabo
    	$geolabo_url = $this->wiki->href("download",$this->wiki->GetPageTag(),"file=$this->file");
    		//$height = "550";
    		//$mindmap_url_fullscreen = "3rdparty/plugins/freemind/fullscreen.php?url=$mindmap_url";
    	
    		$output =
    				
    		"<applet code=\"geolabo.geoweb.class\" codebase=\".\" archive=\"geoweb.jar\" width=\"100%\" height=\"450\">\n".
    			
    		"	<param name=\"figure\" value=\"$fullFilename\" />\n".
    		"	<param name=\"framePossible\" value=\"false\" />\n".
    	
    		"</applet>\n".
    
    		"<br />\n".
    		"<span class=\"floatr\"><a href=\"$geogebra_url\">Télécharger ce fichier Geolabo</a> :: Utiliser <a href=\"http://www.bibmath.net/geolabo/index.php3/\">Geolabo</a> pour l'éditer. Plein écran: cliquer sur Imprimer ci-dessous.</span><div style=\"clear:both;\"></div>\n";
    	
    		print($output);
    		$this->showUpdateLink();
    	}
    
    ajout de cette fonction:
    
    function isGeolabo(){//pour geogebra
    		return preg_match("/.(glb)$/i",$this->file)==1;
    	}
    
    et modification de doAttach:
    
    elseif($this->isGeolabo()){//pour geolabo
    			$this->showAsGeolabo($fullFilename);
    		}
    




    Édition suppression des commentaires
     


    Ajout d'un handler/deletecomment.php
    
    
    
    et modification du fichier /handler/page/show.php
    
    //Ajouter pour l'édition et suppression des commentaires
    				if ($this->HasAccess('write', $comment['tag'])
    				 || $this->UserIsOwner($comment['tag'])
    				 || $this->UserIsOwner() || ($this->GetUserName()== $this->config[admin_wiki]) )
    				{
    					echo '<div class="commenteditlink">';
    					if ($this->HasAccess('write', $comment['tag']))
    					{
    						echo '<a href="',$this->href('edit',$comment['tag']),'">&Eacute;diter ce commentaire</a>';
    					}
    					if ($this->UserIsOwner($comment['tag'])
    					 || $this->UserIsOwner() || ($this->GetUserName()== $this->config[admin_wiki]))
    					{
    						echo '<br />','<a href="',$this->href('deletecomment',$comment['tag']),'">Supprimer ce commentaire</a>';
    					}
    					//echo "$comment[comment_on]";
    					echo "</div>\n";
    				}
    				//FIn de edition suppression commentaire
    
    Modification de la fonction suivante dans wakka.php
    
    		function SavePage($tag, $body, $comment_on = "") {
    		// get current user
    		$user = $this->GetUserName();
    
    		//die($tag);
    
    		// TODO: check write privilege
    		if ($comment_on ? $this->HasAccess("comment", $comment_on)
    		                : $this->HasAccess("write", $tag))
    		{
    			// is page new?
    			if (!$oldPage = $this->LoadPage($tag))
    			{
    				// create default write acl. store empty write ACL for comments.
    				$this->SaveAcl($tag, "write", ($comment_on ? $user : $this->GetConfigValue("default_write_acl")));
    
    				// create default read acl
    				$this->SaveAcl($tag, "read", $this->GetConfigValue("default_read_acl"));
    
    				// create default comment acl.
    				$this->SaveAcl($tag, "comment", ($comment_on ? "" : $this->GetConfigValue("default_comment_acl")));
    
    				// current user is owner; if user is logged in! otherwise, no owner.
    				if ($this->GetUser()) $owner = $user;
    				else $owner = '';
    			}
    			else
    			{
    				// aha! page isn't new. keep owner!
    				$owner = $oldPage["owner"];
    
    				// ...and comment_on, eventualy?
    				if ($comment_on == '') $comment_on = $oldPage['comment_on'];
    			}
    
    
    			// set all other revisions to old
    			$this->Query("update ".$this->config["table_prefix"]."pages set latest = 'N' where tag = '".mysql_Escape_string($tag)."'");
    
    			// add new revision
    			$this->Query("insert into ".$this->config["table_prefix"]."pages set ".
    				"tag = '".mysql_escape_string($tag)."', ".
    				($comment_on ? "comment_on = '".mysql_escape_string($comment_on)."', " : "").
    				"time = now(), ".
    				"owner = '".mysql_escape_string($owner)."', ".
    				"user = '".mysql_escape_string($user)."', ".
    				"latest = 'Y', ".
    				"body = '".mysql_escape_string(chop($body))."'");
    		}
    	}
    
    
    Ajout dans wakka.css de :
    .commenteditlink { float: right; margin: 2; }
    
    
    Modification du forward dans /handler/page/edit.php:
    // forward
    					if ($this->page['comment_on']) {
    						$this->Redirect($this->href('', $this->page['comment_on']).'#'.$this->tag);
    					}
    					else {
    						$this->Redirect($this->href());
    					}
    




    Ajout de la fonction flash

    Ajout flash
    
    dans attach.class.php
    
       var $haut = '';					//hauteur swf
       var $large = '';					//largeur swf
    
    
    function isFlash(){//pour geogebra
    		return preg_match("/.(swf)$/i",$this->file)==1;
    	}
    
    dans la fonction doAttach:
    	elseif($this->isFlash()){//pour geolabo
    			$this->showAsFlash($fullFilename);
    		}
    
    pour vérifier si les valeur de haut et large sont ok, dans CheckParams:
    if ($this->isFlash() && empty($this->haut)){
    			$this->attachErr .= $this->wiki->Format("//action attacher : paramètre **haut** obligatoire pour une animation flash//---");
    		}
    		if ($this->isFlash() && empty($this->large)){
    			$this->attachErr .= $this->wiki->Format("//action attacher : paramètre **large** obligatoire pour une animation flash//---");
    		}
    
    et finalement pour faire afficher le code html:
    
    	/**
    	* Affiche le fichier flasho dans une boite.
    	*/
    	function showAsFlash($fullFilename){//pour geolabo
    	$flash_url = $this->wiki->href("download",$this->wiki->GetPageTag(),"file=$this->file");
    		//$height = "550";
    		//$mindmap_url_fullscreen = "3rdparty/plugins/freemind/fullscreen.php?url=$mindmap_url";
    	$haut=$this->haut;
    	$large=$this->large;
    		$output =
    
    		"<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0\" width=\"$haut\" height=\"$large\">
           		<param name=\"movie\" value=\"$fullFilename\">
           		<param name=\"quality\" value=\"high\">
           		<param name=\"LOOP\" value=\"false\">
           		<param name=\"menu\" value=\"false\">\n".
           		"<embed src=\"$fullFilename\" loop=\"false\" width=\"$haut\" height=\"$large\" quality=\"high\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" menu=\"false\"></embed>\n".
    		
    		"</object>\n".	
    
    		"<br />\n".
    		"<span class=\"floatr\"><a href=\"$flash_url\">Télécharger ce fichier Flash</a>  Plein écran: cliquer sur Imprimer ci-dessous.</span><div style=\"clear:both;\"></div>\n";
    	
    		print($output);
    		$this->showUpdateLink();
    	}
    



    Fonction lecteur Mp3?: on ajoute à la racine du wikinimst le lecteur xspf.swf
    http://musicplayer.sourceforge.net/

    Ajout de cette fonction dans attach.class.php:
    
    	/**
    	* Affiche le fichier mp3 dans un player flash.
    	*/
    	function showAsMp3($fullFilename){
    	$titre=$this->desc;
    	$mp3_url = $this->wiki->href("download",$this->wiki->GetPageTag(),"file=$this->file");
    		$output =
    		
    		"<object type=\"application/x-shockwave-flash\" data=\"xspf.swf?song_url=$fullFilename&song_title=$titre\" width=\"200\" height=\"20\"><param name=\"quality\" value=\"low\" /><param name=\"movie\" value=\"xspf.swf?song_url=$fullFilename&song_title=$titre\" /> </object>\n".	
    		"<br />\n".
    		"<a href=\"$mp3_url\">Télécharger $this->desc</a>\n";
    		
    		print($output);
    		$this->showUpdateLink();
    	}
    
    
    et celle-ci:
    
    	function isMp3(){//pour mp3 dans player flash
    		return preg_match("/.(mp3)$/i",$this->file)==1;
    	}
    
    
    et ajouter à la fonction doAttach:
    	elseif($this->isMp3()){//pour lecteur mp3
    			$this->showAsMp3($fullFilename);
    		}
    




    Cacher l'image upload.png si pas accès en écriture sur la page:

    Ajout de ce code dans le <head> de la page:
    
    <?php if ($this->HasAccess('write', $comment['tag'])) { ?>
    	<style type="text/css"> 
    	 .handout {  }
    	</style>
    
    	<?php
    
    	}
    
    	else { ?>
    		<style type="text/css"> 
    		.handout { display: none; }
    		</style>
    		
    	<?php
    	
    	} ?>
    



    Fonction CSV
    http://wikkawiki.org/ShowCsv

    On ajoute le fichier /handlers/page/handlecsvdata.php

    On modifie le fichier /action/attach.class.php

    var $separateur = '';				//séparateur pour csv
       var $entete = '';					//entete pour csv
    
    
    $this->separateur = $this->wiki->GetParameter("separateur");
    if (empty($this->separateur)) $this->separateur = $this->wiki->GetParameter("separateur");
    
    $this->entete = $this->wiki->GetParameter("entete");
    if (empty($this->entete)) $this->entete = $this->wiki->GetParameter("entete");
    
    dans la fonctione doAttach:
    
    elseif($this->isCsv()){//pour csv
    			$this->showAsCsv($fullFilename);
    		}
    
    Et pour l'affichage:
    	function isCsv(){//pour csv dans un tableau
    		return preg_match("/.(csv)$/i",$this->file)==1;
    	}
    
    
    	/**
    	* Affiche le fichier csv dans un tableau.
    	*/
    	function showAsCsv($fullFilename){
    	require_once('handlers/page/handlecsvdata.php');
    	$csv_url = $this->wiki->href("download",$this->wiki->GetPageTag(),"file=$this->file");
    	// ***Get the params ***
    	$header= 'on';
    	$separator = ",";
    	$filename = $fullFilename;
    	//$tableclass = $vars['tableclass'];
    	if ($this->separateur) $separator = $this->separateur;
    	if ($this->entete) $header = $this->entete;
    	
    	// *** Get the data and print the table ***
    	if (is_array($table = GetCsvData($filename, $separator, $tableclass))) PrintCsvTable($table, $header);
    
    	
    	echo "<a href=\"$csv_url\">Télécharger $this->desc</a>";
    	$this->showUpdateLink();
    	}
    
    Ajout dans le CSS
    
    #csvtable {
    border: thin solid #6495ed;
    border-collapse: collapse;
    text-align: center;
    }
    
    #csvtable th {
    	font-family: monospace;
    	border: thin solid #6495ed;
    	padding: 5px;
    	background-color: #D0E3FA; }
    
    #csvtable td {
    	font-family: monospace;
    	border: thin solid #6495ed;
    	padding: 5px;
    	background-color: #fff; }
    




    Ajout du formatage (action) note:
    http://wikkawiki.org/SidenoteActions

    Ajout dans le CSS:
    
    /* sidenote.css */
    /* Contains css for tip, note and warn actions. */
    
    /* postit note-style information box */
    #note {
            clear: both;
            font-size: 10pt;
            float: right;
            width: 200px;
            border: 1px solid #AAAAAA;
            margin: 15px 10px 0px 0px;
            padding: 0px;
            background-color: #FFF900;
            text-align: justify;
            vertical-align: top;
    }
    
    #note hr {
            height: 1px;
            border: 1px solid #AAAAAA;
            width: 100%;
    }
    
    #note .title {
            text-align: center;
            font-weight: bold;
            background-color: #EEE800;
            border-bottom: 1px solid #AAAAAA;
            color: #000000;
    }
    
    #note #text {
            padding: 4px;
            color: #000000;
    }
    
    Ajout de l'Action note.php:
    
    <?php
    /*
            note action
            Displays a sidebar note (like a post-it)
            Syntax: {{note text="text"}}
    */
    
    $text = htmlspecialchars($vars['texte']);
    if ($vars['titre']=="") { $title="Note";}
    else { $title = htmlspecialchars($vars['titre']);}
    ?>
    
    <div id="note">
            <div class="title"><?php echo $title; ?></div>
            <div id="text">
                    <?php echo $text; ?>
            </div>
    </div>
    




    Ajout formatage tableau+csv

    Ajout de ce code dans le fichier /formatters/wakka.php
    
            // Tables
            else if (preg_match("/^(\|\|)(.*?)(\|\|)$/s", $thing, $matches))
            {
    		$result = "\n<table id=\"csvtable\">\n";
    		$matches[2] = trim($matches[2]);
    		$lignes = split ("\n", $matches[2]);
    		$code=$matches[2];
    		$lien=$wiki->href();
    		$n = 0;
    		foreach ($lignes as $ligne)
    		{
    			if ($n==0) {
    				$result .= "<tr>\n";
    				$colonnes = split (";", $ligne);
    				
    				foreach ($colonnes as $colonne) {
    				$result .= "<th>".$colonne."</th>\n";
    				}
    				$result .= "</tr>\n";
    				$n++;
    				}
    			else {
    				$result .= "<tr>\n";
    				$colonnes = split (";", $ligne);
    				
    				foreach ($colonnes as $colonne) {
    				$result .= "<td>".$colonne."</td>\n";
    				}
    				$result .= "</tr>\n";
    				$n++;
    				}
    		}
    	
    		$result .= "</table>\n\n";
    		$result .="<form action=\"$lien/grabcode\" method=\"post\">
    		<br /><input type=\"submit\" name=\"save\" class=\"grabcodebutton\" value=\"-> .csv\" title=\"Télécharger le contenu du tableau (csv)\" />
    		<input type=\"hidden\" name=\"contenu\" value=\"$code\" /></form>\n";
    
    		return $result;
    
    	}
            
    	// fin Tables
    
    Ajout du fichier /handlers/page/grabcode.php pour télécharger le fichier csv:
    
    <?php
    if (!eregi("wakka.php", $_SERVER['PHP_SELF'])) {
        die ("acc&egrave;s direct interdit");
    }
    $contenu = $_POST[contenu];
    header('Content-type: application/force-download');
    header("Content-type: text/plain");
    header('Content-Disposition: attachment; filename="tableau.csv"');
    // display raw page
    echo $contenu;
    ?>
    




    Désactivation des lecteurs (geonext, mp3, ...) par admin et utilisateur:

    Modification du fichier attach.class.php
    
    On ajoute au haut du fichier:
       var $voir = '';					//pour afficher contenu fichier
    
    et dans checkparams:
        $this->voir = $this->wiki->GetParameter("voir");
    		if (empty($this->voir)) $this->voir = "oui";
    
    On ajoute à chaque fonction comme isFreemind:
       if ($this->wiki->config[view_freemind]==1 && $this->voir==oui)
    
    Aussi, ajouter dans le fichier /setup/writeconfig.php ceci:
    
     $config["view_geonext"] = "1";
     $config["view_geogebra"] = "1";
     $config["view_geolabo"] = "1";
     $config["view_flash"] = "1";
     $config["view_mp3"] = "1";
     $config["view_csv"] = "1";
     $config["view_freemind"] = "1";
    



     

    Ajout d'une question avant enregistrement d'une page et d'un commentaire.
    Modification des pages /handlers/page/show.php, addcomment.php, edit.php.
    On fait calculer la somme de 2 nombres aléatoires (entre 0 et 9).
    Ajout dans le CSS: .question {color:#c71f1f; font-weight: bold;}



     

    Action lien

    <?php
    /*
            lien action
            {{lien url="http://lien.com" texte="Texte du lien" titre="Titre du lien" image="http://lienversimage"}}
    */
    if (empty($vars['url'])) echo "Pas de crit&egrave;re url!";
    else {
    $url = htmlspecialchars($vars['url']);
    $text = htmlspecialchars($vars['texte']);
    
    $image = htmlspecialchars($vars['image']);
    $title = htmlspecialchars($vars['titre']); 
    
    if (!preg_match("/:\/\//", $url))
    	{
    		$url = "http://".$url;	//Very important for xss (avoid javascript:() hacking)
    	}
    if (empty($text)) $text = $url;
    if (!preg_match("/:\/\//", $image))
    	{
    		$image = "http://".$image;
    	}
    if (!empty($vars['image'])) $text = "<img src=\"$image\" border=\"0\" alt=\"$text\">";
    
    
    echo '<a href="' . $url . '" title="' . $title . '">' . $text . '</a>';
    }
    
    ?>