home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 May / CHIPCD5_98.iso / software / HTML / WWWfix / wwwfixpl.txt
Text File  |  1998-03-24  |  7KB  |  315 lines

  1. #!/usr/bin/perl
  2. #
  3. # wwwfixpl - konwerter stron WWW (c)JS. *** PUBLIC DOMAIN ***
  4. # Wiecej informacji: ftp://ftp.agh.edu.pl/ogonki/konwertery/js/wwwfixpl.txt
  5. #
  6.  
  7. use Getopt::Std;
  8. getopts( 'mctfUe:qQvND' );
  9. $|=1;
  10.  
  11. if( $opt_m != 1 ) { $add_meta = 1; }
  12. if( $opt_c != 1 ) { $fix_cr = 1; }
  13. if( $opt_t != 1 ) { $add_html_tag = 1; }
  14. if( $opt_f != 1 ) { $rm_face = 1; }  
  15. if( $opt_U == 1 ) { $update_time = 1; }
  16. if( $opt_e ne '' ) { $exts = $opt_e; } else { $exts = "html|htm|shtml"; }
  17. if( $opt_q == 1 ) { $verbose=0; } else { $verbose=1; }
  18. if( $opt_v == 1 ) { $Verbose=1; } else { $Verbose=0; }
  19. if( $opt_N == 1 ) { $nomod = 1; }
  20. if( $opt_D == 1 ) { $cp852 = 1; }
  21.  
  22.  
  23. if( $opt_Q != 1 )
  24. {
  25.   print "### wwwfixpl - konwerter stron WWW (c)JS. *** PUBLIC DOMAIN ***\n";
  26.   print "### Wiecej informacji: ftp://ftp.agh.edu.pl/ogonki/konwertery/js/wwwfixpl.txt\n";
  27.   
  28.   print "### Opcje: ";
  29.   $a = '';
  30.   if( $add_meta == 1 ) { $a .= "dodaj META, "; }
  31.   if( $fix_cr == 1 ) { $a .= "usun CRy, "; }
  32.   if( $add_html_tag == 1 ) { $a .= "dodaj <HTML>, "; }
  33.   if( $update_time == 1 ) { $a .= "tworz flage, "; }
  34.   chop $a; chop $a; print "$a.\n";
  35. }
  36.  
  37.  
  38. # Zbieranie nazw plikow do konwersji (do tablicy @files)
  39. if( $#ARGV >= 0 )
  40. {
  41.   @args = @ARGV;
  42. }
  43. else
  44. {
  45.   @args = ( '.' );
  46. }
  47. @files = ();
  48. $files_sum_size = 0;
  49. @update_time_files = (); 
  50. $update_time_file_name = ".wwwfixpl_flag";
  51.  
  52. if( $verbose ) { print "*** Przeszukuje katalogi w poszukiwaniu plikow do konwersji:\n"; }
  53. while( $arg = shift @args )
  54. {
  55.   lstat($arg);
  56.   if( -d _ ) 
  57.   { 
  58.     if( $update_time == 1) { push( @update_time_files, "$arg/$update_time_file_name" ); }
  59.     if( $verbose ) { print "* Przeszukuje: '$arg' "; }
  60.     if( opendir( DIR, $arg ) )
  61.     {
  62.       $n=0;
  63.       if( $update_time == 1 )
  64.       {
  65.         $saved_last_mtime = (-M "$arg/$update_time_file_name");
  66.         print ":$saved_last_mtime:";
  67.         if( $saved_last_mtime eq '' ) { $saved_last_mtime = '9'x9; };
  68.       }
  69.       while( $fn = readdir( DIR ) )
  70.       {
  71.         if( $fn !~ /^\./ )
  72.         {
  73.           $newarg = "$arg/$fn";
  74.           lstat( $newarg );
  75.           if( -f _ and $newarg =~ /\.($exts)$/ )
  76.           {
  77.             if( not $update_time or (-M _) < $saved_last_mtime  )
  78.             {
  79.               $n++;
  80.               push( @files, $newarg ); 
  81.               $files_sum_size += -s _; 
  82.             }
  83.           }
  84.           elsif( -d _ )
  85.           {
  86.             $n++;
  87.             push( @args, "$arg/$fn" ); 
  88.           }
  89.         }
  90.       }
  91.       if( $verbose ) { printf( "(%d/%d/%d)\n", $n, $#args+1, $#files+1 ); }
  92.       closedir( DIR );
  93.     }
  94.     else
  95.     {
  96.       if( $verbose ) { print "Nie da sie czytac !!!\n"; }
  97.     }
  98.   }
  99.   elsif( -f _ )
  100.   {
  101.     push( @files, $arg ); 
  102.     $files_sum_size += -s _; 
  103.   }
  104. }
  105.  
  106. if( $opt_Q != 1 )
  107. {
  108.   printf( "### Konwersja %d plikow o lacznym rozmiarze %d KB.\n", 
  109.           $#files +1, $files_sum_size / 1024 );
  110. }
  111.  
  112.  
  113.  
  114.  
  115. # Konwersja wyszukanych plikow
  116. $done_size = 0;
  117. $nsaved = 0; $saved_size = 0; $nskipped = 0; 
  118. while( $fn = shift @files )
  119. {
  120.   $percent = ($done_size * 100 / $files_sum_size);
  121.   $percent =~ s/\.*$//;
  122.   if( $verbose ) { printf( "[%3d%%] ", $percent ); }
  123.   &conv_file( $fn );
  124. }
  125. if( $verbose ) { print "[100%] "; } 
  126. if( $opt_Q != 1 ) 
  127. {
  128.   printf( "Poprawilem %d plikow (%d KB); zostawilem niezmienione %d plikow.\n",
  129.           $nsaved, $saved_size/1024, $nskipped ); 
  130. }
  131.  
  132.  
  133. # Zapis flag czasu konwersji
  134. while( $fn = shift @update_time_files )
  135. {
  136.   if( $verbose ) { print "* Tworze plik-flage czasu konwersji: $fn\n"; }
  137.   if( open( F, ">$fn" ) ) { close F; } else { print "    Nie moge pisac! ($!)\n"; }
  138. }
  139.  
  140. exit 0;
  141.  
  142.  
  143.  
  144.  
  145.  
  146. ### 
  147. ### Wlasciwa konwersja
  148. ###
  149. sub conv_file
  150. {
  151.   my( $fn ) = @_;
  152.   if( $verbose ) { print "$fn: "; }
  153.  
  154.   if( $nomod == 1 )
  155.   {
  156.     $atime = (stat($fn))[8];
  157.     $mtime = (stat($fn))[9];
  158.   }
  159.  
  160.   # Czytaj plik do pamieci
  161.   if( $Verbose ) { print "<"; }
  162.   local $/ = undef;
  163.   unless( open( F, $fn ) )
  164.   {
  165.     print STDERR "NIE MOGE CZYTAC!\n";
  166.     next;
  167.   }
  168.   $_ = <F>;
  169.   close F;
  170.   $done_size += length( $_ );
  171.  
  172.   # Zapamietaj stare zawartosc by moc stwierdzic czy cos sie zmienilo
  173.   if( $Verbose ) { print "."; }
  174.   $prev = $_;
  175.  
  176.   if( $Verbose ) { print "%"; }
  177.   s/\&\#6\;/ /g;
  178.   s/\œ\;/\266/g;  # To jakies dziwactwo tworzone przez HTML save w MS Word
  179.   #tr/\343\323\320/""-/; # Polskie cudzyslowy i dluga pauza z CP1250
  180.  
  181.  
  182.   if( $Verbose ) { print "#"; }
  183.   s/\&\#(\d+)\;/chr($1)/eg;
  184.  
  185.   if( $Verbose ) { print "P"; }
  186.   if( $cp852 == 1 )
  187.   {
  188.     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/;
  189.   }
  190.   else
  191.   {
  192.     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/;
  193.   }
  194.  
  195.   if( $Verbose ) { print "&"; }
  196.   # Jesli by jakies wadliwe paskudztwo zapisalo polskie litery jako 
  197.   # entitles ISO-8859-1 to zamien je na wlasciwe znaki
  198.   s/\¥\;/\241/g;      s/\¡\;/\241/g;
  199.   s/\Æ\;/\306/g;
  200.   s/\Ê\;/\312/g;
  201.   s/\£\;/\243/g;
  202.   s/\Ñ\;/\321/g;
  203.   s/\Ó\;/\323/g;
  204.                        s/\¦\;/\246/g;
  205.                        s/\¬\;/\254/g;
  206.   s/\¯\;/\257/g;
  207.   s/\¹\;/\261/g;     s/\±\;/\261/g;
  208.   s/\æ\;/\346/g;
  209.   s/\ê\;/\352/g;
  210.   s/\³\;/\263/g;
  211.   s/\ñ\;/\361/g;
  212.   s/\ó\;/\363/g;
  213.                        s/\¶\;/\266/g;
  214.                        s/\¼\;/\274/g;
  215.   s/\¿\;/\277/g;
  216.  
  217.   if( $fix_cr )
  218.   {
  219.     if( $Verbose ) { print "c"; }
  220.     s/\r\n/\n/g;
  221.   }
  222.  
  223.   if( $add_meta )
  224.   {
  225.     if( $Verbose ) { print "m"; }
  226.     if( /<HEAD>.*<\/HEAD>/is )
  227.     {
  228.       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 )
  229.       {
  230.         s/^(.*<HEAD>)/$1\n  <META http-equiv="content-type" content="text\/html; charset=ISO-8859-2">\n/is;
  231.       }
  232.     }
  233.     else
  234.     {
  235.       $_ = "<HEAD>\n  <META http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-2\">\n</HEAD>\n\n$_";
  236.     }
  237.   }
  238.  
  239.   if( $add_html_tag && not /<html>/is )
  240.   {
  241.     if( $Verbose ) { print "h"; }
  242.     $_ = "<HTML>\n\n$_\n\n</HTML>\n";
  243.   }
  244.  
  245.   if( $rm_face == 1 )
  246.   {
  247.     if( $Verbose ) { print "f"; }
  248.     s/(<font [^>]*)face="[^"]+"([^>]*>)/$1$2/gis;
  249.     s/<(font) +>/<$1>/gis;
  250.     s/<(font) +/<$1 /gis;
  251.  
  252.     # A teraz usun powstale pary <FONT> ... </FONT> (bez argumentow)
  253.     $flevel=0;
  254.     $fixed = '';
  255.     %fdel = ();
  256.     while( /<(font)([^>]*)>|<(\/font)>/is )
  257.     {
  258.       $_ = $';
  259.       $fixed .= $`;
  260.  
  261.       if( $1 ne '' )
  262.       {
  263.         $flevel++;
  264.         if( $2 eq '' )
  265.         {
  266.           $fdel{$flevel} = 1;
  267.         }
  268.         else
  269.         {
  270.           $fixed .= "<$1$2>";
  271.         }
  272.       }
  273.       else
  274.       {
  275.         if( $fdel{$flevel} == 1 )
  276.         {
  277.           delete $fdel{$flevel};
  278.         }
  279.         else
  280.         {
  281.           $fixed .= "<$3>";
  282.         }
  283.         $flevel--;
  284.       }
  285.     }
  286.     $_ = "${fixed}$_";
  287.   }
  288.  
  289.   if( $Verbose ) { print ">"; }
  290.  
  291.  
  292.   # Jesli nic sie nie zmienilo to nie zapisuj
  293.   if( $_ eq $prev )
  294.   {
  295.     if( $verbose ) { print " bez zmian.\n"; }
  296.     $nskipped++;
  297.     next;
  298.   }
  299.  
  300.   # Zapisz zmiany
  301.   $nsaved++;
  302.   $saved_size += length( $_ );
  303.   unless( open( F, ">$fn" ) )
  304.   {
  305.     print "\n----- $fn:NIE MOGE PISAC! ($!)\n";
  306.     next;
  307.   }
  308.   print F $_;
  309.   close F;
  310.  
  311.   if( $nomod == 1 ) { utime $atime, $mtime, $fn; }
  312.   if( $verbose ) { print " POPRAWIONY.\n"; }
  313. }
  314.  
  315.