1
0
mirror of https://github.com/anope/anope.git synced 2026-06-25 19:56:39 +02:00
Files
anope/bin/langtool
T
dane dane@31f1291d-b8d6-0310-a050-a5561fc1590b 811ce26663 BUILD : 1.6.0 (4) BUGS : none NOTES : File cleanup and new AnopeManager script (bin/am) to work with Anope source control. Version schema change with no impact on cpp directives.
git-svn-id: svn://svn.anope.org/anope/trunk@4 31f1291d-b8d6-0310-a050-a5561fc1590b


git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2 5417fbe8-f217-4b02-8779-1006273d7864
2004-03-28 23:00:59 +00:00

240 lines
8.1 KiB
Perl
Executable File

#!/usr/bin/perl
#
# Ribosome's all in one language tool
# 1) Compares to check for missing lines
# 2) Compares to check for equal lines
# 3) Fixes (on request) missing lines
# 4) Checks for errors in lines
# 5) Checks for long lines (>60 characters)
#
# Check to see if we have received arguments
if (!$ARGV[0]) {
print "Usage: $0 [language file]\n";
exit;
}
# If yes, set $sourcefile to the language filename
$testagainst = $ARGV[0];
# Set $sourcefile to en_us language file
$sourcefile = "en_us.l";
# Number of Keys in File, Number of Equal Lines, Number of Missing Lines
# Fixed Lines (optional) and Number of Format Error Lines, Number of Long Lines
my $numberlines = 0;
my $equallines = 0;
my $missinglines = 0;
my $fixedlines = 0;
my $errorline = 0;
my $longlines = 0;
# Array to hold the lines from the source file and explosion array for long line check
my @sourcearray;
my @explosion;
# Create associative arrays which will contain keys and definitions
# One for the control source and one for what is being tested against
my %sourcehash= ();
my %testhash= ();
# Check if Files Exist
if (! -f $sourcefile) {
print "Critical Error: The source file does not exist or is unreadable.\nNote: This tool must be run from the language directory.\n";
exit;
}
if (! -f $testagainst) {
print "Critical Error: The language file does not exist or is unreadable\n";
exit;
}
###########################################
# Function to load sourcefile into memory #
###########################################
sub load_sourcefile {
my $_key; # This variable will hold the key
my $_def; # This variable will hold the definition
my $line; # This variable will hold the current line
open (SOURCEFILE, "< $sourcefile"); # Open the source file
while (<SOURCEFILE>) { # For each line the source file
$line = $_; # $line is set to the line in the source file
# Skip comments
if (/^#/) { # This checks for # which indicates comment
next; # If detected, the next line is skipped to
}
# Start of a key
if (/^[A-Z]/) { # Checks to see if the line is a key
chomp($line); # Removes things that shouldn't be at the end
push (@sourcearray, $line); # Puts the line into the source array
# If a key is defined, load definition into the hash
if ($_key ne undef) { # If the key is defined
$sourcehash{$_key} = $_def; # Add the definition to the associative array
}
$_key=$line; # Set the key to the line
$_def=""; # Reset the definition
next; # Move onto the next line
}
if ($_key ne undef) { # If the key is set already
$_def.=$line; # The definition is the current line
}
$sourcehash{$_key} = $_def; # Load the definition into the associative array
} # End of while which reads lines
close (SOURCEFILE); # Close the source file
} # End of load_sourcefile function
#################################################
# Function to load testagainst file into memory #
#################################################
sub load_testagainst {
my $_key; # This variable will hold the key
my $_def; # This variable will hold the definition
my $line; # This variable will hold the current line
open (TESTAGAINSTFILE, "< $testagainst"); # Open the file containing the control lines
while (<TESTAGAINSTFILE>) { # For each line in the file
$line = $_; # $line is set to the lines value
# Skip comments
if (/^#/) { # This checks for # which indicates comment
next; # If detected, the next line is skipped to
}
# Start of a key
if (/^[A-Z]/) { # Checks to see if the line is a key
chomp($line); # Removes things that shouldn't be at the end
if ($_key ne undef) { # If the key is defined
$testhash{$_key} = $_def; # Add the definition to the associative array
}
$_key=$line; # Set the key to the line
$_def=""; # Reset the definition
next; # Move onto the next line
}
if ($_key ne undef) { # If the key is set already
$_def.=$line; # The definition is the current line
}
$testhash{$_key} = $_def; # Load the definition into the associative array
} # End of while which reads lines
close (TESTAGAINSTFILE); # Close the source file
}
sub get_format { # Function to get the formatting from a string
my $fmt="";
my $str=shift; # Get the input
while ($str =~ m/%\w/g) {
$fmt .= $&;
}
return $fmt; # Return the formatting
}
load_sourcefile; # Call function to load the source file
load_testagainst; # Call function to load the test file
if (!grep(/^LANG_NAME/,%testhash)) {
print "Critical Error: $ARGV[0] is not a valid language file!\n";
exit;
}
open (LOG,"> langcheck.log"); # Open logfile for writing
foreach $sourcearray (@sourcearray) { # For each key stored in the source array
my $_key=$_; # Store key from source array in $_key
if ((get_format($sourcehash{$sourcearray})) ne (get_format($testhash{$sourcearray}))) {
if ($sourcearray !~ STRFTIME ) {
$errorline++;
print LOG "FORMAT: $sourcearray - (expecting '".get_format($sourcehash{$sourcearray})."' and got '".get_format($testhash{$sourcearray})."')\n";
} }
if ($testhash{$sourcearray} eq $sourcehash{$sourcearray} ) {
# If the definitions between the source and the test are equal
$equallines++; # Number of equal lines increases
print LOG "EQUAL: $sourcearray\n"; # Line is written to logfile
}
if (!grep(/^$sourcearray/,%testhash)) { # If the key is found in the testhash associative array
$missinglines++; # Increase missing lines
print LOG "MISSING: $sourcearray\n"; # Line is written to logfile
}
@explosion = split(/\n/, $testhash{$sourcearray});
foreach $explosion (@explosion) {
$explosion =~ s/\002//g;
$explosion =~ s/\037//g;
if (length($explosion) > 61) {
print LOG "LONGLINE: $sourcearray (".substr($explosion,1,30)."...)\n";
$longlines++;
}
}
$numberlines++; # Increase the number of lines tested by 1
}
close (LOG); # Close the logfile
#########################
# Show the test results #
#########################
print "Calculation Results:\n";
print "----------------------------------\n";
print "[$numberlines] line(s) were compared\n";
print "[$equallines] line(s) were found to equal their $sourcefile counterpart(s)\n";
print "[$missinglines] line(s) were found to be missing\n";
print "[$longlines] line(s) were found to be long (>60 chars)\n";
print "[$errorline] line(s) were found to have formatting errors\n";
print "The specific details of the test have been saved in langcheck.log\n";
if ($missinglines) { # If missing lines exist
print "----------------------------------\n";
print "Missing line(s) have been detected in this test, would you like to fix the file?\n";
print "This automatically inserts values from the control file ($sourcefile) for the missing values\n";
print "y/N? (Default: No) ";
my $input = <STDIN>; # Ask if the file should be fixed
if ((substr($input,0,1) eq "y") || (substr($input,0,1) eq "Y")) { # If Yes...
open (FIX, ">> $testagainst"); # Open the file and append changes
foreach $sourcearray (@sourcearray) { # For each key stored in the source array
my $_key=$_; # Store key from source array in $_key
if (!grep(/^$sourcearray/,%testhash)) { # If the key is not found in the testhash associative array
print FIX "$sourcearray\n$sourcehash{$sourcearray}"; # Add the line(s) to the language file
$fixedlines++; # Increase the fixed line count
}
}
close (FIX); # Close file after fixing
print "Fixing Compete. [$fixedlines] line(s) fixed.\n";
exit; # And Exit!
}
# Otherwise, quit without fixing
print "Exiting. The language file has NOT been fixed.\n";
}