package dpl::tex;

use dpl;
use Data::Dumper;

$VERSION = 0.02;

our $met;

sub firstchoice{ my $a=shift;
   while($a =~ s/\|.*?(?=[()]|$)//g
      or $a =~ s/\*[A-Z]?//g
      or $a =~ s/[()]//g){};
   $a;
}

sub mkdicttex {
  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");

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

  print O "
\\documentclass[10pt,twocolumn]{book}
\\usepackage[portuges]{babel}
\\usepackage[latin1]{inputenc}

$met->{latex}{package}

\\usepackage{dpl}
\\dgeometry{a4paper,top=2cm,left=2cm,right=2cm,bottom=2cm}
\\makeindex
\\begin{document}
\\title{$met->{'title'}}
\\author{",((ref($met->{author}) eq "HASH")?
	    $met->{author}{name}:
	    join(" \\and ",map { $_->{name} } @{$met->{author}})),
	      "}
\\maketitle
",
any2tex( $met->{"introduction"}, 0),
"
\\section*{Estrutura das entradas}
",
any2tex( $met->{"skell"}, 0),

"\n \\section*{Lista de colaboradores}
",
join(";\n",@$agr),

"
\\newpage
\\parskip 0pt

\\begin{dictionary}
"; 

  $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 "\\bigletterc{$fl}\n";}
      my $tn = firstchoice($_);
      my $tn2 = ($_ =~ s/\*//gr);
      if($tn eq $tn2){
         print O "\\term{",any2tex($tn),"}{", 
           join("\n\\hspace{-2mm}\$\\bullet\$ ", 
                   map{any2tex($_)} @{$d1->{h}{$_}}) ,
           "}\n";
         }
      else {
         my $ori=$_;
         print O "\\term{",any2tex($tn),"}{", 
           join("\n\\hspace{-2mm}\$\\bullet\$ ", 
                   map{any2tex({%{$_},patt=>$ori})} @{$d1->{h}{$_}}) ,
           "}\n";

      }
  }

  print O "\\end{dictionary}
         \\end{document}";

}

sub any2tex {
   my ($r,$i)= @_;
   my $ind = ($i >= 0)? (" " x $i) : "";
   if (ref($r) eq "HASH" )
      {if (%$r){ 
         "\\begin{description}". hash2tex($r,abs($i)+3) . "\\end{description}" }
       else {""}
      }
   elsif (ref($r) eq "ARRAY")
      { if (@$r){ "\\begin{itemize}\n\\item " . 
          join("\n\\item", map (any2tex($_,abs($i)+3), @$r)) . 
          "\n\\end{itemize}\n" }
       else {""}
      }
   else {
      $r =~ s/\+daci!(.*?)!(.*?)!/\\emph{$1}/g; 
      $r =~ s!''(.{3,30}?)''!\\emph{$1}!g; 
      $r =~ s/_(.{3,30}?)_/\\textsc{$1}/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 hash2tex {
  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\\item[\$\\circ\$]" . any2tex($_,-1)} 
      }
      else {
        $c .= "\n\\item[]\\hspace{-2mm}" . any2tex($r->{sem},-1)
      }
    }
    elsif($a eq "!seq"){
      if (ref($r->{$a}) eq "ARRAY"){
        for(@{$r->{$a}}){
           $c .= "\\item[]\\hspace{-2mm}" . any2tex($_,-1)}
      }
    }
    elsif($a eq "syn"){
      my $s = (defined($met->{descs}{$a}))?"$met->{descs}{$a}:":"syn.:";
      $c .= "\n\\item[]\\hspace{-2mm}\\emph{". any2tex($s,-$i). "} " .
	      join("; ",( map {any2tex(firstchoice($_),-1)} @{$r->{$a}}));
    }
    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 = any2tex($r->{$a}[0],-$i)}
      else{$contents = any2tex($r->{$a},-$i)}
           
      $c .= "\n\\item[]\\hspace{-2mm}\\emph{". 
            any2tex($s,-$i). "} $contents";
    }
  }
  $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/; 
    tr/ñÑ/N/; 
    s/./\\#/ unless /[A-Z]/;
  }
  return $a;
}

1;
__END__
