User:Merge bot/proposedmergers.php

From Wikipedia, the free encyclopedia

<?php
/** proposedmergers.php - To generate lists of proposed page mergers on Wikipedia
 *
 *  (c) 2009 James Hare - http://en.wikipedia.org/wiki/User:Harej
 *  (c) 2013-2026 Bill  - http://en.wikipedia.org/wiki/User:wbm1058
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *   
 *  Developers (add your self here if you worked on the code):
 *    James Hare - [[User:Harej]] - Wrote everything
 *    WBM - [[User:Wbm1058]] - March/April 2013 updates
 **/
ini_set("display_errors", 1);
error_reporting(E_ALL ^ E_NOTICE);
require_once 'botclasses.php';  // Botclasses.php was written by User:Chris_G and is available under the GNU General Public License
include("logininfo.php");

const bot_version = "2.2";
const botuser = "Merge bot";

function templateprocess($processed) {
	echo " :: " . $processed;
	$processed = preg_replace("/\s?\|\s?/", "|", $processed);
	$processed = preg_replace("/\{{2}\s?/", "", $processed);
	$processed = preg_replace("/\s?\}{2}/", "", $processed);
	$processed = preg_replace("/\s?=\s?/", "=", $processed);

#				Redirects to {{Merge}} (14 aliases)
	$processed = preg_replace("/^(Mergewith|Merge with|Merge_with|MergeVfD|Mergesplit|MergeSplit|Merge)/i", "merge", $processed);
	$processed = preg_replace("/^(Mergedisputed|MergeDisputed|Merge-disputed|Merge disputed|Merge_disputed)/i", "merge", $processed);
	$processed = preg_replace("/^(Merge-multiple|Mergemulti|Mergetomultiple-with|Multimerge)/i", "merge", $processed);
	$processed = preg_replace("/^(Proposed merge|Proposed_merge)/i", "merge", $processed);

#				{{Merging}}
	$processed = preg_replace("/^(Mergingsectionto|Merging|Merging to|Merging_to)(.*)\|\s*dir\s*\=\s*from/i", "mergefrom$2", $processed);
	$processed = preg_replace("/^(Mergingsectionto|Merging|Merging to|Merging_to)/i", "merge", $processed);

#				Redirects to {{Merge from}} (11 aliases)
	$processed = preg_replace("/^(Merge from|Merge_from|Merge-from|Include|Mergrefrom|Mergefrom-category|MergeFrom|Mergefrom)/i", "mergefrom", $processed);
	$processed = preg_replace("/^(Mergefrom-multiple|Multiplemergefrom|Mergefrommultiple|Mergefrommulti|Multimergefrom)/i", "mergefrom", $processed);

#				{{Afd-merge from}}, {{Merging from}}
	$processed = preg_replace("/^(Afd-merge from|Afd-merge_from|Afd-mergefrom|Afdmergefrom|Merging from|Merging_from|Mergingfrom)/i", "mergefrom", $processed);

#				Redirects to {{Merge to}} (15 aliases) and {{Merge school}} (1 alias)
	$processed = preg_replace("/^(Merge to|Merge_to|Merge-to|Mergeinto|MergetoCat|Mergelist|Mergeto-disputed)/i", "mergeto", $processed);
	$processed = preg_replace("/^(MergePartial|Merge-multiple-to|Merge to article|Merge_to_article)/i", "mergeto", $processed);
	$processed = preg_replace("/^(Mergeto-multiple|Multiplemergeto|Multiplemergeinto|Merge into|Merge_into|Merge-into|MergeTo|Mergeto|Merge2)/i", "mergeto", $processed);
	$processed = preg_replace("/^(Merge school|Merge_school|Merge-school)/i", "mergeto", $processed);

#				{{Afd-merge to}}
	$processed = preg_replace("/^(Afd-merge to|Afd-merge_to|Afd-mergeto|Afdmergeto|AfD-merge to|AfD-merge_to)/i", "afd-mergeto", $processed);

#				{{Merge portions from}}  // This is really a splitting template, not a merging template
	$processed = preg_replace("/^(Merge portions from|Merge_portions_from|Move portions from|Move_portions_from)/i", "false-positive", $processed);

	return $processed;
}

echo "PHP version: " . PHP_VERSION . "\n";
#phpinfo();
echo "Bot version: " . bot_version . "\n";

$b = 0;
$month_year = array();
$j = 0;
$takeofflater = 0;
$maxi = 0;
$cachepage = "";
$discuss = array();
$target = array();
$section = array();
$multiplesections = array();
$reason = array();
$othernamespace = 0;
$matchfailed = 0;
$templatesplitfailed = 0;
$nopartner = 0;
$nopartners = array();
$no_direction = 0;
$no_directions = array();
$conflict = 0;
$conflicts = array();
$mismatched_date = 0;
$mismatched_dates = array();
$reason_count = 0;
$reasons = array();
$blank = 0;
$blanks = array();
$no_reciprocal = 0;
$redirects = 0;
$maybe = 0;
$maybes = array();
$diffcase = 0;
$diffcases = array();
$redir_no_reciprocal = 0;
$redir_no_reciprocals = array();
$page_moved = 0;
$pages_moved = array();
$other_redirect = 0;
$other_redirects = array();
$selfmerge = 0;
$targetself = 0;
$noname = 0;
$wikt = 0;
$mainsubmission = "";
$skipped = 0;
$counter = array();
$maxcounter = 0;
$submission = array();
$nomatches = array();
$nosplits = array();
$pagename = array();

echo "Logging in...\n";
$objwiki = new wikipedia();
$objwiki->http->useragent = '[[User:Merge bot]] php wikibot classes';
$objwiki->login($mbuser, $mbpass);
echo "...done.\n";

$mergemembers = $objwiki->categorymembers("Category:Articles proposed for merging");
print_r($mergemembers);

for ($a = 0; $a < count($mergemembers); $a++) { // for each member
	if (preg_match("/Category:Articles proposed for merging from/", $mergemembers[$a])) {
		$mergemonths[$b] = $mergemembers[$a];
		$month_year[$b] = str_replace("Category:Articles proposed for merging from ", "", $mergemembers[$a], $repcount);
		if ($repcount == 0) {
			$month_year[$b] = str_replace("Category:", "", $mergemembers[$a]);
		}
		$b = $b + 1;
	}
	else {
		echo "\n" . $a . ": Skipped: " . $mergemembers[$a] . "\n";
		$skipped += 1;
	}
}
print_r($mergemonths);

for ($a = 0; $a < count($month_year); $a++) {
	$month_yeartime[$a] = strtotime($month_year[$a]);
}

echo "\nSorting by month... ";
$keys = array_keys($month_yeartime);
$values = array_values($month_year);
array_multisort($month_yeartime, SORT_ASC, $keys);

for ($a = 0; $a < count($keys); $a++) {
	$mergemonths[$a] = "Category:Articles proposed for merging from " . $values[$keys[$a]];
}
print_r($mergemonths);

for ($a = 0; $a < count($mergemonths); $a++) { // for each month
	echo "\n__________\n" . $a . ": " . $mergemonths[$a] . "\n";
	$transcludes = $objwiki->categorymembers($mergemonths[$a]);
	#print_r($transcludes);

	$monthyear = str_replace("Category:Articles proposed for merging from ", "", $mergemonths[$a], $repcount);
	if ($repcount == 0) {
		$monthyear = str_replace("Category:", "", $mergemonths[$a]);
	}

	for ($i = 0; $i < count($transcludes); $i++) { // for each page in the category
	
	if ($i > $maxi) {
		$maxi = $i;
	}

	if (preg_match("/^((User|Wikipedia|File|MediaWiki|Template|Help|Category|Portal|Draft)(( |_)talk)?|Talk):/", $transcludes[$i])) {
		echo "\n\n?? Other namespace: " . $transcludes[$i] . "\n\n";
		$others[$othernamespace] = $transcludes[$i];
		$othernamespace += 1;
		continue;
	}

	$getpagefailed = 0;
	do {
		if ($transcludes[$i] == $cachepage) {
			echo "getpage 1: $transcludes[$i]|from cache\n";
			$contents = $cachecontents;
		}
		else {
			echo "getpage 1: $transcludes[$i]|";
			$contents = $objwiki->getpage($transcludes[$i]);
		}
		if ($contents == FALSE) {
			echo "\n\n?? getpage failed: " . $transcludes[$i] . "\n\n";
			$getpagefailed += 1;
			if ($getpagefailed == 5) {
				die("getpage Error");
			}
			sleep(10);
			continue;
		}
	} while ($contents == FALSE);

		if (preg_match_all("/\{{2}\s?(merge|proposed merge|afd-merge|merging|move section)[^}]*\}{2}/i", $contents, $raw1) == 0) {
			#echo "contents:\n";
       			#echo "$contents";
       			#echo "\n";
			unset($contents);
			echo "\n\n?? Match failed: " . $transcludes[$i] . "\n\n";
			$nomatches[$matchfailed] = $transcludes[$i];
			$matchfailed += 1;
			continue;
		}

		$mergetemplates = count($raw1[0]);
		if ($mergetemplates > 1) {
			echo "$mergetemplates merge templates on $transcludes[$i]\n";
			print_r($raw1[0]);
		}
		$takeofflater = 0;

		for ($j = 0; $j < $mergetemplates; $j++) { // for each merge template on the page
			$key = $a . "-" . $i . "-" . $j;
		
			$pagename[$key] = $transcludes[$i];
			echo $key . ">> " . $pagename[$key];
			$template = templateprocess($raw1[0][$j]);
			#echo " § " . $template . " §";

			$ptemplate = $raw1[0][$j];
			if (isset($contents)) $pcontents = $contents;
			else $pcontents = "";
			unset($contents);
			
			$templatesplit = array_map('trim',explode("|", $template));
			echo " " . $templatesplit[0];

			switch ($templatesplit[0]) {
				case "mergefrom":
					$type[$key] = "into";
					break;
				case "merge":
					$type[$key] = "with";
					break;
				case "mergeto":
					$type[$key] = "to";
					break;
				case "afd-mergeto":
				case "false-positive":
					echo " [unset: " . $pagename[$key] . "]\n";
					unset($pagename[$key]);
					$takeofflater += 1;
					continue 2;
				default:
					echo "*** templatesplitfailed: " . $template . "\n";
					print_r($templatesplit);
					$nosplits[$templatesplitfailed] = $transcludes[$i];
					$templatesplitfailed += 1;
					echo " [unset: " . $pagename[$key] . "]\n";
					unset($pagename[$key]);
					$takeofflater += 1;
					continue 2;
			}
			
			$otherpage[$key] = "{{pagelist|nspace=|";
			unset($otherpages);
			$otherpages = array();
			$otherpage_count = 0;

			for ($para = 1; $para < count($templatesplit); $para++) {
				#echo "\n" . $para . ") " . $templatesplit[$para] . "\n";
				if (preg_match("/^date\s*=/i", $templatesplit[$para])) {
					$date[$key] = str_replace("date=", "", $templatesplit[$para]);
					$date[$key] = str_replace("_", " ", $date[$key]);

					if ($date[$key] != $monthyear) {
						if (in_array($transcludes[$i], $mismatched_dates) == FALSE) {
							$mismatched_dates[$mismatched_date] = $transcludes[$i];
							$mismatched_date += 1;
						}
						echo " Another date: " . $date[$key] . " not " . $monthyear;
						echo " [unset=> " . $date[$key] . "]\n";
						unset($pagename[$key]);
						unset($type[$key]);
						unset($date[$key]);
						unset($discuss[$key]);
						unset($target[$key]);
						unset($section[$key]);
						unset($multiplesections[$key]);
						unset($reason[$key]);
						$takeofflater += 1;
						continue 2;
					}
				}
				elseif (preg_match("/^(discuss|discussion|talk)\s*=/i", $templatesplit[$para])) {
					$discuss[$key] = str_replace("discuss=", "", $templatesplit[$para]);
					$discuss[$key] = str_replace("discussion=", "", $discuss[$key]);
					$discuss[$key] = str_replace("talk=", "", $discuss[$key]);
				}
				elseif (preg_match("/^target\s*=/i", $templatesplit[$para])) {
					$target[$key] = str_replace("target=", "", $templatesplit[$para]);

					if ($target[$key] == $transcludes[$i]) {
						echo "\n** error ** Page " . $transcludes[$i] . " proposed merge target is itself\n";
						$targetself += 1;
					}

					if (in_array($target[$key], $pagename)) {
						echo " [unset=> " . $target[$key] . "]\n";
						unset($pagename[$key]);
						unset($type[$key]);
						unset($date[$key]);
						unset($discuss[$key]);
						unset($target[$key]);
						unset($section[$key]);
						unset($multiplesections[$key]);
						unset($reason[$key]);
						$takeofflater += 1;
						continue 2;
					}
				}
				elseif (preg_match("/^section\s*=/i", $templatesplit[$para])) {
					$section[$key] = str_replace("section=", "", $templatesplit[$para]);
				}
				elseif (preg_match("/^multiplesections\s*=/i", $templatesplit[$para])) {
						// Template:Mergefrom uses parameter multiplesections; Merge and Mergeto do not
					$multiplesections[$key] = str_replace("multiplesections=", "", $templatesplit[$para]);
				}
				elseif (preg_match("/^dir\s*=/i", $templatesplit[$para])) { // Template:Merging
				}
				elseif (preg_match("/^(reason|comment)\s*=/i", $templatesplit[$para])) {
					$reason[$key] = str_replace("reason=", "", $templatesplit[$para]);
					$reasons[$reason_count] = $pagename[$key] . " …… " . $reason[$key];
					$reason_count += 1;
				}
				else {
					if (in_array($templatesplit[$para], $pagename)) {
						echo " [unset-> " . $templatesplit[$para] . "]\n";
						unset($pagename[$key]);
						unset($type[$key]);
						unset($date[$key]);
						unset($discuss[$key]);
						unset($target[$key]);
						unset($section[$key]);
						unset($multiplesections[$key]);
						unset($reason[$key]);
						$takeofflater += 1;
						continue 2;
					}
					else {
						if (preg_match("/^(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20)=/i", $templatesplit[$para])) {
							echo "\nNumbered parameter(s):" . $templatesplit[$para];
							$templatesplit[$para] = preg_replace("/(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20)=/", "", $templatesplit[$para]);
						}
						$otherpage[$key] .= $templatesplit[$para] . "|";
						$otherpages[$otherpage_count] = $templatesplit[$para];
						$otherpage_count += 1;
					}
				}
			}

			$otherpage[$key] .= "}}";
			echo " -- " . $otherpage[$key] . "\n";
			#print_r($otherpages);

			for ($ii = 0; $ii < count($otherpages); $ii++) {
				$break = 0;
				$pagecontents = "";

				if (str_replace ("_"," ",$otherpages[$ii]) != $otherpages[$ii]) {
					echo "\n$otherpages[$ii] has underscores\n";
					$pos = strpos($ptemplate, $otherpages[$ii]);
					$otherpages[$ii] = str_replace ("_"," ",$otherpages[$ii]);
					if ($pos !== false) {
				            $new_template = substr_replace($ptemplate, $otherpages[$ii], $pos, strlen($otherpages[$ii]));
				            $pcontents = str_replace($ptemplate,$new_template,$pcontents);
				            if ($pcontents == "") {
				                echo "\n??Problem replacing underscores with spaces in merge template\n";
				            }
				            else if ($objwiki->nobots($transcludes[$i],botuser,$pcontents) == true) {
				                echo "\nReplacing underscores with spaces in merge template\n";
				                $objwiki->edit($transcludes[$i],$pcontents,"Replace underscores with spaces in merge template",true,true);
				            }
					}
				}

				if (strpos($otherpages[$ii],"#") !== false) {
					$len = strpos($otherpages[$ii],"#");
					if ($len == 0) $mp = $pagename[$key];
					else $mp = substr($otherpages[$ii],0,$len); // strip section links
				}
				else $mp = $otherpages[$ii];

				if ($pagename[$key] == $mp) {
					echo "\n***** PAGE " . $mp . " PROPOSED FOR SELF-MERGE *****\n\n";
					$selfmerge += 1;
				}
				else if ($mp == "") {
					echo "\n**** Pagename not specified ****" . $ptemplate . "\n\n";
					$noname += 1;
					$new_template = str_replace ("||","|",$ptemplate);
					if ($new_template !== $ptemplate) {
					    	$pcontents = str_replace($ptemplate,$new_template,$pcontents);
					    	if ($pcontents == "") {
					    	    echo "\n??Problem removing redundant pipe in merge template\n";
					    	}
					    	else if ($objwiki->nobots($transcludes[$i],botuser,$pcontents) == true) {
					    	    echo "\nRemoving redundant pipe in merge template\n";
					    	    $objwiki->edit($transcludes[$i],$pcontents,"Remove redundant pipe in merge template",true,true);
					    	}
					}
				}
				else if (preg_match("/^(Wiktionary|Wikt):/i",$otherpages[$ii])) {
					echo "\n*** Wiktionary merge: " . $otherpages[$ii] . " ***\n\n";
					$wikt += 1;
					$otherpage[$key] = preg_replace("/nspace=/", "nspace=wikt", $otherpage[$key]);
				}
				else {
				    while ($pagecontents == "") {
				        if ($break == 5) {
				            echo "\n*** " . $pagename[$key] . ": PAGE " . $otherpages[$ii] . " IS BLANK OR DOES NOT EXIST ***\n\n";
				            $blanks[$blank] = $pagename[$key] . ":: " . $otherpages[$ii];	
				            unset($pagecontents);
				            $blank += 1;
				            break;
				        }
				        else {
				            if (preg_match("/^((User|Wikipedia|File|MediaWiki|Template|Help|Category|Portal|Draft)(( |_)talk)?|Talk):/", $otherpages[$ii])
				                and $break == 0) {
				            	    echo "\n\n? Other namespace: " . $otherpages[$ii] . "\n\n";
				            	    $others[$othernamespace] = $otherpages[$ii];
				            	    $othernamespace += 1;
				            }
				            echo "getpage 2: $otherpages[$ii]|";
				            $pagecontents = $objwiki->getpage($otherpages[$ii]);
				            if (preg_match_all("/\{{2}\s?(merge|afd-merge|merging|move section)[^}]*\}{2}/i", $pagecontents, $raw2) == 0 and $break == 0) {
				                echo "*** Merge tag not found on " . $otherpages[0] . " *2*\n";
				                $no_reciprocal += 1;
				            }
				            $cachepage = $otherpages[$ii];
				            if (isset($pagecontents)) $cachecontents = $pagecontents;
					    else $cachecontents = "";
				            $break += 1;
				        }
				    }

				    if (isset($pagecontents) and preg_match("/^\#REDIRECT(\s*|:)\[{2}.*\]{2}/i", $pagecontents, $redirect)) {
				        echo "\n*** " . $pagename[$key]. ": PAGE " . $otherpages[$ii] . " IS A REDIRECT!! ***\n";
				        echo $pagecontents . "\n\n";
				        $redirects += 1;
				        preg_match("/(?<=\[{2}).+(?=(\]{2}))/i", $redirect[0], $target);
				        echo "Target: " . $target[0] . "\n";
				        $target[0] = ucfirst($target[0]);
				        $target[0] = str_replace ("_"," ",$target[0]);
				        $target[0] = trim($target[0]);

				        if (strpos($target[0],"#") !== false) {
				            $len = strpos($target[0],"#");
				            if ($len == 0) $targetpage = $target[0];
				            else $targetpage = substr($target[0],0,$len); // strip section links
				        }
				        else $targetpage = $target[0];

				        if ($targetpage == $pagename[$key]) {
				            echo $otherpages[$ii] . " redirects to " . $target[0] . " -- may have been merged\n\n";
				            $maybes[$maybe] = $pagename[$key] . ":: " . $otherpages[$ii];
				            $maybe +=1;
				        }
				        else if (strtoupper($otherpages[$ii]) == strtoupper($target[0])) {
				            echo "Case difference\n";
				            $diffcases[$diffcase] =  $pagename[$key] . ":: " . $otherpages[$ii] . " vs. " . $target[0];
				            $diffcase += 1;
				            $pos = strpos($ptemplate, $otherpages[$ii]);
				            if ($pos !== false) {
				                $new_template = substr_replace($ptemplate, $target[0], $pos, strlen($otherpages[$ii]));
				                $pcontents = str_replace($ptemplate,$new_template,$pcontents);
				                if ($pcontents == "") {
				                    echo "\n??Problem bypassing redirect in merge template – DIFFCAPS\n";
					    	}
				                else if ($objwiki->nobots($transcludes[$i],botuser,$pcontents) == true) {
				                    echo "\nBypassing redirect in merge template – DIFFCAPS\n";
				                    $objwiki->edit($transcludes[$i],$pcontents,"Bypass redirect in merge template – DIFFCAPS",true,true);
				                }
				            }
				        }
				        else {
				            echo "getpage 4: $targetpage|";
				            $pagecontents = $objwiki->getpage($targetpage);
				            if (preg_match_all("/\{{2}\s?(merge|afd-merge|merging|move section)[^}]*\}{2}/i", $pagecontents, $raw4) == 0) {
				                echo "*** Merge tag not found on target page " . $targetpage. " *4*\n";
				                $redir_no_reciprocals[$redir_no_reciprocal] = $pagename[$key] . ":: " . $otherpages[$ii];
				                $redir_no_reciprocal += 1;
				            }
				            else {
				                echo "*** Merge tag found on target page " . $targetpage. " *4* " . $raw4[0][0] . "\n";
				                $pos = stripos($raw4[0][0],$pagename[$key]);
				                if ($pos === false) {
				                    echo " ** " . $pagename[$key] . " not found!\n";
				                    $other_redirects[$other_redirect] = $pagename[$key] . ":: " . $otherpages[$ii];
				                    $other_redirect += 1;
				                }
				                else {
				                    echo " ** found " . $pagename[$key] . "\n";
				                    $pages_moved[$page_moved] = $pagename[$key] . ":: " . $otherpages[$ii];
				                    $page_moved += 1;
				                    $pos = strpos($ptemplate, $otherpages[$ii]);
				                    if ($pos !== false) {
				                        $new_template = substr_replace($ptemplate, $target[0], $pos, strlen($otherpages[$ii]));
				                        $pcontents = str_replace($ptemplate,$new_template,$pcontents);
				                        echo "\n$pcontents\n";
				                        if ($pcontents == "") {
				                            echo "\n??Problem bypassing redirect in merge template – apparently " . $otherpages[$ii] .
				                                " moved to " . $target[0] . "\n";
				                        }
				                        else if ($objwiki->nobots($transcludes[$i],botuser,$pcontents) == true) {
				                            echo "\nBypassing redirect in merge template – apparently " . $otherpages[$ii] . " moved to " . $target[0] . "\n";
				                            $objwiki->edit($transcludes[$i],$pcontents,"Bypass redirect in merge template – apparently " .
				                                $otherpages[$ii] . " moved to " . $target[0],true,true);
				                        }
				                    }
				                }
				            }
				        }
				    }
				}
			}

			if ($otherpage[$key] == "{{pagelist|nspace=|}}") {
				$nopartners[$nopartner] = $transcludes[$i];
				$nopartner += 1;
				if ($templatesplit[0] == "mergeto") $type[$key] = "to ?";
			}
			else if (substr($otherpage[$key],0,22) == "{{pagelist|nspace=wikt") {
				#echo "\nwikt:\n";
			}
			else if ($templatesplit[0] == "mergeto") {
				$break = 0;
				$pagecontents = "";

				while ($pagecontents == "") {
					if ($break == 5) {
						echo "\n*** " . $pagename[$key] . ": PAGE " . $otherpages[0] . " is BLANK or DOES NOT EXIST ***\n\n";
						unset($pagecontents);
						break;
					}
					else {
						if ($otherpages[0] == $cachepage) {
							echo "getpage 3: $otherpages[0]|from cache\n";
							$pagecontents = $cachecontents;
						}
						else {
							echo "getpage 3: $otherpages[0]|";
							$pagecontents = $objwiki->getpage($otherpages[0]);
							if (preg_match_all("/\{{2}\s?(merge|afd-merge|merging|move section)[^}]*\}{2}/i", $pagecontents, $raw3) == 0) {
								echo "*** Merge tag not found on " . $otherpages[0]. " *3*\n";
								$no_reciprocal += 1;
							}
						}
						$break += 1;
					}
				}

				if (isset($pagecontents) and preg_match_all("/\{{2}\s?(merge|afd-merge|merging|move section)[^}]*\}{2}/i", $pagecontents, $raw) !== 0) {
					$reciprocal = FALSE;
					for ($jraw = 0; $jraw < count($raw[0]); $jraw++) {
						echo "(" . $jraw . ") " . $raw[0][$jraw];
						$pos = stripos($raw[0][$jraw],$pagename[$key]);
						if ($pos === false) {
							echo " ** " . $pagename[$key] . " not found!";
						}
						else {
							echo " ** found " . $pagename[$key];
							$reciprocal_template = templateprocess($raw[0][$jraw]);
							echo "\n§ " . $reciprocal_template . " § ";
							$reciprocal_templatesplit = array_map('trim',explode("|", $reciprocal_template));
							echo $reciprocal_templatesplit[0];
							switch ($reciprocal_templatesplit[0]) {
								case "merge":
									echo "\n% Reciprocal direction not specified\n";
									$no_directions[$no_direction] = $pagename[$key] . " ==> " . $otherpages[0];
									$no_direction += 1;
								case "mergefrom":
								case "false-positive":
									$reciprocal = TRUE;
									break;
								case "mergeto":
									echo "\n!! Conflicting tags !!\n";
									$conflicts[$conflict] = $pagename[$key] . " <===> " . $otherpages[0];
									$conflict += 1;
									break;
								default:
									echo "\n!! Unexpected: " . $templatesplit[0];
							}
						}
					}
					if ($reciprocal == FALSE) {
						echo "\n*** Reciprocal merge tag not found on " . $otherpages[0]. " ***\n";
						$no_reciprocal += 1;
					}
					else {
						echo "\n";
						echo "mergeto target: " . $otherpage[$key] . " ◆ " . $otherpages[0];
						echo " [unset: " . $pagename[$key] . "]\n";
						unset($pagename[$key]);
						unset($type[$key]);
						$takeofflater += 1;
						continue;
					}
				}
			}

			if (!array_key_exists($key, $discuss)) { // ($discuss[$key] == "")
				if (preg_match("/^(User|Wikipedia|Image|File|MediaWiki|Template|Help|Category|Portal):/i",$transcludes[$i],$m)) {
					$discuss[$key] = str_replace($m[1],$m[1].' talk',$transcludes[$i]);
				}
				else {
					$discuss[$key] = "Talk:" . $transcludes[$i];
				}
			}
		}
	}

	$j = $j - $takeofflater;

	if (count($transcludes) > 0) {
		$mainsubmission .= "* [[Wikipedia:Proposed mergers/Log/" . $monthyear . "|" . $monthyear . "]]\n";
	}
	else {
		echo "\n*** Category is empty ***\n\n";
	}
}

if (count($pagename) < 1) {
	echo "No pagenames! Exiting.";
	die();
}

echo "\n*** Preparing Updates ***\n\n";
print_r($pagename);

foreach ($pagename as $key => $title) {
	if (array_key_exists($date[$key], $counter) and $counter[$date[$key]] > $maxcounter) {
		$maxcounter = $counter[$date[$key]];
	}
	if (!array_key_exists($date[$key], $submission)) $submission[$date[$key]] = "";
	if (!array_key_exists($key, $reason)) $reason[$key] = "";

	switch ($type[$key]) {
		case "with":  // regular merge
			if (array_key_exists($key, $target)) { // ($target[$key] != "")
				$submission[$date[$key]] .=
					"{{merge log entry|1=[[$title]]|2=$otherpage[$key]|3=[[$target[$key]]]|talk=$discuss[$key]|type=with|reason=$reason[$key]}}\n";
			}
			else {
				$submission[$date[$key]] .= "{{merge log entry|1=[[$title]]|2=$otherpage[$key]|talk=$discuss[$key]|type=with|reason=$reason[$key]}}\n";
			}
			break;
		case "into":  // merge-from
			$submission[$date[$key]] .= "{{merge log entry|1=$otherpage[$key]|2=[[$title]]|talk=$discuss[$key]|type=into|reason=$reason[$key]}}\n";
			break;
		case "to":  // merge-to
			$submission[$date[$key]] .= "{{merge log entry|1=[[$title]]|2=$otherpage[$key]|talk=$discuss[$key]|type=into|reason=$reason[$key]}}\n";
			break;
		case "to ?":  // no partner
			$submission[$date[$key]] .= "{{merge log entry|1=[[$title]]|2=?|talk=$discuss[$key]|type=into|reason=$reason[$key]}}\n";
			break;
		default:
			echo "\n*error* " . $type[$key] . "\n";
			break; // use "continue 2"?
	}

	if (array_key_exists($date[$key], $counter)) $counter[$date[$key]] += 1;
	else $counter[$date[$key]] = 1;
	echo $date[$key] . " | " . $counter[$date[$key]] . ") " . $key . " ++ " . $title. "\n";
}

echo "\n\n*** Posting Updates ***\n\n";

foreach ($submission as $log => $content) {
	if ($log != "") {
		echo "Updating> " . $log. "\n";
		#echo $content . "\n";
		$objwiki->edit("Wikipedia:Proposed mergers/Log/" . $log,$content,"Updating list of proposed mergers",false,true);
	}
	else echo "\n? Error, null log specification: " . $content . "\n\n";
}

echo "Updating Wikipedia:Proposed mergers/Log\n";
$objwiki->edit("Wikipedia:Proposed mergers/Log",$mainsubmission,"Updating list of logs",true,true);
echo "done.\n";

echo "\nCategory members skipped: " . $skipped;
echo "\nMaximum pages in a category: " . $maxi;
echo "\nMaximum items on a report page: " . $maxcounter;
echo "\nOther namespaces skipped: " . $othernamespace . "\n";
if (count($others) > 0) print_r($others);
echo "\nPattern match failed: " . $matchfailed . "\n";
if (count($nomatches) > 0) print_r($nomatches);
echo "\nTemplatesplit failed: " . $templatesplitfailed . "\n";
if (count($nosplits) > 0) print_r($nosplits);
echo "\nNo partner: " . $nopartner . "\n";
if ($nopartner > 0) print_r($nopartners);
echo "\nReciprocal direction not specified: " . $no_direction . "\n";
if ($no_direction > 0) print_r($no_directions);
echo "\nConflicting tags: " . $conflict . "\n";
if ($conflict > 0) print_r($conflicts);
echo "\nPages with multiple proposal dates: " . $mismatched_date . "\n";
if ($mismatched_date > 0) print_r($mismatched_dates);
echo "\nPages where reasons are given in the template: " . $reason_count . "\n";
if ($reason_count > 0) print_r($reasons);
echo "\nOther pages which are blank or don't exist: " . $blank . "\n";
if ($blank > 0) print_r($blanks);
echo "\nOther pages which are redirects: " . $redirects;
echo "\n  Maybe merged: " . $maybe . "\n";
if ($maybe > 0) print_r($maybes);
echo "\n  Cases differ: " . $diffcase . "\n";
if ($diffcase > 0) print_r($diffcases);
echo "\n  Pages moved: " . $page_moved . "\n";
if ($page_moved > 0) print_r($pages_moved);
echo "\n  Other redirects: " . $other_redirect . "\n";
if ($other_redirect > 0) print_r($other_redirects);
echo "\n  Redirect with no reciprocal tags: " . $redir_no_reciprocal . "\n";
if (count($redir_no_reciprocals) > 0) print_r($redir_no_reciprocals);
echo "\nMerge-to targets without reciprocal merge tags: " . $no_reciprocal . "\n";
echo "\nSelf-merges: " . $selfmerge . "\n";
echo "\nSpecified |target is the page itself: " . $targetself . "\n";
echo "\nNo name specified: " . $noname . "\n";
echo "\nWiktionary merges: " . $wikt . "\n";
echo "\nMission accomplished.\n\n";

Related Articles

Wikiwand AI