home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 May
/
CHIPCD5_98.iso
/
software
/
HTML
/
WWWfix
/
wwwfixpl.txt
Wrap
Text File
|
1998-03-24
|
7KB
|
315 lines
#!/usr/bin/perl
#
# wwwfixpl - konwerter stron WWW (c)JS. *** PUBLIC DOMAIN ***
# Wiecej informacji: ftp://ftp.agh.edu.pl/ogonki/konwertery/js/wwwfixpl.txt
#
use Getopt::Std;
getopts( 'mctfUe:qQvND' );
$|=1;
if( $opt_m != 1 ) { $add_meta = 1; }
if( $opt_c != 1 ) { $fix_cr = 1; }
if( $opt_t != 1 ) { $add_html_tag = 1; }
if( $opt_f != 1 ) { $rm_face = 1; }
if( $opt_U == 1 ) { $update_time = 1; }
if( $opt_e ne '' ) { $exts = $opt_e; } else { $exts = "html|htm|shtml"; }
if( $opt_q == 1 ) { $verbose=0; } else { $verbose=1; }
if( $opt_v == 1 ) { $Verbose=1; } else { $Verbose=0; }
if( $opt_N == 1 ) { $nomod = 1; }
if( $opt_D == 1 ) { $cp852 = 1; }
if( $opt_Q != 1 )
{
print "### wwwfixpl - konwerter stron WWW (c)JS. *** PUBLIC DOMAIN ***\n";
print "### Wiecej informacji: ftp://ftp.agh.edu.pl/ogonki/konwertery/js/wwwfixpl.txt\n";
print "### Opcje: ";
$a = '';
if( $add_meta == 1 ) { $a .= "dodaj META, "; }
if( $fix_cr == 1 ) { $a .= "usun CRy, "; }
if( $add_html_tag == 1 ) { $a .= "dodaj <HTML>, "; }
if( $update_time == 1 ) { $a .= "tworz flage, "; }
chop $a; chop $a; print "$a.\n";
}
# Zbieranie nazw plikow do konwersji (do tablicy @files)
if( $#ARGV >= 0 )
{
@args = @ARGV;
}
else
{
@args = ( '.' );
}
@files = ();
$files_sum_size = 0;
@update_time_files = ();
$update_time_file_name = ".wwwfixpl_flag";
if( $verbose ) { print "*** Przeszukuje katalogi w poszukiwaniu plikow do konwersji:\n"; }
while( $arg = shift @args )
{
lstat($arg);
if( -d _ )
{
if( $update_time == 1) { push( @update_time_files, "$arg/$update_time_file_name" ); }
if( $verbose ) { print "* Przeszukuje: '$arg' "; }
if( opendir( DIR, $arg ) )
{
$n=0;
if( $update_time == 1 )
{
$saved_last_mtime = (-M "$arg/$update_time_file_name");
print ":$saved_last_mtime:";
if( $saved_last_mtime eq '' ) { $saved_last_mtime = '9'x9; };
}
while( $fn = readdir( DIR ) )
{
if( $fn !~ /^\./ )
{
$newarg = "$arg/$fn";
lstat( $newarg );
if( -f _ and $newarg =~ /\.($exts)$/ )
{
if( not $update_time or (-M _) < $saved_last_mtime )
{
$n++;
push( @files, $newarg );
$files_sum_size += -s _;
}
}
elsif( -d _ )
{
$n++;
push( @args, "$arg/$fn" );
}
}
}
if( $verbose ) { printf( "(%d/%d/%d)\n", $n, $#args+1, $#files+1 ); }
closedir( DIR );
}
else
{
if( $verbose ) { print "Nie da sie czytac !!!\n"; }
}
}
elsif( -f _ )
{
push( @files, $arg );
$files_sum_size += -s _;
}
}
if( $opt_Q != 1 )
{
printf( "### Konwersja %d plikow o lacznym rozmiarze %d KB.\n",
$#files +1, $files_sum_size / 1024 );
}
# Konwersja wyszukanych plikow
$done_size = 0;
$nsaved = 0; $saved_size = 0; $nskipped = 0;
while( $fn = shift @files )
{
$percent = ($done_size * 100 / $files_sum_size);
$percent =~ s/\.*$//;
if( $verbose ) { printf( "[%3d%%] ", $percent ); }
&conv_file( $fn );
}
if( $verbose ) { print "[100%] "; }
if( $opt_Q != 1 )
{
printf( "Poprawilem %d plikow (%d KB); zostawilem niezmienione %d plikow.\n",
$nsaved, $saved_size/1024, $nskipped );
}
# Zapis flag czasu konwersji
while( $fn = shift @update_time_files )
{
if( $verbose ) { print "* Tworze plik-flage czasu konwersji: $fn\n"; }
if( open( F, ">$fn" ) ) { close F; } else { print " Nie moge pisac! ($!)\n"; }
}
exit 0;
###
### Wlasciwa konwersja
###
sub conv_file
{
my( $fn ) = @_;
if( $verbose ) { print "$fn: "; }
if( $nomod == 1 )
{
$atime = (stat($fn))[8];
$mtime = (stat($fn))[9];
}
# Czytaj plik do pamieci
if( $Verbose ) { print "<"; }
local $/ = undef;
unless( open( F, $fn ) )
{
print STDERR "NIE MOGE CZYTAC!\n";
next;
}
$_ = <F>;
close F;
$done_size += length( $_ );
# Zapamietaj stare zawartosc by moc stwierdzic czy cos sie zmienilo
if( $Verbose ) { print "."; }
$prev = $_;
if( $Verbose ) { print "%"; }
s/\&\#6\;/ /g;
s/\œ\;/\266/g; # To jakies dziwactwo tworzone przez HTML save w MS Word
#tr/\343\323\320/""-/; # Polskie cudzyslowy i dluga pauza z CP1250
if( $Verbose ) { print "#"; }
s/\&\#(\d+)\;/chr($1)/eg;
if( $Verbose ) { print "P"; }
if( $cp852 == 1 )
{
tr/\244\217\250\235\343\340\227\215\275\245\206\251\210\344\242\230\253\276/\241\306\312\243\321\323\246\254\257\261\346\352\263\361\363\266\274\277/;
}
else
{
tr/\245\306\312\243\321\323\214\217\257\271\346\352\263\361\363\234\237\277/\241\306\312\243\321\323\246\254\257\261\346\352\263\361\363\266\274\277/;
}
if( $Verbose ) { print "&"; }
# Jesli by jakies wadliwe paskudztwo zapisalo polskie litery jako
# entitles ISO-8859-1 to zamien je na wlasciwe znaki
s/\¥\;/\241/g; s/\¡\;/\241/g;
s/\Æ\;/\306/g;
s/\Ê\;/\312/g;
s/\£\;/\243/g;
s/\Ñ\;/\321/g;
s/\Ó\;/\323/g;
s/\¦\;/\246/g;
s/\¬\;/\254/g;
s/\¯\;/\257/g;
s/\¹\;/\261/g; s/\±\;/\261/g;
s/\æ\;/\346/g;
s/\ê\;/\352/g;
s/\³\;/\263/g;
s/\ñ\;/\361/g;
s/\ó\;/\363/g;
s/\¶\;/\266/g;
s/\¼\;/\274/g;
s/\¿\;/\277/g;
if( $fix_cr )
{
if( $Verbose ) { print "c"; }
s/\r\n/\n/g;
}
if( $add_meta )
{
if( $Verbose ) { print "m"; }
if( /<HEAD>.*<\/HEAD>/is )
{
unless( s/^(.*<HEAD>.*)<META\s+http-equiv="content-type"\s+content="[^"]+">(.*<\/HEAD>)/$1<META http-equiv="content-type" content="text\/html; charset=ISO-8859-2">$2/is )
{
s/^(.*<HEAD>)/$1\n <META http-equiv="content-type" content="text\/html; charset=ISO-8859-2">\n/is;
}
}
else
{
$_ = "<HEAD>\n <META http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-2\">\n</HEAD>\n\n$_";
}
}
if( $add_html_tag && not /<html>/is )
{
if( $Verbose ) { print "h"; }
$_ = "<HTML>\n\n$_\n\n</HTML>\n";
}
if( $rm_face == 1 )
{
if( $Verbose ) { print "f"; }
s/(<font [^>]*)face="[^"]+"([^>]*>)/$1$2/gis;
s/<(font) +>/<$1>/gis;
s/<(font) +/<$1 /gis;
# A teraz usun powstale pary <FONT> ... </FONT> (bez argumentow)
$flevel=0;
$fixed = '';
%fdel = ();
while( /<(font)([^>]*)>|<(\/font)>/is )
{
$_ = $';
$fixed .= $`;
if( $1 ne '' )
{
$flevel++;
if( $2 eq '' )
{
$fdel{$flevel} = 1;
}
else
{
$fixed .= "<$1$2>";
}
}
else
{
if( $fdel{$flevel} == 1 )
{
delete $fdel{$flevel};
}
else
{
$fixed .= "<$3>";
}
$flevel--;
}
}
$_ = "${fixed}$_";
}
if( $Verbose ) { print ">"; }
# Jesli nic sie nie zmienilo to nie zapisuj
if( $_ eq $prev )
{
if( $verbose ) { print " bez zmian.\n"; }
$nskipped++;
next;
}
# Zapisz zmiany
$nsaved++;
$saved_size += length( $_ );
unless( open( F, ">$fn" ) )
{
print "\n----- $fn:NIE MOGE PISAC! ($!)\n";
next;
}
print F $_;
close F;
if( $nomod == 1 ) { utime $atime, $mtime, $fn; }
if( $verbose ) { print " POPRAWIONY.\n"; }
}