Vikidia:Achille/sources/util.php
| 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="{{Info image|Description=$imagedes
|Source={{commons|$imagecommons}}$red
|Licence=$licence
|Auteur=$auteur
|Date=$date
}}
[[Catégorie:$cat]]
{{AchilleUpload|$daydate}}";
// 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);
}
