--- /dev/null
+#!/usr/bin/env perl
+
+# {
+package Texi2HTML::Config;
+
+my $lastfilename;
+my $docnr = 0;
+my $page_toc_depth = 2;
+
+use Data::Dumper;
+$Data::Dumper::Maxdepth = 2;
+
+sub print_element_info($)
+{
+ my $element = shift;
+ print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
+ print "Element: $element\n";
+ print Dumper($element);
+}
+
+
+# This function makes sure that files are only generated for numbered sections,
+# but not for unnumbered ones. It is called after texi2html has done its own
+# splitting and simply returns the filename for the node given as first argument
+# Nodes with the same filename will be printed out to the same filename, so
+# this really all we need. Also, make sure that the file names for sections
+# are derived from the section title. We also might want to name the anchors
+# according to node titles, which works by simply overriding the id element of
+# the $element hash.
+sub split_at_numbered_sections($$$)
+{
+ my $element = shift;
+ my $type = shift;
+ my $docu_name = shift;
+ my $docu_ext = $Texi2HTML::Config::EXTENSION;
+ if ( $Texi2HTML::THISDOC{'current_lang'} ) {
+ $docu_ext = $Texi2HTML::THISDOC{'current_lang'} . "." . $docu_ext;
+ }
+
+# if ($$element{number} eq "1.1") {
+# print_element_info ($element);
+# }
+
+ # TOC, footer, about etc. are called with undefined $element and $type == "toc"|"stoc"|"foot"|"about"
+ if ($type eq "toc" or $type eq "stoc" or $type eq "foot" or $type eq "about") {
+ my $filename = "lilypond_$type";
+ $filename .= ".$docu_ext" if (defined($docu_ext));
+# print "Standard file of type $type\n";
+ return $filename;
+ } else {
+ # derive the name of the anchor (i.e. the part after # in the links!),
+ # don't use texi2html's SECx.x default!
+ my $anchor = $$element{texi};
+ $anchor =~ tr/\ ?:'/-/d;
+ $$element{id} = $anchor;
+ # Numbered sections will get a filename Section_1.1.2, unnumbered sections will use
+ # the file name of the previous numbered section:
+ if ($$element{number}) {
+ my $filename = $anchor;
+ $filename .= ".$docu_ext" if (defined($docu_ext));
+ $docnr += 1;
+ $$element{doc_nr} = $docnr;
+ $lastfilename = $filename;
+ return $filename;
+ } else {
+ $$element{doc_nr} = $docnr;
+ return $lastfilename;
+ }
+ }
+
+ return;
+}
+
+
+# The default formatting of external refs returns e.g.
+# "(lilypond-internals)Timing_translator", while we simply want "Timing_translator".
+# Solution: Remove all (...) from the file_and_node argument before calling
+# the default handler!
+sub lilypond_external_ref($$$$$$)
+{
+ my $type = shift;
+ my $section = shift;
+ my $book = shift;
+ my $file_node = shift;
+ my $href = shift;
+ my $cross_ref = shift;
+
+ $file_node =~ s/\(.*\)//;
+ return t2h_default_external_ref($type, $section, $book, $file_node, $href, $cross_ref);
+}
+
+
+# recursively generate the TOC entries for the element and its children (which
+# are only shown up to maxlevel. All ancestors of the current element are also
+# shown with their immediate children, irrespective of their level.
+sub generate_ly_toc_entries($$$)
+{
+ my $element = shift;
+ my $element_path = shift;
+ my $maxlevel = shift;
+ # Skip undefined sections, plus all sections generated by index splitting
+ return() if (not defined($element) or exists($element->{'index_page'}));
+ my @result = ();
+ my $level = $element->{'toc_level'};
+ my $is_parent_of_current = $element_path->{$element->{'number'}};
+ my $print_children = ( ($level < $maxlevel) or $is_parent_of_current );
+ my $ind = ' ' x $level;
+ my $this_css_class = $is_parent_of_current ? " class=\"toc_current\"" : "";
+
+ my $entry = "$ind<li$this_css_class>" . &$anchor ($element->{'tocid'}, "$element->{'file'}#$element->{'id'}",$element->{'text'});
+
+ my $children = $element->{'section_childs'};
+ if ( $print_children and defined($children) and (ref($children) eq "ARRAY") ) {
+ push (@result, $entry);
+ my @child_result = ();
+ foreach (@$children) {
+ push (@child_result, generate_ly_toc_entries($_, $element_path, $maxlevel));
+ }
+ # if no child nodes were generated, e.g. for the index, where expanded pages
+ # are ignored, don't generate a list at all...
+ if (@child_result) {
+ push (@result, "$ind<ul$NO_BULLET_LIST_ATTRIBUTE>");
+ push (@result, @child_result);
+ push (@result, "$ind</ul></li>\n");
+ }
+ } else {
+ push (@result, $entry . "</li>\n");
+ }
+ return @result;
+}
+
+
+# Print a customized TOC, containing only the first two levels plus the whole
+# path to the current page
+sub lilypond_generate_page_toc_body($)
+{
+ my $element = shift;
+ my $current_element = $element;
+ my %parentelements;
+ $parentelements{$element->{'number'}} = 1;
+ # Find the path to the current element
+ while ( defined($current_element->{'sectionup'}) and
+ ($current_element->{'sectionup'} ne $current_element) )
+ {
+ $parentelements{$current_element->{'sectionup'}->{'number'}} = 1
+ if ($current_element->{'sectionup'}->{'number'} ne '');
+ $current_element = $current_element->{'sectionup'};
+ }
+ return () if not defined($current_element);
+ # Create the toc entries recursively
+ my @toc_entries = ("<div class=\"contents\">", "<ul$NO_BULLET_LIST_ATTRIBUTE>");
+ my $children = $current_element->{'section_childs'};
+ foreach ( @$children ) {
+ push (@toc_entries, generate_ly_toc_entries($_, \%parentelements, $page_toc_depth));
+ }
+ push (@toc_entries, "</ul>");
+ push (@toc_entries, "</div>");
+ return @toc_entries;
+}
+
+my @this_page_toc = ();
+
+sub lilypond_print_element_header
+{
+ my $fh = shift;
+ my $first_in_page = shift;
+ my $previous_is_top = shift;
+ if ($first_in_page and not @this_page_toc) {
+ if (defined($Texi2HTML::THIS_ELEMENT)) {
+ # Create the TOC for this page
+ @this_page_toc = lilypond_generate_page_toc_body($Texi2HTML::THIS_ELEMENT);
+ }
+ }
+ return T2H_DEFAULT_print_element_header( $fh, $first_in_page, $previous_is_top);
+}
+
+
+
+
+
+
+
+
+
+
+# Print out the TOC in a <div> at the end of th page, which will be formatted as a
+# sidebar mimicking a TOC frame
+sub print_lilypond_page_foot($)
+{
+ my $fh = shift;
+# my @lines = @{$Texi2HTML::OVERVIEW};
+# my $lines = $Texi2HTML::TOC_LINES;
+ my @lines = @this_page_toc;
+ if (not @lines) {
+ print "We have no toc lines, generate generic ones for main::element_top::\n";
+# print Dumper( $main::element_top );
+# print Dumper( $main::section_top );
+# print Dumper( $main::node_top );
+# @lines = lilypond_generate_page_toc_body( $main::element_top );
+# @lines = lilypond_generate_page_toc_body($Texi2HTML::THIS_ELEMENT);
+ @lines = @$Texi2HTML::TOC_LINES;
+ }
+ if (@lines) {
+ print $fh "<div id=\"tocframe\">";
+ print $fh '<h4> ' . $Texi2HTML::NAME{'Contents'} . "</h4>\n";
+ foreach my $line (@lines) {
+ print $fh $line;
+ }
+ print $fh "</div>";
+ @this_page_toc = ();
+ }
+ T2H_DEFAULT_print_page_foot($fh);
+}
+
+
+
+
+
+
+
+sub get_navigation_text
+{
+ my $button = shift;
+ my $text = $NAVIGATION_TEXT{$button};
+ if ( ($button eq 'Back') or ($button eq 'FastBack') ) {
+ $text = $text . $Texi2HTML::NODE{$button} . " ";
+ } elsif ( ($button eq 'Forward') or ($button eq 'FastForward') ) {
+ $text = " " . $Texi2HTML::NODE{$button} . $text;
+ } elsif ( $button eq 'Up' ) {
+ $text = " Up: " . $Texi2HTML::NODE{$button} . " ";
+ }
+ return $text;
+}
+
+
+# Don't automatically create left-aligned table cells for every link, but
+# instead create a <td> only on an appropriate '(left|right|center)-aligned-cell-n'
+# button text. It's alignment as well as the colspan will be taken from the
+# name of the button. Also, add 'newline' button text to create a new table
+# row. The texts of the buttons are generated by get_navigation_text and
+# will contain the name of the next/previous section/chapter.
+sub lilypond_print_navigation
+{
+ my $fh = shift;
+ my $buttons = shift;
+ my $vertical = shift;
+ my $spacing = 1;
+# print $fh '<table cellpadding="', $spacing, '" cellspacing="', $spacing,
+# "\" border=\"0\" class=\"nav_table\">\n";
+ print $fh "<table class=\"nav_table\">\n";
+
+ print $fh "<tr>" unless $vertical;
+ my $beginofline = 1;
+ foreach my $button (@$buttons)
+ {
+ print $fh qq{<tr valign="top" align="left">\n} if $vertical;
+ # Allow (left|right|center)-aligned-cell and newline as buttons!
+ if ( $button =~ /^(.*)-aligned-cell-(.*)$/ )
+ {
+ print $fh qq{</td>} unless $beginofline;
+ print $fh qq{<td valign="middle" align="$1" colspan="$2">};
+ $beginofline = 0;
+ }
+ elsif ( $button eq 'newline' )
+ {
+ print $fh qq{</td>} unless $beginofline;
+ print $fh qq{</tr>};
+ print $fh qq{<tr>};
+ $beginofline = 1;
+
+ }
+ elsif (ref($button) eq 'CODE')
+ {
+ &$button($fh, $vertical);
+ }
+ elsif (ref($button) eq 'SCALAR')
+ {
+ print $fh "$$button" if defined($$button);
+ }
+ elsif (ref($button) eq 'ARRAY')
+ {
+ my $text = $button->[1];
+ my $button_href = $button->[0];
+ # verify that $button_href is simple text and text is a reference
+ if (defined($button_href) and !ref($button_href)
+ and defined($text) and (ref($text) eq 'SCALAR') and defined($$text))
+ { # use given text
+ if ($Texi2HTML::HREF{$button_href})
+ {
+ print $fh "" .
+ &$anchor('',
+ $Texi2HTML::HREF{$button_href},
+ $$text
+ )
+ ;
+ }
+ else
+ {
+ print $fh $$text;
+ }
+ }
+ }
+ elsif ($button eq ' ')
+ { # handle space button
+ print $fh
+ ($ICONS && $ACTIVE_ICONS{' '}) ?
+ &$button_icon_img($BUTTONS_NAME{$button}, $ACTIVE_ICONS{' '}) :
+ $NAVIGATION_TEXT{' '};
+ #next;
+ }
+ elsif ($Texi2HTML::HREF{$button})
+ { # button is active
+ my $btitle = $BUTTONS_GOTO{$button} ?
+ 'title="' . $BUTTONS_GOTO{$button} . '"' : '';
+ if ($ICONS && $ACTIVE_ICONS{$button})
+ { # use icon
+ print $fh '' .
+ &$anchor('',
+ $Texi2HTML::HREF{$button},
+ &$button_icon_img($BUTTONS_NAME{$button},
+ $ACTIVE_ICONS{$button},
+ $Texi2HTML::SIMPLE_TEXT{$button}),
+ $btitle
+ );
+ }
+ else
+ { # use text
+ print $fh
+ '[' .
+ &$anchor('',
+ $Texi2HTML::HREF{$button},
+ get_navigation_text($button),
+ $btitle
+ ) .
+ ']';
+ }
+ }
+ else
+ { # button is passive
+ print $fh
+ $ICONS && $PASSIVE_ICONS{$button} ?
+ &$button_icon_img($BUTTONS_NAME{$button},
+ $PASSIVE_ICONS{$button},
+ $Texi2HTML::SIMPLE_TEXT{$button}) :
+
+ "[" . get_navigation_text($button) . "]";
+ }
+ print $fh "</td>\n" if $vertical;
+ print $fh "</tr>\n" if $vertical;
+ }
+ print $fh "</td>" unless $beginofline;
+ print $fh "</tr>" unless $vertical;
+ print $fh "</table>\n";
+}
+
+
+@Texi2HTML::Config::SECTION_BUTTONS =
+ ('left-aligned-cell-1', 'FastBack',
+ 'center-aligned-cell-3', 'Top', 'Contents', 'Index', 'About',
+ 'right-aligned-cell-1', 'FastForward',
+ 'newline',
+ 'left-aligned-cell-2', 'Back',
+ 'center-aligned-cell-1', 'Up',
+ 'right-aligned-cell-2', 'Forward'
+ );
+
+# buttons for misc stuff
+@Texi2HTML::Config::MISC_BUTTONS = ('center-aligned-cell-3', 'Top', 'Contents', 'Index', 'About');
+
+# buttons for chapter file footers
+# (and headers but only if SECTION_NAVIGATION is false)
+@Texi2HTML::Config::CHAPTER_BUTTONS =
+ ('left-aligned-cell-1', 'FastBack',
+ 'center-aligned-cell-3', 'Top', 'Contents', 'Index', 'About',
+ 'right-aligned-cell-1', 'FastForward',
+ );
+
+# buttons for section file footers
+@Texi2HTML::Config::SECTION_FOOTER_BUTTONS =
+ ('left-aligned-cell-1', 'FastBack',
+ 'center-aligned-cell-3', 'Top', 'Contents', 'Index', 'About',
+ 'right-aligned-cell-1', 'FastForward',
+ 'newline',
+ 'left-aligned-cell-2', 'Back',
+ 'center-aligned-cell-1', 'Up',
+ 'right-aligned-cell-2', 'Forward'
+ );
+
+@Texi2HTML::Config::NODE_FOOTER_BUTTONS =
+ ('left-aligned-cell-1', 'FastBack',
+ 'center-aligned-cell-3', 'Top', 'Contents', 'Index', 'About',
+ 'right-aligned-cell-1', 'FastForward',
+ 'newline',
+ 'left-aligned-cell-2', 'Back',
+ 'center-aligned-cell-1', 'Up',
+ 'right-aligned-cell-2', 'Forward'
+ );
+
+# $Texi2HTML::Config::SPLIT = 'section';
+$Texi2HTML::Config::PREFIX = 'lilypond';
+# $Texi2HTML::Config::FRAMES = 1;
+@Texi2HTML::Config::CSS_REFS = ("lilypond.css");
+$Texi2HTML::Config::element_file_name = \&split_at_numbered_sections;
+$Texi2HTML::Config::print_element_header = \&lilypond_print_element_header;
+$Texi2HTML::Config::print_page_foot = \&print_lilypond_page_foot;
+$Texi2HTML::Config::print_navigation = \&lilypond_print_navigation;
+$Texi2HTML::Config::external_ref = \&lilypond_external_ref;
+
+
+
+return 1;