X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lilypond-texi2html.init;h=7f4c32a1750f29eb6b083c8c9bdc256f481eeee2;hb=bbc682c8cfcc192f4d07c8cebb16a424cf8688e9;hp=1d28c76cc55e02bfe54a51b046caadb93525af23;hpb=b3d101abf89f881f82ce6b15005888c064c24b7d;p=lilypond.git diff --git a/lilypond-texi2html.init b/lilypond-texi2html.init index 1d28c76cc5..7f4c32a175 100644 --- a/lilypond-texi2html.init +++ b/lilypond-texi2html.init @@ -2,7 +2,8 @@ ### texi2html customization script for Lilypond ### Author: Reinhold Kainhofer , 2008. -### Some code parts copied from texi2html and adapted. +### Some code parts copied from texi2html and adapted. These functions +### were written mainly by Patrice Dumas ### License: GPLv2+ ### ### @@ -40,16 +41,19 @@ ### correct file name for the link. Implemented in: ### lilypond_unknown (handling of @translationof, in case ### extract_texi_filenames.py messes up...) -### split_at_numbered_sections (correct file name: use the map) +### lilypond_element_file_name (correct file name: use the map) +### lilypond_element_target_name (correct anchor: use the map) ### lilypond_init_map (read in the externally created map from disk) ### lilypond_external_href (load the map for xrefs, use the correct ### link target) ### -) The HTML anchors for all sections are derived from the node name / ### section title (pre-generated in the .xref-map file). Implemented by: -### split_at_numbered_sections (adjust section anchors) +### lilypond_element_target_name (adjust section anchors) ### -) Use the standard footnote format "nr text" instead of the ### ugly format of texi2html (

(nr)

text

). Implemented in -### lilypond_foot_line_and_ref +### makeinfo_like_foot_line_and_ref +### makeinfo_like_foot_lines +### makeinfo_like_paragraph ### ### ### Useful helper functions: @@ -69,12 +73,22 @@ package Texi2HTML::Config; ### SETTINGS FOR TEXI2HTML ############################################################################# -@Texi2HTML::Config::CSS_REFS = ("lilypond.css"); +@Texi2HTML::Config::CSS_REFS = ( + {FILENAME => "lilypond-mccarty.css", TITLE => "Patrick McCarty's design"} +); +@Texi2HTML::Config::ALT_CSS_REFS = ( + {FILENAME => "lilypond.css", TITLE => "Andrew Hawryluk's design" }, + {FILENAME => "lilypond-blue.css", TITLE => "Kurt Kroon's blue design" }, +); $Texi2HTML::Config::USE_ACCESSKEY = 1; $Texi2HTML::Config::USE_LINKS = 1; $Texi2HTML::Config::USE_REL_REV = 1; +$Texi2HTML::Config::SPLIT_INDEX = 0; $Texi2HTML::Config::SEPARATED_FOOTNOTES = 0; # Print footnotes on same page, not separated -$Texi2HTML::Config::element_file_name = \&split_at_numbered_sections; +if ($Texi2HTML::Config::SPLIT eq 'section') { + $Texi2HTML::Config::element_file_name = \&lilypond_element_file_name; +} +$Texi2HTML::Config::element_target_name = \&lilypond_element_target_name; $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; @@ -84,12 +98,18 @@ $Texi2HTML::Config::toc_body = \&lilypond_toc_body; $Texi2HTML::Config::css_lines = \&lilypond_css_lines; $Texi2HTML::Config::unknown = \&lilypond_unknown; $Texi2HTML::Config::print_page_head = \&lilypond_print_page_head; -$Texi2HTML::Config::foot_line_and_ref = \&lilypond_foot_line_and_ref; +# $Texi2HTML::Config::foot_line_and_ref = \&lilypond_foot_line_and_ref; +$Texi2HTML::Config::foot_line_and_ref = \&makeinfo_like_foot_line_and_ref; +$Texi2HTML::Config::foot_lines = \&makeinfo_like_foot_lines; +$Texi2HTML::Config::paragraph = \&makeinfo_like_paragraph; + + # Examples should be formatted similar to quotes: $Texi2HTML::Config::complex_format_map->{'example'} = { 'begin' => q{"
"},
   'end' => q{"
\n"}, + 'style' => 'code', }; %Texi2HTML::config::misc_pages_targets = ( @@ -223,19 +243,23 @@ sub lilypond_css_lines ($$) { my $import_lines = shift; my $rule_lines = shift; - return if (defined($CSS_LINES)); + return if (defined($Texi2HTML::THISDOC{'CSS_LINES'})); if (@$rule_lines or @$import_lines) { - $CSS_LINES = "\n"; + $Texi2HTML::THISDOC{'CSS_LINES'} = "\n"; } foreach my $ref (@CSS_REFS) { - $CSS_LINES .= "\n"; + $Texi2HTML::THISDOC{'CSS_LINES'} .= "{TITLE}\" href=\"$ref->{FILENAME}\">\n"; + } + foreach my $ref (@ALT_CSS_REFS) + { + $Texi2HTML::THISDOC{'CSS_LINES'} .= "{FILENAME}\" title=\"$ref->{TITLE}\">\n"; } - $CSS_LINES .= "\n"; + $Texi2HTML::THISDOC{'CSS_LINES'} .= "\n"; } @@ -262,7 +286,7 @@ my $node_to_filename_map = (); # If an external nodename<=>filename/anchor map file is found (loaded in # lilypond_init_out, use the externally created values, otherwise use the # same logic here. -sub split_at_numbered_sections($$$) +sub lilypond_element_file_name($$$) { my $element = shift; my $type = shift; @@ -285,10 +309,6 @@ sub split_at_numbered_sections($$$) (my $filename, my $anchor) = @{$node_to_filename_map->{$node_name}}; $filename .= ".$docu_ext" if (defined($docu_ext)); - # need to override both target (used as anchor in links to this section) and - # id (used in the tag for this section)! - $element->{'id'} = $element->{'target'} = $anchor; - # unnumbered sections (except those at top-level!) always go to the same # file as the previous numbered section if (not ($element->{number}) and not ($lastfilename eq '') and ($element->{level} > 1)) { @@ -304,36 +324,20 @@ sub split_at_numbered_sections($$$) return $filename; } elsif ($type eq "top" or $type eq "toc" or $type eq "doc" or $type eq "stoc" or $type eq "foot" or $type eq "about") { - # TOC, footer, about etc. are called with undefined $element and $type == "toc"|"stoc"|"foot"|"about" - if ($type eq "top") { - $element->{'id'} = $element->{'target'} = "Top"; - } return; } else { print STDERR "WARNING: Node '$node_name' was NOT found in the map\n" unless ($node_name eq '') or ($element->{'tag'} eq 'unnumberedsec') or ($node_name =~ /NOT REALLY USED/); - # derive the name of the anchor (i.e. the part after # in the links!), - # don't use texi2html's SECx.x default! - my $sec_name = main::remove_texi($element->{'texi'}); - # if we have a node, use its name: - if ($element->{'node_ref'}->{'texi'} ne '') { - $sec_name = main::remove_texi($element->{'node_ref'}->{'texi'}); - } - my $anchor = $sec_name; - if ($element->{translationof}) { - $anchor = main::remove_texi($$element{translationof}); - } - # normalize to the same file name as texinfo - $anchor = texinfo_file_name($anchor); - # need to override both target (used as anchor in links to this section) and - # id (used in the tag for this section)! - $element->{'id'} = $element->{'target'} = $anchor; # Numbered sections will get a filename Node_title, unnumbered sections will use # the file name of the previous numbered section: if (($element->{number}) or ($lastfilename eq '') or ($element->{level} == 1)) { - my $filename = $anchor; + # normalize to the same file name as texinfo + if ($element->{translationof}) { + $node_name = main::remove_texi($element->{translationof}); + } + my $filename = texinfo_file_name($node_name); $filename .= ".$docu_ext" if (defined($docu_ext)); $docnr += 1; $$element{doc_nr} = $docnr; @@ -348,6 +352,34 @@ sub split_at_numbered_sections($$$) return; } +sub lilypond_element_target_name($$$) +{ + my $element = shift; + my $target = shift; + my $id = shift; + # Target is based on node name (or sec name for secs without node attached) + my $node_name = main::remove_texi($element->{'node_ref'}->{'texi'}); + if ($node_name eq '') { + $node_name = main::remove_texi($element->{'texi'}); + } + + # If we have an entry in the section<=>filename map, use that one, otherwise + # generate the anchor here. + if (exists ($node_to_filename_map->{$node_name})) { + (my $filename, $target) = @{$node_to_filename_map->{$node_name}}; + } else { + my $anchor = $node_name; + if ($element->{translationof}) { + $anchor = main::remove_texi($element->{translationof}); + } + # normalize to the same file name as texinfo + $target = texinfo_file_name($anchor); + } + # TODO: Once texi2html correctly prints out the target and not the id for + # the sections, change this back to ($id, $target) + return ($target, $target); +} + ## Load the map file for the corrently processed texi file. We do this # using a command init handler, since texi2html does not have any @@ -524,7 +556,7 @@ sub generate_ly_toc_entries($$$$) my $ind = ' ' x $level; my $this_css_class = $is_parent_of_current ? " class=\"toc_current\"" : ""; - my $entry = "$ind" . &$anchor ($element->{'tocid'}, "$element->{'file'}#$element->{'id'}",$element->{'text'}); + my $entry = "$ind" . &$anchor ($element->{'tocid'}, "$element->{'file'}#$element->{'target'}",$element->{'text'}); my $children = $element->{'section_childs'}; # Don't add unnumbered entries, unless they are at top-level or a parent of the current! @@ -587,8 +619,33 @@ sub lilypond_print_toc_div ($$) # use default TOC if no custom lines have been generated @lines = @default_toc if (not @lines); if (@lines) { + print $fh "\n\n
\n"; - print $fh '

' . $Texi2HTML::NAME{'Contents'} . "

\n"; + + # Remove the leading "GNU LilyPond --- " from the manual title + my $topname = $Texi2HTML::NAME{'Top'}; + $topname =~ s/^GNU LilyPond(:| &[mn]dash;) //; + + # construct the top-level Docs index (relative path and including language!) + my $lang = $Texi2HTML::THISDOC{current_lang}; + if ($lang and $lang ne "en") { + $lang .= "."; + } else { + $lang = ""; + } + my $reldir = ""; + $reldir = "../" if ($Texi2HTML::Config::SPLIT eq 'section'); + my $uplink = $reldir."index.${lang}html"; + + print $fh "

<< Back to + Documentation Index

\n"; + + print $fh '

' . &$anchor('', + $Texi2HTML::HREF{'Top'}, + $topname, + 'title="Start of the manual"' + ) . "

\n"; foreach my $line (@lines) { print $fh $line; } @@ -603,7 +660,6 @@ sub lilypond_print_toc_div ($$) our @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) { @@ -612,7 +668,7 @@ sub lilypond_print_element_header @this_page_toc = lilypond_generate_page_toc_body($Texi2HTML::THIS_ELEMENT); } } - return T2H_DEFAULT_print_element_header( $fh, $first_in_page, $previous_is_top); + return T2H_DEFAULT_print_element_header( $first_in_page, $previous_is_top); } # Generate the HTML output for the TOC @@ -638,7 +694,7 @@ sub print_lilypond_page_foot($) { my $fh = shift; my $program_string = &$program_string(); - print $fh "

$program_string
$PRE_BODY_CLOSE

\n"; +# print $fh "

$program_string
$PRE_BODY_CLOSE

\n"; print $fh "\n\n"; print $fh "\n
\n\n"; @@ -681,48 +737,45 @@ sub get_navigation_text # 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 '\n"; - print $fh "
\n"; + my $result = "
\n"; - print $fh "" unless $vertical; + $result .= "" unless $vertical; my $beginofline = 1; foreach my $button (@$buttons) { - print $fh qq{\n} if $vertical; + $result .= qq{\n} if $vertical; # Allow (left|right|center)-aligned-cell and newline as buttons! if ( $button =~ /^(.*)-aligned-cell-(.*)$/ ) { - print $fh qq{} unless $beginofline; - print $fh qq{} unless $beginofline; + $result .= qq{} unless $beginofline; - print $fh qq{}; - print $fh qq{}; + $result .= qq{} unless $beginofline; + $result .= qq{}; + $result .= qq{}; $beginofline = 1; } elsif (ref($button) eq 'CODE') { - &$button($fh, $vertical); + $result .= &$button($vertical); } elsif (ref($button) eq 'SCALAR') { - print $fh "$$button" if defined($$button); + $result .= "$$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) + 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}) @@ -736,7 +789,7 @@ sub lilypond_print_navigation { $anchor_attributes .= " rel=\"$BUTTONS_REL{$button_href}\""; } - print $fh "" . + $result .= "" . &$anchor('', $Texi2HTML::HREF{$button_href}, get_navigation_text($$text), @@ -745,13 +798,13 @@ sub lilypond_print_navigation } else { - print $fh get_navigation_text($$text); + $result .= get_navigation_text($$text); } } } elsif ($button eq ' ') { # handle space button - print $fh + $result .= ($ICONS && $ACTIVE_ICONS{' '}) ? &$button_icon_img($BUTTONS_NAME{$button}, $ACTIVE_ICONS{' '}) : $NAVIGATION_TEXT{' '}; @@ -771,7 +824,7 @@ sub lilypond_print_navigation } if ($ICONS && $ACTIVE_ICONS{$button}) { # use icon - print $fh '' . + $result .= '' . &$anchor('', $Texi2HTML::HREF{$button}, &$button_icon_img($BUTTONS_NAME{$button}, @@ -782,11 +835,11 @@ sub lilypond_print_navigation } else { # use text - print $fh + $result .= '[' . &$anchor('', $Texi2HTML::HREF{$button}, - get_navigation_text ($button), + get_navigation_text($button), $btitle ) . ']'; @@ -794,7 +847,7 @@ sub lilypond_print_navigation } else { # button is passive - print $fh + $result .= $ICONS && $PASSIVE_ICONS{$button} ? &$button_icon_img($BUTTONS_NAME{$button}, $PASSIVE_ICONS{$button}, @@ -802,12 +855,13 @@ sub lilypond_print_navigation "[" . get_navigation_text($button) . "]"; } - print $fh "\n" if $vertical; - print $fh "\n" if $vertical; + $result .= "\n" if $vertical; + $result .= "\n" if $vertical; } - print $fh "" unless $beginofline; - print $fh "" unless $vertical; - print $fh "
}; + $result .= qq{}; $beginofline = 0; } elsif ( $button eq 'newline' ) { - print $fh qq{
\n"; + $result .= "" unless $beginofline; + $result .= "" unless $vertical; + $result .= "\n"; + return $result; } @@ -864,37 +918,117 @@ sub lilypond_print_navigation # Format footnotes in a nicer way: Instead of printing the number in a separate # (nr) heading line, use the standard way of prepending nr immediately # before the fn text. -sub lilypond_foot_line_and_ref($$$$$$$) + + +# The following code is copied from texi2html's examples/makeinfo.init and +# should be updated when texi2html makes some changes there! + +my $makekinfo_like_footnote_absolute_number = 0; + +sub makeinfo_like_foot_line_and_ref($$$$$$$$) { - my $number_in_doc = shift; - my $number_in_page = shift; - my $footnote_id = shift; - my $place_id = shift; - my $document_file = shift; + my $foot_num = shift; + my $relative_num = shift; + my $footid = shift; + my $docid = shift; + my $from_file = shift; my $footnote_file = shift; my $lines = shift; my $state = shift; - if ($document_file eq $footnote_file) - { - $document_file = $footnote_file = ''; - } - # FN number printed before the fn text: - my $tmptxt = &$anchor($footnote_id, $document_file . "#$place_id", - "$number_in_doc"); - # unfortunately, the @$lines contain the already formatted footnote in the - # from

...

. This means that we have to modify this string and - # insert the FN number manually. The default (nr) on a separate line before - # the FN text is just plain ugly: - $lines->[0] =~ s/

/

$tmptxt /; + $makekinfo_like_footnote_absolute_number++; + # this is a bit obscure, this allows to add an anchor only if formatted # as part of the document. - $place_id = '' if ($state->{'outside_document'} or $state->{'multiple_pass'}); - # return FN lines and text to be inserted in the running text (link to FN) - return ($lines, &$anchor($place_id, $footnote_file . "#$footnote_id", - "$number_in_doc")); + $docid = '' if ($state->{'outside_document'} or $state->{'multiple_pass'}); + + if ($from_file eq $footnote_file) + { + $from_file = $footnote_file = ''; + } + + my $foot_anchor = "" . &$anchor($docid, "$footnote_file#$footid", $relative_num) . ""; + $foot_anchor = &$anchor($docid, "$footnote_file#$footid", "($relative_num)") if ($state->{'preformatted'}); + +# unshift @$lines, "

  • "; +# push @$lines, "
  • \n"; + return ($lines, $foot_anchor); +} + +sub makeinfo_like_foot_lines($) +{ + my $lines = shift; + unshift @$lines, "
    \n

    $Texi2HTML::I18n::WORDS->{'Footnotes_Title'}

    \n"; +#
      \n"; +# push @$lines, "
    "; + return $lines; } +my %makekinfo_like_paragraph_in_footnote_nr; + +sub makeinfo_like_paragraph ($$$$$$$$$$$$$) +{ + my $text = shift; + my $align = shift; + my $indent = shift; + my $paragraph_command = shift; + my $paragraph_command_formatted = shift; + my $paragraph_number = shift; + my $format = shift; + my $item_nr = shift; + my $enumerate_style = shift; + my $number = shift; + my $command_stack_at_end = shift; + my $command_stack_at_begin = shift; + my $state = shift; +#print STDERR "format: $format\n" if (defined($format)); +#print STDERR "paragraph @$command_stack_at_end; @$command_stack_at_begin\n"; + $paragraph_command_formatted = '' if (!defined($paragraph_command_formatted) or + exists($special_list_commands{$format}->{$paragraph_command})); + return '' if ($text =~ /^\s*$/); + foreach my $style(t2h_collect_styles($command_stack_at_begin)) + { + $text = t2h_begin_style($style, $text); + } + foreach my $style(t2h_collect_styles($command_stack_at_end)) + { + $text = t2h_end_style($style, $text); + } + if (defined($paragraph_number) and defined($$paragraph_number)) + { + $$paragraph_number++; + return $text if (($format eq 'itemize' or $format eq 'enumerate') and + ($$paragraph_number == 1)); + } + my $open = '[0]) and $command_stack_at_begin->[0] eq 'footnote') + { + my $state = $Texi2HTML::THISDOC{'state'}; + $makekinfo_like_paragraph_in_footnote_nr{$makekinfo_like_footnote_absolute_number}++; + if ($makekinfo_like_paragraph_in_footnote_nr{$makekinfo_like_footnote_absolute_number} <= 1) + { + $open.=' class="footnote"'; + my $document_file = $state->{'footnote_document_file'}; + if ($document_file eq $state->{'footnote_footnote_file'}) + { + $document_file = ''; + } + my $docid = $state->{'footnote_place_id'}; + my $doc_state = $state->{'footnote_document_state'}; + $docid = '' if ($doc_state->{'outside_document'} or $doc_state->{'multiple_pass'}); + my $foot_label = &$anchor($state->{'footnote_footnote_id'}, + $document_file . "#$state->{'footnote_place_id'}", + "$state->{'footnote_number_in_page'}"); + $footnote_text = "[${foot_label}] "; + } + } + return $open.'>'.$footnote_text.$text.'

    '; +} #############################################################################