#!/usr/bin/perl

use HTML::Parser;

$|=1;
#=============================
#
#      SUB's


sub usage {
    print "usage:\n
pas encore clair...
";
} 



#===== mieux que getopts
sub getArgs {
    my @args=@_;
    my $oldKey="";
    my %opts=();
    for $el (@args) {
	if ($el=~/^-/) {
	    $el=~s/-+//g;
	    $opts{$el}="";
	    $oldKey=$el;
	}
	else {
	    $opts{$oldKey}=$el;
	}
    }
    return %opts;
}
#=============================


# ============  HANDLERS ================

sub pushpop {
    push(@elt,$_[0]);
    push(@elt,$_[1]);
}    

$handle_start=sub {    #Start Handler
#    my $parser=shift;
    my $name=shift;
    my $ref_attr=shift;

	$depth++;

	$ref_attr->{"NO"}=$depth;
	if ($name=~/\/$/) {
		$name=substr($name,0,-1);
	}
    my $strArgs="\\n ";
	if (!$notext) 
	{
		for $key (keys(%{$ref_attr})) {
			$strArgs.="$key => ".substr($ref_attr->{$key},0,15)."\\n";
		}
		$strArgs=~s/\"/\\\"/g;
	} else {
		$strArgs="";
	}
	#print STDERR "looking $name whith $strArgs\n";
    $parentElt=pop @elt;
    $thisElt=$name."_$depth";
    print OUT "\"$parentElt\" -> \"$thisElt\" ;\n";
    if ($name =~ /(table)/i) {
		$compteur++;
		print OUT "subgraph \"cluster_$name$depth\" {\n" ;
		$inTable=1;
    }
    print OUT "\"$thisElt\" [ label=\"$name $strArgs\" ];\n";
    &pushpop($parentElt,$thisElt);
	if ($alone{uc($name)}) {
		pop @elt;
	}
};

$handle_end=sub {    #End Handler
#    my $parser=shift;
    my $name=shift;
    my %attr=@_;
	my @tmpElt=@elt;
	$depth++;
    do {
		$parentElt=pop @tmpElt;
	} while (($parentElt !~ /$name/) && ($#tmpElt>=0));

	if ($#tmpElt>=0) {
		print OUT "\"$parentElt\" -> \"$parentElt\" ;\n" ;
		@elt=@tmpElt;
	} else {
		# pas de parent
		pop @elt;
	}
    if ($name =~ /(table)/i) {
		$compteur--;
		print OUT "}\n" ;
    }
};



#==========================
# MAIN


#------------------------
#                       |
#Gestion des entrées :
my %opts=();
%opts=getArgs(@ARGV);

if((exists $opts{h}) || (exists $opts{help})) {
    &usage();
    exit 0;
}

if (exists $opts{f}) {
    $file=$opts{f};
} else {
    &usage();
    exit 0;
}

if (exists $opts{o}) {
    $output=$opts{o};
} else {
    $output="";
}

if (exists $opts{nt}) {
    $notext=1;
} else {
    $notext=0;
}
#                       |
#------------------------


#------------------------
#                       |
#Initialisation:

if ($output) {
    open(OUT,">$output");
    *STDOUT=*OUT;
}
@elt=qw( HTML );
$ecart="    ";
%alone=qw{IMG 1 INPUT 1 OPTION 1 BR 1 HR 1 META 1 FRAME 1 LINK 1 PARAM 1};
$compteur=0;

print OUT "digraph HTML {\n";
print OUT "node [ shape=box ];\n";

$toto = HTML::Parser->new(api_version=>3,
							  start_h => [$handle_start,"tagname,attr"],
							  end_h   => [$handle_end,"tagname"]
							  );
$toto->parse_file($file);
while ($compteur) {
	print OUT "}\n";
	$compteur--;
}

print OUT "}\n";
close OUT if ($output);



#=================================
#
#         End Main
#
#=================================




