User:Cedars/inote.pl

From Wikipedia, the free encyclopedia

The following Perl script is a hack for converting Wikipedia citations from the inote convention to the ref/note convention. The result is fed to standard output. The script handles both single-argument and double-argument inote tags. The scripts' work is quite obvious as citations are systematically labelled AR1, AR2 and so on unless a second argument is provided for the inote tag. Both inote tags and inote-explain tags should be completely removed from the output. The script is designed to assist the human editing of Wikipedia articles, not replace it. Please feel free to make changes to this page if you feel they would improve the script. If you have comments on the script please feel free to post them on the talk page.

#! /usr/bin/perl -w

# inote.pl
#
# Converts Wikipedia citations from the inote convention to the ref/note convention.
# Result is fed to standard output.
#
# Public Domain 2005

# Check that our arguments make sense, otherwise print usage
if ($#ARGV != 0 || !($ARGV[0] && -f $ARGV[0])) {
	print "\ninote.pl\n\n";
	print "Converts Wikipedia citations from the inote convention to the ref/note\nconvention. ";
	print "Result is fed to standard output.\n\n";
	print "Usage:\tinote.pl target\n";
	print "\ttarget - the text file to convert\n";
	die("\n");
}

# Set the path file to reflect the target
$path = $ARGV[0];

# Open the file
open(FILE, $path);
@input = <FILE>;
close(FILE);
$input_len = $#input + 1;

# Create output
$output_len = 0;

# Create initial notes part
$notes[0] = "==Notes==\n";
$notes_len = 1;
$AR_count = 1;

# Go through all lines in the file
$terminate = 0;
for ($i = 0; !$terminate && $i < $input_len; $i++) {
	
	# Get the current line
	$curline = $input[$i];
	
	# We have found the heading after the references so end the loop
	if ($references && $curline =~ /^\=\=[^\=]/) {
		$terminate_index = $i;
		$terminate = 1;
	}
	else {
		
		# Check for inote tag and pull contents
		if ($curline =~ /\{\{inote\|([^\}^\|]*)\|?([^\}]*)\}\}/) {

			# Switch style depending on arguments			
			if ($2 eq "") {
				
				# Revise input
				$input[$i] =~ s/{\{inote\|([^\}^\|]*)\|?([^\}]*)\}\}/\{\{ref\|AR$AR_count\}\}/;
				
				# Add to notes
				$notes[$notes_len] = "# {{note|AR".$AR_count."}} ".$1."\n"; 
				$notes_len++;
				$AR_count++;
				
			}
			else {
			
				# Revise input
				$input[$i] =~ s/{\{inote\|([^\}^\|]*)\|?([^\}]*)\}\}/\{\{ref\|$2\}\}/;
				
				# Add to notes
				$notes[$notes_len] = "# {{note|".$2."}} ".$1."\n"; 
				$notes_len++;
				
			}
			
			# Delay the move (we might have multiple notes)
			$i--;
			
		}
		else {
			
			# Add line unaltered to output
			$output[$output_len] = $curline;
			$output[$output_len] =~ s/\{\{explain-inote\}\}\n?//;
			$output_len++;
			
		}
	}
	
	# Note if we have found the references heading
	if ($curline =~ /^\=\=.*References.*\=\=/) {
		$references = 1;
	}
	
}

# If terminate is true we found the place to put our notes, otherwise just add them to the end
if ($terminate) {

	# Add in notes
	for ($i = 0; $i < $notes_len; $i++) {
		$output[$output_len] = $notes[$i];
		$output_len++;
	}
	
	# Add in a blank line
	$output[$output_len] = "\n";
	$output_len++;
	
	# Fill out the rest
	for ($i = $terminate_index; $i < $input_len; $i++) {
		$output[$output_len] = $input[$i];
		$output[$output_len] =~ s/\{\{explain-inote\}\}\n?//;
		$output_len++;
	}
	
}
else {

	# Add in a blank line
	$output[$output_len] = "\n";
	$output_len++;
	
	# Add in notes
	for ($i = 0; $i < $notes_len; $i++) {
		$output[$output_len] = $notes[$i];
		$output_len++;
	}
	
	# Add in a blank line
	$output[$output_len] = "\n";
	$output_len++;
}

# Print end result
for ($i = 0; $i < $output_len; $i++) {
	print $output[$i];	
}