#!/usr/bin/perl -w
# $Id$
# Dieses Script (latex-formula) wurde von Rdiger Beck erstellt
# Es ist freie Software
# Bei Fehlern wenden Sie sich bitte an mich.
# jeffbeck@web.de  oder  jeffbeck@gmx.de

# thist script reads a vapour-table from coolpack-output
# and converts it to a latex-table

# Bibliotheken
use strict;
use DBI;
use Getopt::Long;
Getopt::Long::Configure ("bundling");
use File::Find;
use coldformix;
# ==========================================================================

# debug 0: final print
# debug 1: show frameboxes 
my $debug=0;


# Choose the Language: de, en
my $lang="de";

# Choose the Unit-System: si_symbol,
my $unit_system = "si_symbol";
my $file="";

my $formula_minipage_open=0;
my $drawing_minipage_open=0;
# ===========================================================================
# Optionen verarbeiten
# ==========================================================================
# Parsen der Optionen
my $testopt=GetOptions(
           "lang|l=s" => \$lang,
           "unit_system|u=s" => \$unit_system,
           "file=s" => \$file
          );


print "Language: $lang \n";
print "Unit_System: $unit_system \n";
if ($file eq ""){
    $file="formula";
}

# Prfen, ob Optionen erkannt wurden, sonst Abbruch
&coldformix::check_options($testopt);


my @exp_symbols=();


#
if (not -e "../coldformix-generated/$lang/latex") {
    system("install -d ../coldformix-generated/$lang/latex");
}


my %symbols  = &coldformix::get_symbols();
my %units  = &coldformix::get_units();
my %trans = &coldformix::get_trans();

#print "Result(units): $units{temperature}{latex_1} \n";
#print "Result(symbols): $symbols{t_evap}{en} \n";



# Standardmssig die erste Einheit whlen
my $number=0;

my $text="";
my $string="";
my $section="";
# zum ausgeben
my $key;
my $value;

my $latex_line="";

my $latex_in  = "../coldformix-source/templates/$file-template.tex";
open(LATEXIN,"<$latex_in");

my $latex_out = "../coldformix-generated/$lang/latex/$file-$lang.tex";
open(LATEXOUT,">$latex_out");

my $drawing_width=0; # width of the drawing and frames
my $drawing_form=0;  # formular number 1,2,3,4,5,6,7,8
my $formula_seen=0;  # is this the second,... formula (1) or not (0)

while(<LATEXIN>){
   print "\n############### This is the line: ############### \n",
         "  $_";
   if(/^\#/){
       next;
   } 
   ########################################
   # DAWINGAWING-tag
   if(/^DRAWING0/ or
      /^DRAWING1/ or
      /^DRAWING2/ or
      /^DRAWING3/ or
      /^DRAWING4/ or
      /^DRAWING5/ or
      /^DRAWING6/ or
      /^DRAWING7/ or
      /^DRAWING8/ or
      /^DRAWING9/
     ){
       my $width; # width of the picture 
       my $frame;
       # open minipage for DRAWING, FORMULA and EXPLAIN
       print LATEXOUT '\begin{minipage}[c]{\textwidth}';
       # remember opened minipage
       $drawing_minipage_open=1;
       if(/^DRAWING0/){
           $drawing_form=0;
           $drawing_width="30";
           $frame="1";
           s/DRAWING0//;
       } elsif(/^DRAWING1/){
           $drawing_form=1;
           $drawing_width="40";
           $frame="1";
           s/DRAWING1//;
       } elsif(/^DRAWING2/){
           $drawing_form=2;
           $drawing_width="50";
           $frame="1";
           s/DRAWING2//;
       } elsif(/^DRAWING3/){
           $drawing_form=3;
           $drawing_width="60";
           $frame="1";
           s/DRAWING3//;
       } elsif(/^DRAWING4/){
           $drawing_form=4;
           $drawing_width="70";
           $frame="1";
           s/DRAWING4//;
       } elsif(/^DRAWING5/){
           $drawing_form=5;
           $drawing_width="80";
           $frame="1";
           s/DRAWING5//;
       } elsif(/^DRAWING6/){
           $drawing_form=6;
           $drawing_width="90";
           $frame="1";
           s/DRAWING6//;
       } elsif(/^DRAWING7/){
           $drawing_form=7;
           $drawing_width="100";
           $frame="1";
           s/DRAWING7//;
       } elsif(/^DRAWING8/){
           $drawing_form=8;
           $drawing_width="110";
           $frame="1";
           s/DRAWING8//;
       } elsif(/^DRAWING9/){
           $drawing_form=9;
           $drawing_width="120";
           $frame="1";
           s/DRAWING9//;
       }
       # extract the filename
       my $eps_file=$_;
       chomp($eps_file);
       $eps_file=~s/^\s+//;
       $eps_file=~s/\s+$//;
       s/$_//;

       $width=$drawing_width-$frame-$frame;
       print LATEXOUT "  % DRAWING$drawing_form OUTER\n";
       print LATEXOUT "  \\begin{minipage}[c]{${drawing_width}mm} % GRAPHIC\n";
       print LATEXOUT "      \\hspace{${frame}mm}%\n",
                      "      \\includegraphics[width=${width}mm]{$eps_file}%\n",
                      "      \\hspace{${frame}mm}\n";
       print LATEXOUT "  \\end{minipage} % GRAPHIC\n";

   }
   ########################################
   # FORMULA-tag
   if(/^FORMULA/ or 
      /^FORMULA2/ or 
      /^FORMULA3/ or 
      /^FORMULA4/ or 
      /^FORMULA5/ or 
      /^FORMULA6/ or
      /^FORMULA01/ or 
      /^FORMULAD3/ or 
      /^FORMULAD4/ or 
      /^FORMULAD5/){
       my $formula_column="67mm"; 
       my $formula_box="45mm";
       my $form=0;
       # open the minipage for FORMULA and EXPLAIN
       if ($formula_seen==0){  
           if ($debug==1){
               print LATEXOUT "\\fbox{\\begin{minipage}[c]",
                              "{\\textwidth-${drawing_width}mm} % FORMULA OUTER\n";
           } else {
               print LATEXOUT "\\begin{minipage}[c]",
                              "{\\textwidth-${drawing_width}mm}\n";
           }
       }
       $formula_seen=1;
       $formula_minipage_open=1;  # remember, that minipage is open
       # settings for 1,2,3,4,5,6
       if(/^FORMULA2/){
           $formula_column="67mm"; 
           $formula_box="55mm";
           $form=2;
           s/FORMULA2//;
       } elsif (/^FORMULA3/){
           $formula_column="67mm"; 
           $formula_box="64mm";
           $form=3;
           s/FORMULA3//;
       } elsif (/^FORMULA4/){
           $formula_column="82mm"; 
           $formula_box="79mm";
           $form=4;
           s/FORMULA4//;
       } elsif (/^FORMULA5/){
           $formula_column="102mm"; 
           $form=5;
           $formula_box="99mm";
           s/FORMULA5//;
       } elsif (/^FORMULA6/){
           $formula_column="146mm"; 
           $form=6;
           $formula_box="143mm";
           s/FORMULA6//;
       } elsif (/^FORMULAD0/){
           $formula_column="76mm"; 
           $form="D0";
           $formula_box="74mm";
           s/FORMULAD0//;
       } elsif (/^FORMULAD1/){
           $formula_column="71mm"; 
           $form="D1";
           $formula_box="69mm";
           s/FORMULAD1//;
       } elsif (/^FORMULAD2/){
           $formula_column="66mm"; 
           $form="D2";
           $formula_box="64mm";
           s/FORMULAD2//;
       } elsif (/^FORMULAD3/){
           $formula_column="61mm"; 
           $form="D3";
           $formula_box="59mm";
           s/FORMULAD3//;
       } elsif (/^FORMULAD4/){
           $formula_column="56mm"; 
           $form="D4";
           $formula_box="54mm";
           s/FORMULAD4//;
       } elsif (/^FORMULAD5/){
           $formula_column="51mm"; 
           $form="D5";
           $formula_box="49mm";
           s/FORMULAD5//;
       } else {
           $form=1;
           s/FORMULA//;
       }

       my $formula=$_;
       my $i=1;
       # Formel Verarbeiten
       # For Symbols, you can use a,b,c,... A,B,C,... 0,1,... and _
       # No blanks
       while ( $formula =~m/<sym>([A-Za-z0-9_]+)<\/sym>/ ) {
           # $1 is the 'name'
	   print "Hit $i:   $1   \n";
           $i++;
           if (defined $symbols{$1}) {
	        my $symbol=$symbols{$1}{$unit_system};
                print "Symbol $1  replaced by $symbol !\n"; 
                $formula=~s/<sym>$1<\/sym>/$symbol/;
	    } else {
                print "Symbol $1 not found in Database!\n";
                $formula=~s/<sym>$1<\/sym>/!!!Symbol not Found!!!/;
            }
       }

       # generate latex-code
       print LATEXOUT "  \\begin{minipage}[c]{$formula_column}",
                      " % FORMULA$form\n",
                      "    \\fbox{\\parbox{$formula_box}{%\n",
                      "      \\begin{eqnarray} \n",
                      "        $formula ",
                      "      \\end{eqnarray}} \n",
                      "    }\n",
                      "  \\end{minipage} % FORMULA$form\n";
  
       if ($form==6){
           # go to a new line
	   print LATEXOUT "\n \\vspace{2ex} \n\n";
       } else {
          # nothing so far
       }

       if ($drawing_form > 5){
           # begin explain minipage in new line with vspace
	   print LATEXOUT "\n  \\vspace{2ex} % DRAWING$drawing_form\n\n";
       }
       next;
   }

   ########################################
   # EXPLAIN-tag
   if(/^EXPLAIN/  or 
      /^EXPLAIN2/ or 
      /^EXPLAIN3/ or 
      /^EXPLAIN4/ or 
      /^EXPLAIN5/ or
      /^EXPLAIN6/ or
      /^EXPLAIND0/ or
      /^EXPLAIND1/ or
      /^EXPLAIND2/ or
      /^EXPLAIND3/ or
      /^EXPLAIND4/ or
      /^EXPLAIND5/ ){
       chomp();
       #print "Explanation for the following symbols needed: \n";
       my $explain_column="118mm"; 
       my $expl=0;
       if(/^EXPLAIN2/){
           $explain_column="119mm";
           $expl=2;
           s/^EXPLAIN2//;
       } elsif (/^EXPLAIN3/){
           $explain_column="119mm"; 
           $expl=3;
           s/^EXPLAIN3//;
       } elsif (/^EXPLAIN4/){
           $explain_column="104mm"; 
           $expl=4;
           s/^EXPLAIN4//;
       } elsif (/^EXPLAIN5/){
           $explain_column="84mm"; 
           $expl=5;
           s/^EXPLAIN5//;
       } elsif (/^EXPLAIN6/){
           $explain_column="\\textwidth-2mm"; 
           $expl=6;
           s/^EXPLAIN6//;
       } elsif (/^EXPLAIND0/){
           $explain_column="81mm";
           $expl="D0";
           s/^EXPLAIND0//;
       } elsif (/^EXPLAIND1/){
           $explain_column="76mm";
           $expl="D1";
           s/^EXPLAIND1//;
       } elsif (/^EXPLAIND2/){
           $explain_column="71mm";
           $expl="D2";
           s/^EXPLAIND2//;
       } elsif (/^EXPLAIND3/){
           $explain_column="66mm";
           $expl="D3";
           s/^EXPLAIND3//;
       } elsif (/^EXPLAIND4/){
           $explain_column="61mm";
           $expl="D4";
           s/^EXPLAIND4//;
       } elsif (/^EXPLAIND5/){
           $explain_column="56mm";
           $expl="D5";
           s/^EXPLAIND5//;
       } else {
           s/^EXPLAIN//;
           $expl=1;
       }

       # override EXPLAIN column
       if ($drawing_form > 5){
           # if EXPLAIN is set under FORMULA, use same width as 
           # right minipage for all EXPLAIN
           $explain_column="\\textwidth-2mm";
       }


       # remove multiple spaces
       s/ +//g; 
       @exp_symbols = split(/[,;]/);

       if ($debug==1){
           print LATEXOUT "  \\fbox{\\begin{minipage}[c]{$explain_column}",
                          " % EXPLAIN$expl\n";
       } else {
           print LATEXOUT "  \\begin{minipage}[c]{$explain_column}",
                          " % EXPLAIN$expl\n";
       }

       if ($expl==6){
          print LATEXOUT "  \\setlength{\\columnsep}{5mm} \n";
          print LATEXOUT "  \\begin{multicols}{2} \n";
       }
       print LATEXOUT "    \\begin{list}{}{ \n",
                      "        \\setlength{\\itemsep}{0.3mm} \n",
                      "        \\setlength{\\labelwidth}{12.8mm} \n",
                      "        \\setlength{\\itemindent}{0mm} \n",
                      "        \\setlength{\\leftmargin}{14.2mm} \n",
                      "        \\setlength{\\labelsep}{1.2mm} \n",
                      "        \\setlength{\\parsep}{0mm} \n",
                      "      } \n";

       foreach my $exp_symbol (@exp_symbols) {
	   print "\n#####  I must explain:  $exp_symbol  #####\n";
           # Extracting n in {n}, if exists
           if ($exp_symbol=~m/{([0-9])}/) {
               $number=$1;
               print "Number of $exp_symbol is $1 \n";
               # Throwing away {n}
               $exp_symbol=~s/\{$number\}//;
               print "Symbol is $exp_symbol \n";
           } else {
               # when not specified, use 0 as standard
               $number=0;
           }
           $latex_line = &explain_symbol($exp_symbol,$number);
           print LATEXOUT "      $latex_line";
       }

       print LATEXOUT "    \\end{list} \n";
       if ($expl==6){
          print LATEXOUT "  \\end{multicols} \n";
       }

       if ($debug==1){
            print LATEXOUT "  \\end{minipage}} % EXPLAIN$expl\n";
       } else {
           print LATEXOUT "  \\end{minipage} % EXPLAIN$expl\n";
       }

       # minipage beenden, falls geffnet durch FORMULA-TAG       
       if ($formula_minipage_open==1){
           if ($debug==1){
               print LATEXOUT "\\end{minipage}} % FORMULA OUTER\n";
           } else {
               print LATEXOUT "\\end{minipage} % FORMULA OUTER\n";
           }
           $formula_minipage_open=0;
       }

       # close minipage, if opened by DRAWING
       if ($drawing_minipage_open==1){
          print LATEXOUT "\\end{minipage} % DRAWING$drawing_form OUTER\n";
          $drawing_minipage_open=0;
       }

       print LATEXOUT "\n\\bigskip \n";

       # reset values after (DRAWING),FORMULA,...,EXPLAIN, ... -Block
       $drawing_width=0;
       $drawing_form=0;
       $formula_seen=0;
       next;
   }

   ########################################
   # INT-tag und alle section-Befehle
   if(/^INT/){
       print "INT-Hit: $_ \n";
       # Remove INT-Tag
       s/^INT//;
       # remove multiple spaces
# wozu?
       #s/ +//g; 
       $text=$_;
#       if ( $text =~m/(.*)section(\*?){(.*)}/ ) {
       if ( $text =~m/(.*)section(\*?){(.*)}{(.*)}/ ) {
           # $1 is the 'name'
	   print "*section-Prefix:   $1   \n";
	   print "*section-Name is:   $3   \n";
	   print "*F T D is:   $4   \n";
           $section=&coldformix::translate($3,$lang,\%trans);
           print "New Section: $section \n";
           $latex_line="$1"."section"."$2"."{"."$section"."}"."{"."$4"."}";
           print LATEXOUT "$latex_line \n";
           next;
       } elsif ($text =~m/(.*)paragraph(\*?){(.*)}/ ){
           # does not work
           # $1 is the 'name'
	   print "*paragraph-Name is:   $3   \n";
           $section=&coldformix::translate($3,$lang,\%trans);
           print "New Paragraph: $section \n";
           $latex_line="$1"."paragraph"."$2"."{"."$section"."}";
           print LATEXOUT "$latex_line \n\n";
           next;
       } else {
	   while ($text =~m/<voc>([\sA-Za-z_]+)<\/voc>/){
              print " Translate: $1","\n"; 
              $string=&coldformix::translate($1,$lang,\%trans);
              $text=~s/<voc>$1<\/voc>/$string/;
           }
           $latex_line="$1"."$text"."$3";
           if ($latex_line=~/^REPLACE/){
                $_=$latex_line;
	  } else {
              print LATEXOUT "$latex_line";
              next;
          }
       }
#       next;
   }


   ########################################
   # REPLACE-tag: replace formula 
   if(/^REPLACE/){
       print "REPLACE-Hit: $_ \n";
       # Remove REPLACE-Tag
       s/^REPLACE//;
       my $replace=$_;
       my $i=1;
       # Code Verarbeiten
       # For Symbols, you can use a,b,c,... A,B,C,... 0,1,... and _
       # No blanks
       while ( $replace =~m/<sym>([A-Za-z0-9_]+)<\/sym>/ ) {
           # $1 is the 'name'
	   print "sym-Hit (Nr. $i):   $1   \n";
           $i++;
           if (defined $symbols{$1}) {
	        my $symbol=$symbols{$1}{$unit_system};
                print "Symbol $1  replaced by $symbol !\n"; 
                $replace=~s/<sym>$1<\/sym>/$symbol/;
	   } else {
                print "Symbol $1 not found in Database!\n";
                $replace=~s/<sym>$1<\/sym>/!!!Symbol not Found!!!/;
           }
       }

       while ( $replace =~m/<unit>([A-Za-z0-9{}_]+)<\/unit>/ ) {
       print "Looking for <unit> in:  $replace \n\n";
           # $1 is the 'name'
           my $unit=$1;
           my $unit_orig=$1;
	   print "unit-Hit (Nr. $i):   $unit_orig   \n";
           $i++;

           if ($unit=~m/{([0-9])}/) {
               $number=$1;
               # Throwing away {n}
               $unit=~s/\{$number\}//;
           } else {
               # when not specified, use 0 as standard
               $number=0;
           }

           my $unit_db = &explain_unit($unit,$number);
           # escape { and } in original line
           $unit_orig=~s/\}/\\\}/s;
           $unit_orig=~s/\{/\\\{/s;
	   print "replace: --$replace-- \n";
	   print "unit_orig: --$unit_orig-- \n";
	   print "unit:      --$unit-- \n";
	   print "number:    --$number-- \n";
	   print "unit_db:   --$unit_db-- \n";

           $replace=~s/<unit>$unit_orig<\/unit>/$unit_db/;
           print "$replace \n";

       }
       print LATEXOUT $replace,"\n";
       next;
   }


   ########################################
   # Lines without tags: Do Nothing
   print LATEXOUT "$_";
}

close LATEXIN;
close LATEXOUT;

print "\nCreated file:\n",
      "   $latex_out\n\n";





############################################################
# SUB
############################################################
sub explain_unit {
    my ($name,$number) = @_;
    my $latex_column = "latex_"."$number";
    my $unit = $units{$name}{$latex_column};
    return $unit;
}



sub explain_symbol {
    my ($name,$number) = @_;
    # type=0: return line
    # type=1: return unit only
    my $lang_column = "$lang";
    my $latex_column = "latex_"."$number";
    my $description="";
    my $latex_line="";
    if (not defined $symbols{$name}{$lang_column}
        or $symbols{$name}{$lang_column} eq ""){
	$description = "\\textcolor{red}{$symbols{$name}{'de'}(de)}";
	print "Not defined!\n"; 
    } else {
	$description = $symbols{$name}{$lang_column};
    }
    my $unit = $units{$symbols{$name}{'unit'}}{$latex_column};
    print "Looking in column $lang_column for explanation of $name \n";
    print "-> Hit:  $symbols{$name}{$lang_column} \n";
    print "Basic unit of $name is ->  $symbols{$name}{'unit'}\n";
    print "Unit in latex_$number  is ->  $unit \n";
    $latex_line = "\\item [\$$symbols{$name}{$unit_system}\$]:".
                      " $description in \$ $unit \$\n";
    return $latex_line;
}



