Le Livre d'or • avoir tout Vikidia hors-connexion
Vikidia:Achille/sources/util.php
< Vikidia:Achille | sources
Aller à la navigation
Aller à la recherche
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); }