#!/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 , "; } 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; } $_ = ; 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>/is ) { unless( s/^(.*.*)(.*<\/HEAD>)/$1$2/is ) { s/^(.*)/$1\n \n/is; } } else { $_ = "\n \n\n\n$_"; } } if( $add_html_tag && not //is ) { if( $Verbose ) { print "h"; } $_ = "\n\n$_\n\n\n"; } if( $rm_face == 1 ) { if( $Verbose ) { print "f"; } s/(]*)face="[^"]+"([^>]*>)/$1$2/gis; s/<(font) +>/<$1>/gis; s/<(font) +/<$1 /gis; # A teraz usun powstale pary ... (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"; } }