# $Id: am2html.pl,v 1.2 2000/08/21 18:45:01 tomek Exp $
################################################################
# Konwersja DocBook ARTICLE -> html
# Autor skryptu: Tomasz Przechlewski ***
# Data: 17/07/2000 ** Ostatnia poprawka: 18/08/2000
#######################

use SGMLS; # Use the SGMLS package.
use SGMLS::Output; # Use stack-based output.
use SGMLS::Refs; #

my $GawkExSym = "*"; # oznaczenie rozszerzeń gawk-a
$ExTableSpecs='BORDER="0" WIDTH="100%" BGCOLOR="#E0E0E0"';
$example_id = 0; 

#
# Document Handlers.
#
sgml('start',sub { 
   $Refs = new SGMLS::Refs('awk-man.refs'); 
   $toc_contents = $Refs -> get('ToC'); 
});

sgml('end', sub { $Refs->warn; });

# ///////////////////////////////////////////////////////////////
#                     Element Handlers
# ///////////////////////////////////////////////////////////////
# Element: ARTICLE
# ** Nazwiska autor/ow skromnie na ko/ncu **
sgml('<ARTICLE>', sub { output ("<html>\n<head>\n"); });

sgml('</ARTICLE>', sub {
    #output ("\n<HR><P><i>$signature</i><P>\n");
    output ("<p><hr><p>Copyright (C) $copyright</p>");
    output ("$legalnotice");
    output ("</body></html>");
});

# Element: ARTHEADER
sgml('<ARTHEADER>', "");

sgml('</ARTHEADER>', sub {
  output "<TITLE>$documenttitle</TITLE>";
  output '<META HTTP-EQUIV="content-type" content="text/html; charset=iso-8859-2">';
  output "\n<STYLE type=\"text/css\">";
  output " P.gawk {background: green}";
  output "</STYLE>\n";
  output "\n</head>\n<body>\n";

  if (defined $bibliomisc) { output ("<H1>$documenttitle*</H1>") }
  else { output ("<H1>$documenttitle</H1>") }

  # Drukujemy autorów zapamiętanych w tablicy authors
  # jednocześnie tworzony jest napis $signature zawierający w/w
  # dane do późniejszego wykorzystania

  # Drukowanie imion/nazwisk autorów:
  my $i;

  for ( $i=0; $i <= $#authors; $i++ ) { 
     my $a = ${$authors[$i]}{'firstname'}  . ' ' . ${$authors[$i]}{'surname'};
     my $e = ${$authors[$i]}{'email'};
     output ("<B>$a</B>\n");
     $signature .= "<A HREF=\"MAILTO:$e\">$a</A>\n";
  }

  if (defined $bibliomisc) { output ("<P>[*$bibliomisc]</P>\n") }
  output("<P><HR><P>\n");

  @authors=(); # zawartość tablicy już niepotrzebna
  undef $articletitle; # ditto, tytuł artykułu...
  undef $bibliomisc;  # ditto, podziękowania itp...

  #
  # Wstawiamy spis treści
  #
  $toc_contents =~ s#</s1><s1>#</li>\n<li>#gs;
  $toc_contents =~ s#</s2><s2>#</li>\n\t<li>#gs;
  $toc_contents =~ s#</s3><s3>#</li>\n<li>#gs;
  $toc_contents =~ s#</s1><s2>#</li>\n<ul><li>#gs;
  $toc_contents =~ s#</s2><s1>#</li></ul>\n<li>#gs;
  $toc_contents =~ s#</s2><s3>#</li>\n<ul><li>#gs;
  $toc_contents =~ s#</s3><s2>#</li></ul>\n<li>#gs;
  #
  $toc_contents =~ s#^<s[0-9]>#<li>#g;
  $toc_contents =~ s#</s[0-9]$>#</li>#g;
  #
  output "<h2>Spis treści</h2><ul>\n";
  output "$toc_contents\n";
  output "</ul>\n";

  output("<P><HR><P>\n");
});


# ///////////////
# Element: TITLE. Z elementem 'TITLE' jest ten problem, że sposób jego
# formatowania zależy od kontekstu. Inaczej formatujemy tytuł
# rozdziału a inaczej tytuł przykładu, itp...
#

sgml('<TITLE>', \&push );

sgml('</TITLE>', sub {
    my $element=shift;
    my ($t, $t_toc);

    $t = pop_output;
    $t_id = $element->parent->attribute('ID')->value;

    $_ = $element->parent->name;
    $title_id++;

    if ( $t_id ) { $true_title_id = $t_id }
    else { $true_title_id = "title$title_id" };

  TITLE: {
      /ARTHEADER/ and do { $documenttitle=$t; last TITLE };
      /SECT1/ and do { 
          $Refs-> put("$t_id", $t) if $t_id; ## DODANE !
#          $t_toc =  "<s1><A HREF=\"#title$title_id\">$t</A></s1>";
#          $t="\n<A NAME=\"title$title_id\"><h1>$t</h1>\n"; 
          $t_toc =  "<s1><A HREF=\"#$true_title_id\">$t</A></s1>";
          $t="\n<A NAME=\"$true_title_id\"><h1>$t</h1>\n"; 
          output $t;
          last TITLE };
      /SECT2/ and do { 
          $Refs-> put("$t_id", $t) if $t_id; ## DODANE !
          #$t_toc =  "<s2><A HREF=\"#title$title_id\">$t</A></s2>";
          #$t="\n<A NAME=\"title$title_id\"><h2>$t</h2>\n";
          $t_toc =  "<s2><A HREF=\"#$true_title_id\">$t</A></s2>";
          $t="\n<A NAME=\"$true_title_id\"><h2>$t</h2>\n"; 
          output $t;
          last TITLE };
      /SECT3/ and do { 
          $t_toc =  "<s3><A HREF=\"#title$title_id\">$t</A></s3>";
          $t="\n<A NAME=\"title$title_id\"><h3>$t</h3>\n"; 
          output $t;
          last TITLE };
      /FIGURE/ and do { 
          my $num = &counter($_);
          $t="\n{\\smallskip\\centerline{Rys. $num. $t}}\n";
          $figcap=$t; undef $t;
          output $t;
          last TITLE };
      /EXAMPLE/ and do { 
          # Licznik $example_id jest zwiększany po napotkaniu
          # nadrzędnych elementów EXAMPLE/INFORMALEXAMPLE
          my $example_title = "$example_id [$t]";
          $Refs-> put("$t_id", $example_title);
          $t="<A NAME=\"$t_id\">\n<h4>Przykład $example_id: $t</h4>\n";
          output $t;
          last TITLE };
      /VARIABLELIST/ and do { 
           $t="<HR><B>$t</B><HR>\n"; output $t;
           last TITLE };
      /TABLE/ and do { 
               $tabletitle = $t;  last TITLE };
      /BIBLIOENTRY/ and do { 
          # Tytuł jest drukowany po napotkaniu `/BIBLIOENTRY'
          # Tutaj go tylko zapamiętujemy
          $booktitle =$t; 
          last TITLE };
      /BIBLIOSET/ and do { 
          my $what = $element->parent->attribute(RELATION)->value;
      
          $articletitle = $t if ($what eq 'article');
          $journaltitle = $t if ($what eq 'journal');
          last TITLE }
  }

    $t_to_toc .= $t_toc; # Wpisy do spisu tre/sci /l/aczymy w jeden napis
    chomp($t_to_toc); # Na wszelki wypadek obcinamy koniec wiersza

    $Refs-> put('ToC',$t_to_toc);
});


# Bibliografia i odsyłacze bibliograficzne /////////////////
#
sgml('<CITATION>', \&push);

sgml('</CITATION>', sub{
    my $element = shift;
    my $bib = pop_output;
    output("<A HREF=\"#$bib\">$bib</A>");
});

sgml('<BIBLIOGRAPHY>', sub { 
    output ("\n<h1>Bibliografia</h1>\n"); 
    output ("<dl>\n"); });

sgml('</BIBLIOGRAPHY>', sub { output "</dl>\n";  }); 

sgml('<BIBLIOENTRY>', sub {
    my $element = shift;
    my $label = $element ->attribute('XREFLABEL')->value;
    output ("<A NAME=\"$label\"><dt>$label</dt><dd>\n")
 });

sgml('</BIBLIOENTRY>', sub {
    my $i;
    # Autorzy
    for ( $i=0; $i <= $#authors; $i++ ) { 
      my $a = ${$authors[$i]}{'surname'}  . ' ' . ${$authors[$i]}{'firstname'};
      my $e = ${$authors[$i]}{'email'};
      if ( $i < $#authors ) { output ("$a,\n"); }
      else { output ("$a:\n"); }
    }
    # Formatowanie pozycji typu: książka
    if ($booktitle) {
      output("<I>$booktitle</I>");
      output(",\n$publishername") if $publishername;
  
      if ($pubdate && $publishername) { output("\n$pubdate")  }
      else { if ($pubdate ) {output(",\n$pubdate") } }

      output(",\n$bibliomisc") if $bibliomisc;
      output(".\n");
    }
    # Formatowanie pozycji typu: artykuł
    if ($articletitle ) {
      output("$articletitle, <I>$journaltitle</I>");
  
    if ($volumenum && $pubdate) { output("\n$volumenum/$pubdate")  }
    else { if ($pubdate ) {output(",\n$pubdate") } }

    output(",\ns.&nbsp;$pagenums") if $pagenums;
    output(",\n$bibliomisc") if $bibliomisc;
    output(".\n");

  }
  
  @authors=(); # tablica jest już niepotrzebna

  undef $booktitle;
  undef $publishername;
  undef $pubdate;
  undef $bibliomisc;

  undef $articletitle;
  undef $journaltitle;

  undef $pagenums;
  undef $volumenum;

});

sgml('<AUTHOR>', "");

sgml('</AUTHOR>', sub {
  push(@authors, {'surname'  => $surname,
                  'firstname' => $firstname,
                  'email'     => $email} );
});

sgml('<AUTHORGROUP>', \&push);
sgml('</AUTHORGROUP>', \&getcontents);

sgml('<FIRSTNAME>', \&push);
sgml('</FIRSTNAME>', \&getcontents);

sgml('<CORPAUTHOR>', \&push);
sgml('</CORPAUTHOR>', \&getcontents);

sgml('<EDITION>', \&push);
sgml('</EDITION>', \&getcontents);

sgml('<PUBLISHERNAME>', \&push);
sgml('</PUBLISHERNAME>', \&getcontents);

sgml('<OTHERNAME>', \&push);
sgml('</OTHERNAME>', \&getcontents);

sgml('<SURNAME>', \&push);
sgml('</SURNAME>', \&getcontents);

sgml('<PUBDATE>', \&push);
sgml('</PUBDATE>', \&getcontents);

sgml('<VOLUMENUM>', \&push);
sgml('</VOLUMENUM>', \&getcontents);

sgml('<PAGENUMS>', \&push);
sgml('</PAGENUMS>', \&getcontents);

sgml('<DATE>', \&push);
sgml('</DATE>', \&getcontents);

sgml('<ADDRESS>', \&push);
sgml('</ADDRESS>', \&getcontents);

sgml('<CITY>', \&push);
sgml('</CITY>', \&getcontents);

sgml('<EMAIL>', \&push);
sgml('</EMAIL>', \&getcontents);

sgml('<LEGALNOTICE>', \&push);
sgml('</LEGALNOTICE>', \&getcontents);

sgml('<COPYRIGHT>', \&push);
sgml('</COPYRIGHT>', \&getcontents);

sgml('<HOLDER>', \&push);
sgml('</HOLDER>', sub { 
   my $element=shift;
   my $holder =pop_output;
   if ($element->within(COPYRIGHT) ) { output "$holder\n"; } });

sgml('<YEAR>', \&push);
sgml('</YEAR>', sub { 
    my $element=shift;
    my $y =pop_output;
    if ($element->within(COPYRIGHT) ) { output "$y\n"; } });

sgml('<ISSN>', \&push);
sgml('</ISSN>', \&getcontents);

sgml('<BIBLIOMISC>', sub { my $element=shift;
    my $parent=$element->parent->name;  push_output 'string';} );

sgml('</BIBLIOMISC>', sub { my $element=shift; 
    $bibliomisc = pop_output;});

# Różne //////

sgml('<PARA>', sub{
    my $element = shift;
    $para_num++;
    # -- Wewnątrz przypisu pierwszy <P> musi zniknąć --
    if (($element->within(FOOTNOTE) || $element->within(NOTE)) && 
	$para_num == 1) { ;
    } else { output "\n</P>\n"; }
});

sgml('</PARA>', sub{
    my $element = shift;
    # ** W przypisach/notkach nic na końcu nie stawiamy ***
    if ($element->within(FOOTNOTE) || $element->within(NOTE)) { ; }
    else { output "\n</P>\n"; }
});

sgml('<NOTE>', sub { undef $para_num; output ("<P><B>Uwagi</B>:\n"); });
sgml('</NOTE>', sub { output ("</P>\n"); });

sgml('<FOREIGNPHRASE>', "ang. <I>");
sgml('</FOREIGNPHRASE>', "</I>");

sgml('<EMPHASIS>', "<em>");
sgml('</EMPHASIS>', "</em>");

# Różne typu BLOCK

#
# *** Elementy EXAMPLE oraz INFORMALEXAMPLE **
# Element INFORMALEXAMPLE nie zawiera elementu `TITLE'
# Element: EXAMPLE
sgml('<EXAMPLE>', sub{ 
   my $element = shift;
   my $id = $element ->attribute('ID')->value;
   output ("<div class=example>");
   output ("<name=\"$id\">") if $id;
   output ("<TABLE $ExTableSpecs><tr><td>\n");
   $example_id++; # numer kolejnego przykładu, por. `INFORMALEXAMPLE'
 });
sgml('</EXAMPLE>', "</td></tr></table></div>"); 
#
# Element: INFORMALEXAMPLE
sgml('<INFORMALEXAMPLE>', sub{ 
   my $element = shift;
   my $id = $element ->attribute('ID')->value;
   output ("<div class=example>");
   output ("<name=\"$id\">") if id;
   output ("<table $ExTableSpecs><tr><td>\n");
   output ("<h4>Przykład $example_id</h4>\n"); # Nie ma tytułu
   $example_id++; # numer kolejnego przykładu, por. `EXAMPLE'
 });
sgml('</INFORMALEXAMPLE>', "</td></tr></table></div>"); 

# Element: LITERAL
sgml('<LITERALLAYOUT>', "<pre>");
sgml('</LITERALLAYOUT>', "</pre>");

# Element: PROGRAMLISTING 
sgml('<PROGRAMLISTING>', "<PRE>");
sgml('</PROGRAMLISTING>', "</PRE>");

# Skorowidz ///////////////////////

sgml('<INDEX>', sub { push_output 'nul' });
sgml('</INDEX>', \&pop_output );

sgml('<INDEXTERM>', sub {push_output 'nul' });
sgml('</INDEXTERM>', \&pop_output ); 

# Wyliczanki ///////////////////////

sgml('<VARIABLELIST>', "<dl>\n");
sgml('</VARIABLELIST>', "</dl><HR>\n");

sgml('<VARLISTENTRY>', "<dd>\n");
sgml('</VARLISTENTRY>', "</dd>\n");

sgml('<TERM>', "<dt>\n");
sgml('</TERM>', "</dt>\n");

sgml('<LISTITEM>', sub {
    my $element=shift;
    my $parent=$element->parent->name;
    if ($parent ne 'VARLISTENTRY') { output "<li>"; }
});

#sgml('</LISTITEM>', "</li>\n");

sgml('<ITEMIZEDLIST>', "<ul>\n");
sgml('</ITEMIZEDLIST>', "</ul>\n");

sgml('<ORDEREDLIST>', "<ol>\n");
sgml('</ORDEREDLIST>', "</ol>\n");

# Elementy składane imitacją pisma maszynowego  ///////////////
#
sgml('<OPTION>', \&push);
sgml('</OPTION>', \&print_verbatim);

sgml('<COMMAND>', \&push);
sgml('</COMMAND>', \&print_verbatim);

sgml('<LITERAL>', \&push);
sgml('</LITERAL>', \&print_verbatim);

sgml('<VARNAME>', \&push ); 
sgml('</VARNAME>', \&print_verbatim); 

sgml('<FUNCTION>', \&push );
sgml('</FUNCTION>', \&print_verbatim); 

sgml('<FILENAME>', \&push );
sgml('</FILENAME>', \&print_verbatim );

sgml('<APPLICATION>', \&push );
sgml('</APPLICATION>', \&print_verbatim );

    # USERINPUT jest zawsze wewnątrz LITERAL albo PROGRAMLISTING
    # nie wymaga zatem żadnego dodatkowego formatowania
sgml('<USERINPUT>', "");
sgml('</USERINPUT>', "");

sgml('<PARAMETER>', "<");
sgml('</PARAMETER>', ">");

    # Zakładamy, że `REPLACEABLE' i `OPTIONAL' występują zawsze
    # wewnątrz elementów składanych ,,verbatim''
sgml('<REPLACEABLE>', "<I>");
sgml('</REPLACEABLE>', "</I>");

sgml('<OPTIONAL>', sub { output ("["); });
sgml('</OPTIONAL>', sub {  output ("]"); });

# Przypisy i odsyłacze

# Element: ULINK
sgml('<ULINK>', sub {
   my $element = shift;
   #my $uri = $element ->attribute('URL')->value;
   #output "<a href=\"$uri\">" if $uri;
   $uri = $element ->attribute('URL')->value;
   &push;
});
#sgml('</ULINK>', "</a>")
sgml('</ULINK>', sub{
   my $uritext =pop_output;
   $uritext =~ s/^[ \t\n]$//gs; # usuń wszystkie odstępy
   if ($uritext eq '') { output "<a href=\"$uri\">$uri</a>" }
   else { output "<a href=\"$uri\">$uritext</a>" }
});

sgml('<XREF>', sub {
   my $element = shift;
   my $uri = $element ->attribute('LINKEND')->value;
   my $uritext = $Refs-> get($uri);
   output "<A HREF=\"#$uri\">$uritext" if $uri;
});
sgml('</XREF>', "</A>");

# Element: LINK
sgml('<LINK>', "<a>");
sgml('</LINK>', "</a>");

# Element: FOOTNOTE
sgml('<FOOTNOTE>', sub{ 
   undef $para_num;
   output "\n["; 
});
sgml('</FOOTNOTE>', sub{  output "]";  }); 


# TABELE //////////////////////////////////
#
# -- Zrobić formatowanie tabel ---
#
sgml('<TABLE>', sub { my $element = shift;
    push @current_id_stack, $current_id;
    $current_id = lc($element->attribute(ID)->value || gen_id());
    $table_counter++;
    $Refs->put("xref:$current_id",$table_counter);
});
sgml('</TABLE>', sub { output "\n";
    $current_id = pop @current_id_stack;
});

#
# Nothing needs to be done here -- we don't care how many cells there are.
#
sgml('<TGROUP>', sub { 
   my $element = shift;
   my $cols = $element ->attribute('COLS')->value || 2;
   output "<TABLE BORDER=\"3\" WIDTH=\"100%\">";
   output "<TR><TD ALIGN=\"CENTER\" COLSPAN=$cols><B>$tabletitle</B></TD></TR>" if $tabletitle; 
   undef $tabletitle;
});
sgml('</TGROUP>', "</TABLE>");
#
# We will keep track of all of the entries in the head, for later use.
#
sgml('<THEAD>', "");
sgml('</THEAD>', "");
#
sgml('<TBODY>', "");
sgml('</TBODY>', "");
#
sgml('<ROW>', sub { output "\n<TR>\n"; });
sgml('</ROW>', "\n</TR>\n");
#
sgml('<ENTRY>', sub { output "<TD>"; });
sgml('</ENTRY>', sub { output "</TD>"; });

#Elementy podziału logicznego dokumentu 

# Element: SECT1
sgml('<SECT1>', "");
sgml('</SECT1>', "");

# Element: SECT3
sgml('<SECT3>', "");
sgml('</SECT3>', "");

# Element: SECT2
sgml('<SECT2>', "");
sgml('</SECT2>', "");


## ///////////////////////////////////////////////////////////
## Być może nie jest to specjalnie potrzebne:
sub gen_id { $id_counter++; return "node$id_counter"; }

## Uwaga przedefiniowany push!!
sub push { my $element=shift; push_output 'string'; }

sub getcontents{ my $element=shift; my $name = lc($element->name);
    $$name=pop_output; }

sub stepcounter{ my $name=shift; ++$count{$name}; }

sub counter{ my $name=shift; $count{$name}; }

# SDATA Handlers

sgml('|[TeX]|',"TeX");
sgml('|[LaTeX]|',"LaTeX");
sgml('|[MP]|',"MetaPost");
sgml('|[MF]|',"MetaFont");
sgml('|[nbsp  ]|','&nbsp;');
sgml('|[amp   ]|','&amp;');
sgml('|[mdash ]|','--');
sgml('|[gt    ]|','&gt;');
sgml('|[lt    ]|','&lt;');
sgml('|[vspace]|','~'); # visible space
sgml('|[gawkex]|',"$GawkExSym"); # gawk extension symbol
sgml('|[userex]|',"$UserDfSym"); # userdefined function
sgml('|[minus ]|', "-"); 
sgml('|[percen]|', "%");

sub print_verbatim { 
    my $element=shift; 
    my $name = $element->name;
    my $content = pop_output; 
    my $role = $element->attribute('ROLE')->value;

    if ($role eq 'gawk') { $role="$GawkExSym" }
    else { $role="" }

    output ("<code>$content</code>$role");
} 


1;

