|
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;
|