User:Keller999/projects/gamepageupdate

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.
 * 1) !/usr/bin/perl

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

$imageSize = 300;

my ($savedImageLine, $savedSizeLine);

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

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";

while ($line ne "-1") { $line = ; chomp($line);
 * 1) Wikipedia input

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";

while ($line ne "-1") { $line = ; chomp($line);
 * 1) Dolphin page input

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


 * 1) EXISTING ARTICLE PROCESSING#
 * 1) EXISTING ARTICLE PROCESSING#

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

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\|\s*(.+)\s*\|\s*(.+)\s*(\|\s*(.+)\s*)?\}\}$/gi) {  # Version compat report that's been filled out $versionCompatEntry = "\{\{VersionCompatibilityVersion\|$1\|$2".(($3)?"\|$3":"")."\}\}"; push (@versionCompatSection, $versionCompatEntry); } # Anything besides filled-out compat reports are not needed, the rest will be regenerated } elsif ($currentSection eq "testing") { if ($newLine =~ /^\{\{.+?\|revision\=\s*(.*?)\s*\|os\=\s*(.*?)\s*\|cpu\=\s*(.*?)\s*\|gpu\=\s*(.*?)\s*\|result\=\s*(.*?)\s*(\|tester\=\s*(.*?)\s*)?\}\}/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)?"$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 . "\}\}"); }	}	}


 * 1) WIKIPEDIA PROCESSING#
 * 1) WIKIPEDIA PROCESSING#

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

my @autoCategory;

push (@autoCategory, '');

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, ""); $platformAltered = 1; }

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

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

#TriForce if ($newLine =~ /TriForce/i) { $platforms .= 'Triforce '; push (@autoCategory, ""); $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/\//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 name }

#Set genre categories if ($newLine =~ /^\|\ *genre/ ne "") { $genreLine = $newLine; $genreLine =~ s/^\|\ *genre\ *\=\ *//i; @genres = split (/\,|\/,$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 (/\,|\/,$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 = '); }

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

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


 * 1) COMPILE FINAL RESULT#
 * 1) COMPILE FINAL RESULT#


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

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

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, $_); }	}

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

push (@finalResult, "\n\=\= Configuration \=\="); push (@finalResult, ''); push (@finalResult, "\{\{Config"); push (@finalResult, @configurationSection); push (@finalResult, "\}\}");

push (@finalResult, "\n\=\= Version Compatibility \=\="); push (@finalResult, "\{\{VersionCompatibility\}\}"); push (@finalResult, ''); push (@finalResult, @versionCompatSection); push (@finalResult, "\{\{VersionCompatibilityClose\}\}");

push (@finalResult, "\n\=\= Testing \=\="); push (@finalResult, "\{\{testing\/start\}\}"); push (@finalResult, ''); push (@finalResult, @testingSection); push (@finalResult, "\{\{testing\/end\}\}");

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

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


 * 1) FINAL OUTPUT#
 * 1) FINAL OUTPUT#

system ('clear');

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

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