Utilisateur:Tractopelle-jaune/Divers/Script ajout légendes début-fin

Une page de Wikipédia, l'encyclopédie libre.

Script PHP pour l'ajout des modèles {{Légende/Début}} et {{Légende/Fin}} manquants dans les légendes.

Ce script est exécuté en ligne de commande (d'où la présence d'un shebang sur la première ligne).

#!/opt/lampp/bin/php
<?php

// Script pour opérer des modifications depuis le compte bot "Tractopelle-jaune télécommandée-bot"
define("EXECUTION_MODE", "bin");
define("BOT_FILENAME_INPUT", "/opt/lampp/htdocs/777/Wikipedia/bot-operations/bot-operations-input.txt");
define("BOT_FILENAME_OK", "/opt/lampp/htdocs/777/Wikipedia/bot-operations/bot-operations-ok.txt");
define("BOT_FILENAME_ERROR", "/opt/lampp/htdocs/777/Wikipedia/bot-operations/bot-operations-error.txt");

define("BOT_FILENAME_COMMIT", "/opt/lampp/htdocs/777/Wikipedia/bot-operations/bot-operations-commit.txt");
define("BOT_FILENAME_DONE", "/opt/lampp/htdocs/777/Wikipedia/bot-operations/bot-operations-done.txt");

define("BOT_FILENAME_DEBUG_OUT", "/opt/lampp/htdocs/777/Wikipedia/bot-operations/bot-operations-debug.out");
define("BOT_LIMIT", 50);
define("BOT_DEBUG", false); // Mode de débogage activé

define("BOT_MAXLAG", 5);

$count = 0;

include("config.php");

$regex_recurse_t = "[^{}]*(?P<recursegroup1>\{\{(?:(?>[^{}]+)|(?P>recursegroup1))*\}\}[^{}]*)*"; // Variante avec quantificateurs gourmands
$regex_recurse_t2 = "[^{}]*?(?P<recursegroup1>\{\{(?:(?>[^{}]+?)|(?P>recursegroup1))*?\}\}[^{}]*?)*?"; // Variante non-gourmande
$regex_recurse_tl = "[^{}\n]*(?P<recursegroup1>\{\{(?:(?>[^{}\n]+)|(?P>recursegroup1))*\}\}[^{}\n]*)*"; // Variante avec quantificateurs gourmands ; retours à la ligne interdits
$regex_recurse_t2l = "[^{}\n]*?(?P<recursegroup1>\{\{(?:(?>[^{}\n]+?)|(?P>recursegroup1))*?\}\}[^{}\n]*?)*?"; // Variante non-gourmande ; retours à la ligne interdits
$regex_recurse_t2l_2 = "[^{}\n]*?(?P<recursegroup2>\{\{(?:(?>[^{}\n]+?)|(?P>recursegroup2))*?\}\}[^{}\n]*?)*?"; // En cas d'usage multiple dans une regex, pour éviter les conflits de masques nommés
$regex_recurse_t2l_3 = "[^{}\n]*?(?P<recursegroup3>\{\{(?:(?>[^{}\n]+?)|(?P>recursegroup3))*?\}\}[^{}\n]*?)*?"; // En cas d'usage multiple dans une regex, pour éviter les conflits de masques nommés
$regex_mois_i = "(?:[Jj]anvier|[Ff]évrier|[Mm]ars|[Aa]vril|[Mm]ai|[Jj]uin|[Jj]uillet|[Aa]oût|[Ss]eptembre|[Oo]ctobre|[Nn]ovembre|[Dd]écembre)";

define("BOT_LOGIN", "Tractopelle-jaune télécommandée-bot");
define("BOT_PASSWORD", "");

$regex_bot_all_templates = "(?:[Ll]égende|[Ll]egend|[Ll]égende double|[Ll]igne de légende|[Ll]egend-line)"; // Différents modèles de légende autorisés
$regex_bot_legende = "\{\{{$regex_bot_all_templates} *\|{$regex_recurse_t2l}\}\}"; // Une légende
$regex_bot_legende_2 = "\{\{{$regex_bot_all_templates} *\|{$regex_recurse_t2l_2}\}\}"; // Une légende
$regex_bot_legende_3 = "\{\{{$regex_bot_all_templates} *\|{$regex_recurse_t2l_3}\}\}"; // Une légende
$regex_bot_legende_multi = "(?:{$regex_bot_legende}\s*)+"; // Toutes les légendes consécutives (au moins 1 légende)
$regex_bot_legende_multi2 = "(?:{$regex_bot_legende}\s*?)+"; // Toutes les légendes consécutives (au moins 1 légende)
$regex_bot_legende_debut = "\{\{[Ll]égende\/[Dd]ébut[^{}\n]*\}\}";
$regex_bot_legende_fin = "\{\{[Ll]égende\/[Ff]in\s*\}\}";

$lines_input = file(BOT_FILENAME_INPUT, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$lines_ok = file(BOT_FILENAME_OK, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$lines_error = file(BOT_FILENAME_ERROR, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$lines_commit = file(BOT_FILENAME_COMMIT, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$lines_done = file(BOT_FILENAME_DONE, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);


foreach($lines_ok as $line_key => &$line)
	$line = preg_replace("/^([^|]+)\|.*$/", '$1', $line);

foreach($lines_error as $line_key => &$line)
	$line = preg_replace("/^([^|]+)\|.*$/", '$1', $line);

foreach($lines_commit as $line_key => &$line)
	$line = preg_replace("/^([^|]+)\|.*$/", '$1', $line);

foreach($lines_done as $line_key => &$line)
	$line = preg_replace("/^([^|]+)\|.*$/", '$1', $line);



if(!API_Login(BOT_LOGIN, BOT_PASSWORD))
	DeclareError("Impossible de se connecter à ".BOT_LOGIN."");

foreach($lines_input as $page_key => &$page)
{
	$page_name = trim($page);
	$page_name = CleanLien($page_name);
	$page_wikicode = "";
	$page_wikicode_orig = "";
	$page_resume_final = "";
	$page_resume_caracteres_controle = false;
	$timestamp = 0;
	$resume_final = "";
	$count_sequences = 0; // Comte le nombre de séquences de légendes présentes dans un article
	$count_sequences_debutfin = 0; // Comte le nombre de séquences de légendes avec modèles début/fin présentes dans un article
	$count_sequences_post = 0; // Second comptage après modifications
	$count_sequences_debutfin_post = 0; // Second comptage après modifications
	$count_sequences_replace = 0;
	$count_sequences_debut = 0; // Compte le nombre de modèles {{Légende/Début}}
	$count_sequences_fin = 0; // Compte le nombre de modèles {{Légende/Fin}}
	$count_remove_border = 0; // Compte le nombre de paramètres border= supprimés
	$count_double_retour_ligne = 0; // Compte le nombre de doubles retours à la ligne supprimés
	$erreur = "";
	
	if(in_array($page_name, $lines_ok))
		continue;
	
	if(in_array($page_name, $lines_done))
		continue;
	
	if(in_array($page_name, $lines_error))
		continue;
	
	if($count >= BOT_LIMIT)
	{
		echo "END to limit(".BOT_LIMIT.") ; $count lines\n";
		break;
	}
	$count++; // On compte à ce moment-là, afin de prendre en compte les nombreux "continue" passant à l'itération suivante en cas de problèmes ou de cas ne nécessitant aucun traitement
	
	Bot_SetStart($page_name);
	
	$timestamp = GetPageTimestamp($page_name);
	
	$page_wikicode = DownloadPageWikicode($page_name, false); // Pas de résolution d'éventuelles redirections
	if(empty($page_wikicode))
	{
		Bot_SetError("Erreur 01 : Échec de la récupération du wikicode de la page <$page_name>.");
		continue;
	}
	
	/* Conditions d'abandon prématuré */
	
	// Aucun modèle {{Légende}} ou apparenté identifié
	if(!preg_match("/\{\{{$regex_bot_all_templates}\s*[|}]/", $page_wikicode))
	{
		DeclareWarning("Aucun modèle de légende n'a pu être retrouvé sur la page.");
		Bot_SetOk("TEMPLATE NOT FOUND");
		Bot_SetSpecialState("DONE-TEMPLATE NOT FOUND", BOT_FILENAME_DONE);
		continue;
	}
	
	// Balises <ol></ol> ou <ul></ul> identifiées dans l'article (possible contournement bricolé du problème avec utilisation autour des modèles de légende, abandon par précaution)
	if(preg_match("/(?:<ol[ >]|<\/ol>|<ul[ >]|<\/ul>)/", $page_wikicode))
	{
		Bot_SetError("Erreur 02 : Abandon commandé par précaution ; des balises <ol></ol> ou <ul></ul> ont été identifiées.");
		continue;
	}
	
	// On vérifie que le nombre de modèles {{Légende/Début}} soit identique au nombre de {{Légende/Fin}}
	$count_sequences_debut = preg_match_all("/{$regex_bot_legende_debut}/", $page_wikicode);
	$count_sequences_fin = preg_match_all("/{$regex_bot_legende_fin}/", $page_wikicode);
	if($count_sequences_debut != $count_sequences_fin)
	{
		Bot_SetError("Erreur 03 : Anomalie détectée avant modification ; la page contient un nombre inégal de modèles début ($count_sequences_debut) et fin ($count_sequences_fin).");
		continue;
	}
	
	/* Fin des conditions d'abandon prématuré */
	
	
	
	// Suppression des caractères de contrôle - À effectuer avant d'enregistrer la variable $page_wikicode_orig, afin que les comparaisons post-modifications ne soient pas affectés de ces suppressions
	$page_wikicode = CleanCaracteresControle($page_wikicode, $page_resume_caracteres_controle, false); // extended=false
	$page_wikicode_orig = $page_wikicode;
	
	
	
	// Comptage des séquences de légendes
	$table_sequences_total = array();
	preg_match_all("/({$regex_bot_legende_multi})(?<!\s)/", $page_wikicode, $table_sequences_total, PREG_SET_ORDER);
	$count_sequences = count($table_sequences_total);
	if($count_sequences < 1)
	{
		Bot_SetError("Erreur 04 : Erreur interne lors du comptage des séquences de légendes ; des modèles de légendes ont été identifiés, mais une erreur est survenue lors de leur comptage.");
		continue;
	}
	
	// Préparation des données
	foreach($table_sequences_total as $sequence_total_key => &$sequence_total)
	{
		$sequence_total['data_legendes'] = $sequence_total[1];
		$sequence_total['debutfin'] = false; // Default value
		$sequence_total['count'] = preg_match_all("/{$regex_bot_all_templates}/", $sequence_total['data_legendes']);
		if($sequence_total['count'] == 0)
		{
			Bot_SetError("Erreur 05 : Erreur lors du comptage du nombre de légendes de la séquence $sequence_total_key ; zéro légendes ont été retournées.");
			continue 2;
		}
	}
	unset($sequence_total);
	
	
	
	// Comptage des séquences de légendes avec modèles début/fin
	$table_sequences_debutfin = array();
	preg_match_all("/({$regex_bot_legende_debut})(\s*)({$regex_bot_legende_multi})(\s*)({$regex_bot_legende_fin})/", $page_wikicode, $table_sequences_debutfin, PREG_SET_ORDER);
	$count_sequences_debutfin = count($table_sequences_debutfin);
	
	// Erreur de comptage si le nombre de séquences valides est différent du nombre de modèles {{Légende/Début}} présents, cela signifie probablement qu'il y a des éléments parasites entre les modèles début et/ou fin d'une ou plusieurs séquences
	if($count_sequences_debutfin != $count_sequences_debut)
	{
		Bot_SetError("Erreur 06 : Discordance lors du comptage des séquences : Le nombre de séquences valides identifiées ($count_sequences_debutfin) est différent du nombre de modèles {{Légende/Début}} identifiés ($count_sequences_debut).");
		continue;
	}
	
	// Si on a le même nombre de séquences que le premier comptage, cela signifie que toutes les séquences sont normalement valides
	if($count_sequences_debutfin == $count_sequences)
	{
		Bot_SetOk("NOT MODIFIED");
		Bot_SetSpecialState("DONE-NOT MODIFIED", BOT_FILENAME_DONE);
		Bot_SetEnd();
		continue;
	}
	
	
	
	// On marque toutes les séquences complètes dans la table principale
	foreach($table_sequences_debutfin as $sequence_debutfin_key => &$sequence_debutfin)
	{
		$sequence_found = false;
		
		$sequence_debutfin['data_legendes'] = $sequence_debutfin[3];
		$sequence_debutfin['count'] = preg_match_all("/{$regex_bot_all_templates}/", $sequence_debutfin['data_legendes']); // 2018-08-03 - Remplacement variable $sequence_total['data_legendes'] par $sequence_debutfin['data_legendes'] (il s'agit d'une inattention)
		if($sequence_debutfin['count'] == 0)
		{
			Bot_SetError("Erreur 07 : Erreur lors du comptage du nombre de légendes de la séquence début/fin $sequence_debutfin_key ; zéro légendes ont été retournées.");
			continue 2;
		}
		
		foreach($table_sequences_total as $sequence_total_key => &$sequence_total)
		{
			if($sequence_total['data_legendes'] == $sequence_debutfin['data_legendes'])
			{
				if($sequence_found) // Au cas où on a déjà identifié une séquence identique, on déclare une erreur
				{
					Bot_SetError("Erreur 08 : Au moins deux séquences identiques de légendes ont été identifiées.");
					continue 3;
				}
				
				if($sequence_total['count'] != $sequence_debutfin['count'])
				{
					Bot_SetError("Erreur 09 : L'appareillement de la séquence début/fin $sequence_debutfin_key avec la séquence principale sequence_total_key a réussi, mais une différence de comptage du nombre de modèles de légendes est survenue ; {$sequence_total['count']} modèles étaient attendus, mais la séquence début/fin en a compté {$sequence_debutfin['count']}.");
					continue 3;
				}
				
				$sequence_total['debutfin'] = true;
				$sequence_found = true;
			}
		}
		unset($sequence_total);
		
		if(!$sequence_found)
		{
			Bot_SetError("Erreur 10 : Impossible d'établir la concordance entre les deux tables de séquences pour la séquence débutfin $sequence_debutfin_key.");
			continue 2;
		}
	}
	unset($sequence_debutfin);
	
	/*
	echo "SEQUENCES_TOTAL:";
	var_dump($table_sequences_total);
	echo "END;";
	
	echo "SEQUENCES_DEBUTFIN:";
	var_dump($table_sequences_debutfin);
	echo "END;";
	*/
	
	foreach($table_sequences_total as $sequence_total_key => &$sequence_total)
	{
		if(!$sequence_total['debutfin'] && $sequence_total['count'] == 1 && !preg_match("/^[0-9er]+ $regex_mois_i aux Jeux olympiques(?: d'hiver| d'été)? de \d+$/", $page_name)) // Exceptions pour certaines catégories de pages, qui sont traitées malgré des séquences uniques, en raison de leur grand nombre
		{
			DeclareWarning("Une séquence ne comportant qu'un seul modèle de légende a été identifiée (séquence numéro $sequence_total_key : contenu {$sequence_total['data_legendes']}) ; les séquences ne comportant qu'une seule légende ne sont pas traitées pour des raisons de sécurité.");
		}
		elseif(!$sequence_total['debutfin']) // Séquence avec modèles début/fin manquants
		{
			$count_replace = 0;
			
			//var_dump($sequence_total['data_legendes']);
			
			if(!preg_match("/^(({$regex_bot_legende})(\s*)((?:{$regex_bot_legende_2}\s*)*)({$regex_bot_legende_3})?)$/", $sequence_total['data_legendes'], $matching))
			{
				DeclareAlert("Séquence $sequence_total_key ; contenu : {$sequence_total['data_legendes']}");
				Bot_SetError("Erreur 11 : Erreur lors de l'application de la regex de séparation ; la séquence $sequence_total_key n'a pas pu être séparée en vue de récupérer les données d'indentation pour l'ajout des modèles début/fin.");
				continue 2;
			}
			
			if($matching[1] != $sequence_total['data_legendes'])
			{
				Bot_SetError("Erreur 12 : Erreur lors de l'appareillement de la séquence de séparation d'avec la séquence complète $sequence_total_key.");
				continue 2;
			}
			
			//var_dump($matching);
			
			$sequence_total['indentation'] = $matching[4]; // Contient les éventuels espaces ou retours à la ligne
			
			$sequence_total['data_new'] = "{{Légende/Début}}{$sequence_total['indentation']}{$sequence_total['data_legendes']}{$sequence_total['indentation']}{{Légende/Fin}}";
			
			$sequence_total['data_new'] = preg_replace("/\n{2,}/", "\n", $sequence_total['data_new'], -1, $count_double_retour_ligne);
			if($count_double_retour_ligne > 0)
				DeclareNotice("$count_double_retour_ligne retours à la ligne excédentaires au sein d'une séquence ont été supprimés.");
			
			$data_legendes_quoted = preg_quote($sequence_total['data_legendes'], "/");
			$page_wikicode = preg_replace("/{$data_legendes_quoted}/", "{$sequence_total['data_new']}", $page_wikicode, -1, $count_replace);
			if($page_wikicode === NULL)
			{
				Bot_SetError("Erreur 13 : Une erreur interne est survenue lors de la substitution de la chaîne correspondant à la séquence $sequence_total_key en cours de traitement.");
				continue 2;
			}
			elseif($count_replace == 0)
			{
				Bot_SetError("Erreur 14 : Échec de substitution de la séquence $sequence_total_key par une nouvelle séquence corrigée.");
				continue 2;
			}
			elseif($count_replace >= 2)
			{
				Bot_SetError("Erreur 15 : Le contrôle post-modification a identifié que $count_replace séquences identiques ont été substituées simultanément.");
				continue 2;
			}
			
			$count_sequences_replace++; // On incrémente le compteur de remplacements
			$sequence_total['debutfin'] = true;
		}
	}
	unset($sequence_total);
	
	if(preg_match("/{$regex_bot_legende_debut}[ \n\[\]{}|:]*{$regex_bot_legende_debut}/", $page_wikicode))
	{
		Bot_SetError("Erreur 16 : Une séquence illégale a été détectée : Présence de modèles {{Légende/Début}} consécutifs une fois les modifications appliquées.");
		continue;
	}
	elseif(preg_match("/{$regex_bot_legende_fin}[ \n\[\]{}|:]*{$regex_bot_legende_fin}/", $page_wikicode))
	{
		Bot_SetError("Erreur 17 : Une séquence illégale a été détectée : Présence de modèles {{Légende/Fin}} consécutifs une fois les modifications appliquées.");
		continue;
	}
	
	
	
	/* Recomptage des séquences - Dernière boucle de rattrapage en cas d'erreur - contrôles de sécurité */
	
	// Comptage des séquences de légendes
	$tmp_sequences = array();
	preg_match_all("/({$regex_bot_legende_multi})/", $page_wikicode, $tmp_sequences, PREG_SET_ORDER);
	$count_sequences_post = count($tmp_sequences);
	if($count_sequences_post < 1)
	{
		Bot_SetError("Erreur 18 : Erreur interne lors du recomptage des séquences de légendes après modification ; des modèles de légendes sont présents, mais une erreur est survenue lors de leur comptage");
		continue;
	}
	elseif($count_sequences_post != $count_sequences)
	{
		Bot_SetError("Erreur 19 : Une anomalie a été identifiée lors du contrôle final avant enregistrement ; une divergence du nombre total de séquences détectées après modification ($count_sequences_post) par rapport à avant ($count_sequences).");
		continue;
	}
	
	// Comptage des séquences de légendes avec modèles début/fin
	$tmp_sequences = array();
	preg_match_all("/({$regex_bot_legende_debut})(\s*)({$regex_bot_legende_multi})(\s*)({$regex_bot_legende_fin})/", $page_wikicode, $tmp_sequences, PREG_SET_ORDER);
	$count_sequences_debutfin_post = count($tmp_sequences);
	if($count_sequences_debutfin_post < $count_sequences_debutfin)
	{
		Bot_SetError("Erreur 20 : Une anomalie a été identifiée lors du contrôle final avant enregistrement ; une divergence illégale du nombre de séquences avec modèles début/fin détectées après modification ($count_sequences_debutfin_post) par rapport à avant ($count_sequences_debutfin).");
		continue;
	}
	
	// Recomptage des modèles {{Légende/Début} et {{Légende/Fin}}, le nombre doit être identique pour les deux
	$count_sequences_debut = preg_match_all("/{$regex_bot_legende_debut}/", $page_wikicode);
	$count_sequences_fin = preg_match_all("/{$regex_bot_legende_fin}/", $page_wikicode);
	if($count_sequences_debut != $count_sequences_fin)
	{
		Bot_SetError("Erreur 21 : Anomalie détectée après modification ; la page contient un nombre inégal de modèles début ($count_sequences_debut) et fin ($count_sequences_fin).");
		continue;
	}
	
	// Erreur de comptage si le nombre de séquences valides est différent du nombre de modèles {{Légende/Début}} présents, cela signifie probablement qu'il y a des éléments parasites entre les modèles début et/ou fin d'une séquence ou plusieurs séquences
	if($count_sequences_debut != ($count_sequences_debutfin + $count_sequences_replace))
	{
		Bot_SetError("Erreur 22 : Discordance lors du comptage des séquences : Le nombre de séquences valides identifiées ($count_sequences_debutfin) + celles corrigées ($count_sequences_replace) est différent du nombre de modèles {{Légende/Début}} identifiés ($count_sequences_debut).");
		continue;
	}
	
	// Erreur inconnue si on a plus de modèles début que de séquences totales
	if($count_sequences_debut > $count_sequences)
	{
		Bot_SetError("Erreur 23 : Discordance lors du comptage des séquences : Le nombre de modèles {{Légende/Début}} identifiés ($count_sequences_debut) est supérieur au nombre de séquences totales ($count_sequences).");
		continue;
	}
	
	/* Fin du recomptage des séquences */
	
	
	
	if($count_sequences_debutfin_post == $count_sequences_post)
	{
		Bot_SetSpecialState("FIXED ALL", BOT_FILENAME_DONE);
	}
	else
	{
		DeclareWarning("$count_sequences_debutfin_post séquences sur $count_sequences_post ont pu êtres corrigées");
	}
	
	/* Aucune modification apportée dans les paramètres - CleanEOL trimme les fins de lignes pour permettre des comparaisons correctes */
	if(CleanEOL($page_wikicode) == CleanEOL($page_wikicode_orig))
	{
		DeclareNotice("Aucune modification n'a pu être apportée à la page");
		Bot_SetOk("NON CORRIGÉ");
		Bot_SetEnd();
		continue;
	}
	
	
	
	/* Modifications mineures annexes effectuées après traitement principal */
 	
 	$page_wikicode = preg_replace("/\{\{(?:[Ll]égende|[Ll]egend)( *\|)/", '{{Légende$1', $page_wikicode);
 	$page_wikicode = preg_replace("/\{\{(?:[Ll]égende double)( *\|)/", '{{Légende double$1', $page_wikicode);
 	$page_wikicode = preg_replace("/\{\{(?:[Ll]igne de légende|[Ll]egend-line)( *\|)/", '{{Ligne de légende$1', $page_wikicode);
 	$page_wikicode = preg_replace("/\{\{(?:[Ll]égende\/[Dd]ébut)( *\||\}\})/", '{{Légende/Début$1', $page_wikicode);
 	$page_wikicode = preg_replace("/\{\{(?:[Ll]égende\/[Ff]in)( *\||\}\})/", '{{Légende/Fin$1', $page_wikicode);
	
	// Suppression des paramètres "border="
	$page_wikicode = preg_replace("/(\{\{[Ll]égende(?: *\|{$regex_recurse_t2l})?) *\| *border *= *[a-zA-Z0-9 #]*(\||\}\})/", '$1$3', $page_wikicode, -1, $count_remove_border);
	if($count_remove_border >= 1)
	{
		DeclareNotice("$count_remove_border paramètres border= ont été supprimés");
	}
	
	// Suppression du deux-points (indentation) devant les légendes uniques pour les chronologies de Jeux olympiques
	if(preg_match("/^[0-9er]+ $regex_mois_i aux Jeux olympiques(?: d'hiver| d'été)? de \d+$/", $page_name))
	{
		$page_wikicode = preg_replace("/^:({$regex_bot_legende_debut})({$regex_bot_legende})({$regex_bot_legende_fin})$/m", "$1\n$2\n$4", $page_wikicode);
	}
	
	/* Fin des modifications mineures annexes */
	
	
	
	/* Préparation du résumé de modification */
	
	$resume_final .= "Ajout des modèles [[Modèle:Légende/Début|{{Légende/Début}}]] et [[Modèle:Légende/Fin|{{Légende/Fin}}]] manquants ([[Wikipédia:Bot/Requêtes/2018/07|voir la requête]])";
	
	if($page_resume_caracteres_controle)
		$resume_final .= " / Suppression de [[caractères de contrôle]]";
	
	if($count_remove_border >= 1)
		$resume_final .= " / Suppression du paramètre inexistant border= des modèles [[Modèle:Légende|{{Légende}}]] ([[Wikipédia:Bot/Requêtes/2018/07#Suppression_border|suite demande]])";
	
	$resume_final = trim($resume_final);
	
	/* Fin de la préparation du résumé de modification */
	
	
	
	/* Mise en ligne */
	
	//if(!API_Commit("Utilisateur:Tractopelle-jaune/Brouillon", $page_wikicode, $resume_final, 0, $erreur))
	if(!API_Commit($page_name, $page_wikicode, $resume_final, $timestamp, $erreur))
	{
		Bot_SetError("Erreur 24 : Échec de la mise en ligne des modifications; error_code:$erreur;");
		continue;
	}
	
	/* Fin de la mise en ligne */
	
	if($count_remove_border >= 1)
		Bot_SetSpecialState("COMMIT-$count_sequences_replace SÉQUENCES CORRIGÉES+REMOVE PARAM BORDER", BOT_FILENAME_COMMIT);
	else
		Bot_SetSpecialState("COMMIT-$count_sequences_replace SÉQUENCES CORRIGÉES", BOT_FILENAME_COMMIT);
	
	sleep(10);
	
	Bot_SetOk();
	Bot_SetEnd();
}

echo "END\n";

?>