Blame scripts/collapse-br

Packit f574b8
#!/usr/bin/env perl
Packit f574b8
# $LynxId: collapse-br,v 1.8 2017/07/04 19:35:45 tom Exp $
Packit f574b8
# Generate a series of HTML files containing a mixture of text and 
tags,
Packit f574b8
# comparing dumps of those to w3m and elinks.
Packit f574b8
Packit f574b8
use warnings;
Packit f574b8
use strict;
Packit f574b8
use diagnostics;
Packit f574b8
Packit f574b8
$| = 1;
Packit f574b8
Packit f574b8
use Getopt::Std;
Packit f574b8
use File::Temp qw/ tempdir /;
Packit f574b8
Packit f574b8
our ( $opt_C, $opt_T, $opt_e, $opt_l, $opt_p, $opt_t, $opt_w );
Packit f574b8
our $tempdir = tempdir( CLEANUP => 1 );
Packit f574b8
Packit f574b8
sub dumpit($$) {
Packit f574b8
    my $prog = shift;
Packit f574b8
    my $html = shift;
Packit f574b8
    my $opts = "-dump";
Packit f574b8
    $html =
Packit f574b8
        "<html>"
Packit f574b8
      . "<head><title>T</title></head>"
Packit f574b8
      . "<body>$html</body>"
Packit f574b8
      . "</html>"
Packit f574b8
      if ($opt_t);
Packit f574b8
    my @result;
Packit f574b8
    if ( $prog =~ /lynx$/ ) {
Packit f574b8
        my $name = "$tempdir/lynx.cfg";
Packit f574b8
        $opts .= " -cfg=$name";
Packit f574b8
        open my $fh, ">$name";
Packit f574b8
        printf $fh "collapse_br_tags:%s\n", $opt_C ? "false" : "true";
Packit f574b8
        printf $fh "trim_blank_lines:%s\n", $opt_T ? "false" : "true";
Packit f574b8
        close $fh;
Packit f574b8
    }
Packit f574b8
    if ($opt_p) {
Packit f574b8
        $opts .= " -stdin"       if ( $prog =~ /lynx$/ );
Packit f574b8
        $opts .= " -force-html"  if ( $prog =~ /elinks$/ );
Packit f574b8
        $opts .= " -T text/html" if ( $prog =~ /w3m$/ );
Packit f574b8
        if ( open my $fh, "echo '$html' | $prog $opts |" ) {
Packit f574b8
            @result = <$fh>;
Packit f574b8
            close $fh;
Packit f574b8
        }
Packit f574b8
    }
Packit f574b8
    else {
Packit f574b8
        my $name = "$tempdir/foobar.html";
Packit f574b8
        open my $fh, ">$name";
Packit f574b8
        printf $fh "%s", $html;
Packit f574b8
        close $fh;
Packit f574b8
Packit f574b8
        $opts .= " $name";
Packit f574b8
        if ( open my $fh, "$prog $opts |" ) {
Packit f574b8
            @result = <$fh>;
Packit f574b8
            close $fh;
Packit f574b8
        }
Packit f574b8
    }
Packit f574b8
    for my $n ( 0 .. $#result ) {
Packit f574b8
        chomp $result[$n];
Packit f574b8
    }
Packit f574b8
Packit f574b8
    if ( open my $fh, "echo '$html' | $prog $opts |" ) {
Packit f574b8
        @result = <$fh>;
Packit f574b8
        close $fh;
Packit f574b8
        for my $n ( 0 .. $#result ) {
Packit f574b8
            chomp $result[$n];
Packit f574b8
        }
Packit f574b8
    }
Packit f574b8
    $result[0] = "OOPS" unless ( $#result >= 0 );
Packit f574b8
    return @result;
Packit f574b8
}
Packit f574b8
Packit f574b8
sub header($) {
Packit f574b8
    my @cols = @{ $_[0] };
Packit f574b8
    my $text = "";
Packit f574b8
    for my $c ( 0 .. $#cols ) {
Packit f574b8
        $text .= sprintf "%-8s", $cols[$c];
Packit f574b8
    }
Packit f574b8
    printf "\t    %s\n", $text;
Packit f574b8
}
Packit f574b8
Packit f574b8
sub doit() {
Packit f574b8
    my $length = 1;
Packit f574b8
    my $state  = -1;
Packit f574b8
Packit f574b8
    my @tokens;
Packit f574b8
    $tokens[0] = " ";
Packit f574b8
    $tokens[1] = "X";
Packit f574b8
    $tokens[2] = "
";
Packit f574b8
    my $tokens = $#tokens + 1;
Packit f574b8
Packit f574b8
    my @progs;
Packit f574b8
    $progs[ $#progs + 1 ] = "lynx";
Packit f574b8
Packit f574b8
    $progs[ $#progs + 1 ] = "w3m"    if ($opt_w);
Packit f574b8
    $progs[ $#progs + 1 ] = "elinks" if ($opt_e);
Packit f574b8
    $progs[ $#progs + 1 ] = "./lynx" if ( -f "./lynx" );
Packit f574b8
Packit f574b8
    while ( $length <= $opt_l ) {
Packit f574b8
        my $bits  = "";
Packit f574b8
        my $html  = "";
Packit f574b8
        my $value = ++$state;
Packit f574b8
        $length = 0;
Packit f574b8
        while ( $value >= 0 ) {
Packit f574b8
            my $digit  = $value % $tokens;
Packit f574b8
            my $update = ( $value - $digit ) / $tokens;
Packit f574b8
            last if ( ( $update <= 0 ) and ( $value <= 0 ) and $length > 0 );
Packit f574b8
            $bits .= sprintf "%d", $digit;
Packit f574b8
            $length++;
Packit f574b8
            $html .= $tokens[$digit];
Packit f574b8
            $value = $update;
Packit f574b8
        }
Packit f574b8
Packit f574b8
        # skip the non-interesting cases
Packit f574b8
        next if ( $bits =~ /00/ );
Packit f574b8
        next if ( $bits =~ /11/ );
Packit f574b8
        next unless ( $bits =~ /2/ );
Packit f574b8
        printf "%-*s '%s'\n", $opt_l, $bits, $html;
Packit f574b8
        my @listing;
Packit f574b8
        for my $p ( 0 .. $#progs ) {
Packit f574b8
            my @q = &dumpit( $progs[$p], $html );
Packit f574b8
            my $l = $p * 8;
Packit f574b8
            for my $r ( 0 .. $#q ) {
Packit f574b8
Packit f574b8
                $listing[$r] = "" unless ( $listing[$r] );
Packit f574b8
                $listing[$r] = sprintf "%-*s", $l, $listing[$r] if ( $l > 0 );
Packit f574b8
                $listing[$r] .= sprintf "|%s",
Packit f574b8
                  substr( $q[$r] . "........", 0, 7 );
Packit f574b8
            }
Packit f574b8
        }
Packit f574b8
        &header( \@progs );
Packit f574b8
        for my $r ( 0 .. $#listing ) {
Packit f574b8
            printf "\t%2d %s|\n", $r, $listing[$r];
Packit f574b8
        }
Packit f574b8
    }
Packit f574b8
}
Packit f574b8
Packit f574b8
sub main::HELP_MESSAGE() {
Packit f574b8
    printf STDERR <
Packit f574b8
Usage: $0 [options]
Packit f574b8
Packit f574b8
Options:
Packit f574b8
 -C      do not collapse BR-tags (lynx only)
Packit f574b8
 -T      do not trim blank lines (lynx only)
Packit f574b8
 -e      compare with elinks
Packit f574b8
 -l NUM  generate test-cases up to this length (default: 3)
Packit f574b8
 -p      pipe HTML to the program rather than reading a file
Packit f574b8
 -t      add dummy title
Packit f574b8
 -w      compare with w3m
Packit f574b8
Packit f574b8
EOF
Packit f574b8
      ;
Packit f574b8
    exit;
Packit f574b8
}
Packit f574b8
Packit f574b8
&getopts('CTel:ptw') || main::HELP_MESSAGE;
Packit f574b8
Packit f574b8
$opt_l = 3 unless ($opt_l);
Packit f574b8
Packit f574b8
&doi;;
Packit f574b8
Packit f574b8
1;