User:Keller999/projects/gamepageupdate

From Dolphin Emulator Wiki
< User:Keller999
Revision as of 16:43, 18 August 2011 by Kolano (talk | contribs) (Revise Version Compatibility suggestion to show more recent rev (i.e. post 3.0), since pre 2.0 entries may be hidden.)
Jump to navigation Jump to search

I am working on doing several things for all existing game pages:

  • If it's not already in place, copy/paste a cleaned-up Infobox from Wikipedia into the game page
  • Update templates to use the most recent versions, rather than redirected versions
  • Ensure that all sections that need user updates have a template to copy-paste, or a link to further documentation
  • Update pages to conform to the standard game page -- Problems, Configuration, Version Compatibility, Testing, Gameplay Videos
  • Remove existing non-used config variables if they are present in the page

Scripts

Hooray for programming mini-project! I put together a script that takes the Infobox and summary from Wikipedia, then the existing Dolphin Wiki article, and creates a standards-compliant merge of the two. For an example of what this script does, please see Call of Duty: Black Ops/sandbox. Revision 23655 is before, Revision 23677 is after. I did NOT do any additional touchup between these revs, as I wanted to show exactly what the script was doing.

I have updated the page to match what I believe to be current standard. I intend to start running this script for many pages starting tomorrow evening, so PLEASE review the newest revision of Call of Duty: Black Ops/sandbox to ensure that I'm not missing anything! I would hate to do a bunch of mass changes and then have to go repair them all.

Also, expect this script to have a bug or two until I can get it working and find out the issues with it.

Let me know your thoughts!

--Keller999 13:15, 18 August 2011 (CEST)

dolphinpageupdate.pl

Runs great on my Linux box, uses no special modules. I know for a fact that system('clear') does NOT work in Windows, but you could probably replace it with system('cls') and get the same effect.

#!/usr/bin/perl

my (@wikipedia, @originalPage);
my (@problemSection, @configurationSection, @versionCompatSection, @testingSection, @videoSection, @categorySection);
my @finalResult;

$imageSize = 300;

my ($savedImageLine, $savedSizeLine);

#######
#INPUT#
#######
system('clear');

print "*********************************\n";
print "* Dolphin Wiki Page Update v1.0 *\n";
print "*********************************\n\n";

print "First, copy and paste the game's Wikipedia article from the top to wherever you'd like to end the new description.  Enter \'-1\' to indicate the end.\n\n";

# Wikipedia input
while ($line ne "-1") {
        $line = <STDIN>;
        chomp($line);

        if (($line ne "-1") and ($line ne "")) {
                push (@wikipedia,$line);
        }
}

$line = "";

system('clear');

print "*********************************\n";
print "* Dolphin Wiki Page Update v1.0 *\n";
print "*********************************\n\n";

print "Now, copy and paste the existing Dolphin wiki article to import existing information.  No input is fine.  Enter \'-1\' to indicate the end.\n\n";

# Dolphin page input
while ($line ne "-1") {
        $line = <STDIN>;
        chomp($line);

        if (($line ne "-1") and ($line ne "")) {
                push (@originalArticle,$line);
        }
}

#############################
#EXISTING ARTICLE PROCESSING#
#############################

# (@problemSection, @configurationSection, @versionCompatSection, @testingSection, @videoSection, @categorySection);
$currentSection = "none";

foreach (@originalArticle) {
	$newLine = $_;
	$checkLine = $_;

	if ($newLine =~ /^\ *\={1,4}\ *Problems\ *\=*$/i) { $currentSection = "problems"; }
	elsif ($newLine =~ /^\ *\={1,4}\ *Configuration\ *\=*$/i) { $currentSection = "configuration"; }
	elsif ($newLine =~ /^\ *\={1,4}\ *Version Compatibility\ *\=*$/i) { $currentSection = "versionCompat"; }
	elsif ($newLine =~ /^\ *\={1,4}\ *Testing\ *\=*$/i) { $currentSection = "testing"; }
	elsif ($newLine =~ /^\ *\={1,4}\ *.*Videos\ *\=*$/i) { $currentSection = "videos"; }
	elsif ($newLine =~ /^\ *\[\[Category\:.*\]\]$/i) { $currentSection = "categories"; }
	elsif ($newLine =~ /^\ *\{\{Navigation\ .*\}\}$/i) { $currentSection = "categories"; }

	if ($currentSection eq "none") {
		# Information is outside of the defined sections, and is purged.  Infobox/summary will be re-generated from Wikipedia
		# The ONLY two exceptions are the image (which we prefer over the Wikipedia image name) and the size
		if ($newLine =~ /^\|\ *image\ *=\ *.+/gi) {
			$savedImageLine = $newLine; # saved for later
		} elsif ($newLine =~ /^\|\ *size\ *=\ *.+/gi) {
			$savedSizeLine = $newLine; # saved for later
		}
	} elsif ($currentSection eq "problems") {
		if ($newLine =~ /^\ *\={1,4}\ *Problems\ *\=*$/i) {   # Matches the section heading, ignore
			# ignore
		} elsif ($newLine =~ /^\ *\={1,4}\ *(.*?)\ *\=*\ *$/gm) {   # This is a sub-heading.  Reformat it
			push (@problemSection, "\=\=\= $1 \=\=\=");
		} else {   # This is something else in the problem section, like user input.  Keep it
			push (@problemSection, $newLine);
		}
	} elsif ($currentSection eq "configuration") {
		if ($newLine =~ /\|\ *.*\=\ *\S+.*$/gi) {   # This is a config entry that has been filled out
			push (@configurationSection, $newLine);
		} # Anything besides filled-out config params are not needed, the rest will be regenerated
	} elsif ($currentSection eq "versionCompat") {
		if ($newLine =~ /^\{\{VersionCompatibilityVersion\|.+\|.+\}\}$/gi) {   # Version compat report that's been filled out
			push (@versionCompatSection, $newLine);
		} # Anything besides filled-out compat reports are not needed, the rest will be regenerated
	} elsif ($currentSection eq "testing") {
		if ($newLine =~ /^\{\{.+?\|revision\=(.*?)\|os\=(.*?)\|cpu\=(.*?)\|gpu\=(.*?)\|result\=(.*?)\|tester\=(.*?)\}\}/i) {
			# Matches test reports with all variables set (tester is optional) and dissects for reassembly (muahahaha!)
			$testResult = "\{\{testing\/entry\|revision\=$1\|OS\=$2\|CPU\=$3\|GPU\=$4\|result\=$5\|tester\=$6\}\}";
			push (@testingSection, $testResult);
		}
	} elsif ($currentSection eq "videos") {
		if ($newLine =~ /^\ *\={1,4}\ *.*Videos\ *\=*$/i) {   # Matches the section heading, ignore
			# ignore
		} else {   # Keep everything else
			push (@videoSection, $newLine);
		}
	} elsif ($currentSection eq "categories") {   # We keep all existing categories, and add some new auto-generated ones!
		if ($newLine =~ /^\[\[Category\:\ *(.*)\ *\]\]/i) {   # This is a category entry
			push (@categorySection, "\[\[Category:" . $1 . "\]\]");
		} elsif ($newLine =~ /^\{\{Navigation\ *(.*)\ *\}\}/i) {   # This is a navigation entry
			push (@categorySection, "\{\{Navigation " . $1 . "\}\}");
		}
	}	
}




######################
#WIKIPEDIA PROCESSING#
######################

$foundInfobox = 0;
$foundImage = 0;
$insideInfobox = 0;

my @autoCategory;

push (@autoCategory, '<!-- Categories below this line were automatically generated -->');

system('clear');

foreach (@wikipedia) {
	$newLine = $_;

	$platforms  = "\|platforms \= ";
	$platformAltered = 0;
	$skip = 0;
	$skipUnWiki = 0;

	if ($newLine =~ /^\{\{\ *Infobox.*/i) {
		push (@finalResult, '{{Infobox VG');
		$foundInfobox = 1;
		$insideInfobox = 1;
		$skip = 1;
		
	}

	#Platforms
	if ($newLine =~ /\|\ *platforms/gi) {
		#Wii
		if ($newLine =~ /.*Wii.*/i) {
			$platforms .= '[[Wii]] ';
			push (@autoCategory, "[[Category:Wii games]]");
			$platformAltered = 1;
		}			

		#GameCube
                if ($newLine =~ /GameCube/i) {
			$platforms .= '[[GameCube]] ';
			push (@autoCategory, "[[Category:GameCube games]]");
			$platformAltered = 1;
	       	 }	

		#WiiWare
                if ($newLine =~ /WiiWare/i) {
       	        	$platforms .= '[[WiiWare]] ';
			push (@autoCategory, "[[Category:WiiWare games]]");
			$platformAltered = 1;
       	 	}

		#TriForce
                if ($newLine =~ /TriForce/i) {
               		$platforms .= '[[Triforce]] ';
			push (@autoCategory, "[[Category:Triforce games]]");
			$platformAltered = 1;
        	}

		push (@finalResult,$platforms);
		$skip = 1;
		$skipUnWiki = 1;
	}

	#Purge un-used parameters
	if ($insideInfobox) {
	
		#If there was already an image listed in the original page, keep it
		if (($newLine =~ /^\|\ *image\ *=\ *.+/gi) and ($savedImageLine ne "")) {
			$foundImage = 1;
			$skipUnWiki = 1;
			$newLine = $savedImageLine;		
		}

		if ($newLine =~ /^\|\ *(title|developer|publisher|distributor|director|producer|designer|programmer|artist|composer|license|series|engine|resolution|released|genre|mode|ratings|input|size|fps|dspcode|dtkadpcm|channeltype|image|mode|modes)\ *=\ *.+/gi) {
			$skip = 0;
		} else {
			$skip = 1;
		}
	}

	#Un-wiki-fy everything
        if ($skipUnWiki eq 0) {
		$newLine =~ s/\<ref.+?\/.{0,3}\>//gi; # remove citations references
		$newLine =~ s/\{\{cite.*?\}\}//gi; # remove references
		$newLine =~ s/\[\[(([.]|[^\|])+?)\]\]/$1/g; # un-wiki-fy wiki links in the format [[link]]
                $newLine =~ s/\[\[.+?\|(.+?)\]\]/$1/g; # un-wiki-fy wiki links in the format [[link|name]]
        }

	#Set genre categories
	if ($newLine =~ /^\|\ *genre/ ne "") {
		$genreLine = $newLine;
		$genreLine =~ s/^\|\ *genre\ *\=\ *//i;
		@genres = split (/\,|\<br.*?\>/,$genreLine);
		foreach (@genres) {
			$line = $_;
			$line =~ s/^\ *//;
			$line =~ s/\ +$//;
			push (@autoCategory, "\[\[Category:" . $line . " games\]\]");
		}
	}
	
	#Set mode categories
	if ($newLine =~ /^\|\ *mode/ ne "") {
		$modeLine = $newLine;
		$modeLine =~ s/^\|\ *modes{0,1}\ *\=\ *//i;
		@modes = split (/\,|\<br.*?\>/,$modeLine);
		foreach (@modes) {
			$line = $_;
			$line =~ s/^\ *//;
			$line =~ s/\ +$//;
			push (@autoCategory, "\[\[Category:" . $line . " games\]\]");
		}
	}		

	#New-line if this is the end of the Infobox
	if ($newLine =~ /^\}\}$/) {
		if ($savedSizeLine ne "") { push (@finalResult, $savedSizeLine); }  # Saved size
		if (($foundImage eq 0) and ($savedImageLine ne "")) { # Saved image line, if wikipedia doesn't have one
			push (@finalResult, $savedImageLine); 
		} elsif (($foundImage eq 0) and ($savedImageLine eq "")) {
			push (@finalResult, '|image = [[File:{{SUBPAGENAME}}.png|' . $imageSize . 'px]]');
		}


		push (@finalResult, $newLine);
		push (@finalResult, " ");
		$skip = 1;
		$insideInfobox = 0;
	}

	if (($foundInfobox eq 1) and ($skip eq 0)) {
		push (@finalResult,$newLine);
	}
}

######################
#COMPILE FINAL RESULT#
######################

# At this point, the Infobox and the summary are in place.  Now, time to add our checked and re-formatted content sections.

# Need to combine our categories and make sure there are no duplicates
foreach (@autoCategory) {
	$fullCat = $_;
	my $shortCat;
	$dupe = 0;

	if (($fullCat =~ /^\[\[Category\:\ *(.*)\ *\]\]/i) or ($fullCat =~ /^\{\{Navigation\ *(.*)\ *\}\}/i)) {
		$shortCat = $1;
	}

	foreach (@categorySection) {
		$compareCatLong = $_;
		my $compareCatShort;

		if (($compareCatLong =~ /^\[\[Category\:\ *(.*)\ *\]\]/i) or ($compareCatLong =~ /^\{\{Navigation\ *(.*)\ *\}\}/i)) {
			$compareCatShort = $1;
		}

		if ($compareCatShort eq $shortCat) {
			$dupe = 1;
		}		
	}

	if ($dupe eq 0) {
		push (@categorySection, $_);
	}	
}

# Problem Section
push (@finalResult, "\n\=\= Problems \=\=");
push (@finalResult, @problemSection);

push (@finalResult, "\n\=\= Configuration \=\=");
push (@finalResult, '<!--A full list of options is available at Template:Config/doc-->');
push (@finalResult, "\{\{Config");
push (@finalResult, @configurationSection);
push (@finalResult, "\}\}");

push (@finalResult, "\n\=\= Version Compatibility \=\=");
push (@finalResult, "\{\{VersionCompatibility\}\}");
push (@finalResult, '<!--Use this template for compatibility entries: {{VersionCompatibilityVersion|7617|****}}-->');
push (@finalResult, @versionCompatSection);
push (@finalResult, "\{\{VersionCompatibilityClose\}\}");

push (@finalResult, "\n\=\= Testing \=\=");
push (@finalResult, "\{\{testing\/start\}\}");
push (@finalResult, '<!--Use this template for test entries: {{Test Entry|revision=|OS=|CPU=|GPU=|result=|tester=}}-->');
push (@finalResult, @testingSection);
push (@finalResult, "\{\{testing\/end\}\}");

push (@finalResult, "\n\=\= Gameplay Videos \=\=");
push (@finalResult, @videoSection);

push (@finalResult, "\n");
push (@finalResult, @categorySection);


##############
#FINAL OUTPUT#
##############

system ('clear');

print "****************\n";
print "* FINAL OUTPUT *\n";
print "****************\n";

foreach (@finalResult) {
	print $_ . "\n";
}