User:Keller999/projects/gamepageupdate

From Dolphin Emulator Wiki
< User:Keller999
Revision as of 06:46, 20 August 2011 by Keller999 (talk | contribs) (Script update -- version 1.01 (see Version History))
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.

Version History

1.0

  • Initial release

1.01

  • Image is now always parsed, and will set the size based on platforms detected. Defaults to Wii (300px)
  • If no Wikipedia Infobox is supplied, re-use the one from the Dolphin wiki page
  • If no Infobox is supplied at all, generate a generic one
  • Better supports not providing information (for example, if you don't supply a Wikipedia entry, the description from the Dolphin page will be reused)
  • Added shortcut to just generate a generic template
#!/usr/bin/perl

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

$imageSize = 300; # Assuming Wii by default

my ($image, $savedSizeLine);

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

print "*********************************\n";
print "* Dolphin Wiki Page Update v1.01 *\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.  Zero input is fine.  Enter \'-1\' to indicate the end, or -2 to just get a blank template.\n\n";

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

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

if ($line eq "-2") {
	$line = "-1";
} else {
	$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.  Zero 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#
#############################

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

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

	if    ($newLine =~ /^\{\{\ *Infobox.*/i) { $currentSection = "infobox"; $foundDolphinInfobox = 1; }	
	elsif ($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 "infobox") {
		if ($newLine =~ /^\{\{\ *Infobox.*/i) {   # This is the start of the Infobox, ignore
			# ignore
		} elsif ($newLine =~ /^\}\}$/) {   # This is the end of the Infobox, change section and ignore
			$currentSection = "description";
		} else {   # We want to keep anything else in the infobox.  This is in case the user didn't give us a wikipedia article to generate a new one from
			push (@infoboxSection, $newLine);

			# Now we save the image filename and size to be added onto wikipedia's infobox, if its provided
			if ($newLine =~ /^\|\ *image\ *=\ *.+/gi) {
				$image = $newLine;
				# just keep the filename, and format 
				$image =~ s/\|image\ *\=\ *\[\[(?:File|Image)\ *\:\ *(.*?)(?:\||\]).*/$1/i; #
			} elsif ($newLine =~ /^\|\ *size\ *=\ *.+/gi) {
				$savedSizeLine = $newLine; # saved for later
			}
		}
	} elsif ($currentSection eq "description") {
		# We're pretty much going to assume that if it's in this section, we want to keep it all as-is
		push (@descriptionSection, $newLine);
	} 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 . "\}\}");
		}
	}	
}




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

$foundWikipediaInfobox = 0;
$insideInfobox = 0;

my @autoCategory;

system('clear');

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

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

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

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

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

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

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

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

	#Purge un-used parameters
	if ($insideInfobox) {
		#Replace whatever title Wikipedia is using with our own
		if ($newLine =~ /^\|\ *title\ *=\ *.+/gi) {
			$newLine = '|title = {{SUBPAGENAME}}';
		}

		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|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/\{\{vgy\|([0-9]{4})\}\}/$1/gi; # we don't do Template:vgy, removing
		$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) {
			if (@autoCategory eq 0) {
				push (@autoCategory, '<!-- Categories below this line were automatically generated -->');
			}
			$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) {
			if (@autoCategory eq 0) {
				push (@autoCategory, '<!-- Categories below this line were automatically generated -->');
			}
			$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 ($image ne "") { # Saved image line
			push (@finalResult, '|image = [[File:' . $image . '|' . $imageSize . 'px]]'); 
		} elsif ($image eq "") {
			push (@finalResult, '|image = [[File:{{SUBPAGENAME}}.png|' . $imageSize . 'px]]');
		}

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

	if (($foundWikipediaInfobox 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.

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

#INFOBOX PROCESSING
if (($foundWikipediaInfobox eq 1) and ($foundDolphinInfobox eq 1)) {
	# If a Wikipedia Infobox was received, it was already pushed into @finalResult.
	# TODO: Wikipedia parsing should push into its own array, which is then added in this section
} elsif (($foundWikipediaInfobox eq 0) and ($foundDolphinInfobox eq 1)) {  # We didn't get a Wikipedia Infobox, so use the one from Dolphin
	push (@finalResult, '{{Infobox VG');
	push (@finalResult, @infoboxSection);
	push (@finalResult, '}}');	
} elsif (($foundWikipediaInfobox eq 0) and ($foundDolphinInfobox eq 0)) { # We didn't get ANY infoboxes, create a generic one
	push (@finalResult, '{{Infobox VG');
	push (@finalResult, '|title = {{SUBPAGENAME}}');
	push (@finalResult, '|image = [[File:{{SUBPAGENAME}}.png|');
	push (@finalResult, '}}');	
}

#DESCRIPTION PROCESSING
if ((@descriptionSection) and ($foundWikipediaInfobox eq 0)) {   # Only re-use the original description if there was one and we didn't get Wikipedia data
	push (@finalResult, "\n");
	push (@finalResult, @descriptionSection);
}

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

print "\n\n";