JavaScript, Json minimizator

jsmin – is a JavaScript, Json minimizator which removes comments and unnecessary whitespace from JS, JSON files

2 Commits   0 Branches   0 Tags
f8470165 (kx 2023-04-07 06:34:02 +0300   1) #!/usr/bin/perl -w
f8470165 (kx 2023-04-07 06:34:02 +0300   2) 
f8470165 (kx 2023-04-07 06:34:02 +0300   3) use strict;
f8470165 (kx 2023-04-07 06:34:02 +0300   4) use Getopt::Long qw(:config no_ignore_case bundling);
f8470165 (kx 2023-04-07 06:34:02 +0300   5) use File::Basename;
f8470165 (kx 2023-04-07 06:34:02 +0300   6) use utf8;
f8470165 (kx 2023-04-07 06:34:02 +0300   7) 
f8470165 (kx 2023-04-07 06:34:02 +0300   8) my $ifname = '';
f8470165 (kx 2023-04-07 06:34:02 +0300   9) my $ofname = '';
f8470165 (kx 2023-04-07 06:34:02 +0300  10) my $stdio  = '';
f8470165 (kx 2023-04-07 06:34:02 +0300  11) my $last   = '';
f8470165 (kx 2023-04-07 06:34:02 +0300  12) 
f8470165 (kx 2023-04-07 06:34:02 +0300  13) my $version = "@VERSION@";
f8470165 (kx 2023-04-07 06:34:02 +0300  14) 
f8470165 (kx 2023-04-07 06:34:02 +0300  15) my ( $if, $of );
f8470165 (kx 2023-04-07 06:34:02 +0300  16) 
f8470165 (kx 2023-04-07 06:34:02 +0300  17) sub usage
f8470165 (kx 2023-04-07 06:34:02 +0300  18) {
f8470165 (kx 2023-04-07 06:34:02 +0300  19)   my $p = basename( $0 );
f8470165 (kx 2023-04-07 06:34:02 +0300  20) 
f8470165 (kx 2023-04-07 06:34:02 +0300  21)   print <<EOF;
f8470165 (kx 2023-04-07 06:34:02 +0300  22) 
f8470165 (kx 2023-04-07 06:34:02 +0300  23) Usage: $p [options] [input_file_name]
f8470165 (kx 2023-04-07 06:34:02 +0300  24) Options:
f8470165 (kx 2023-04-07 06:34:02 +0300  25)    --output | -o       - output file name;
f8470165 (kx 2023-04-07 06:34:02 +0300  26)    --version | -v      - print version numver;
f8470165 (kx 2023-04-07 06:34:02 +0300  27)    --help | -h | -?    - print this message;
f8470165 (kx 2023-04-07 06:34:02 +0300  28)    --                  - an option terminator;
f8470165 (kx 2023-04-07 06:34:02 +0300  29)    -                   - use std{io|out} instead of files.
f8470165 (kx 2023-04-07 06:34:02 +0300  30) 
f8470165 (kx 2023-04-07 06:34:02 +0300  31) Examples:
f8470165 (kx 2023-04-07 06:34:02 +0300  32) 
f8470165 (kx 2023-04-07 06:34:02 +0300  33)   Input file is 'full.json', output file is 'min.json':
f8470165 (kx 2023-04-07 06:34:02 +0300  34) 
f8470165 (kx 2023-04-07 06:34:02 +0300  35)     \$ $p -o min.json full.json
f8470165 (kx 2023-04-07 06:34:02 +0300  36) 
f8470165 (kx 2023-04-07 06:34:02 +0300  37)   Input file is 'STDIN', output file is 'min.json':
f8470165 (kx 2023-04-07 06:34:02 +0300  38) 
f8470165 (kx 2023-04-07 06:34:02 +0300  39)     \$ $p -o min.json -
f8470165 (kx 2023-04-07 06:34:02 +0300  40) 
f8470165 (kx 2023-04-07 06:34:02 +0300  41)     Please note that to terminate your input by keyboard you have to use
f8470165 (kx 2023-04-07 06:34:02 +0300  42)     <Ctrl>+d combination;
f8470165 (kx 2023-04-07 06:34:02 +0300  43) 
f8470165 (kx 2023-04-07 06:34:02 +0300  44)   Input file is 'full.json', output file is 'STDOUT':
f8470165 (kx 2023-04-07 06:34:02 +0300  45) 
f8470165 (kx 2023-04-07 06:34:02 +0300  46)     \$ $p -- full.json
f8470165 (kx 2023-04-07 06:34:02 +0300  47) 
f8470165 (kx 2023-04-07 06:34:02 +0300  48)   Use stdin, stdout:
f8470165 (kx 2023-04-07 06:34:02 +0300  49) 
f8470165 (kx 2023-04-07 06:34:02 +0300  50)     \$ $p - < full.json > min.json
f8470165 (kx 2023-04-07 06:34:02 +0300  51) 
f8470165 (kx 2023-04-07 06:34:02 +0300  52) Enjoj.
f8470165 (kx 2023-04-07 06:34:02 +0300  53) 
f8470165 (kx 2023-04-07 06:34:02 +0300  54) EOF
f8470165 (kx 2023-04-07 06:34:02 +0300  55)   exit;
f8470165 (kx 2023-04-07 06:34:02 +0300  56) }
f8470165 (kx 2023-04-07 06:34:02 +0300  57) 
f8470165 (kx 2023-04-07 06:34:02 +0300  58) sub version
f8470165 (kx 2023-04-07 06:34:02 +0300  59) {
f8470165 (kx 2023-04-07 06:34:02 +0300  60)   print <<EOF;
f8470165 (kx 2023-04-07 06:34:02 +0300  61) $version
f8470165 (kx 2023-04-07 06:34:02 +0300  62) EOF
f8470165 (kx 2023-04-07 06:34:02 +0300  63)   exit;
f8470165 (kx 2023-04-07 06:34:02 +0300  64) }
f8470165 (kx 2023-04-07 06:34:02 +0300  65) 
f8470165 (kx 2023-04-07 06:34:02 +0300  66) 
f8470165 (kx 2023-04-07 06:34:02 +0300  67) my $a = '';
f8470165 (kx 2023-04-07 06:34:02 +0300  68) my $b = '';
f8470165 (kx 2023-04-07 06:34:02 +0300  69) my $x = '';
f8470165 (kx 2023-04-07 06:34:02 +0300  70) my $y = '';
f8470165 (kx 2023-04-07 06:34:02 +0300  71) 
f8470165 (kx 2023-04-07 06:34:02 +0300  72) my $lookahead = 0;
f8470165 (kx 2023-04-07 06:34:02 +0300  73) 
f8470165 (kx 2023-04-07 06:34:02 +0300  74) 
f8470165 (kx 2023-04-07 06:34:02 +0300  75) sub get
f8470165 (kx 2023-04-07 06:34:02 +0300  76) {
f8470165 (kx 2023-04-07 06:34:02 +0300  77)   my $c = 0;
f8470165 (kx 2023-04-07 06:34:02 +0300  78) 
f8470165 (kx 2023-04-07 06:34:02 +0300  79)   $c = $lookahead;
f8470165 (kx 2023-04-07 06:34:02 +0300  80)   $lookahead = 0;
f8470165 (kx 2023-04-07 06:34:02 +0300  81) 
f8470165 (kx 2023-04-07 06:34:02 +0300  82)   if( $c == 0 )
f8470165 (kx 2023-04-07 06:34:02 +0300  83)   {
f8470165 (kx 2023-04-07 06:34:02 +0300  84)     if( ! eof( $if ) )
f8470165 (kx 2023-04-07 06:34:02 +0300  85)     {
f8470165 (kx 2023-04-07 06:34:02 +0300  86)       my $ch = getc( $if );
f8470165 (kx 2023-04-07 06:34:02 +0300  87)       $c = ord( $ch );
f8470165 (kx 2023-04-07 06:34:02 +0300  88)     }
f8470165 (kx 2023-04-07 06:34:02 +0300  89)     else
f8470165 (kx 2023-04-07 06:34:02 +0300  90)     {
f8470165 (kx 2023-04-07 06:34:02 +0300  91)       $c = 0;
f8470165 (kx 2023-04-07 06:34:02 +0300  92)     }
f8470165 (kx 2023-04-07 06:34:02 +0300  93)   }
f8470165 (kx 2023-04-07 06:34:02 +0300  94)   if( $c >= ord(" ") || $c == ord("\n") || $c == 0 )
f8470165 (kx 2023-04-07 06:34:02 +0300  95)   {
f8470165 (kx 2023-04-07 06:34:02 +0300  96)     return $c;
f8470165 (kx 2023-04-07 06:34:02 +0300  97)   }
f8470165 (kx 2023-04-07 06:34:02 +0300  98)   if( $c == ord("\r") )
f8470165 (kx 2023-04-07 06:34:02 +0300  99)   {
f8470165 (kx 2023-04-07 06:34:02 +0300 100)     return ord("\n");
f8470165 (kx 2023-04-07 06:34:02 +0300 101)   }
f8470165 (kx 2023-04-07 06:34:02 +0300 102)   return ord(" ");
f8470165 (kx 2023-04-07 06:34:02 +0300 103) }
f8470165 (kx 2023-04-07 06:34:02 +0300 104) 
f8470165 (kx 2023-04-07 06:34:02 +0300 105) sub peek
f8470165 (kx 2023-04-07 06:34:02 +0300 106) {
f8470165 (kx 2023-04-07 06:34:02 +0300 107)   $lookahead = get();
f8470165 (kx 2023-04-07 06:34:02 +0300 108)   return $lookahead;
f8470165 (kx 2023-04-07 06:34:02 +0300 109) }
f8470165 (kx 2023-04-07 06:34:02 +0300 110) 
f8470165 (kx 2023-04-07 06:34:02 +0300 111) sub next_cn
f8470165 (kx 2023-04-07 06:34:02 +0300 112) {
f8470165 (kx 2023-04-07 06:34:02 +0300 113)   my $c = get();
f8470165 (kx 2023-04-07 06:34:02 +0300 114) 
f8470165 (kx 2023-04-07 06:34:02 +0300 115)   if( $c == ord("/") )
f8470165 (kx 2023-04-07 06:34:02 +0300 116)   {
f8470165 (kx 2023-04-07 06:34:02 +0300 117)     my $char = chr( peek() );
f8470165 (kx 2023-04-07 06:34:02 +0300 118)     if( $char eq "/" )
f8470165 (kx 2023-04-07 06:34:02 +0300 119)     {
f8470165 (kx 2023-04-07 06:34:02 +0300 120)       for(;;) { $c = get(); if( $c <= ord("\n") ) { last; } }
f8470165 (kx 2023-04-07 06:34:02 +0300 121)     }
f8470165 (kx 2023-04-07 06:34:02 +0300 122)     elsif( $char eq "*" )
f8470165 (kx 2023-04-07 06:34:02 +0300 123)     {
f8470165 (kx 2023-04-07 06:34:02 +0300 124)       get();
f8470165 (kx 2023-04-07 06:34:02 +0300 125)       while( $c != ord(" ") )
f8470165 (kx 2023-04-07 06:34:02 +0300 126)       {
f8470165 (kx 2023-04-07 06:34:02 +0300 127)         my $cn = get();
f8470165 (kx 2023-04-07 06:34:02 +0300 128)         if( chr( $cn ) eq "*" )
f8470165 (kx 2023-04-07 06:34:02 +0300 129)         {
f8470165 (kx 2023-04-07 06:34:02 +0300 130)           if( chr( peek() ) eq "/" ) { get(); $c = ord(" "); }
f8470165 (kx 2023-04-07 06:34:02 +0300 131)         }
f8470165 (kx 2023-04-07 06:34:02 +0300 132)         elsif( $cn == 0 )
f8470165 (kx 2023-04-07 06:34:02 +0300 133)         {
f8470165 (kx 2023-04-07 06:34:02 +0300 134)           print STDERR "Unterminated comment.\n"; exit 1;
f8470165 (kx 2023-04-07 06:34:02 +0300 135)         }
f8470165 (kx 2023-04-07 06:34:02 +0300 136)       }
f8470165 (kx 2023-04-07 06:34:02 +0300 137)     }
f8470165 (kx 2023-04-07 06:34:02 +0300 138)   }
f8470165 (kx 2023-04-07 06:34:02 +0300 139)   $y = $x;
f8470165 (kx 2023-04-07 06:34:02 +0300 140)   $x = chr( $c );
f8470165 (kx 2023-04-07 06:34:02 +0300 141) 
f8470165 (kx 2023-04-07 06:34:02 +0300 142)   return $c;
f8470165 (kx 2023-04-07 06:34:02 +0300 143) }
f8470165 (kx 2023-04-07 06:34:02 +0300 144) 
f8470165 (kx 2023-04-07 06:34:02 +0300 145) sub action
f8470165 (kx 2023-04-07 06:34:02 +0300 146) {
f8470165 (kx 2023-04-07 06:34:02 +0300 147)   my $d = $_[0];
f8470165 (kx 2023-04-07 06:34:02 +0300 148) 
f8470165 (kx 2023-04-07 06:34:02 +0300 149)   if( $d == 1 )
f8470165 (kx 2023-04-07 06:34:02 +0300 150)   {
f8470165 (kx 2023-04-07 06:34:02 +0300 151)     print $of $a;
f8470165 (kx 2023-04-07 06:34:02 +0300 152)     if(
f8470165 (kx 2023-04-07 06:34:02 +0300 153)         ( $y eq "\n" || $y eq " " ) &&
f8470165 (kx 2023-04-07 06:34:02 +0300 154)         ( $a eq "+" || $a eq "-" || $a eq "*" || $a eq "/" ) &&
f8470165 (kx 2023-04-07 06:34:02 +0300 155)         ( $b eq "+" || $b eq "-" || $b eq "*" || $b eq "/" )
f8470165 (kx 2023-04-07 06:34:02 +0300 156)       )
f8470165 (kx 2023-04-07 06:34:02 +0300 157)     {
f8470165 (kx 2023-04-07 06:34:02 +0300 158)       print $of $y;
f8470165 (kx 2023-04-07 06:34:02 +0300 159)     }
f8470165 (kx 2023-04-07 06:34:02 +0300 160)     $d = 2;
f8470165 (kx 2023-04-07 06:34:02 +0300 161)   }
f8470165 (kx 2023-04-07 06:34:02 +0300 162) 
f8470165 (kx 2023-04-07 06:34:02 +0300 163)   if( $d == 2 )
f8470165 (kx 2023-04-07 06:34:02 +0300 164)   {
f8470165 (kx 2023-04-07 06:34:02 +0300 165)     $a = $b;
f8470165 (kx 2023-04-07 06:34:02 +0300 166)     if( $a eq "\'" || $a eq "\"" || $a eq "`" )
f8470165 (kx 2023-04-07 06:34:02 +0300 167)     {
f8470165 (kx 2023-04-07 06:34:02 +0300 168)       for(;;)
f8470165 (kx 2023-04-07 06:34:02 +0300 169)       {
f8470165 (kx 2023-04-07 06:34:02 +0300 170)         my $c;
f8470165 (kx 2023-04-07 06:34:02 +0300 171) 
f8470165 (kx 2023-04-07 06:34:02 +0300 172)         print $of $a;
f8470165 (kx 2023-04-07 06:34:02 +0300 173)         $c = get(); $a = chr( $c );
f8470165 (kx 2023-04-07 06:34:02 +0300 174)         if( $a eq $b ) { last; }
f8470165 (kx 2023-04-07 06:34:02 +0300 175)         if( $a eq "\\" )
f8470165 (kx 2023-04-07 06:34:02 +0300 176)         {
f8470165 (kx 2023-04-07 06:34:02 +0300 177)           print $of $a;
f8470165 (kx 2023-04-07 06:34:02 +0300 178)           $c = get(); $a = chr( $c );
f8470165 (kx 2023-04-07 06:34:02 +0300 179)         }
f8470165 (kx 2023-04-07 06:34:02 +0300 180)         if( $c == 0 )
f8470165 (kx 2023-04-07 06:34:02 +0300 181)         {
f8470165 (kx 2023-04-07 06:34:02 +0300 182)           print STDERR "Unterminated string literal.\n"; exit 1;
f8470165 (kx 2023-04-07 06:34:02 +0300 183)         }
f8470165 (kx 2023-04-07 06:34:02 +0300 184)       }
f8470165 (kx 2023-04-07 06:34:02 +0300 185)     }
f8470165 (kx 2023-04-07 06:34:02 +0300 186)     $d = 3;
f8470165 (kx 2023-04-07 06:34:02 +0300 187)   }
f8470165 (kx 2023-04-07 06:34:02 +0300 188) 
f8470165 (kx 2023-04-07 06:34:02 +0300 189)   if( $d == 3 )
f8470165 (kx 2023-04-07 06:34:02 +0300 190)   {
f8470165 (kx 2023-04-07 06:34:02 +0300 191)     $b = chr( next_cn() );
f8470165 (kx 2023-04-07 06:34:02 +0300 192)     if( $b eq "/" &&
f8470165 (kx 2023-04-07 06:34:02 +0300 193)         ( $a eq "(" || $a eq "," || $a eq "=" || $a eq ":" ||
f8470165 (kx 2023-04-07 06:34:02 +0300 194)           $a eq "[" || $a eq "!" || $a eq "&" || $a eq "|" ||
f8470165 (kx 2023-04-07 06:34:02 +0300 195)           $a eq "?" || $a eq "+" || $a eq "-" || $a eq "~" ||
f8470165 (kx 2023-04-07 06:34:02 +0300 196)           $a eq "*" || $a eq "/" || $a eq "{" || $a eq "\n"
f8470165 (kx 2023-04-07 06:34:02 +0300 197)         )
f8470165 (kx 2023-04-07 06:34:02 +0300 198)       )
f8470165 (kx 2023-04-07 06:34:02 +0300 199)     {
f8470165 (kx 2023-04-07 06:34:02 +0300 200)       print $of $a;
f8470165 (kx 2023-04-07 06:34:02 +0300 201)       if( $a eq "/" || $a eq "*" ) { print $of " "; }
f8470165 (kx 2023-04-07 06:34:02 +0300 202)       print $of $b;
f8470165 (kx 2023-04-07 06:34:02 +0300 203)       for(;;)
f8470165 (kx 2023-04-07 06:34:02 +0300 204)       {
f8470165 (kx 2023-04-07 06:34:02 +0300 205)         my $c;
f8470165 (kx 2023-04-07 06:34:02 +0300 206) 
f8470165 (kx 2023-04-07 06:34:02 +0300 207)         $c = get(); $a = chr( $c );
f8470165 (kx 2023-04-07 06:34:02 +0300 208)         if( $a eq "[" )
f8470165 (kx 2023-04-07 06:34:02 +0300 209)         {
f8470165 (kx 2023-04-07 06:34:02 +0300 210)           for(;;)
f8470165 (kx 2023-04-07 06:34:02 +0300 211)           {
f8470165 (kx 2023-04-07 06:34:02 +0300 212)             print $of $a;
f8470165 (kx 2023-04-07 06:34:02 +0300 213)             $c = get(); $a = chr( $c );
f8470165 (kx 2023-04-07 06:34:02 +0300 214)             if( $a eq "]" )
f8470165 (kx 2023-04-07 06:34:02 +0300 215)             {
f8470165 (kx 2023-04-07 06:34:02 +0300 216)               last;
f8470165 (kx 2023-04-07 06:34:02 +0300 217)             }
f8470165 (kx 2023-04-07 06:34:02 +0300 218)             if( $a eq "\\" )
f8470165 (kx 2023-04-07 06:34:02 +0300 219)             {
f8470165 (kx 2023-04-07 06:34:02 +0300 220)               print $of $a;
f8470165 (kx 2023-04-07 06:34:02 +0300 221)               $c = get(); $a = chr( $c );
f8470165 (kx 2023-04-07 06:34:02 +0300 222)             }
f8470165 (kx 2023-04-07 06:34:02 +0300 223)             if( $c == 0 )
f8470165 (kx 2023-04-07 06:34:02 +0300 224)             {
f8470165 (kx 2023-04-07 06:34:02 +0300 225)               print STDERR "Unterminated regular expression literal.\n"; exit 1;
f8470165 (kx 2023-04-07 06:34:02 +0300 226)             }
f8470165 (kx 2023-04-07 06:34:02 +0300 227)           }
f8470165 (kx 2023-04-07 06:34:02 +0300 228)         }
f8470165 (kx 2023-04-07 06:34:02 +0300 229)         elsif( $a eq "/" )
f8470165 (kx 2023-04-07 06:34:02 +0300 230)         {
f8470165 (kx 2023-04-07 06:34:02 +0300 231)           my $ch = chr( peek() );
f8470165 (kx 2023-04-07 06:34:02 +0300 232)           if( $ch eq "/" || $ch eq "*" )
f8470165 (kx 2023-04-07 06:34:02 +0300 233)           {
f8470165 (kx 2023-04-07 06:34:02 +0300 234)             print STDERR "Unterminated regular expression literal.\n"; exit 1;
f8470165 (kx 2023-04-07 06:34:02 +0300 235)           }
f8470165 (kx 2023-04-07 06:34:02 +0300 236)           last;
f8470165 (kx 2023-04-07 06:34:02 +0300 237)         }
f8470165 (kx 2023-04-07 06:34:02 +0300 238)         elsif( $a eq "\\" )
f8470165 (kx 2023-04-07 06:34:02 +0300 239)         {
f8470165 (kx 2023-04-07 06:34:02 +0300 240)           print $of $a;
f8470165 (kx 2023-04-07 06:34:02 +0300 241)           $c = get(); $a = chr( $c );
f8470165 (kx 2023-04-07 06:34:02 +0300 242)         }
f8470165 (kx 2023-04-07 06:34:02 +0300 243)         elsif( $c == 0 )
f8470165 (kx 2023-04-07 06:34:02 +0300 244)         {
f8470165 (kx 2023-04-07 06:34:02 +0300 245)           print STDERR "Unterminated regular expression literal.\n"; exit 1;
f8470165 (kx 2023-04-07 06:34:02 +0300 246)         }
f8470165 (kx 2023-04-07 06:34:02 +0300 247)         print $of $a;
f8470165 (kx 2023-04-07 06:34:02 +0300 248)       }
f8470165 (kx 2023-04-07 06:34:02 +0300 249)       $b = chr( next_cn() );
f8470165 (kx 2023-04-07 06:34:02 +0300 250)     }
f8470165 (kx 2023-04-07 06:34:02 +0300 251)   }
f8470165 (kx 2023-04-07 06:34:02 +0300 252) }
f8470165 (kx 2023-04-07 06:34:02 +0300 253) 
f8470165 (kx 2023-04-07 06:34:02 +0300 254) 
f8470165 (kx 2023-04-07 06:34:02 +0300 255) sub isalnum
f8470165 (kx 2023-04-07 06:34:02 +0300 256) {
f8470165 (kx 2023-04-07 06:34:02 +0300 257)   my $ch = $_[0];
f8470165 (kx 2023-04-07 06:34:02 +0300 258) 
f8470165 (kx 2023-04-07 06:34:02 +0300 259)   if( ($ch ge "a" && $ch le "z") || ($ch ge "0" && $ch le "9") ||
f8470165 (kx 2023-04-07 06:34:02 +0300 260)       ($ch ge "A" && $ch le "Z") ||  $ch eq "_" || $ch eq "\$" ||
f8470165 (kx 2023-04-07 06:34:02 +0300 261)       $ch eq "\\" || $ch gt "~"
f8470165 (kx 2023-04-07 06:34:02 +0300 262)     ) { return 1; } else { return 0; }
f8470165 (kx 2023-04-07 06:34:02 +0300 263) }
f8470165 (kx 2023-04-07 06:34:02 +0300 264) 
f8470165 (kx 2023-04-07 06:34:02 +0300 265) 
f8470165 (kx 2023-04-07 06:34:02 +0300 266) sub jsmin
f8470165 (kx 2023-04-07 06:34:02 +0300 267) {
f8470165 (kx 2023-04-07 06:34:02 +0300 268)   if( peek() == 0xEF ) { get(); get(); get(); }
f8470165 (kx 2023-04-07 06:34:02 +0300 269)   $a = "\n";
f8470165 (kx 2023-04-07 06:34:02 +0300 270)   action( 3 );
f8470165 (kx 2023-04-07 06:34:02 +0300 271)   while( $a ne "" && $a ne "\0" )
f8470165 (kx 2023-04-07 06:34:02 +0300 272)   {
f8470165 (kx 2023-04-07 06:34:02 +0300 273)     if( $a eq " " )
f8470165 (kx 2023-04-07 06:34:02 +0300 274)     {
f8470165 (kx 2023-04-07 06:34:02 +0300 275)       action( isalnum( $b ) ? 1 : 2 );
f8470165 (kx 2023-04-07 06:34:02 +0300 276)     }
f8470165 (kx 2023-04-07 06:34:02 +0300 277)     elsif( $a eq "\n" )
f8470165 (kx 2023-04-07 06:34:02 +0300 278)     {
f8470165 (kx 2023-04-07 06:34:02 +0300 279)       if( $b eq "{" || $b eq "[" || $b eq "(" || $b eq "+" ||
f8470165 (kx 2023-04-07 06:34:02 +0300 280)           $b eq "-" || $b eq "!" || $b eq "~"
f8470165 (kx 2023-04-07 06:34:02 +0300 281)         )
f8470165 (kx 2023-04-07 06:34:02 +0300 282)       {
f8470165 (kx 2023-04-07 06:34:02 +0300 283)         action( 1 );
f8470165 (kx 2023-04-07 06:34:02 +0300 284)       }
f8470165 (kx 2023-04-07 06:34:02 +0300 285)       elsif( $b eq " " )
f8470165 (kx 2023-04-07 06:34:02 +0300 286)       {
f8470165 (kx 2023-04-07 06:34:02 +0300 287)         action( 3 );
f8470165 (kx 2023-04-07 06:34:02 +0300 288)       }
f8470165 (kx 2023-04-07 06:34:02 +0300 289)       else
f8470165 (kx 2023-04-07 06:34:02 +0300 290)       {
f8470165 (kx 2023-04-07 06:34:02 +0300 291)         action( isalnum( $b ) ? 1 : 2 );
f8470165 (kx 2023-04-07 06:34:02 +0300 292)       }
f8470165 (kx 2023-04-07 06:34:02 +0300 293)     }
f8470165 (kx 2023-04-07 06:34:02 +0300 294)     else
f8470165 (kx 2023-04-07 06:34:02 +0300 295)     {
f8470165 (kx 2023-04-07 06:34:02 +0300 296)       if( $b eq " " )
f8470165 (kx 2023-04-07 06:34:02 +0300 297)       {
f8470165 (kx 2023-04-07 06:34:02 +0300 298)         action( isalnum( $a ) ? 1 : 3 );
f8470165 (kx 2023-04-07 06:34:02 +0300 299)       }
f8470165 (kx 2023-04-07 06:34:02 +0300 300)       elsif( $b eq "\n" )
f8470165 (kx 2023-04-07 06:34:02 +0300 301)       {
f8470165 (kx 2023-04-07 06:34:02 +0300 302)         if( $a eq "}" || $a eq "]" || $a eq ")" || $a eq "+" ||
f8470165 (kx 2023-04-07 06:34:02 +0300 303)             $a eq "-" || $a eq "\"" || $a eq "\'" || $a eq "`"
f8470165 (kx 2023-04-07 06:34:02 +0300 304)           )
f8470165 (kx 2023-04-07 06:34:02 +0300 305)         {
f8470165 (kx 2023-04-07 06:34:02 +0300 306)           action( 1 );
f8470165 (kx 2023-04-07 06:34:02 +0300 307)         }
f8470165 (kx 2023-04-07 06:34:02 +0300 308)         else
f8470165 (kx 2023-04-07 06:34:02 +0300 309)         {
f8470165 (kx 2023-04-07 06:34:02 +0300 310)           action( isalnum( $a ) ? 1 : 3 );
f8470165 (kx 2023-04-07 06:34:02 +0300 311)         }
f8470165 (kx 2023-04-07 06:34:02 +0300 312)       }
f8470165 (kx 2023-04-07 06:34:02 +0300 313)       else
f8470165 (kx 2023-04-07 06:34:02 +0300 314)       {
f8470165 (kx 2023-04-07 06:34:02 +0300 315)         action( 1 );
f8470165 (kx 2023-04-07 06:34:02 +0300 316)       }
f8470165 (kx 2023-04-07 06:34:02 +0300 317)     }
f8470165 (kx 2023-04-07 06:34:02 +0300 318)   }
f8470165 (kx 2023-04-07 06:34:02 +0300 319)   #lats carriage return
f8470165 (kx 2023-04-07 06:34:02 +0300 320)   print $of "\n";
f8470165 (kx 2023-04-07 06:34:02 +0300 321) }
f8470165 (kx 2023-04-07 06:34:02 +0300 322) 
f8470165 (kx 2023-04-07 06:34:02 +0300 323) 
f8470165 (kx 2023-04-07 06:34:02 +0300 324) local $SIG{__WARN__} = sub {
f8470165 (kx 2023-04-07 06:34:02 +0300 325)   my $message = shift;
f8470165 (kx 2023-04-07 06:34:02 +0300 326)   print STDERR "ERROR: " . $message;
f8470165 (kx 2023-04-07 06:34:02 +0300 327)   usage();
f8470165 (kx 2023-04-07 06:34:02 +0300 328) };
f8470165 (kx 2023-04-07 06:34:02 +0300 329) 
f8470165 (kx 2023-04-07 06:34:02 +0300 330) if( ! GetOptions( 'o=s'       => \$ofname,
f8470165 (kx 2023-04-07 06:34:02 +0300 331)                   'output=s'  => \$ofname,
f8470165 (kx 2023-04-07 06:34:02 +0300 332)                   ''          => \$stdio,
f8470165 (kx 2023-04-07 06:34:02 +0300 333)                   'help|h|?'  => sub { usage() },
f8470165 (kx 2023-04-07 06:34:02 +0300 334)                   'version|v' => sub { version() }
f8470165 (kx 2023-04-07 06:34:02 +0300 335)                 )
f8470165 (kx 2023-04-07 06:34:02 +0300 336)   )
f8470165 (kx 2023-04-07 06:34:02 +0300 337) {
f8470165 (kx 2023-04-07 06:34:02 +0300 338)   usage();
f8470165 (kx 2023-04-07 06:34:02 +0300 339) }
f8470165 (kx 2023-04-07 06:34:02 +0300 340) 
f8470165 (kx 2023-04-07 06:34:02 +0300 341) foreach( @ARGV )
f8470165 (kx 2023-04-07 06:34:02 +0300 342) {
f8470165 (kx 2023-04-07 06:34:02 +0300 343)   $last = $_;
f8470165 (kx 2023-04-07 06:34:02 +0300 344) 
f8470165 (kx 2023-04-07 06:34:02 +0300 345)   if( $#ARGV )
f8470165 (kx 2023-04-07 06:34:02 +0300 346)   {
f8470165 (kx 2023-04-07 06:34:02 +0300 347)     usage();
f8470165 (kx 2023-04-07 06:34:02 +0300 348)   }
f8470165 (kx 2023-04-07 06:34:02 +0300 349) 
f8470165 (kx 2023-04-07 06:34:02 +0300 350) # NOTE: The '--' is an option terminator!
f8470165 (kx 2023-04-07 06:34:02 +0300 351) #       So ./script -- - returns last equal to '-'.
f8470165 (kx 2023-04-07 06:34:02 +0300 352) #
f8470165 (kx 2023-04-07 06:34:02 +0300 353) # The $last argument is a ifname by default;
f8470165 (kx 2023-04-07 06:34:02 +0300 354) #
f8470165 (kx 2023-04-07 06:34:02 +0300 355) }
f8470165 (kx 2023-04-07 06:34:02 +0300 356) 
f8470165 (kx 2023-04-07 06:34:02 +0300 357) 
f8470165 (kx 2023-04-07 06:34:02 +0300 358) if( $ifname eq '' && $ofname eq '' && ! $stdio )
f8470165 (kx 2023-04-07 06:34:02 +0300 359) {
f8470165 (kx 2023-04-07 06:34:02 +0300 360)   usage();
f8470165 (kx 2023-04-07 06:34:02 +0300 361) }
f8470165 (kx 2023-04-07 06:34:02 +0300 362) 
f8470165 (kx 2023-04-07 06:34:02 +0300 363) if( $ofname ne '' && $stdio && $last ne '' )
f8470165 (kx 2023-04-07 06:34:02 +0300 364) {
f8470165 (kx 2023-04-07 06:34:02 +0300 365)  # like that:
f8470165 (kx 2023-04-07 06:34:02 +0300 366)  #   ./script -o min.json full.json -
f8470165 (kx 2023-04-07 06:34:02 +0300 367)  #   ./script -o min.json - full.json
f8470165 (kx 2023-04-07 06:34:02 +0300 368)  #
f8470165 (kx 2023-04-07 06:34:02 +0300 369)   print "ERROR: Input file defined twice: as 'stdin' and as a orfinary file '$last'\n";
f8470165 (kx 2023-04-07 06:34:02 +0300 370)   usage();
f8470165 (kx 2023-04-07 06:34:02 +0300 371) }
f8470165 (kx 2023-04-07 06:34:02 +0300 372) else
f8470165 (kx 2023-04-07 06:34:02 +0300 373) {
f8470165 (kx 2023-04-07 06:34:02 +0300 374)   $ifname = $last; $last = '';
f8470165 (kx 2023-04-07 06:34:02 +0300 375) }
f8470165 (kx 2023-04-07 06:34:02 +0300 376) 
f8470165 (kx 2023-04-07 06:34:02 +0300 377) if( $ofname eq '' ) { $ofname = '-'; }
f8470165 (kx 2023-04-07 06:34:02 +0300 378) if( $ifname eq '' ) { $ifname = '-'; }
f8470165 (kx 2023-04-07 06:34:02 +0300 379) if( $ifname eq '-' ) { $if = *STDIN; }  else { open( $if, "< $ifname" ); }
f8470165 (kx 2023-04-07 06:34:02 +0300 380) if( $ofname eq '-' ) { $of = *STDOUT; } else { open( $of, "> $ofname" ); }
f8470165 (kx 2023-04-07 06:34:02 +0300 381) 
f8470165 (kx 2023-04-07 06:34:02 +0300 382) 
f8470165 (kx 2023-04-07 06:34:02 +0300 383) jsmin();
f8470165 (kx 2023-04-07 06:34:02 +0300 384) 
f8470165 (kx 2023-04-07 06:34:02 +0300 385) 
f8470165 (kx 2023-04-07 06:34:02 +0300 386) close $if;
f8470165 (kx 2023-04-07 06:34:02 +0300 387) close $of;
f8470165 (kx 2023-04-07 06:34:02 +0300 388) 
f8470165 (kx 2023-04-07 06:34:02 +0300 389) exit 0;