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.
#!/usr/bin/perl my (@wikipedia, @originalPage); my (@problemSection, @configurationSection, @versionCompatSection, @testingSection, @videoSection, @categorySection); my @finalResult; 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; 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.*/gi) { $newLine =~ s/^\{\{\ *Infobox.*/\{\{Infobox\ VG/gi; $foundInfobox = 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 ($newLine =~ /^\|/) { #If there was already an image listed in the original page, keep it if ($newLine =~ /^\|\ *image\ *=\ *.+/gi) { $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 "")) { push (@finalResult, $savedImageLine); } # Saved image line, if wikipedia doesn't have one push (@finalResult, $newLine); push (@finalResult, " "); $skip = 1; } 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|3891|****}}-->'); 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"; }