# -*-perl-*-
#+##############################################################################
#
# html32.init: output HTML 3.2
#
#    Copyright (C) 2003-2008  Patrice Dumas <dumas@centre-cired.fr>
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
#    02110-1301  USA
#
#-##############################################################################
# APA: Add SystemLiteral to identify the canonical DTD.
# [Definition:] The SystemLiteral is called the entity's system
# identifier. It is a URI, which may be used to retrieve the entity.
# See http://www.xml.com/axml/target.html#NT-ExternalID
$DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN" "http://www.w3.org/TR/html32/loose.dtd">';

$FRAMESET_DOCTYPE = $DOCTYPE;

$BODYTEXT = 'bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"';
# this controls the pre style for menus
$MENU_PRE_STYLE = '';

$NO_BULLET_LIST_STYLE ='';

$USE_ISO = 0;
$MENU_SYMBOL = '*';

# This lines are inserted before and after the shortcontents 
$BEFORE_OVERVIEW = "";
$AFTER_OVERVIEW = '';

# This lines are inserted before and after the contents 
$BEFORE_TOC_LINES = "";
$AFTER_TOC_LINES = '';

# html version for latex2html
$L2H_HTML_VERSION = "3.2";

# no class in html 32
$NO_BULLET_LIST_ATTRIBUTE = '';

# no css
$CSS_LINES = "";
%css_map = ();

$things_map{'oe'} = '&#156;';
$things_map{'OE'} = '&#140;';
$things_map{'dots'} = '<small>...</small>';
$things_map{'enddots'} = '<small>...</small>';
$things_map{'euro'} = 'Euro';
$things_map{'geq'} = '>=';
$things_map{'leq'} = '<=';
$things_map{'quotedblleft'} = '``';
$things_map{'quotedblright'} = "''";
$things_map{'quoteleft'} = '`';
$things_map{'quoteright'} = "'";
$things_map{'quotedblbase'} = ',,';
$things_map{'quotesinglbase'} = ',';
$things_map{'guillemetleft'} = '&lt;&lt;';
$things_map{'guillemetright'} = '&gt;&gt;';
$things_map{'guillemotleft'} = '&lt;&lt;';
$things_map{'guillemotright'} = '&gt;&gt;';
$things_map{'guilsinglleft'} = '&lt;';
$things_map{'guilsinglright'} = '&gt;';

foreach my $style ('oe', 'OE', 'quotedblleft', 'quotedblright', 
   'quoteleft', 'quoteright',
   'quotedblbase', 'quotesinglbase', 'guillemetleft', 'guillemetright',
   'guillemotleft', 'guillemotright', 'guilsinglleft', 'guilsinglright')
{
    $pre_map{$style} = $things_map{$style};
}

$style_map{'sansserif'} = {};
$style_map{'r'} = {};
$style_map_pre{'r'} = {};
$style_map_pre{'sansserif'} = {};
$style_map{'titlefont'} = {'function' => \&t2h_html32_titlefont, 
            'type' => 'simple_style'};
$style_map_pre{'titlefont'} = {};

$format_map{'multitable'} = 'table';

# Avoid adding h1 if the text is empty
# no class in html 3.2
sub t2h_html32_titlefont($$$)
{
    shift;
    my $args = shift;
    return "<h1>$args->[0]</h1>" if ($args->[0] =~ /\S/);
    return '';
}

# formatting functions

$summary_letter    = \&t2h_html32_summary_letter;
$print_index       = \&t2h_html32_print_index;
$protect_text      = \&t2h_html32_protect_text;
$normal_text       = \&t2h_html32_normal_text;
$heading           = \&t2h_html32_heading;
$preformatted      = \&t2h_html32_preformatted;
$raw               = \&t2h_html32_raw;
$menu              = \&t2h_html32_menu;
$foot_section      = \&t2h_html32_foot_section;
$cartouche         = \&t2h_html32_cartouche;
$listoffloats      = \&t2h_html32_listoffloats;
$float             = \&t2h_html32_float;
$acronym_like      = \&t2h_html32_acronym_like;
$row               = \&t2h_html32_row;
$cell              = \&t2h_html32_cell;
$quotation         = \&t2h_html32_quotation;




# &quot; is not in html 3.2
sub t2h_html32_protect_text($)
{
   my $text = shift;
   $text =~ s/&/&amp;/g;
   $text =~ s/</&lt;/g;
   $text =~ s/>/&gt;/g;
   $text =~ s/\"/&#34;/g;
   return $text;
}

sub t2h_html32_normal_text($$$$$)
{
   my $text = shift;
   my $in_raw_text = shift;
   my $in_preformatted = shift;
   my $in_code = shift;
   my $in_simple = shift;
   my $style_stack = shift;
   $text = uc($text) if (in_cmd($style_stack, 'sc'));
   $text = &$protect_text($text) unless($in_raw_text);
   if (! $in_code and !$in_preformatted)
   {
       if ($in_raw_text) #FIXME really do that ? It is done by makeinfo
       {
           $text =~ s/``/"/g;
           $text =~ s/''/"/g;
       }
       else
       {
           $text =~ s/``/&#34;/g;
           $text =~ s/''/&#34;/g;
       }
       # temporary reuse '' to store --- !....
       # FIXME won't '---' be handled wrongly?
       # FIXME really do that in raw text?
       $text =~ s/---/''/g; 
       $text =~ s/--/-/g; 
       $text =~ s/''/--/g;
   }
   return $text;
}

# a preformatted section
sub t2h_html32_preformatted($$$)
{
    my $text = shift;
    my $pre_style = shift;
    my $class = shift;

    return '' if ($text eq '');
    return "<pre>$text</pre>";
}

# a heading for an element
sub t2h_html32_heading($)
{
    my $element = shift;
    my $command = shift;
    my $texi_line = shift;
    my $line = shift;
    my $in_preformatted = shift;
    my $one_section = shift;
    my $element_heading = shift;

    return '' if (defined($command) and $command eq 'node' and !$element_heading);

    my $level = 3;
    if (!$element->{'node'})
    {
        $level = $element->{'level'};
    }
    $level = 1 if ($level == 0);
    my $text = $element->{'text'};
    if (!$element->{'node'} and (!$NUMBER_SECTIONS))
    {
        $text = $element->{'name'};
    }
    return '' if ($text !~ /\S/);
    if (defined($element->{'tocid'}) and $TOC_LINKS)
    {
         $text = &$anchor ('', "$Texi2HTML::THISDOC{'toc_file'}#$element->{'tocid'}", $text);
    }
    return "<h$level> $text </h$level>\n";
}

# formatting of raw regions
# ih L2H is true another mechanism is used for tex
sub t2h_html32_raw($$)
{
    my $style = shift;
    my $text = shift;
    if ($style eq 'verbatim' or $style eq 'tex')
    {
        return "<pre>" . &$protect_text($text) . '</pre>';
    }
    elsif ($style eq 'html')
    {
        return $text;
    }
    else
    {
        warn "$WARN (bug) unknown style $style\n";
        return &$protect_text($text);
    }
}

# a whole menu
sub t2h_html32_menu($)
{
    my $text = shift;
    if ($text =~ /\S/)
    {
        return "<table border=\"0\" cellspacing=\"0\">\n" 
        . $text . "</table>\n";
    }
}

# a simple menu entry ref in case we aren't in a standard menu context
sub t2h_html32_foot_section($)
{
    my $lines = shift;
    unshift (@$lines, "<hr>\n", "<h3>Footnotes</h3>\n");
    return $lines; 
}

# a cartouche
sub t2h_html32_cartouche($)
{
    my $text = shift;

    if ($text =~ /\S/)
    {
        return "<table border=\"1\"><tr><td>\n" . $text . "</td></tr></table>\n";
    }
    return '';
}


# no style
sub t2h_html32_summary_letter($$$$$$$)
{
   my $letter = shift;
   my $file = shift;
   my $identifier = shift;
   my $index_element_id = shift;
   my $number = shift;
   my $index_element = shift;
   my $index_name = shift;

   return &$anchor('', $file . '#' . $identifier, '<b>' . &$protect_text($letter) . '</b>');
}

# format a whole index
#
# argument:
# index text
# index name
sub t2h_html32_print_index($$)
{
    my $text = shift;
    my $name = shift;
    return '' if (!defined($text));
    return "<table border=\"0\">\n" .
    "<tr><td></td><th align=\"left\">" . &$I('Index Entry') . "</th><th align=\"left\"> " . &$I('Section') . "</th></tr>\n"
    . "<tr><td colspan=\"3\"> $DEFAULT_RULE</td></tr>\n" . $text .
    "</table>\n";
}

sub t2h_html32_float($$$$$)
{
    my $text = shift;
    my $float = shift;
    my $caption = shift;
    my $shortcaption = shift;
    
    my $label = '';
    if (exists($float->{'id'}))
    {
        $label = &$anchor($float->{'id'});
    }
    my $caption_text = '';
    
    if (defined($float->{'caption_texi'}))
    {
         $caption_text = $caption;
    }
    elsif (defined($float->{'shortcaption_texi'}))
    {
         $caption_text = $shortcaption;
    }
    elsif (defined($caption))
    {
         $caption_text = $caption;
    }
    
    return "$label\n" . $text . $caption_text;
}

sub t2h_html32_listoffloats($$$)
{
    my $style_texi = shift;
    my $style = shift;
    my $float_entries = shift;

    my $result = "<dl>\n" ;
    foreach my $float_entry (@$float_entries)
    {
         $result .= $float_entry;
    }
    return $result . "</dl>\n";
} 

# no acronym, and no abbr in html 3.2
sub t2h_html32_acronym_like($$$$$$)
{
    my $command = shift;
    my $acronym_texi = shift;
    my $acronym_text = shift;
    my $with_explanation = shift;
    my $explanation_lines = shift;
    my $explanation_text = shift;
    my $explanation_simply_formatted = shift;
    
    if ($with_explanation)
    {
        return &$I('%{acronym_like} (%{explanation})', {'acronym_like' => $acronym_text, 'explanation' => $explanation_text},{'duplicate'=>1})
    }
    else
    {
        return $acronym_text;
    }
}

# row in multitable
sub t2h_html32_row($$)
{
    my $text = shift;
    my $macro = shift;

    if ($text =~ /\S/)
    {
         return '<tr>' . $text . '</tr>' . "\n";
    }
    return '';
}

# cell in multitable
sub t2h_html32_cell($$)
{
    my $text = shift;
    my $row_macro = shift;
    my $columnfractions = shift;
    my $prototype_row = shift;

    $text =~ s/^\s*//;
    $text =~ s/\s*$//;

    if ($row_macro eq 'headitem')
    {
        return "<th>" . $text . '</th>';
    }
    return "<td>" . $text . '</td>';
}

sub t2h_html32_quotation($$$$)
{
    my $command = shift;
    my $text = shift;
    my $argument_text = shift;
    my $argument_text_texi = shift;
    return "<blockquote>" . $text . "</blockquote>\n";
}

