#!/usr/bin/perl -w # file KLEIDER/web/src/sitestyle/clean_js.pl # Entfernt Kommentare und Leerzeichen aus JS-Dateien # 2011-06-24 Herbert Schiemann # 2020-09-15 "Backtick"-Zeichenketten use utf8; # Dieser Quelltext ist utf-8-kodiert use Herbaer::Readargs; # read_args () binmode (STDIN, ":encoding(utf-8)"); binmode (STDOUT, ":encoding(utf-8)"); binmode (STDERR, ":encoding(utf-8)"); my $args = { "[cnt]verbose" => undef, "in" => undef, # Eingabedatei, default STDIN "out" => undef, # Ausgabedatei, default STDOUT "encoding_in" => "utf-8", # Kodierung der Eingabe "encoding_out" => "utf-8", # Kodierung der Ausgabe }; # gibt die Version nach STDOUT aus sub version { print << 'VERSION'; clean_js.pl Entfernt Kommentare und Leerzeichen aus JavaScript-Dateien Version 2011-06-24 2010, 2011 Herbert Schiemann GPL 2 oder neuer VERSION }; $args -> {"[sr]version"} = sub { version (); exit 0; }; $args -> {"[sr]help"} = sub { version (); print_message_with_values (<<"HELP", $args); $0 --help zeigt diese Hilfe an $0 --version zeigt die Programm-Version an $0 [option]... --verbose erhöht den Umfang der STDERR-Ausgabe \${[cnt]verbose} --no_verbose unterdrückt die STDERR-Ausgabe --in Dateipfad der Eingabedatei \${in} --out Dateipfad der Ausgabe-Datei \${out} --encoding_in Kodierung der Eingabe \${encoding_in} --encoding_out Kodierung der Eingabe \${encoding_out} HELP exit 0; }; # help read_args ($args); my $hin; # Handle der Eingabe my $hout; # Handle der Ausgabe my $nc_hin; # ist $hin zu schließen? my $nc_hout; # ist $hout zu schließen? open_files($args) or die; clean_js ($args, $hin, $hout); close_files($args); sub open_files { my $args = shift; my $verb = $args -> {"[cnt]verbose"}; my $fnin = $args -> {"in"} || "-"; my $fnout = $args -> {"out"} || "-"; print STDERR "clean_js $fnin -> $fnout\n" if $verb; my $enc = $args -> {"encoding_in"}; if ($fnin eq "-") { $hin = STDIN; binmode ($hin, ":raw:encoding($enc)"); } else { open ($hin, "<:encoding($enc)", $fnin) or do { print STDERR "Kann Eingabedatei \"$fnin\" nicht öffnen: $!\n" if $verb; return 0; }; $nc_hin = 1; } $enc = $args -> {"encoding_out"}; if ($fnout eq "-") { $hout = STDOUT; binmode ($hout, ":raw:encoding($enc)"); } else { open ($hout, ">:encoding($enc)", $fnout) or do { print STDERR "Kann Ausgabedatei \"$fnout\" nicht öffnen: $!\n" if $verb; return 0; }; $nc_hout = 1; } 1; } # open_files sub close_files { close ($hin) if $nc_hin; close ($hout) if $nc_hout; } # close_files # entfernt Kommentare und Leerzeichen # $args HASH der Befehlszeilen-Argumente # $hin Handle der Eingabe # $hout Handle der Ausgabe sub clean_js { my ($args, $hin, $hout) = @_; my $line; # Zeile my $cnt = 0; # Anzahl der Zeichen in der ausgegebenen Zeile # Blockkommentare beginnen mit /* am Zeilenfang # und enden mit */ am Ende derselben oder einer folgenden Zeile # Zu Anfang nicht im Blockkommentar-Modus my $blc = 0; my $str; # Hash der Zeichenketten-Konstanten my $sym; # Symbol für einer Zeichenketten-Konstante my $rp; # Ersetzungs-Zeichenkette my $append = sub { $rp = "$1\[?$sym?]"; $str -> {$sym++} = $2; $rp; }; while (defined ($line = <$hin>)) { if (!$blc) { $blc = 1 if $line =~ /^\s*\/\*/; } if ($blc) { $blc = 0 if $line =~ /\*\/\s*$/; next; } $sym = "a"; $str = {}; $line =~ s/([^"]*)("(?:[^"\\]|\\.)*")/$append -> ()/geo ; # Zeichenketten $line =~ s/([^`]*)(`(?:[^`\\]|\\.)*`)/$append -> ()/geo ; # Backtick-Zeichenketten $line =~ s/\/\*.*?\*\///go ; # Kurzkommentare $line =~ /^\s*((?:[^\/\\]|\\.|\/[^\/])*)/o; $line = $1; $line or next; $line =~ s/\s+$//; $line =~ s/\s*([][=.,;:?!|&<>(){}*\/])\s*/$1/go; $line =~ s/([^+-])\s+([+-])/$1$2/go; $line =~ s/([+-])\s+([^+-])/$1$2/go; $line =~ s/\s\s+/ /go; $line =~ s/\[\?(.+?)\?\]/ $str -> {$1} /geo ; print $hout $line; $cnt += length ($line); if ($cnt > 60 || $line =~ /}$/) { print $hout "\n"; $cnt = 0; } elsif ($line !~ /[][=.,;:?!|&<>(){*\/]$/) { print $hout " "; ++$cnt; } } print $hout "\n" if $cnt; } # clean_js # end of file KLEIDER/web/src/sitestyle/clean_js.pl