diff --git a/tp/Texinfo/Convert/HTML.pm b/tp/Texinfo/Convert/HTML.pm
index 098b3c3c30..bdfdacbc34 100644
--- a/tp/Texinfo/Convert/HTML.pm
+++ b/tp/Texinfo/Convert/HTML.pm
@@ -2456,11 +2456,31 @@ sub _convert_heading_command($$$$$)
}
my $element_id = $self->command_id($command);
+ my $element;
+ if ($Texinfo::Common::root_commands{$command->{'cmdname'}}
+ and $command->{'parent'}
+ and $command->{'parent'}->{'type'}
+ and $command->{'parent'}->{'type'} eq 'element') {
+ $element = $command->{'parent'};
+ }
+ my $element_header;
+ my $page_footer;
+ if ($element) {
+ $element_header = &{$self->{'format_element_header'}}($self, $cmdname,
+ $command, $element);
+ $page_footer = &{$self->{'format_page_footer'}}($self, $command);
+ }
+
my $section = $command->{'extra'}->{'associated_section'};
if ($cmdname eq 'node' and $section) {
my $level = $section->{'level'};
$result .= join('', $self->close_registered_sections_level($level));
- $self->register_opened_section_level($level, "\n");
+ my $close =
+ "\n";
+ if ($page_footer and scalar(@{$self->{'pending_closes'}}) == 0) {
+ $close = $page_footer . $close;
+ }
+ $self->register_opened_section_level($level, $close);
$result .= '
get_conf('DEBUG'));
- my $element;
- if ($Texinfo::Common::root_commands{$command->{'cmdname'}}
- and $command->{'parent'}
- and $command->{'parent'}->{'type'}
- and $command->{'parent'}->{'type'} eq 'element') {
- $element = $command->{'parent'};
- }
if ($element) {
- $result .= &{$self->{'format_element_header'}}($self, $cmdname,
- $command, $element);
+ $result .= $element_header;
}
my $heading_level;
@@ -4767,7 +4779,7 @@ sub _default_format_element_footer($$$$)
my $type = shift;
my $element = shift;
my $content = shift;
-
+
my $result = '';
my $is_top = $self->element_is_top($element);
my $next_is_top = ($element->{'element_next'}
@@ -4796,34 +4808,15 @@ sub _default_format_element_footer($$$$)
}
my $rule = '';
- my $buttons;
- my $maybe_in_page;
+ my $maybe_in_page = 1;
if (($is_top or $is_special)
and ($self->get_conf('SPLIT') or !$self->get_conf('MONOLITHIC'))
and ($end_page
and ($self->get_conf('HEADERS')
or ($self->get_conf('SPLIT') and $self->get_conf('SPLIT') ne 'node')))) {
- if ($is_top) {
- $buttons = $self->get_conf('TOP_BUTTONS');
- } else {
- $buttons = $self->get_conf('MISC_BUTTONS');
- }
} elsif ($end_page and $self->get_conf('SPLIT') eq 'section') {
- $buttons = $self->get_conf('SECTION_FOOTER_BUTTONS');
} elsif ($end_page and $self->get_conf('SPLIT') eq 'chapter') {
- $buttons = $self->get_conf('CHAPTER_BUTTONS');
} elsif ($self->get_conf('SPLIT') eq 'node') {
- if ($self->get_conf('HEADERS')) {
- my $no_footer_word_count;
- if ($self->get_conf('WORDS_IN_PAGE')) {
- my @cnt = split(/\W*\s+\W*/, $content);
- if (scalar(@cnt) < $self->get_conf('WORDS_IN_PAGE')) {
- $no_footer_word_count = 1;
- }
- }
- $buttons = $self->get_conf('NODE_FOOTER_BUTTONS')
- unless ($no_footer_word_count);
- }
} else {
$maybe_in_page = 1;
}
@@ -4849,11 +4842,78 @@ sub _default_format_element_footer($$$$)
$result .= &{$self->{'format_footnotes_text'}}($self);
}
if (!$self->get_conf('PROGRAM_NAME_IN_FOOTER')
- and !$buttons and !$maybe_in_page) {
+ and !$maybe_in_page) {
# no rule in that case
} else {
$result .= "$rule\n" if ($rule);
}
+
+ return $result;
+}
+sub _default_format_page_footer($$)
+{
+ my $self = shift;
+ my $element = shift;
+
+ my $result = '';
+ my $is_top = $self->element_is_top($element);
+ my $next_is_top = ($element->{'element_next'}
+ and $self->element_is_top($element->{'element_next'}));
+ my $next_is_special = (defined($element->{'element_next'})
+ and $element->{'element_next'}->{'extra'}->{'special_element'});
+ # no 'parent' defined happens if there are no pages, and there are elements
+ # which should only happen when called with $self->{'output_file'}
+ # set to ''.
+ my $end_page = (!$element->{'element_next'}
+ or (defined($element->{'filename'})
+ and $element->{'filename'} ne $element->{'element_next'}->{'filename'}
+ and $self->{'file_counters'}->{$element->{'filename'}} == 1));
+ #my $end_page = (!$element->{'element_next'}
+ # or (defined($element->{'parent'})
+ # and $element->{'parent'} ne $element->{'element_next'}->{'parent'}));
+ my $is_special = $element->{'extra'}->{'special_element'};
+
+ if (($end_page or $next_is_top or $next_is_special or $is_top)
+ and $self->get_conf('VERTICAL_HEAD_NAVIGATION')
+ and ($self->get_conf('SPLIT') ne 'node'
+ or $self->get_conf('HEADERS') or $is_special or $is_top)) {
+ $result .= "
+
+"."\n";
+ }
+
+ my $buttons;
+ my $maybe_in_page;
+ if (($is_top or $is_special)
+ and ($self->get_conf('SPLIT') or !$self->get_conf('MONOLITHIC'))
+ and ($end_page
+ and ($self->get_conf('HEADERS')
+ or ($self->get_conf('SPLIT') and $self->get_conf('SPLIT') ne 'node')))) {
+ if ($is_top) {
+ $buttons = $self->get_conf('TOP_BUTTONS');
+ } else {
+ $buttons = $self->get_conf('MISC_BUTTONS');
+ }
+ } elsif ($end_page and $self->get_conf('SPLIT') eq 'section') {
+ $buttons = $self->get_conf('SECTION_FOOTER_BUTTONS');
+ } elsif ($end_page and $self->get_conf('SPLIT') eq 'chapter') {
+ $buttons = $self->get_conf('CHAPTER_BUTTONS');
+ } elsif ($self->get_conf('SPLIT') eq 'node') {
+ if ($self->get_conf('HEADERS')) {
+ $buttons = $self->get_conf('NODE_FOOTER_BUTTONS');
+ }
+ } else {
+ $maybe_in_page = 1;
+ }
+
+ # FIXME the following condition is almost a duplication of end_page
+ # except that the file counter needs not be 1
+ if ((!$element->{'element_next'}
+ or (defined($element->{'filename'})
+ and $element->{'filename'} ne $element->{'element_next'}->{'filename'}))
+ and $self->get_conf('footnotestyle') eq 'end') {
+ $result .= &{$self->{'format_footnotes_text'}}($self);
+ }
if ($buttons) {
$result .= &{$self->{'format_navigation_header_panel'}}($self, $buttons,
undef, $element);
@@ -4895,6 +4955,7 @@ my %default_formatting_references = (
'format_navigation_header_panel' => \&_default_format_navigation_header_panel,
'format_element_header' => \&_default_format_element_header,
'format_element_footer' => \&_default_format_element_footer,
+ 'format_page_footer' => \&_default_format_page_footer,
'format_button' => \&_default_format_button,
'format_button_icon_img' => \&_default_format_button_icon_img,
'format_contents' => \&_default_format_contents,