#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
##
##  htmlfix -- Fixup HTML markup code
##  Copyright (c) 1997-2000 Ralf S. Engelschall, All Rights Reserved. 
##  Copyright (c) 2000 Denis Barbier
##

require 5.003;

BEGIN { $^W = 0; } # get rid of nasty warnings

use lib "/usr/lib/wml/perl/lib";
use lib "/usr/lib/wml/perl/lib/s390-linux-gnu-thread-multi-64int";

use Getopt::Long 2.13;
use Image::Size;
use IO::File 1.06;

#
#   process command line
#
sub usage {
    print STDERR "Usage: htmlfix [options] [file]\n";
    print STDERR "\n";
    print STDERR "Options:\n";
    print STDERR "  -o, --outputfile=<file>  set output file instead of stdout\n";
    print STDERR "  -F, --fix=<fixes>        select which fix to apply\n";
    print STDERR "  -S, --skip=<fixes>       skip specified fixes\n";
    print STDERR "  -v, --verbose            verbose mode\n\n";
    print STDERR "Fixes are a comma separated list of (default is to process them all)\n";
    print STDERR "  imgalt : add ALT attributes to IMG tags\n";
    print STDERR "  imgsize: add WIDTH/HEIGHT attributes to IMG tags\n";
    print STDERR "  summary: add SUMMARY attribute to TABLE tags\n";
    print STDERR "  center : change proprietary CENTER tag to standard DIV tag\n";
    print STDERR "  space  : fix trailing spaces in tags\n";
    print STDERR "  quotes : add missing quotes for attributes and missing '#' character\n           to color attributes\n";
    print STDERR "  indent : indent paragraphs\n";
    print STDERR "  comment: out-comment tags\n";
    print STDERR "  tagcase: perform tag case-conversion\n";
    exit(1);
}
$opt_v = 0;
$opt_o = '-';
$opt_F = 'imgalt,imgsize,summary,center,space,quotes,indent,comment,tagcase';
$opt_S = '';
$Getopt::Long::bundling = 1;
$Getopt::Long::getopt_compat = 0;
if (not Getopt::Long::GetOptions(
    "v|verbose",
    "F|fix=s",
    "S|skip=s",
    "o|outputfile=s")) {
    &usage;
}

sub verbose {
    my ($str) = @_;
    if ($opt_v) {
        print STDERR "** HTMLfix:Verbose: $str\n";
    }
}
sub error {
    my ($str) = @_;
    print STDERR "** HTMLfix:Error: $str\n";
    exit(1);
}
sub warning {
    my ($str) = @_;
    if (not $opt_q) {
        print STDERR "** HTMLfix:Warning: $str\n";
    }
}

#
#   read input file
#
if (($#ARGV == 0 and $ARGV[0] eq '-') or $#ARGV == -1) {
    $in = new IO::Handle;
    $in->fdopen(fileno(STDIN), 'r') || error("cannot load STDIN: $!");
    local ($/) = undef;
    $buffer = <$in>;
    $in->close() || error("cannot close STDIN: $!");
}
elsif ($#ARGV == 0) {
    $in = new IO::File;
    $in->open($ARGV[0]) || error("cannot load $ARGV[0]: $!");
    local ($/) = undef;
    $buffer = <$in>;
    $in->close() || error("cannot close $ARGV[0]: $!");
}
else {
    &usage;
}

#
#   processing loop
#
$bytes = 0;

#
#   Definitions of fixups
#   Some attention has been paid for efficiency in regular expressions,
#   this is why they appear more complicated than needed.
#

#
#   FIXUP 1: add WIDTH/HEIGHT/ALT attributes to <img>-tags
#
sub ProcessImgTag {
    my ($attr) = @_;
    my ($image, $width, $height, $scale);
    my ($Nwidth, $Nheight, $Pwidth, $Pheight);

    if (   $attr =~ m|SRC\s*=\s*"([^"]*)"|is
        or $attr =~ m|SRC\s*=\s*(\S+)|is    ) {
        $image = $1;

        ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
         $atime,$mtime,$ctime,$blksize,$blocks) = stat($image);
        $bytes += $size;

        #   add WIDTH and HEIGHT to speed up display
        $width  = -1;
        $height = -1;
        $scale  =  1;
        if (   $attr =~ m/WIDTH\s*=\s*([0-9%]+|\*)/is
            or $attr =~ m/WIDTH\s*=\s*"([0-9%]+|\*)"/is) {
            $width = $1;
        }
        if (   $attr =~ m/HEIGHT\s*=\s*([0-9%]+|\*)/is
            or $attr =~ m/HEIGHT\s*=\s*"([0-9%]+|\*)"/is) {
            $height = $1;
        }
        if (   $attr =~ s/SCALE\s*=\s*([0-9]+)%//is
            or $attr =~ s/SCALE\s*=\s*"([0-9]+)%"//is) {
            $scale = $1 / 100;
        }
        if (   $attr =~ s/SCALE\s*=\s*([0-9.]+)//is
            or $attr =~ s/SCALE\s*=\s*"([0-9.]+)"//is) {
            $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if ($width  eq '*' or $           $scale = $1;
        }
        if