Vikidia:Achille/sources/util.php

Aller à : navigation, rechercher
Version 0.1.5 (c)
Ces pages sont données pour consultation. Si vous souhaitez utiliser Achille, téléchargez de préférence les sources au format zip


<?php
/*
	Achille/util.php
	GPL v3
	Thomas Pimmel 2008
*/
// Analyse si l'identifiant est correct
function identify()
{
	//Valeur par défaut
	if (!isset($_SESSION['user']) && !isset($_POST['user']))
	{
		$_SESSION['command']=CMD_PASSWORD;
		return 0;
	}
	$menu=$_POST['menu'];
	//Analyse du menu
	switch ($menu)
	{
		case "deconnect":
			w_Logout();
			clearsession();
			return 0;
			break;
		case "mainmenu":
			$_SESSION['command']=CMD_MAIN_MENU;
			// effacement des variables
			if (isset($_SESSION['msg']))	unset ($_SESSION['msg']);
			if (isset($_SESSION['rncat']))	unset ($_SESSION['rncat']);
			if (isset($_SESSION['sr']))	unset ($_SESSION['sr']);
			if (isset($_SESSION['mif']))	unset ($_SESSION['mif']);
			if (isset($_SESSION['import']))	unset ($_SESSION['import']);
			break;
		case "gestion":
			$_SESSION['command']=CMD_GESTION;
			break;
		case "preferences":
			$_SESSION['command']=CMD_PREFS;
			break;
		case "deluser":
			$_SESSION['command']=CMD_DEL_USER;
			$_SESSION['argu']=$_POST['user'];
			break;
		case "adduser":
			$_SESSION['command']=CMD_ADD_USER;
			unset ($_SESSION['argu']);
			break;
		case "connectwiki":
			$_SESSION['command']=CMD_CTC_WIKI;
			break;
			// changement du mot de passe
		case "userprefs":
			$_SESSION['command']=CMD_USER_PREFS;
			break;
		case "readmail":
			$_SESSION['command']=CMD_READ_MAIL;
			break;
		case "readreq":
			$_SESSION['command']=CMD_READ_REQ;
			break;
		case "readlog":
			$_SESSION['command']=CMD_READ_LOG;
			break;
		case "annonce":
			$_SESSION['command']=CMD_USER_ANNONCES;
			break;
		case "rncat":
			$_SESSION['command']=CMD_RN_CAT;
			break;
		case "replace":
			$_SESSION['command']=CMD_USER_REPLACE;
			break;
		case "wikif":
			$_SESSION['command']=CMD_USER_WIKIF;
			break;
		case "image":
			$_SESSION['command']=CMD_USER_IMAGE;
			break;
		case "inter":
			$_SESSION['command']=CMD_USER_INTER;
			break;
		case "typo":
			$_SESSION['command']=CMD_USER_TYPO;
			break;
		case "test":
			$_SESSION['command']=CMD_USER_TEST;
			break;
		case "import":
			$_SESSION['command']=CMD_USER_IMPORT;
			break;
		case "pod":
			$_SESSION['command']=CMD_USER_POD;
			break;
		case "cato":
			$_SESSION['command']=CMD_USER_CATO;
			break;
		case "tmp":
			$_SESSION['command']=CMD_USER_TMP;
			break;
		default:
			break;
	}
	//Identifiant correct, on passe en retournant le status
	if ($_SESSION['user']!='')	return $_SESSION['status'];
	if ($_POST['user']=='')		return 0;
	//Identifiant vide, on teste
	$status=us_control($_POST['user'],$_POST['passwd']);
	if ($status!=0)
	{
		$_SESSION['user']=$_POST['user'];
		$_SESSION['status']=$status;
		$_SESSION['passwd']=$_POST['passwd'];
		$_SESSION['command']=CMD_MAIN_MENU;
		return $status;
	}
	// Mauvais identifiant
	clearsession();
	return 0;
}
//Mise à zéro de la session
function clearsession()
{
	unset ($_SESSION['user']);
	unset ($_SESSION['passwd']);
	unset ($_SESSION['argu']);
	unset ($_SESSION['licences']);
	$_SESSION['status']=0;
	$_SESSION['command']=CMD_PASSWORD;
}
//changement de mot de passe
function change_password($user,$pass,$pass2)
{
	if ($pass!=$pass2)
	{
		message ("Vos deux mots de passe doivent être identiques !",0);
		return false;
	}
	if (strlen($pass)<6)
	{
		message ("Votre mot de passe doit comporter au moins six lettres !",0);
		return false;
	}
	if ($pass==$user)
	{
		message ("Votre mot de passe doit être différent de votre nom d'utilisateur !",0);
		return false;
	}
	$result=us_chguser($user,USMDP,$pass);
	if ($result)
	{
		message("Mot de passe changé",2);
		$_SESSION['passwd']=$pass;
		// changer flag
		us_chguser($user,USWARN,0);
		return true;
	}
	else
	{
		message("Erreur dans la base de données");
		return false;
	}
}
// Boucle d'annonce
function annonce_loop()
{
	LogWindow(true);
	flush();
	@ob_flush();
	if (!isset($_SESSION['msg']['message']))	$_SESSION['msg']['message']=make_annonce($_SESSION['msg']['category'],$_SESSION['msg']['texte']);
	while ($_SESSION['msg']['result']=="continue")
	{
		annonce();
	}
	//PutLog();
	//PutLog2($cmd,$color,$ligne1,$ligne21,$ligne22,$ligne3,$write=true)
	$total=$_SESSION['log']['nbt']+$_SESSION['log']['nbp'];
	PutLog2("Message","ffaaff","<b>Fonction :</b> Message","<b>À :</b>".$_SESSION['msg']['category'],"<b>Titre :</b>".$_SESSION['msg']['section'],
		"<b>Envoyé(s) :</b>".$_SESSION['log']['nbt']." / ".$total,true);
}
// annonce
function annonce()
{
	// rechercher liste d'utilisateurs
	$list=w_GetPagesCat($_SESSION['msg']['category'],$_SESSION['msg']['from']);
	// boucler sur les utilisateurs
	$n=0;
	$result=true;
	while (isset($list[$n]) && $result)
	{
		$utilisateur=FilterUser($list[$n]);
		if ($utilisateur)
		{
		// ajouter
		$result=w_AddToPage("Discussion_Utilisateur:".$utilisateur,$_SESSION['msg']['section'],$_SESSION['msg']['message'],false,true);
			if ($result)
			{
				print ("Envoyé à $utilisateur<br>");
				$_SESSION['log']['nbt']++;
			}
		flush();
		@ob_flush();
		}
		$n++;
	}
	// gestion de l'erreur
	if (!$result)
	{
		$_SESSION['msg']['result']="error";
	}
	else
	{
		if (!$_SESSION['msg']['from']) $_SESSION['msg']['result']="end";
		else $_SESSION['msg']['result']="continue";
	}
}
// Fabriquer l'annonce
function make_annonce($destinataires, $message)
{
	$ajout= "{{Achille message|~~~~|".$destinataires."|".$message."}}";
	return $ajout;
}

// passer page en revue pour changement
function rn_change()
{
	$rnfrom=$_SESSION['rncat']['from'];
	$rnto=$_SESSION['rncat']['to'];
	$rncom=$_SESSION['rncat']['com'];
	$rnselect=$_SESSION['rncat']['select'];
	//Message
	LogWindow(true);
	// boucler
	$result=true;
	$n=0;
	while (isset($rnselect[$n]) && $result)
	{
		// chercher la page
		$page=w_GetPage($rnselect[$n]);

		//remplacer
		$search[0]="[[catégorie:".$rnfrom."]]";
		$search[1]="[[catégorie: ".$rnfrom."]]";
		$search[2]="[[catégorie:".$rnfrom."|";
		$search[3]="[[catégorie: ".$rnfrom."|";
		$search[4]="[[category:".$rnfrom."]]";
		$search[5]="[[category: ".$rnfrom."]]";
		$search[6]="[[category:".$rnfrom."|";
		$search[7]="[[category: ".$rnfrom."|";


		$rep[0]="[[Catégorie:".$rnto."]]";
		$rep[1]=$rep[0];
		$rep[2]="[[Catégorie:".$rnto."|";
		$rep[3]=$rep[2];
		$rep[4]=$rep[0];
		$rep[5]=$rep[0];
		$rep[6]=$rep[2];
		$rep[7]=$rep[2];

		$page=str_ireplace($search,$rep,$page,$nbr);
		if ($nbr)
		{
			$result=w_PutPage($rnselect[$n],$rncom,$page,true,true);
			if ($result)
			{
				dateprint ("Page $rnselect[$n] traitée ($nbr modification(s))");
				$_SESSION['log']['nbt']++;
				$_SESSION['log']['nbm']=$_SESSION['log']['nbm']+$nbr;
			}
		}
		else
		{
			dateprint ("Page $rnselect[$n] passée");
			$_SESSION['log']['nbp']++;
		}
		flush();
		@ob_flush();
		$n++;
	}
	$nbt=$_SESSION['log']['nbt'];
	$nbp=$_SESSION['log']['nbp'];
	$nbm=$_SESSION['log']['nbm'];
	$ligne1="<b>Fonction :</b> changement de catégorie<br>".$_SESSION['rncat']['com'];
	$ligne21="<b>De :</b> ".$_SESSION['rncat']['from'];
	$ligne22="<b>Vers :</b> ".$_SESSION['rncat']['to'];
	$ligne3="<b>Page(s)</b> : traitée(s) $nbt / Passée(s) $nbp / Modification(s) opérée(s) $nbm";
	print ("$ligne3<br>");
	PutLog2("Changement de catégorie","EAFF00",$ligne1,$ligne21,$ligne22,$ligne3,true);
	return $result;
}
// chercher / remplacer
function sr_loop()
{
	$search=$_SESSION['sr']['search'];
	$replace=$_SESSION['sr']['replace'];
	//$list=$_SESSION['sr']['list'];
	$list=$_SESSION['sr']['select'];
	$com=$_SESSION['sr']['com'];
	$case=$_SESSION['sr']['case'];
	$maj=$_SESSION['sr']['maj'];
	// log
	LogWindow(true);
	// boucler
	$result=true;
	$n=0;
	while (isset($list[$n]) && $result)
	{
		// chercher la page
		$page=w_GetPage($list[$n]);
		//print ("$page<br>");
		//remplacer
		$newpage=searchin($search,$replace,$page,$case,$maj,$nbr);
		if ($nbr)
		{
			$result=w_PutPage($list[$n],$com,$newpage,true,true);
			if ($result)
			{
				$_SESSION['log']['nbt']++;
				$_SESSION['log']['nbm']=$_SESSION['log']['nbm']+$nbr;
				dateprint ("Page $list[$n] traitée (<b>$nbr modification(s)</b>)");
			}
		}
		else
		{
			dateprint ("Page $list[$n] traitée (aucune modification)");
			$_SESSION['log']['nbp']++;
		}
		flush();
		@ob_flush();
		$n++;
	}
	$nbt=$_SESSION['log']['nbt'];
	$nbp=$_SESSION['log']['nbp'];
	$nbm=$_SESSION['log']['nbm'];
	$ligne1="<b>Fonction :</b> Recherche / remplacement<br>".$_SESSION['sr']['com'];
	$ligne21="<b>Remplacer :</b> ".$_SESSION['sr']['search'];
	$ligne22="<b>Par :</b> ".$_SESSION['sr']['replace'];
	$ligne3="<b>Page(s)</b> : traitée(s) $nbt / Passée(s) $nbp / Modification(s) opérée(s) $nbm";
	print ("$ligne3<br>");
	PutLog2("Recherche / remplacement","00EA00",$ligne1,$ligne21,$ligne22,$ligne3,true);
	return $result;
}
// détailler la recherche remplacement
function GetDetails($list,$search,$case)
{
	// boucler sur les entrées
	$n=0;
	$detail="";
	while	(isset($list[$n]))
	{
		// chercher page
		$page=w_GetPage($list[$n]);
		//print ("$page<br>");
		// boucler sur la recherche
		$offset=0;
		$detail[$n]='';
		while (is_int($offset))
		{
			$offset=strword($page,$search,$offset,$case,false);
			if (is_int($offset))
			{
				if ($detail[$n])	$detail[$n]=$detail[$n]."<br>";
				$detail[$n]=$detail[$n].HiDetail($page,$offset,$search,60);
				$offset=$offset+strlen($search);
			}
		}
		$n++;
	}
	return $detail;
}
function HiDetail($text,$offset,$mot,$lng)
{
	// calcul du début
	$length=$lng+strlen($mot);
	$offset=$offset-$lng/2;
	if ($offset<0)	$offset=0;
	$text=htmlspecialchars(mb_strcut($text,$offset,$length,"UTF-8"));
	// ajouter couleur rouge
	$text=str_ireplace($mot,"<font color=#0000AA>".$mot."</font>",$text);
	return $text;
}
// Wikifier
function wikif_loop()
{
	$mot=$_SESSION['wikif']['mot'];
	$com=$_SESSION['wikif']['com'];
	$pluriel=$_SESSION['wikif']['pluriel'];
	$list=$_SESSION['wikif']['select'];
	// log
	LogWindow(true);
	// boucler
	$result=true;
	$n=0;
	while (isset($list[$n]) && $result)
	{
		// éviter la page en question
		if (strcasecmp($list[$n],$mot))
		{
			// chercher la page
			//$page="Tortues";
			$page=w_GetPage($list[$n]);
			//print ("$page<br>");
			// voir si déjà présent et déjà wikifié
			$change=true;
			//$offset=stripos($page,$mot);
			$car=array ('','');
			$offset=strword($page,$mot,0,false,$pluriel,&$car);
			// trouvé ?
			if (!is_int($offset))						$change=false;
			// premier caractère = "[" ?
			if ($change && $car[0]=='[')					$change=false;
			// dernier caractère
			if ($change && $car[1]==']')					$change=false;
			// test si dans un wikif
			if ($change && iswikif($page,$offset))				$change=false;
			// si change, on insert
			if ($change)
			{
				$page=substr($page,0,$offset)."[[" .substr($page,$offset,strlen($mot)) . "]]" .
				substr($page,$offset+strlen($mot),strlen($page)-strlen($mot)-$offset);
				// sauver la page
				//print ("$page<br>");
				$result=w_PutPage($list[$n],$com,$page,true,true);
				if ($result)
				{
					dateprint ("Page $list[$n] <b>wikifiée</b>");
					$_SESSION['log']['nbt']++;
					$_SESSION['log']['nbm']++;
				}
			}
			else
			{
				dateprint ("Page $char $list[$n] passée (pas d'occurrence)");
				$_SESSION['log']['nbp']++;
			}
		}
		flush();
		@ob_flush();
		$n++;
	}
	$nbt=$_SESSION['log']['nbt'];
	$nbp=$_SESSION['log']['nbp'];
	$nbm=$_SESSION['log']['nbm'];
	$ligne1="<b>Fonction :</b> Wikification<br>".$_SESSION['wikif']['com'];
	$ligne21="<b>De :</b> ".$_SESSION['wikif']['mot'];
	$ligne22="";
	$ligne3="<b>Page(s)</b> : traitée(s) $nbt / Passée(s) $nbp / Modification(s) opérée(s) $nbm";
	print ("$ligne3<br>");
	PutLog2("Wikification","c83c7e",$ligne1,$ligne21,$ligne22,$ligne3,true);
	return $result;
}
// détailler la wikification
function GetDetailsWikif($list,$mot,$pluriel)
{
	// boucler sur les entrées
	$n=0;
	$detail="";
	$car=array ('','');
	while	(isset($list[$n]))
	{
		// chercher page
		$page=w_GetPage($list[$n]);
		//print ("$page<br>");
		// boucler sur la recherche
		$detail[$n]='';
		//($text,$match,$offset,$case,$pluriel,&$car=0)
		$offset=strword($page,$mot,0,false,$pluriel,&$car);
		if (is_int($offset) && $car[0]!='[' && $car[1]!=']' && !iswikif($page,$offset))
		{
			$detail[$n]=$detail[$n].HiDetail($page,$offset,$mot,60);
			$offset=$offset+strlen($search);
		}
		$n++;
	}
	return $detail;
}

// Vérif d'une page
function BadAccol($page)
{
	$n=0;
	$ina=0;
	$inc=0;
	// comptage des {{
	while (isset($page[$n]))
	{
		if ($page[$n]=="{")	$ina++;
 		if ($page[$n]=="}")	$ina--;
		if ($page[$n]=="[")	$inc++;
		if ($page[$n]=="]")	$inc--;
		$n++;
	}
	// comptage des guillemets
	$ing=0;
	$offset=0;
	while (is_int($offset))
	{
		$offset=strpos($page,"«",$offset);
		if (is_int($offset))
		{
			$ing++;
			$offset=$offset+2;
		}
	}
	$offset=0;
	while (is_int($offset))
	{
		$offset=strpos($page,"»",$offset);
		if (is_int($offset))
		{
			$ing--;
			$offset=$offset+2;
		}
	}
	if ($ina!=0)	message ("Déséquilibre des accolades");
 	if ($inc!=0)	message ("Déséquilibre des crochets");
 	if ($ing!=0)	message ("Déséquilibre des guillemets");
	if ($inc!=0 || $ina!=0 || $ing!=0)	return true;
	else			return false;
}
// vérification typographie
function loop_typo()
{
	$from=$_SESSION['typo']['from'];
	$nbr=$_SESSION['typo']['nbr'];
	$flags=$_SESSION['typo']['flags'];
	$heures=$_SESSION['typo']['heures'];
	$jours=$_SESSION['typo']['jours'];
	// vérifications des données
	if (($jours||$heures) && ($from))
	{
		message ('"Commencer à..." doit être nul pour effectuer une recherche sur créations / modifications récentes');
		return false;
	}
	if ($nbr>500)
	{
		message ('Vous ne pouvez traiter plus de 500 articles à la fois');
		$_SESSION['mif']['nbr']=500;
		return false;
	}
	// traitement
	LogWindow(true);
	if (!$jours && !$heures)
	{
		print ("Vérification des articles : De $from<br>");
		$ligne21="<b>De :</b> ".$from;
		$listarticle=w_GetAllFiles($from,$nbr,"0");
		$ligne22="<b>À :</b> ".$from;
		print ("À $from<br>($nbr article(s))");
		$ligne1="<b>Fonction :</b> Typographie de tous les articles (".$nbr.")";
	}
	else
	{
		if ($flags&8)	$what="nouveaux articles";
		else		$what="articles édités";
		$listarticle=GetByDate($what,$jours,$heures);
		print ("Vérification $what ($jours jour(s) et $heures heure(s))<br>");
		$ligne1="<b>Fonction :</b> Typographie des $what.";
		$ligne21="<b>Jours :</b> ".$jours;
		$ligne22="<b>Heures :</b> ".$heures;
	}
	// boucle articles
	$n=0;
	$result=true;
	while	(isset($listarticle[$n]) && $result)
	{
		if (NoDouble($listarticle,$listarticle[$n],$n))
		{
			$page=w_GetPage($listarticle[$n]);
			if ($page)
			{
				dateprint ("Vérification de $listarticle[$n]");
				if (BadAccol($page))
				{
						$_SESSION['log']['nbp']++;
				}
				else
				{
					if (VerifTypo($page,$flags))
					{
						//print ("$page<br>");
						$result=w_PutPage($listarticle[$n],"Typographie",$page,true,true);
						if ($result)
						{
							$_SESSION['log']['nbt']++;
							dateprint ("Page <b>traitée</b>");
						}
					}
					else
					{
						//print ("Page passée<br>");
						$_SESSION['log']['nbp']++;
					}
				}
			}
			else
			{
				dateprint ("Erreur de lecture $listarticle[$n]<br>");
			}
		}
		flush();
		@ob_flush();
		$n++;
	}
	$nbt=$_SESSION['log']['nbt'];
	$nbp=$_SESSION['log']['nbp'];
	$ligne3="<b>Page(s)</b> : traitée(s) $nbt / Passée(s) $nbp";
	dateprint ("$ligne3<br>");
	PutLog2("Typographie des articles","55FF55",$ligne1,$ligne21,$ligne22,$ligne3,true);
	if ($result && !$jours && !$heures)	$_SESSION['typo']['from']=$from;
	return $result;
}
// routine principale
function VerifTypo(&$page,$flags)
{
	//print ("Page $page<br>");
	if (strlen($page)==0)	return false;
	$new=" ";		// type chaîne
	$idx=0;			// idx destination
	$n=0;			// idx source
	$guil=0;		// équilibre des guillemets
	$result=false;
	$auth=" ')-.,=<>&{[\n";		// espaces autorisés
	$balist=array("!--","code","pre","nowiki","gallery");	// balises à ignorer
	$inmod=0;
	$incat=0;
	while (isset($page[$n]))
	{
		$done=false;
		$car=$page[$n++];
		// modèles ou catégories
		if ($car=="{")	$inmod++;
		if ($car=="[")	$incat++;
		if ($car=="}")	$inmod--;
		if ($car=="]")	$incat--;
		if ($incat || $inmod)		{$new[$idx++]=$car;$done=true;}

		if (!$done && $car==" " && $page[$n-2]=="\n")
		{
			$ligne=PassLigne($page,$n);
			$new=$new.$car.$ligne;
			$offset=strlen($ligne);
			$n=$n+$offset;
			$idx=$idx+$offset+1;
			$done=true;
		}
		// test caractère html
		if (!$done && $car=='&' && $page[$n]!=" ")
		{
			$htm=PassHtml($page,$n);
			if ($htm)
			{
				$new=$new.$car.$htm;
				$offset=strlen($htm);
				$n=$n+$offset;
				$idx=$idx+$offset+1;
				$done=true;
			}
		}
		// test si http: (méthode brutale)
		if (!$done && $car=="h" && $page[$n]=="t" && $page[$n+1]=="t" && $page[$n+2]=="p" && $page[$n+3]==":")
		{
			$adrs=PassHttp($page,$n);
			$new=$new.$car.$adrs;
			$offset=strlen($adrs);
			$n=$n+$offset;
			$idx=$idx+$offset+1;
			$done=true;
			//$balise=htmlentities($adrs);
			//print ("<b>h$balise</b><br>");
		}
		// balises
		if ($car=="<" && !$done)
		{
			$balise=GetBalise($page,$n,$balist);
			if ($balise)
			{	$new=$new.$car.$balise;
				$offset=strlen($balise);
				$n=$n+$offset;
				$idx=$idx+$offset+1;
				$done=true;
				//$balise=htmlentities($balise);
				//print ("<b>$balise</b><br>");
			}
		}
		// typo de -
		if ($flags&4 && !$done && $car=="-" && $page[$n-2]=="\n" && $page[$n]!="-")
		{
			$new[$idx++]="*";
			$result=true;
			$done=true;
			print ("<b>Avertissement, expérimentation de *</b><br>");
		}
		// typo de "
		if ($flags&2 && !$done)
		{
			if ($car=='"')
			{
				//ouvrant ou fermant ?
				if (!$done && $guil && $page[$n-2]!=" " && GetAutCar($page[$n],$auth))
				{
					$new[$idx++]=" ";
					$pipo="»";
					$new[$idx++]=$pipo[0];
					$new[$idx++]=$pipo[1];
					$result=true;
					$done=true;
					$guil--;
					print ("Guillemet fermant<br>");
				}
				if (($page[$n-2]==" " || $page[$n-2]=="'") && $page[$n]!=" ")
				{
					$pipo="«";
					$new[$idx++]=$pipo[0];
					$new[$idx++]=$pipo[1];
					$new[$idx++]=" ";
					$result=true;
					$done=true;
					$guil++;
					print ("Guillemet ouvrant<br>");
				}
			}
		}
		// typographie de la ponctuation
		if ($flags&1 && !$done)
		{
			switch ($car)
			{
				// espace avant et après sauf cas spécial
				case ":":
					if ($page[$n-2]==":" || $page[$n-2]=="\n" || is_numeric($page[$n-2]) || is_numeric($page[$n]))
					{
						$new[$idx++]=$car;
						break;
					}
					if (!GetAutCar($page[$n-2],$auth))	{$new[$idx++]=" ";$result=true;}
					$new[$idx++]=$car;
					if (!GetAutCar($page[$n],$auth))	{$new[$idx++]=" ";$result=true;}
					break;
				// espace avant et après
				case "?":
				case "!":
				case ";":
					if (!GetAutCar($page[$n-2],$auth."?!"))	{$new[$idx++]=" ";$result=true;}
					$new[$idx++]=$car;
					if (!GetAutCar($page[$n],$auth."?!"))	{$new[$idx++]=" ";$result=true;} //?! en double autorisés
					break;
				// pas d'espace avant mais un après
				case ")":
					if ($page[$n-2]==" ")			{$idx--;$result=true;}
					$new[$idx++]=$car;
					if (!GetAutCar($page[$n],$auth))
						{$new[$idx++]=" ";$result=true;} // (e) et (s) gérés
					break;
				// pas d'espace après mais un avant
				case "(":
					if (!GetAutCar($page[$n-2],$auth) &&
						!($page[$n]=="s" && $page[$n+1]==")") &&
						!($page[$n]=="e" && $page[$n+1]==")") &&
						!($page[$n]=="x" && $page[$n+1]==")"))		{$new[$idx++]=" ";$result=true;}
					$new[$idx++]=$car;
					if ($page[$n]==" ")			{$n++;$result=true;}
					break;
				// espace en trop
				case " ":
					if ($page[$n] && $page[$n-2]!=',' && GetAutCar($page[$n]," .,")) $result=true;
					else						$new[$idx++]=$car;
					break;
				// espace après sauf si nombre ou sigle
				case ".":
					$new[$idx++]=$car;
					if (!is_numeric($page[$n]) && !GetAutCar($page[$n],$auth) && $page[$n+1]!=".")	{$new[$idx++]=" ";$result=true;}
					break;
				// espace après sauf si nombre
				case ",":
				case ".":
					$new[$idx++]=$car;
					if (!is_numeric($page[$n]) && !GetAutCar($page[$n],$auth))	{$new[$idx++]=" ";$result=true;}
					break;
				default:
					$new[$idx++]=$car;
					break;
			}
		}
		else	// pas de typo ponctuation
		{
			if (!$done)	$new[$idx++]=$car;
		}
	}
	if ($result)	$page=$new;
	return $result;
	//print ("Page $new<br>");
	//return false;
}
// passer ligne
function PassLigne($page,$idx)
{
	//print ("<i>ligne entière</i><br>");
	// extraction de la chaîne
	$end=strpos($page,"\n",$idx);
	if (is_int($end))	return	substr($page,$idx,$end-$idx+1);
	else			return	substr($page,$idx);
}
// passer html
function PassHtml($page,$idx)
{
	$ret=false;
	// extraction de la chaîne
	$end=strpos($page,";",$idx);
	if (is_int($end))
	{
		$ret=substr($page,$idx,$end-$idx+1);
		//print ("$ret<br>");
	}
	return $ret;
}
// passer adresse http:
function PassHttp($page,$idx)
{
	$ret="";
	while (isset($page[$idx]) && $page[$idx]!=" " && $page[$idx]!="\n")	$ret=$ret.$page[$idx++];
	return $ret;
}
// chercher et renvoyer une balise
function GetBalise($page,$idx,$balist)
{
	if ($page[$idx]==" ")	return false;
	$n=0;
	$found=false;
	$cut=substr($page,$idx);			// fin de la chaîne;
	while (!$found && isset($balist[$n]))
	{

		if (strncasecmp($cut,$balist[$n],strlen($balist[$n]))==0)	// trouvé
		{
			// trouvé
			// recherche de la fin
			if ($balist[$n][0]!="!")
			{
				$end=stripos($cut,"</".$balist[$n].">",0);
				$len=strlen($balist[$n])+3;
			}
			else
			{
				$end=strpos($cut,"-->",0);
				$len=3;
			}
			if (is_int($end))
			{
				$found=substr($cut,0,$len+$end);
			}
			else
			{
				$found=$cut;			// balise fin absente
				print ("Attention : balise fin absente<br>");
			}
		}
		$n++;
	}
	// si non trouvé, on copie la balise
	if (!$found)
	{
		$end=strpos($cut,">",0);
		if (is_int($end))
			{
				$found=substr($cut,0,$end+1);
			}
			else
			{
				$found=$cut;			// balise fin absente
				print ("Attention : fin balise absente<br>");
			}
	}
	return $found;
}
// vérifier caractères autorisés
function GetAutCar($car,$aut)
{
	if (!$car)			return true;	// fin texte ok
	if (is_int(strpos($aut,$car)))	return true;	// autorisé ok
	return false;
}
// vérifier si pas déjà fait
function NoDouble($list,$elem,$idx)
{
	$n=0;
	$result=true;
	while ($result && $idx>$n)
	{
		if ($list[$n]==$elem)	$result=false;
		$n++;
	}
	return $result;
}
// Vérification des images
function mif_loop()
{
	$from=$_SESSION['mif']['from'];
	$nbr=$_SESSION['mif']['nbr'];
	$flags=$_SESSION['mif']['flags'];
	$heures=$_SESSION['mif']['heures'];
	$jours=$_SESSION['mif']['jours'];
	// vérifications des données
	if (($jours||$heures) && ($from))
	{
		message ('"Commencer à..." doit être nul pour effectuer une recherche sur importations récentes');
		return false;
	}
	if ($nbr>500)
	{
		message ('Vous ne pouvez traiter plus de 500 images à la fois');
		$_SESSION['mif']['nbr']=500;
		return false;
	}
	LogWindow(true);
	// traitement
	if (!$jours && !$heures)
	{
		print ("Vérification des images : De $from<br>");
		$ligne21="<b>De :</b> ".$from;
		$listimage=w_GetAllFiles($from,$nbr,"6");
		$ligne22="<b>À :</b> ".$from;
		print ("À $from ($nbr image(s))<br>");
		$ligne1="<b>Fonction :</b> vérification de toutes les images (".$nbr.")";
	}
	else
	{
		$listimage=GetImageByDate("nouvelles images",$jours,$heures);
		print ("Vérification des images nouvelles ($jours jour(s) et $heures heure(s))<br>");
		$ligne1="<b>Fonction :</b> vérification des nouvelles images";
		$ligne21="<b>Jours :</b> ".$jours;
		$ligne22="<b>Heures :</b> ".$heures;
	}
	// licences
	GetLicences();
	if (!isset($_SESSION['licences']))
	{
		message ("Impossible de charger la liste des licences",1);
		LogWindow(false);
		return false;
	}
	flush();
	@ob_flush();
	// boucler sur les images
	$n=0;
	$result=true;
	while (isset($listimage[$n]) && $result)
	{
		// go
		$bmef=false;
		$btext="";
		$nbmod=0;
		print ("Vérification de $listimage[$n]<br>");
		unset ($page);
		$listmod=w_GetPageInfo($listimage[$n],'templates');
		if (isset($listmod))
		{
			// à mettre en forme ?
			if ($flags&1 && !templ_exists("Modèle:Image mef",$listmod))
			{
				if (!templ_exists("Modèle:Info image",$listmod)) {$bmef=true;$nbmod++;}
			}
			// à vérifier ?
			if (!templ_exists("Modèle:Image à vérifier",$listmod))
			{
				if ($flags&2)
				{
					if (!GoodLicence($listmod))
					{
						$btext=$btext."\n*Modèle licence non-trouvé";
						$nbmod++;
					}
				}
				if ($flags&4)
				{
					// méthode liens externes
					$listext=w_GetPageInfo($listimage[$n],'extlinks');
					if (!GoodLinks($listext,$link))
					{
						$btext=$btext."\n*Source sur commons introuvable [$link]";
						$nbmod++;
					}
					else
					{
						$page=w_GetPage($listimage[$n]);
						// source présente
						$source=GetInfoImageArg($page,"source");
						//print ("Source : $source<br>");
						if (!$source)
						{
							$btext=$btext."\n*Pas de source";
							$nbmod++;
						}
						else
						{
							// méthode par modèle commons|
							$lien=GetTemplArgs("commons",$page);
							if (isset($lien[0]))
							{
								if (isset($lien[1]))
								{
									$lien="Image:".rawurldecode($lien[1]);
								}
								else			$lien=$listimage[$n];
								if (!w_GetPage($lien,"http://commons.wikimedia.org/w"))
								{
									$lien="http://commons.wikimedia.org/wiki/".$lien;
									$btext=$btext."\n*Source sur commons introuvable [$lien]";
									//$page=$page."\n[[Catégorie:Image Commons introuvable]]";
									$nbmod++;
								}
							}
						}
					}
				}
			}
			else
			{
				print ("Rappel : à vérifier déjà demandé<br>");
			}
			if ($flags&8)
			{
				if (!$page)		$page=w_GetPage($listimage[$n]);
				if (!is_int(stripos($page,"[[Catégorie:Image ")))
				{
					$page=$page."\n[[Catégorie:Image thème inconnu]]";
					print ("Ajout catégorie Thème inconnu<br>");
					$nbmod++;
				}
			}
			// modifer image ?
			if ($nbmod)
			{
				if (!$page)			$page=w_GetPage($listimage[$n]);
				print ("<b>$listimage[$n]</b> :<br>");
				if ($bmef)
				{
					$page=$page."\n{{Image mef}}";
					print ("À mettre en forme<br>");
				}
				if ($btext)
				{
					$page="{{Image à vérifier|$btext}}\n".$page;
					print ("Image à vérifier<br>$btext<br>");
				}
				if (!$jours && !$heures)	$edcom="Vérification des images ($n/$nbr)";
				else				$edcom="Vérification des dernières images";
				$result=w_PutPage($listimage[$n],$edcom,$page,true,true);
				//$result=true;
				if ($result)
				{
					$_SESSION['log']['nbm']=$_SESSION['log']['nbm']+$nbmod;
					$_SESSION['log']['nbt']++;
				}
			}
			else
			{
					$_SESSION['log']['nbp']++;
			}
		}
		else
		{
			print ("<i>Image introuvable</i><br />");
		}
		flush();
		@ob_flush();
		$n++;
	}
	// retour
	$nbm=$_SESSION['log']['nbm'];
	$nbt=$_SESSION['log']['nbt'];
	$nbp=$_SESSION['log']['nbp'];
	$ligne3="<b>Page(s)</b> : traitée(s) $nbt / Passée(s) $nbp / Modification(s) opérée(s) $nbm";
	print ("$ligne3<br>");
	if ($result && !$jours && !$heures)	$_SESSION['mif']['from']=$from;
	//PutLog2($cmd,$color,$ligne1,$ligne21,$ligne22,$ligne3,$write=true)
	PutLog2("Maintenance des images","FF5533",$ligne1,$ligne21,$ligne22,$ligne3,true);
	return $result;
}
// boucle typo
// boucle interwiki
function loop_inter()
{
	$from=$_SESSION['inter']['from'];
	$nbr=$_SESSION['inter']['nbr'];
	$jours=$_SESSION['inter']['jours'];
	$heures=$_SESSION['inter']['heures'];
	// vérifications des données
	if (($jours||$heures) && $from)
	{
		message ('"Commencer à..." doit être nul pour effectuer une recherche sur créations récentes');
		return false;
	}
	if ($nbr>500)
	{
		message ('Vous ne pouvez traiter plus de 500 articles à la fois');
		$_SESSION['inter']['nbr']=500;
		return false;
	}
	// traitement
	LogWindow(true);
	if ($jours || $heures)
	{
		$listarticle=GetByDate("nouveaux articles",$jours,$heures);
		$fromwiki="Interwiki des nouveaux articles";
		print ("$fromwiki ($jours jour(s) et $heures heure(s))<br>");
		$ligne1="<b>Fonction :</b> $fromwiki";
		$ligne21="<b>Jour(s) :</b> ".$jours;
		$ligne22="<b>Heure(s) :</b> ".$heures;
	}
	else
	{
		$fromwiki=$from;
		$listarticle=w_GetAllFiles($from,$nbr,"0");
		$towiki=$from;
		if	(!$fromwiki)	$fromwiki="(début)";
		if 	(!$towiki)	$towiki="(fin)";
		$ligne1="<b>Fonction :</b> Interwiki de tous les articles";
		$ligne21="<b>De :</b> ".$fromwiki;
		$ligne22="<b>À :</b> ".$towiki;
		print ("Interwiki de $fromwiki à $towiki<br>");
	}

	// boucler sur les articles
	$n=0;
	$result=true;
	while (isset($listarticle[$n]) && $result)
	{
	  $modifs=0;
	  print ("<b>$listarticle[$n]</b><br>");
		
	  $page=w_GetPage($listarticle[$n]);
	  $lng=array('wp'=>'','en'=>'','nl'=>'');
	  if ($page && !Redirect($page))
	  {
		if (is_int(stripos($page,"{{LienWP")))
		{
			$modifs++;
			$page=templ_suppr("LienWP",$page,$lng['wp']);
			print ("Vieux modèle supprimé (LienWP)<br>");
		}
		if (is_int(stripos($page,"{{LienEn")))
		{
			$modifs++;
			$page=templ_suppr("LienEn",$page,$lng['en']);
			print ("Vieux modèle supprimé (LienEn)<br>");
		}
		if (is_int(stripos($page,"{{LienNl")))
		{
			$modifs++;
			$page=templ_suppr("LienNl",$page,$lng['nl']);
			print ("Vieux modèle supprimé (LienNl)<br>");
		}
		if (is_int(stripos($page,"{{Lien fr en")))
		{
			$modifs++;
			$page=templ_suppr("Lien fr en",$page,$lng['en'],$lng['wp']);
			print ("Vieux modèle supprimé (Lien fr en)<br>");
		}
		// Wikipédia
		$fr=GetInter($page,"wp:");
		if ($fr)
		{
			print ("Recherche sur Wikipédia $fr<br>");
			$pagew=w_GetPage($fr,"http://fr.wikipedia.org/w");
		}
		else
		{
			if ($lng['wp'])	$fr=$lng['wp'];
			else		$fr=$listarticle[$n];
			print ("Recherche sur Wikipédia $fr<br>");
			$pagew=w_GetPage($fr,"http://fr.wikipedia.org/w");
			$pr=Redirect($pagew);
			if ($pr)
			{
				$pagew=w_GetPage($pr,"http://fr.wikipedia.org/w");
				$fr=$pr;
			}
			if ($pagew)	add_inter($page,"wp",$fr,$modifs);
		}
		// Simple english
		$simple=GetInter($page,"en:");
		if (!$simple && $lng['en'])	add_inter($page,"en",$lng['en'],$modifs);
		else
		{
			if ($pagew && !$simple)
			{
				$simple=GetInter($pagew,"simple:");
				if ($simple)	add_inter($page,"en",$simple,$modifs);

			}

		}
		// wkikids
		GetOtherWiki($page,$pagew,$lng,"nl",$modifs,$listarticle[$n]);

		// modifications effectuées
		if ($modifs)
		{
			print ("Écriture de $listarticle[$n]<br>");
			$result=w_PutPage($listarticle[$n],"Lien interwiki",$page,true,true);
			if ($result)		$_SESSION['log']['nbt']++;
		}
		else
		{
			$_SESSION['log']['nbp']++;
		}
	   }
	   else
	   {
		$_SESSION['log']['nbp']++;
	   }
	   flush();
	   @ob_flush();
	   $n++;
	}
	// retour
	$nbt=$_SESSION['log']['nbt'];
	$nbp=$_SESSION['log']['nbp'];
	$wp=$_SESSION['log']['wp'];
	$en=$_SESSION['log']['en'];
	$nl=$_SESSION['log']['nl'];
	$ligne3="<b>Page(s) :</b> traitée(s) $nbt / Passée(s) $nbp<br><b>Lien(s) ajouté(s) :</b> wp $wp / en $en / nl $nl";

	print ("$ligne3<br>");
	//PutLog2($cmd,$color,$ligne1,$ligne21,$ligne22,$ligne3,$write=true)
	PutLog2("Interwiki","aaaaff",$ligne1,$ligne21,$ligne22,$ligne3,true);
	if ($result && !$jours && !$heures)	$_SESSION['inter']['from']=$from;
	return $result;
}
/*-------------- Catégorie -------------------*/
function loop_cato()
{
	$from=$_SESSION['cato']['from'];
	$nbr=$_SESSION['cato']['nbr'];
	$flags=$_SESSION['cato']['flags'];
	$jours=$_SESSION['cato']['jours'];
	$heures=$_SESSION['cato']['heures'];
	$categ=$_SESSION['cato']['categ'];
	// vérifications des données
	if (($jours||$heures) && ($from||$categ))
	{
		message ('"Commencer à... et catégorie" doivent être nuls pour effectuer une recherche sur modifications récentes');
		return false;
	}
	if ($nbr>500)
	{
		message ('Vous ne pouvez traiter plus de 500 articles à la fois');
		$_SESSION['cato']['nbr']=500;
		return false;
	}
	// traitement
	LogWindow(true);
	$_SESSION['log']['illp']=0;
	$_SESSION['log']['illm']=0;
	$_SESSION['log']['missp']=0;
	$_SESSION['log']['missm']=0;

	if ($jours || $heures)
	{
		$listarticle=GetByDate("articles édités",$jours,$heures);
		$fromwiki="Catégorisation des articles édités";
		print ("$fromwiki ($jours jour(s) et $heures heure(s))<br>");
		$ligne1="<b>Fonction :</b> $fromwiki";
		$ligne21="<b>Jour(s) :</b> ".$jours;
		$ligne22="<b>Heure(s) :</b> ".$heures;
		$all=false;
	}
	else
	{
		if ($categ)
		{
			$listarticle=w_GetPagesCat($categ,$continue);
			if ($continue)	message ("La catégorie comporte plus de 500 membres. Les derniers articles seront ignorés.");
			$ligne1="<b>Fonction : </b>Catégorisation des articles";
			$ligne21="<b>De :</b> la catégorie ".$categ;
			$ligne22="";
			print ("Catégorisation de la catégorie $categ<br>");
		}
		else
		{
			$fromwiki=$from;
			$listarticle=w_GetAllFiles($from,$nbr,"0");
			$towiki=$from;
			if	(!$fromwiki)	$fromwiki="(début)";
			if 	(!$towiki)	$towiki="(fin)";
			$ligne1="<b>Fonction : </b>Catégorisation de tous les articles";
			$ligne21="<b>De :</b> ".$fromwiki;
			$ligne22="<b>À :</b> ".$towiki;
			print ("Catégorisation de $fromwiki à $towiki<br>");
		}
		$all=true;
	}
	// boucler sur les articles
	$n=0;
	$result=true;
	while (isset($listarticle[$n]) && $result)
	{
		$modifs=0;
		if (($all || NoDouble($listarticle,$listarticle[$n],$n)) && !is_int(stripos($listarticle[$n],"Catégorie:")))
		{
			$page=w_GetPage($listarticle[$n]);
			if ($page && !Redirect($page) && !is_int(stripos($page,"{{homonymie}}")))
			{
				dateprint ("Vérification de $listarticle[$n]");
				if (VerifCato($page,$listarticle[$n],$flags))
				{
					$result=w_PutPage($listarticle[$n],"Catégorisation",$page,true,true);
					if ($result)
					{
						$_SESSION['log']['nbt']++;
						dateprint ("<b>Page Sauvegardée</b>");
					}
				}
				else	$_SESSION['log']['nbp']++;
			}
			else	dateprint ("<i>Passe $listarticle[$n]</i>");
		}
		flush();
		@ob_flush();
		$n++;
	}
	$nbt=$_SESSION['log']['nbt'];
	$nbp=$_SESSION['log']['nbp'];
	$illp=$_SESSION['log']['illp'];
	$illm=$_SESSION['log']['illm'];
	$missp=$_SESSION['log']['missp'];
	$missm=$_SESSION['log']['missm'];
	$ligne3=	"<b>Page(s) :</b> traitée(s) $nbt / Passée(s) $nbp<br>
			<b>Article à illustrer :</b> + $illp / - $illm<br>
			<b>Illustration manquante :</b> + $missp / - $missm";

	print ("$ligne3<br>");
	PutLog2("Catégorisation","C29B5B",$ligne1,$ligne21,$ligne22,$ligne3,true);
	if ($result && !$jours && !$heures)	$_SESSION['cato']['from']=$from;
	return $result;
}
function VerifCato (&$page,$nom,$flags)
{
	$retour=false;
	$ill=cat_get("Article à illustrer",$page);
	$miss=cat_get("Illustration manquante",$page);
	// vérifier la présence des illustrations
	$illist=w_GetPageInfo ($nom,"images");
	$nbimages=0;	// nombre d'images réellement dans l'article
	$nberr=0;	// nombre erreurs
	$n=0;
	while (isset($illist[$n]))
	{
		//print ("Image : $illist[$n]<br>");
		if (is_int(stripos($page,$illist[$n])))
		{
			$nbimages++;
			if (($flags&12) && !w_GetExist($illist[$n]))	$nberr++;
		}
		$n++;
	}
	if ($nbimages)	print ("Images : $nbimages / Erreurs : $nberr<br>");
	// Article à illustrer
	if ($flags&1 && !$nbimages && !isset($ill[0]))
	{
		print ("<b> + Article à illustrer</b><br>");
		$page=$page."\n[[Catégorie:Article à illustrer]]";
		$_SESSION['log']['illp']++;
		$retour=true;
	}
	// Article à illustrer moins
	if ($flags&2 && $nbimages && isset($ill[0]))
	{
		print ("<b> - Article à illustrer</b><br>");
		cat_suppr($ill,$page);
		$_SESSION['log']['illm']++;
		$retour=true;
	}
	// Illustration manquante
	if ($flags&4 && $nberr && !isset($miss[0]))
	{
		print ("<b> + Illustration manquante</b><br>");
		$page=$page."\n[[Catégorie:Illustration manquante]]";
		$_SESSION['log']['missp']++;
		$retour=true;
	}
	// Illustration manquante moins
	if ($flags&8 && !$nberr && isset($miss[0]))
	{
		print ("<b> - Illustration manquante</b><br>");
		cat_suppr($miss,$page);
		$_SESSION['log']['missm']++;
		$retour=true;
	}
	//print ("$page<br>");
	return $retour;
}
// tester présence d'une cat (renvoi tableau avec début et longueur)
function cat_get($cat,$page)
{
	$deb=stripos($page,"[[catégorie:".$cat."]]");
	if (is_int($deb))
	{
		$ret[0]=$deb;
		$ret[1]=strlen("[[catégorie:".$cat."]]");
		return $ret;
	}
	$deb=stripos($page,"[[category:".$cat."]]");
	if (is_int($deb))
	{
		$ret[0]=$deb;
		$ret[1]=strlen("[[category:".$cat."]]");
		return $ret;
	}
	$deb=stripos($page,"[[catégorie: ".$cat."]]");
	if (is_int($deb))
	{
		$ret[0]=$deb;
		$ret[1]=strlen("[[catégorie: ".$cat."]]");
		return $ret;
	}
	$deb=stripos($page,"[[category: ".$cat."]]");
	if (is_int($deb))
	{
		$ret[0]=$deb;
		$ret[1]=strlen("[[category: ".$cat."]]");
		return $ret;
	}
	return false;
}
// supprimer une catégorie quelconque
function cat_suppr($tab,&$page)
{
	$start=$tab[0];
	$len=$tab[1];
	if ($start)		$deb=substr($page,0,$start);
	$fin=substr($page,$start+$len);
	$page=$deb.$fin;
}
/*---------------------------------------------*/
// à vérifier
function GetImageByDate($what,$d,$h)
{
	// calcul de la timestamp
	$utc=date_default_timezone_get();
	date_default_timezone_set("UTC");
	$now=time();
	$found=$now-$d*3600*24-$h*3600;
	$time=strftime("%Y-%m-%dT%TZ",$found);
	date_default_timezone_set($utc);
	// Get de la liste
	print ("$time<br>");
	$list=w_GetRc($what,$time);
	$n=0;
	$idx=0;
	while (isset($list[$n]))
	{
		/*if ($list[$n]['title']=="Special:Journal/upload")
		{
			// chercher nom
			print ("$list[$n]<br>");
			$start=strpos($list[$n]['comment'],"[[Image:");
			if (is_int($start))
			{
				$end=strpos($list[$n]['comment'],"]]",$start);
				if (is_int($end))
				{
					$name=substr($list[$n]['comment'],$start+2,$end-$start-2);
					$pages[$idx]=$name;
					//print ("$idx $name<br>");
					$idx++;
				}
			}
		}*/
		// les log ont changé
		$pages[$idx++]=$list[$n]['title'];
		$n++;
	}
	if ($idx===0)	message ("Pas d'images chargées<br>");
	else		message ("$idx images chargées ou détruites<br>",2);
	return $pages;
}
function GetByDate($what,$d,$h)
{
	// calcul de la timestamp
	$utc=date_default_timezone_get();
	date_default_timezone_set("UTC");
	$now=time();
	$found=$now-$d*3600*24-$h*3600;
	$time=strftime("%Y-%m-%dT%TZ",$found);
	date_default_timezone_set($utc);
	// Get de la liste
	$list=w_GetRc($what,$time);
	$n=0;
	while (isset($list[$n]))
	{
		$pages[$n]=$list[$n]['title'];
		$n++;
	}
	if ($n===0)	message ("Pas de nouvelles créations ou modifications<br>");
	else		message ("$n nouvelles créations ou modifications<br>",2);
	return $pages;
}
// Interwiki
function GetOtherWiki(&$page,$pagew,$lng,$wiki,&$modifs,$original)
{
	require ("includes/adrs.php");
	$simple=GetInter($page,$wiki.":");
	if (!$simple && $lng[$wiki])	add_inter($page,$wiki,$lng[$wiki],$modifs);
	else
	{
		if ($pagew && !$simple)
		{
			$simple=GetInter($pagew,$wiki.":");
			if ($simple)
			{
				print ("Recherche $wiki '$simple'<br>");
				// recherche sur autre wiki
				$pagenl=w_GetPage($simple,$adrs[$wiki]['api']);

				if ($pagenl)
				{
					$pr=Redirect($pagenl);
					if ($pr)	$simple=$pr;
					add_inter($page,$wiki,$simple,$modifs);
				}
				else
				{
					// recherche sans parenthèses
					if (!is_int(strpos($original,"(")))
					{
						$simple=NoParent($simple);
						if ($simple)
						{
							print ("Recherche sur $wiki '$simple' <b>(sans parenthèses)</b><br>");
							// recherche sur kids
							$pagenl=w_GetPage($simple,$adrs[$wiki]['api']);
							if ($pagenl)
							{
								$pr=Redirect($pagenl);
								if ($pr)	$simple=$pr;
								//print ("$pagenl<br>");
								add_inter($page,$wiki,$simple,$modifs);
							}
						}
					}
				}
			}
		}
	}
}
/* --------------------S/P----------------------*/
/*						*/
/*						*/
/*						*/
/*						*/
/* ---------------------------------------------*/
// chercher un argument dans le modèle infoimage
function	GetInfoImageArg($page,$key)
{
	$offset=stripos($page,$key);
	if (is_int($offset))
	{
		$offset=strpos($page,"=",$offset);
		if (is_int($offset))
		{
			$end=strpos($page,"|",$offset);
			$offset++;
			$offset=PassEspace($page,$offset);
			$arg=substr($page,$offset,$end-$offset);
			return $arg;
		}
	}
	return false;
}
// passer espace
function PassEspace ($text,$offset)
{
	while (true)
	{
		$what=$text[$offset];
		if ($what==" " || $what=="\n" || $what=="\r" || $what=="\t")	$offset++;
		else								return $offset;
	}
}

// ajouter lien interwiki
function add_inter(&$page,$inter,$value,&$modifs)
{
	$page=$page."\n[[".$inter.":".$value."]]";
	$modifs++;
	print ("Ajout [[$inter:$value]]<br>");
	$_SESSION['log'][$inter]++;
}
// suppression des parenthèses d'un nom
function NoParent($name)
{
	$end=strpos($name,"(");
	if (!is_int($end))	return false;
	$name=substr($name,0,$end-1);
	return $name;
}

// test si redirect
function Redirect($page)
{
	$start=stripos($page,"#REDIRECT [[");
	if (!is_int($start))
	{
		$start=stripos($page,"#REDIRECT[[");
		if (!is_int($start))	return false;	// non-présent
		$end=strpos($page,"]]",$start);
		if (!is_int($end))	return false;	// mal-formé
		// couper redirect
		$lien=substr($page,$start+11,$end-$start-11);
	}
	else
	{
		$end=strpos($page,"]]",$start);
		if (!is_int($end))	return false;	// mal-formé
		// couper redirect
		$lien=substr($page,$start+12,$end-$start-12);
	}
	print ("Redirect $lien<br>");
	return $lien;
}
//chercher lien interwiki
function GetInter(&$page,$inter)
{
	$start=stripos($page,"[[".$inter);
	if (!is_int($start))	return false;	// non-présent
	$end=strpos($page,"]]",$start);
	if (!is_int($end))	return false;	// mal-formé
	// couper lien interwiki
	$lien=substr($page,$start+2+strlen($inter),$end-$start-2-strlen($inter));
	if ($lien=="{{PAGENAME}}")
	{
		$lien=false;
		$deb='';
		if ($start)	$deb=substr($page,0,$start);
		$fin=substr($page,$end+2);
		$page=$deb.$fin;
		print ("Interwiki malformé<br>");
	}
	return $lien;
}
// supprimer un modèle
function templ_suppr($modele,$page,&$a1='',&$a2='')
{
	$start=stripos($page,"{{".$modele);
	if (!is_int($start))	return $page;	// modèle non-présent
	$end=strpos($page,"}}",$start);
	if (!is_int($end))	return $page;	// modèle mal-formé
	// isoler modèle
	$mod=substr($page,$start+2,$end-$start-2);
	$pieces=explode("|",$mod);
	if ($pieces[1])	$a1=$pieces[1];
	if ($pieces[2])	$a1=$pieces[2];
	// sppr modèle
	$deb='';
	if ($start)	$deb=substr($page,0,$start);
	$fin=substr($page,$end+2);
	$page=$deb.$fin;
	return $page;
}
// tester liens
function GoodLinks($list,&$link=false)
{
	$n=0;
	$result=true;
	while (isset($list[$n]) && $result)
	{
		if (strncmp("http://commons.wikimedia.org/wiki/Image:",$list[$n],40)==0)
		{
			// enlever url
			$page=mb_strcut($list[$n],strlen("http://commons.wikimedia.org/wiki/"),255,"UTF-8");
			print ("Recherche commons $list[$n]<br>");
			// enlever &lang
			$et=strpos($page,"?");
			if (is_int($et))
			{
				$page=mb_strcut($page,0,$et,"UTF-8");
				//print ("$page<br>");
			}
			//$pipo=w_GetPageInfo($page,"templates","http://commons.wikimedia.org/w");
			$pipo=w_GetExist($page,"http://commons.wikimedia.org/w");
			if (!$pipo)
			{
				//print ("Erreur ici !!!!! (notset)<br>");
				$link=$list[$n];
				$result=false;
			}
		}
		$n++;
	}
	return $result;
}
// licence correcte ?
function GoodLicence($licence)
{
	$n=0;
	$found=false;
	// boucler sur $licence
	while (!$found && isset($licence[$n]))
	{
		$found=licence_exists($licence[$n]);
		$n++;
	}
	return $found;
}
// tester présence licence
function licence_exists($template)
{
	// boucler sur liste
	$i=0;
	$found=false;
	while (!$found && isset($_SESSION['licences'][$i]))
	{
		if (strcasecmp($template,$_SESSION['licences'][$i])==0)	$found=true;
		$i++;
	}
	return $found;
}
// retourne argument d'un modèle
function GetTemplArgs($modele,$page)
{
	$args=false;
	$start=stripos($page,"{{".$modele);
	if (!is_int($start))	return false;	// modèle non-présent
	$end=strpos($page,"}}",$start);
	if (!is_int($end))	return false;	// modèle mal-formé
	// isoler modèle
	$mod=substr($page,$start+2,$end-$start-2);
	$args=explode("|",$mod);
	return $args;
}
// retourne argument unique d'un modèle
function GetTemplArgs2($modele,$page)
{
	$args=false;
	$start=stripos($page,"{{".$modele);
	if (!is_int($start))	return false;	// modèle non-présent
	$end=strpos($page,"}}",$start);
	if (!is_int($end))	return false;	// modèle mal-formé
	// isoler modèle
	$args=substr($page,$start+3+strlen($modele),$end-$start-3-strlen($modele));
	return $args;
}
// retourne modèle partiel
function modlicence_exists($template,$list)
{
	// boucler sur liste
	$i=0;
	while (isset($list[$i]))
	{
		$pos=stripos($list[$i],$template);
		if (is_int($pos) && $list[$i]!="Template:PD-Layout")	return $i;
		$i++;
	}
	return false;
}
//tester présence modèle
function templ_exists($template,$list)
{
	// boucler sur liste
	$i=0;
	$found=false;
	while (!$found && isset($list[$i]))
	{
		if ($template==$list[$i])	$found=true;
		$i++;
	}
	return $found;
}
// faire la liste des licences
function GetLicences()
{
	if ($_SESSION['licences'])	return;
	// fabriquer la liste
	Licences("Modèle licence");
	message ('Liste des licences chargée',2);
}
function Licences($category)
{
	static $n=0;
	$list=w_GetPagesCat($category);
	$i=0;
	while (isset($list[$i]))
	{
		// modèle ou catégorie ?
		$suite=str_replace("Catégorie:","",$list[$i],$nb);
		if ($nb)
		{
			Licences($suite);
			$i++;
		}
		else
		{
			if ($list[$i]!='Modèle:Licence' && $list[$i]!='Modèle:Licence douteuse' && $list[$i]!='Modèle:Licence inconnue')
			{
				$_SESSION['licences'][$n]=$list[$i];
				$n++;
			}
			$i++;
		}
	}
}
// Recherche / remplacement intelligente
function searchin($search,$replace,$text,$case,$maj,&$nbr)
{
	$nbr=0;
	$offset=0;	//position dans la chaîne
	$found=true;
	while ($found)
	{
		$newpos=strword($text,$search,$offset,$case,false);
		if (is_int($newpos))
		{
			//on remplace
			$oldchar=$text[$newpos];
			$text=substr($text,0,$newpos).$replace.substr($text,$newpos+strlen($search),strlen($text));
			$offset=$newpos+strlen($replace);
			// respect de la première majuscule
			if ($maj && ucfirst($oldchar)==$oldchar) $text[$newpos]=ucfirst($text[$newpos]);
			$nbr++;
		}
		else
		{
			$found=false;
		}

	}
	return $text;
}
function ismot($car)
{
	switch ($car)
	{
	case " ":
	case ":":
	case "|":
	case '"':
	case "[":
	case "(":
	case "]":
	case ")":
	case ".":
	case ",":
	case ";":
	case "'":
	case "}":
	case "{":
	case "=":
	case "\n":
		$result=true;
		break;
	default:
		$result=false;
		break;	
	}
	return $result;
}
// chercher un mot dans une chaîne
function strword ($text,$match,$offset,$case,$pluriel,&$car=0)
{
	while ($offset<strlen($text))
	{
		// rechercher occurrence
		if ($case)	$offset=strpos($text,$match,$offset);
		else		$offset=stripos($text,$match,$offset);
		if (is_int($offset))
		{
			// prendre caractère avant et après
			$char[0]=" ";
			$char[1]=" ";
			if ($offset)	$char[0]=$text[$offset-1];
			if ( ($offset+strlen($match)) < strlen($text) )	$char[1]=$text[$offset+strlen($match)];
			if ($pluriel && $char[1]=="s")	$char[2]=" ";
			else				$char[2]=false;
			if ( ($offset+strlen($match)+1) < strlen($text) && $char[2]) $char[2]=$text[$offset+strlen($match)+1];

			if (ismot($char[0])&& (ismot($char[1]) || ismot($char[2])))
			{
				if ($car)
				{
					$car[0]=$char[0];
					$car[1]=$char[1];
				}
				return $offset;
			}
		}
		else
		{
			return false;
		}
		$offset++;
	}
	return false;
}
// vérifier si mot pas déjà vikifié ou dans un lien
function iswikif(&$texte,$offset)
{
	$loop=true;
	while ($loop)
	{
		$car=$texte[$offset];
		if ($car==']')	{$result=false;$loop=false;}
		if ($car=='[')	{$result=true;$loop=false;}
		if (!$offset)	{$result=false;$loop=false;}
		else		$offset--;
	}
	return $result;
}
/*--------------------------------------
Import d'images
---------------------------------------*/
// Création d'une liste
// affichage d'une liste d'import
function make_import_list($url)
{
	require ("includes/adrs.php");
	// de quelle liste s'agit-il ?
	// category ?
	if (strncmp($url,"Category:",9)==0)
	{
		$url=substr($url,9,strlen($url)-9);
		$rawlist=w_GetPagesCat($url,$next,500,$adrs['commons']['api']);
		$n=0;
		$idx=0;
		// copie des noms d'images
		while (isset($rawlist[$n]))
		{
			if (strncmp($rawlist[$n],"Image:",6)==0)	$list[$idx++]=$rawlist[$n];		// image
			$n++;
		}
	}
	else
	{
		if (strncmp($url,"Image:",6)==0)
		{
			$list[0]=$url;
		}
		else
		{
			// galerie
			$page=w_GetPage($url,$adrs['commons']['api']);
			if ($page)	$list=GetGallery($page);
		}
	}
	if (!isset($list))	message("Aucune image n'a été trouvée !",1);
	else			{$im=count($list);message("$im image(s) trouvée(s)",2);}
	return $list;
}
// image d'une galerie
function GetGallery($page)
{
	$deb=strpos($page,"<gallery");
	if (!is_int($deb))	return false;
	$fin=strpos($page,"</gallery>");
	if (!is_int($fin))	return false;
	// première image
	$n=0;
	$offset=strpos($page,"Image:",$deb);
	while (is_int($offset))
	{
		$off2=strpos($page,"\n",$offset);
		if (!is_int($off2))	return $list;
		else
		{
			// cas des |
			$off3=strpos($page,"|",$offset);
			if (is_int($off3) && $off3<$off2)	$off2=$off3;	
		}
		$list[$n++]=substr($page,$offset,$off2-$offset);
		$offset=strpos($page,"Image:",$off2);
		/*$im=$list[$n-1];
		print ("'$im'<br>");*/
	}
	return $list;
}
// extraire url d'une page
function extract_url($page)
{
	$offset=strpos($page,'<div class="fullImageLink" id="file">');
	if (!is_int($offset))	return false;

	$big=strpos($page,"<a href=",$offset);
	if (!is_int($big))	return false;

	$small=strpos($page,"src=",$offset);
	if (!is_int($small))	return false;

	$url[0]=copy_url($page,$big+8);
	$url[1]=copy_url($page,$small+4);
	return $url;
}
function copy_url($page,$offset)
{
	$guill=$page[$offset++];
	$end=strpos($page,$guill,$offset);
	$url=substr($page,$offset,$end-$offset);
	//print ("$url<br>");
	return $url;
}
// extraire le nom de l'auteur
function GetImInfo($page,$what)
{
	$offset=stripos($page,"|".$what);
	if (!is_int($offset))
	{
		$offset=stripos($page,"| ".$what);
		if (!is_int($offset)) return false;
		$offset=$offset+strlen($what)+2;
	}
	else
	{
		$offset=$offset+strlen($what)+1;
	}
	// passer = et espaces
	while ($page[$offset]==' ' || $page[$offset]=='=')	$offset++; 
	$end=strpos($page,"\n",$offset);
	if (!is_int($end))	return false;
	if ($end==$offset)
	{
		$end=strpos($page,"\n|",$offset);
		if (!is_int($end))	return false;
	}
	return		substr($page,$offset,$end-$offset);
}
// importer image
function ImportImage	($imagedes,$licence1,$licence2,$licence3,$auteur,$date,$imagered,$imagefull,$cat)
{
	$nb=$_SESSION['import']['nb'];
	$list=$_SESSION['import']['list'];
	$image=$list[$nb];
	$imagecommons=str_replace("Image:","",$image);
	// image transformée en png ?
	if ($_SESSION['import']['reduce'])
	{
		$red=" (image réduite)";
		if (is_int(stripos($imagered,".svg.png")))	$image=$image.".png";
	}
	else					$red='';


	$imagedes=stripslashes($imagedes);
	// déjà chargée ?
	if (w_GetPage($image))
	{
		message ("Image déjà chargée $image");
		return true;
	}
	//print ("Import '$image'<br>$imagedes<br>$licence1/$licence2/$licence3<br>$auteur<br>$date<br>$imagered<br>$imagefull<br>");
	$mois=GetMois(date("F"));
	$daydate=date("j ").$mois.date(" Y");

	$licence='';
	if ($licence1)	$licence="{{".$licence1."}}";
	if ($licence2)	$licence=$licence."{{".$licence2."}}";
	if ($licence3)	$licence=$licence."{{".$licence3."}}";
	// création description
	$des = "{{Information image
 | Description = $imagedes
 | Source      = {{Commons|$imagecommons}}$red
 | Licence     = $licence
 | Auteur      = $auteur
 | Date        = $date
}}
{{AchilleUpload|$daydate}}

[[Catégorie:$cat]]";

	// création fichier temporaire
	if ($_SESSION['import']['reduce'])	$imageurl=$imagered;
	else					$imageurl=$imagefull;
	$imagedata=w_Curl($imageurl);
	if (!$imagedata)
	{
		message ("Erreur lors du chargement du fichier $imageurl",1);
		return false;
	}
	$tempfile=tempnam("users","achille");
	$fh=fopen($tempfile,"w");
	if (!$fh)
	{
		message ("Erreur lors de la création du fichier temporaire",1);
		return false;
	}
	fwrite($fh,$imagedata);
	fclose($fh);
	$retour=wiki_PutImage($tempfile,$imagecommons,$des,false,true);		//"$imagedesc,$minor,$botedit)
	unlink($tempfile);
	if ($retour)	AddPod($image);
	else
	{
		message ("Erreur de l'importation du fichier");
		return false;
	}
	return true;
}
// ajouter au fichier des images du jour
function AddPod($image)
{
	if ($_SESSION['status']==3) 		return false;
	if (!$_SESSION['import']['day'])	return false;
	$fh=fopen("users/".$_SESSION['user'].".podfile","a+");
	if (!$fh)	return false;
	fwrite($fh,$image."\n");
	fclose($fh);
}
// faire la liste des catégories
function GetCatList($cat)
{
	$list=w_GetPagesCat($cat);
	$i=0;
	$n=1;
	$listcat[0]=$cat;
	while (isset($list[$i]))
	{
		// modèle ou catégorie ?
		$suite=str_replace("Catégorie:","",$list[$i],$nb);
		if ($nb)
		{
			$listcat[$n++]=$suite;
		}
		$i++;
	}
	return $listcat;
}
// fonction POD
function MakePOD($datedeb,$podlist)
{
	$podlist=explode("\n",$podlist);
	// éliminer les lignes inutiles
	$i=0;
	$n=0;
	while (isset($podlist[$i]))
	{
		if (strpos($podlist[$i],"Image:")===0)	$pod[$n++]=$podlist[$i];
		$i++;
	}
	$nb=count($pod);
	LogWindow(true);
	print ("Images du jour : $nb pages à créer<br>Date : $datedeb<br>");
	flush();
	@ob_flush();
	// calcul de la date
	$tt=strtotime($datedeb);
	$tt=$tt+12 * 60 * 60;		// bug erreur de calcul
	// mélanger les images
	$n=0;
	$result=true;
	while ($result && isset($pod[$n]))
	{
		$tmp=$pod[$n];
		if ($tmp)
		{
			$rand=rand($n,$nb-1);
			$pod[$n]=$pod[$rand];
			$pod[$rand]=$tmp;
			// charger le fichier
			print ("Fichier : '$pod[$n]'<br>");
			$page=w_GetPage($pod[$n]);
			if ($page)
			{
				dateprint ("Image du jour <b>$pod[$n]</b>");
				$des=GetImInfo($page,"Description");
				$offset=strpos($des,".");
				if (is_int($offset))	$des=substr($des,0,$offset+1);
				print ("<i>$des</i><br>");
				// jour
				$mois=GetMois(date("F",$tt));
				$date=date("j ",$tt).$mois.date(" Y",$tt);
				$file="Vikidia:Image du jour/$date";
				print("$file<br>");
				$tt=$tt+24 * 60 * 60;
				$image=str_replace("Image:","",$pod[$n]);
				$newtext="{{ImageDuJour|$image|$des}}";
				$result=w_PutPage($file,"Image du jour $date",$newtext,true,true);
				if (!$result)	message ("Erreur d'écriture $image",1);
				else	$_SESSION['log']['nbt']++;
			}
			else
			{
				message ("Fichier non-trouvé $pod[$n]");
				$_SESSION['log']['nbp']++;
			}
			flush();
			@ob_flush();
		}
		$n++;
	}
	$nbt=$_SESSION['log']['nbt'];
	$nbp=$_SESSION['log']['nbp'];
	$ligne1="<b>Fonction :</b> création images du jour";
	$ligne21="<b>Date :</b> ".$datedeb;
	$ligne22="";
	$ligne3="<b>Image(s)</b> : traitée(s) $nbt / Passée(s) $nbp";
	print ("$ligne3<br>");
	if ($result)
	{
		unlink("users/".$_SESSION['user'].".podfile");
		dateprint ("Fichier pod effacé");
	}
	PutLog2("Images du jour","AA0000",$ligne1,$ligne21,$ligne22,$ligne3,true);
}
/*--------------------------------------
Fonctions de log
*--------------------------------------*/
// ouverture fermeture fenêtre
function LogWindow($open)
{
	if ($open)
	{
		$_SESSION['log']['start']=time();
		$_SESSION['log']['nbt']=0;
		$_SESSION['log']['nbp']=0;
		$_SESSION['log']['nbm']=0;
		$_SESSION['log']['wp']=0;
		$_SESSION['log']['en']=0;
		$_SESSION['log']['nl']=0;
		$_SESSION['log']['result']="";
		// préparer fenêtre messages
		print ('<div class="divrun">');
		dateprint ("<b>---Ouverture du log---</b>");
	}
	else
	{
		dateprint ("<b>---fermeture du log---</b>");
		print ("</div>");
	}
}
function PutLog2($cmd,$color,$ligne1,$ligne21,$ligne22,$ligne3,$write=true)
{
	if ($_SESSION['log']['nbt']==0)
	{
		dateprint ("Le log ne sera pas transmis à Vikidia (0 page traitée)<br>");
		$write=false;
	}
	LogWindow(false);
	// écrire log ?
	if (!isset($_SESSION['log'])||!$write ||$_SESSION['status']==3) return false;
	// protection des commentaires
	$ligne1=nowiki($ligne1);
	$ligne21=nowiki($ligne21);
	$ligne22=nowiki($ligne22);
	$ligne23=nowiki($ligne3);
	// valeurs communes
	$lresult=$_SESSION['log']['result'];
	$version=ACHILLE_VERSION;
	// calcul du temps et résultat
	$sec=time()-$_SESSION['log']['start'];
	$min=intval($sec/60);
	$sec=$sec-$min*60;
	if (!$lresult)	$lresult="Tâche accomplie. Temps $min min(s) $sec sec(s)";
	else $lresult=$lresult." Temps $min min(s) $sec sec(s)";
	// composition message
	//{{AchilleLog2|couleur|signature|ligne1|ligne2-1|Ligne2-2|ligne3|résultat|version}}
	$logurl="Utilisateur:".$_SESSION['user']."/logs";
	$logtext="\n{{AchilleLog2|$color|~~~~|$ligne1|$ligne21|$ligne22|$ligne3|$lresult|$version}}";
	$page=w_GetPage($logurl);
	$page=$page.$logtext;
	$result=w_PutPage($logurl,"Rapport d'activité : ".$cmd,$page,false,false);
	unset ($_SESSION['log']);
	return true;
}
function nowiki($texte)
{
		//remplacer
		$search[0]="[[";
		$search[1]="]]";
		$search[2]="{{";
		$search[3]="}}";
		$search[4]="=";
		$rep=array('','','','','=');
		return str_ireplace($search,$rep,$texte);
}