package dpl::tex;

use dpl;
use Data::Dumper;

$VERSION = 0.02;

our $met;

sub mkdicthtml {
  my $filename= shift;
  my $outfilename= shift;

  my $d1 = dpl::opendb($filename);

  open(G,"LC_ALL=pt_PT sort -f $filename.wrdlst|") or die("cant open $filename\n");
  open(O,"> $outfilename") or die("cant create $outfilename\n");
  binmode(O,":utf8");

  $met = $d1->{meta};
#  my $intr = $met->{introduction};
#  $intr =~ any2html($intr);
  my $agr = $d1->{h}{'_agradecimentos'}[0]{sem};

  print O "
<html>
<head><meta charset='utf-8'/>
<style>
   dl   {margin:0px;       padding:0pt; }
   ul   {margin:0px;       padding:0pt; }
   div  {margin:0px;       padding:0pt; }
   .term{margin-top: 10px; padding:2px ;font-size: 120%; color: red;  }
   .inf {margin-left:20px; padding:0pt; }
</style> </head>
<body>
<h2>$met->{'title'}</h2>
<h3>",((ref($met->{author}) eq "HASH")?
	    $met->{author}{name}:
	    join(" and ",map { $_->{name} } @{$met->{author}})),
	      "</h3>\n", $met->{"introduction"},
"
<h3>Estrutura das entradas</h3>
",
any2html( $met->{"skell"}, 0),

"\n <h3>Lista de colaboradores</h3>
",
join(";\n",@$agr),
"<hr/> "; 

  $fl="";
  while(<G>){
      chomp();
      next if /^!/;
      next if /^_agradecimentos/;
      if(/([a-záéíóúàÁÉÍÓÚ0-9])/i and $fl ne n($1)){$fl = n($1);
					       print O "<h1 class='bigletterc'>$fl</h1>\n";}
      my $tn = firstchoice($_);
      my $tn2 = ($_ =~ s/\*//gr);
      if($tn eq $tn2){
         print O "<div class='entry'>
             <div class='term'>",any2html($tn),"</div>
             <div class='inf'>", 
                 join("\n &loz; ", 
                     map{any2html($_)} @{$d1->{h}{$_}}) ,
            "</div></div>\n";
         }
      else {
         my $ori=$_;
         print O "<div class='entry'>
             <div class='term'>",any2html($tn),"</div>
             <div class='inf'>", 
                 join("\n &bullet; ", 
                   map{any2html({%{$_},patt=>$ori})} @{$d1->{h}{$_}}) ,
            "</div></div>\n";
         }
  }

  print O "</body>\n</html>\n"
}

sub any2html {
   my ($r,$i)= @_;
   my $ind = ($i >= 0)? (" " x $i) : "";
   if (ref($r) eq "HASH" )
      {if (%$r){ 
         "<dl>". hash2html($r,abs($i)+3) . "</dl>\n" }
       else {""}
      }
   elsif (ref($r) eq "ARRAY")
      { if (@$r){ "<ul>\n<li>" . 
          join("</li>\n<li>", map (any2html($_,abs($i)+3), @$r)) . 
          "</li>\n</ul>\n" }
       else {""}
      }
   else {
      $r =~ s/\+daci!(.*?)!(.*?)!/$1/g; 
      $r =~ s!''(.{3,30}?)''!<i>$1</i>!g;    #emph
      $r =~ s!_(.{3,30}?)_!<u>$1</u>!g; 
      $r =~ s!\n\n+!\n<br/>\n!g;
#      $r =~ s/_+/\\_/g; 
#      $r =~ s!\|!\/!g; 
#      $r =~ s/<p>/\n\n/g; 
#      $r =~ s/<b>/\\textbf{/g; 
#      $r =~ s!</b>!}!g; 
#      $r =~ s/~/\\~{ }/g; 
        "$ind$r"
      #  "$r"
   }
}

sub hash2html{
  my($r,$i)=($_[0],$_[1]);
  my $c="";
  my $a;

  for $a (sort_keys(keys %$r)) {
    if ($a eq "sem") {
      if (ref($r->{sem}) eq "ARRAY"){
        for(@{$r->{sem}}){
           $c .= "\n<dt>&bullet; " . any2html($_,-1). "</dt>\n"} 
      }
      else {
        $c .= "\n<dt>" . any2html($r->{sem},-1) ."</dt>\n"
      }
    }
    elsif($a eq "!seq"){
      if (ref($r->{$a}) eq "ARRAY"){
        for(@{$r->{$a}}){
           $c .= "<dt>" . any2html($_,-1) . "</dt>\n"}
      }
    }
    elsif($a eq "syn"){
      my $s = (defined($met->{descs}{$a}))?"$met->{descs}{$a}:":"syn.:";
      $c .= "\n<dt> <i>". any2html($s,-$i). "</i></dt><dd> " .
	      join("; ",( map {any2html(firstchoice($_),-1)} @{$r->{$a}})) .
          "</dd>";
    }
    else{
      # Este $aa é usado para pesquisa no array associativo de descricoes;
      my $aa = ($a=~/^\!/)?$':$a;
      my $s = (defined($met->{descs}{$aa}))?"$met->{descs}{$aa}:":"$a:";
      my $contents = "";
      
      if(ref($r->{$a}) eq "ARRAY" && scalar(@{$r->{$a}}) == 1) {
           $contents = any2html($r->{$a}[0],-$i)}
      else{$contents = any2html($r->{$a},-$i)}
           
      $c .= "\n<dt><i>".  any2html($s,-$i). "</i></dt><dd> $contents</dd>";
    }
  }
  $c;
}

sub sort_keys{ my (@ks)=@_;
  my %ord=(sem=>10, 
           isa=>11,
           syn=>9, 
           ex=> 7, 
           frase => 9, equiv => 8, paraf =>8, 
           adivinha => 7, 
           q =>9, p => 9, r => 8, 
           %{$met->{order}||{}}) ;
  return (sort { ($ord{$b} // 0) <=> ($ord{$a} // 0) or $a cmp $b } @ks)
}

sub offfirstchoice{ my $a=shift;
 while( 0
    or $a =~ s/\|[^()]+/|/g
    or $a =~ s/\|([)]|$)//g
    or $a =~ s/\|[(]/||/g
    or $a =~ s/\*[A-Z]*//g
    or $a =~ s/[()]//g
    or $a =~ s/(\n|\s\s+)/ /g
    or $a =~ s/\s+$|^\s+//g){};
 $a;
}

sub n {
  my $a = uc(shift);
  for ($a) {
    tr/áàãâ/A/;
    tr/ÀÁÃÂ/A/;
    tr/ÉÈÊ/E/;
    tr/éèê/E/;
    tr/ÍÌÎ/I/;
    tr/íìî/I/;
    tr/ÓÒÔÕ/O/;
    tr/óòõô/O/;
    tr/ÚÙÛ/U/;
    tr/úùû/U/;
    tr/çÇ/C/; 
    s/./#/ unless /[A-Z]/;
  }
  return $a;
}

1;
__END__
