Code robot pour infobox Ville du Japon modifier

// fonction de conversion pour le changement infobox ville du Japon
// Tâche : - convertit les coordonnées DMS en coordonnées décimales (via le modèle {{coord/dms2dec}}
//              - modifie le séparateur des milliers pour les champs population et km² (pour le calcul de la densité)
// Paramètres:
// * $texte (string) = le texte de l'article contenant une infobox ville du japon
// Retour : le texte modifié, ou NULL si erreur
function conversion_infobox_japon($texte)
{
	// **étape 1 ************************************************************************
	// on isole l'infobox pour limiter tout effet de bord
	$pos_infobox = strpos($texte, "{{Infobox Ville du Japon");
	$boxtexte = substr($texte, $pos_infobox);
	
	if($pos_infobox === FALSE){
		print "Erreur critique 0 - pas d'infobox trouvée.<br />";
		return NULL; 
	}
	
	$open = strpos($boxtexte , "{{", 2);
	$end = strpos($boxtexte , "}}");
	while($open !== false && $open < $end) // en cas de modèle imbriqué, on avance itérativement jusqu'à trouver la fin de l'infobox
	{
		$open = strpos($boxtexte , "{{", $open+2);
		$end = strpos($boxtexte , "}}", $end+2);
	}
	
	if($end === FALSE){
		print "Erreur critique 1 - fin infobox.<br />";
		return NULL; 
	}
	
	$length_box = $end+2;
	$boxtexte = substr($boxtexte , 0, $length_box); // $end = la fin de l'infobox
	
	// **étape 2 ************************************************************************
	// on opère la conversion des coordonnées
	// deux formes possibles : x° y' z" D ou x° y' D
	// transformé en {{coord/dms2dec|D|x|y|z}} ou {{coord/dms2dec|D|x|y}}
	$apostrophe = "(′|['’]){1}"; //liste de toutes les apostrophes possibles pour les minutes
	$boxtexte = preg_replace_callback("#\|longitude[ ]*=[ ]*(.+)°[ ]*(.+)".$apostrophe."([ ]*(.+)\")?[ ]*([ENOS])#i", 
				create_function('$matches', 'return	$matches[4]=="" ? "|longitude={{coord/dms2dec|$matches[6]|$matches[1]|$matches[2]}}"
											: "|longitude={{coord/dms2dec|$matches[6]|$matches[1]|$matches[2]|$matches[5]}}";'), 
				$boxtexte);
	$boxtexte = preg_replace_callback("#\|latitude[ ]*=[ ]*(.+)°[ ]*(.+)".$apostrophe."([ ]*(.+)\")?[ ]*([ENOS])#i", 
				create_function('$matches', 'return	$matches[4]=="" ? "|latitude={{coord/dms2dec|$matches[6]|$matches[1]|$matches[2]}}"
											: "|latitude={{coord/dms2dec|$matches[6]|$matches[1]|$matches[2]|$matches[5]}}";'),
				$boxtexte);
				
	if($boxtexte == NULL){
		print "Erreur critique 2 - coordonnées.<br />";
		return NULL; 
	}
	
	// **étape 3 ************************************************************************
	// on supprime les virgules (séparateurs des milliers) dans superficie et population
	preg_match("#\|population[ ]*=[ ]*(.+)(\n)*\|#i", $boxtexte, $pop);
	if(isset($pop[1])){
		$pop[1] = str_replace(",", "", $pop[1]);
		$pop[1] = str_replace(" ", "", $pop[1]);
		$boxtexte = preg_replace("#\|population[ ]*=[ ]*(.+)(\n)*\|#i", "|population=".$pop[1]."$2|", $boxtexte);
	}

	preg_match("#\|km²[ ]*=[ ]*(.+)(\n)*\|#i", $boxtexte, $superficie);
	if(isset($superficie[1])){
		$superficie[1] = str_replace(",", ".", $superficie[1]);
		$superficie[1] = str_replace(" ", "", $superficie[1]);
		$boxtexte = preg_replace("#\|km²[ ]*=[ ]*(.+)(\n)*\|#i", "|km²=".$superficie[1]."$2|", $boxtexte);
	}
	
	if($boxtexte == NULL){
		print "Erreur critique 3 - séparateurs milliers.<br />";
		return NULL; 
	}

	// **étape 4 ************************************************************************
	// remplacement de l'infobox dans le texte
	$texte = substr_replace($texte, $boxtexte, $pos_infobox, $length_box);
	
	return $texte;
}

Routine de vérification infobox modifier

// routine de vérification après conversion
// param $texte = le texte d'une page modifiée
// retour : 0 si ok, 1 si une erreur a été détectée
function verification_bot($texte)
{
	if (strpos($texte, "Erreur d’expression") !== false)
		return 1;
	return 0;
}

Code robot pour statut des villes du Japon modifier

/* Recherche de kanji spéciaux dans une chaîne de caractère.
* Retour : 3 si le caractère 市 a été trouvé, 4 si 町, 5 si 村 ou 0 si aucun
*/
function recherche_statut($chaine)
{
	$statut = 0;

	//on cherche un des caractères clés
	if(strpos($chaine, "市") !== false)
			$statut = 3;
	else if(strpos($chaine, "町") !== false)
			$statut = 4;
	else if(strpos($chaine, "村") !== false)
			$statut = 5;
	return $statut;
}

/* Fonction de recherche automatique du statut d'une ville (c-à-d préfecture, ville, bourg ou village)
* Modification : ajoute le statut dans l'infobox et supprime l'ancienne catégorie
* Méthode : on regarde le kanji final du nom de la ville (en japonais) : 市 = ville, 町 = bourg, 村 = village 
* param $ville (string) = le nom de la ville en cours
* param $texte (string) = le texte d'un article contenant une infobox Ville du Japon
* Retour : NULL si erreur, le texte de la page modifié sinon.
*/
function autoCategorie_ville_japon($ville, $texte)
{
	$statut = 0;
	
	//liste des préfectures actuelles
	$liste_prefecture = array("Nagoya"
	, "Akita"
	, "Aomori"
	, "Chiba"
	, "Matsuyama"
	, "Fukui"
	, "Fukuoka"
	, "Fukushima"
	, "Gifu"
	, "Maebashi"
	, "Hiroshima"
	, "Sapporo"
	, "Kobe"
	, "Mito"
	, "Kanazawa"
	, "Morioka"
	, "Takamatsu"
	, "Kagoshima"
	, "Yokohama"
	, "Kochi"
	, "Kumamoto"
	, "Kyoto"
	, "Tsu"
	, "Sendai"
	, "Miyazaki"
	, "Nagano"
	, "Nagasaki"
	, "Nara"
	, "Niigata"
	, "Oita"
	, "Okayama"
	, "Naha"
	, "Osaka"
	, "Saga"
	, "Saitama"
	, "Otsu"
	, "Matsue"
	, "Shizuoka"
	, "Utsunomiya"
	, "Tokushima"
	, "Shinjuku"
	, "Tottori"
	, "Toyama"
	, "Wakayama"
	, "Yamagata"
	, "Yamaguchi"
	, "Kofu");

	// **étape 1 ************************************************************************
	// on vérifie la présence d'une infobox
	$pos_infobox = strpos($texte, "{{Infobox Ville du Japon");
	
	// si pas d'infobox, on retourne une erreur
	if($pos_infobox === FALSE){
			print "Pas d'infobox trouvée.<br />";
			return NULL;
	}
	
	// **étape 2 ************************************************************************
	// on cherche le statut avec précaution dans la page
	
	// cas où la ville est une préfecture
	if(in_array($ville, $liste_prefecture))
		$statut = 2;
	else{
		// sinon, on récupère le nom de la commune dans l'infobox
		if( preg_match("#\|nomcommune=(.+)(\n)*\|#i", $texte, $nom))
		{
				$statut = recherche_statut($nom[1]); //on parse le nom pour extraire le statut
		}

		if($statut == 0)
		{
			//si on ne trouve pas dans l'infobox directement, on va tenter de le trouver en début d'article
			// protection contre les effets de bord : on se limite à une recherche du type :
			//	 - {{Japonais|nom_ville|kanji|hepburn}}
			//	 - {{nihongo|nom_ville|kanji|hepburn}}
			//	 - nom_ville (kanji, hepburn)
			// ou "nom_ville" est le nom de la ville passé en param
			if( preg_match("#[^=]{{(Japonais|nihongo)\|'*".$ville."'*\|(.+)\|(.+)}}#i",$texte, $nom) )
					$statut = recherche_statut($nom[0]);
			else if( preg_match("#[^=]{{(Japonais|nihongo)\|'*".$ville."'*\|(.+)}}#i",$texte, $nom) )
					$statut = recherche_statut($nom[0]);
			else if( preg_match("#[^=]{{(Japonais|nihongo)\|'*".$ville."-(.){3-4}'*\|(.+)}}#i",$texte, $nom) )
					$statut = recherche_statut($nom[0]);
			else if( preg_match("#[^=]'*".$ville."'* \((.+), (.+)\)#i", $texte, $nom) )
					$statut = recherche_statut($nom[0]);

			if($statut == 0)
			{
					print "Statut non trouvé.<br />";
					return NULL;
			}
		}
	}
	
	// **étape 3 ************************************************************************
	// si on a trouvé le statut, on effectue les modifications dans le texte
	if($statut != 0){
		//on ajoute le statut dans l'infobox
		$texte = str_replace("{{Infobox Ville du Japon", "{{Infobox Ville du Japon|\nstatut=".$statut."\n", $texte);

		return $texte;
	}
	else
		return NULL;
	
}

Routine de vérification statut modifier

// routine de vérification après modif du statut
// param $texte = le texte d'une page modifiée
// retour : 0 si ok, 1 si une erreur a été détectée
function verification_statut($texte)
{
	if(strpos($texte, "|statut=") === false || !preg_match("#\|statut=[2-5]#", $texte))
		return 1;
	return 0;
}