]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'master' of ssh://kainhofer@git.sv.gnu.org/srv/git/lilypond into dev...
authorReinhold Kainhofer <reinhold@kainhofer.com>
Fri, 9 May 2008 17:00:26 +0000 (19:00 +0200)
committerReinhold Kainhofer <reinhold@kainhofer.com>
Fri, 9 May 2008 17:00:26 +0000 (19:00 +0200)
Conflicts:

buildscripts/html-gettext.py
buildscripts/www_post.py
input/lsr/editorial-and-educational-use-intro.itely
make/doclang-rules.make
python/langdefs.py
stepmake/stepmake/texinfo-rules.make

34 files changed:
Documentation/lilypond.css [new file with mode: 0644]
Documentation/user/music-glossary.tely
buildscripts/add_html_footer.py
buildscripts/html-gettext.py
buildscripts/tely-gettext.py [new file with mode: 0755]
buildscripts/www_post.py
config.make.in
configure.in
input/lsr/ancient-notation-intro.itely
input/lsr/chords-intro.itely
input/lsr/contexts-and-engravers-intro.itely
input/lsr/expressive-marks-intro.itely
input/lsr/lilypond-snippets.tely
input/lsr/midi-intro.itely
input/lsr/paper-and-layout-intro.itely
input/lsr/percussion-intro.itely
input/lsr/pitches-intro.itely
input/lsr/repeats-intro.itely
input/lsr/rhythms-intro.itely
input/lsr/simultaneous-notes-intro.itely
input/lsr/spacing-intro.itely
input/lsr/staff-notation-intro.itely
input/lsr/template-intro.itely
input/lsr/text-intro.itely
input/lsr/titles-intro.itely
input/lsr/tweaks-and-overrides-intro.itely
input/lsr/vocal-music-intro.itely
lilypond-texi2html.init [new file with mode: 0644]
make/doclang-rules.make
make/doclang-vars.make
scm/documentation-generate.scm
scm/documentation-lib.scm
stepmake/stepmake/texinfo-rules.make
stepmake/stepmake/texinfo-vars.make

diff --git a/Documentation/lilypond.css b/Documentation/lilypond.css
new file mode 100644 (file)
index 0000000..93df577
--- /dev/null
@@ -0,0 +1,164 @@
+/***********************************************************/
+/*                  PAGE-WIDE SETTINGS                     */
+/***********************************************************/
+body {
+  margin-right: auto;
+  margin-left: auto;
+}
+
+/***********************************************************/
+/*                      HEADERS                            */
+/***********************************************************/
+h2 {
+  font-size: x-large;
+  color: #1d7b85;
+}
+.unnumberedsubsubsec {
+  font-size: large;
+  color: #1d7b85;
+}
+.subsubheading {
+  font-size: large;
+  color: #3b220d;
+}
+
+/***********************************************************/
+/*                       LINKS                             */
+/***********************************************************/
+a {
+  color: #344242;
+}
+a:visited {
+  color: #666666;
+}
+a:active {
+  color: #00cccc;
+}
+a:hover {
+  color: #1d7b85;
+  text-decoration:underline;
+}
+
+/***********************************************************/
+/*                  BLOCK FORMATTING                       */
+/***********************************************************/
+blockquote {
+  border: 1px solid #cccccc;
+  padding: 3px;
+  width: 40em;
+}
+.verbatim {
+  font-family: "Courier New",Courier,monospace;
+}
+hr {
+  border:  none;
+  height: 1px;
+  color: #666666;
+  background-color: #666666;
+}
+table.cartouche {
+  border: 2px dotted #cccccc;
+  margin-left: auto;
+  margin-right: auto;
+  width: 85%;
+}
+table.cartouche td {
+  border: none;
+}
+
+/***********************************************************/
+/*                        TOC                              */
+/***********************************************************/
+.contents {
+  border: 1px dashed #339999;
+  margin: 3px 2em;
+  list-style-type: square;
+  padding-right: 1em;
+  width: 40em;
+  background-color: #fcfff9;
+}
+
+
+/***********************************************************/
+/*                    TOC SIDEBAR                          */
+/***********************************************************/
+body {
+  padding-left: 27%; /* To create space for the sidebar! */
+}
+div#tocframe {
+  position:      fixed;
+  top:           0;
+  left:          0;
+  margin:        0em;
+  padding:       5px;
+  width:         25%;
+  height:        100%;
+  overflow:      auto;
+  background-color: #FFFACD;
+  z-index:100;
+  list-style-type: none;
+}
+
+#tocframe .contents {
+  width: 100%;
+  border: none;
+  margin: 0em;
+  background-color: transparent;
+  list-style-type: none;
+}
+
+#tocframe ul.toc {
+  padding-left: 0px;
+  margin-left: 0px;
+}
+#tocframe ul.toc li {
+ padding-left: 0px;
+  margin-left: 0px;
+  list-style-type: none;
+}
+#tocframe ul.toc > li {
+  font-size: 12px;
+}
+#tocframe ul.toc li li {
+  padding-left: 15px;
+}
+li.toc_current {
+  font-weight: bold;
+  font-style: italic;
+}
+
+li.toc_current ul {
+  font-weight: normal;
+  font-style: normal;
+  background: transparent;
+}
+
+
+
+
+/***********************************************************/
+/*                     NAVIGATION                          */
+/***********************************************************/
+.nav_table {
+  width:  98%;
+  background-color: #CCCCCC;
+  border: 0;
+  left: auto;
+  right: auto;
+  font-size: 10pt;
+}
+
+
+
+
+
+
+/***********************************************************/
+/*               OVERRIDES FOR PRINTING...                 */
+/***********************************************************/
+@media print {
+  /* Hide the sidebar: */
+  body { padding-left: 0; }
+  #tocframe { display: none; }
+  .nav_table { display: none; }
+}
\ No newline at end of file
index aa072e7e7d77d4fbd260bf2f250f94bbecf56a97..70843c2e3a51a1ac9936e0afcf5d92adde2e5c1b 100644 (file)
@@ -125,6 +125,9 @@ Copyright 1999--2007 by the authors
 * Pitch names::                 
 @end menu
 
+@contents
+
+
 @node Musical terms A-Z
 @chapter Musical terms A-Z
 
index 00b48dc6ba5a5accfa490974419c33e396f0c077..5a459784825f1d1bf0955a07b05f75df67a52677 100644 (file)
@@ -6,6 +6,7 @@ Print a nice footer.
 import re
 import os
 import time
+import operator
 
 import langdefs
 
@@ -50,7 +51,10 @@ mail_address = 'http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bug
 suggest_Docs_url = 'http://lilypond.org/web/devel/participating/documentation-adding'
 
 header_tag = '<!-- header_tag -->'
+header_tag_re = re.compile (header_tag)
+
 footer_tag = '<!-- footer_tag -->'
+footer_tag_re = re.compile (footer_tag)
 
 lang_available = _doc ("Other languages: %s.")
 browser_lang = _doc ('About <A HREF="%s">automatic language selection</A>.')
@@ -90,6 +94,9 @@ def source_links_replace (m, source_val):
 splitted_docs_re = re.compile ('(input/lsr/out-www/lilypond-snippets|Documentation/user/out-www/(lilypond|music-glossary|lilypond-program|lilypond-learning))/')
 
 snippets_ref_re = re.compile (r'href="(\.\./)?lilypond-snippets')
+# TODO: master has ../lily- !
+src_href_re = re.compile ('(href|src)="(lily-.*?|.*?[.]png)"')
+source_link_re = re.compile ('href="source/(.*?)"')
 
 ## Windows does not support symlinks.
 # This function avoids creating symlinks for splitted HTML manuals
@@ -97,7 +104,7 @@ snippets_ref_re = re.compile (r'href="(\.\./)?lilypond-snippets')
 # this also fixes missing PNGs only present in translated docs
 def hack_urls (s, prefix):
     if splitted_docs_re.match (prefix):
-        s = re.sub ('(href|src)="(../lily-.*?|.*?[.]png)"', '\\1="../\\2"', s)
+        s = src_href_re.sub ('\\1="../\\2"', s)
 
     # fix Snippets xrefs ad hoc
     s = snippets_ref_re.sub ('href="source/input/lsr/lilypond-snippets', s)
@@ -106,59 +113,52 @@ def hack_urls (s, prefix):
     if not os.path.islink (source_path):
         return s
     source_val = os.readlink (source_path)
-    return re.sub ('href="source/(.*?)"', lambda m: source_links_replace (m, source_val), s)
+    return source_link_re.sub (lambda m: source_links_replace (m, source_val), s)
+
+body_tag_re = re.compile ('(?i)<body([^>]*)>')
+html_tag_re = re.compile ('(?i)<html>')
+doctype_re = re.compile ('(?i)<!DOCTYPE')
+doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n'
 
 def add_header (s):
-    """Add header (<BODY> and doctype)"""
-    if re.search (header_tag, s) == None:
-        body = '<BODY BGCOLOR=WHITE TEXT=BLACK>'
-        s = re.sub ('(?i)<body>', body, s)
-        if re.search ('(?i)<BODY', s):
-            s = re.sub ('(?i)<body[^>]*>', body + header, s, 1)
-        elif re.search ('(?i)<html', s):
-            s = re.sub ('(?i)<html>', '<HTML>' + header, s, 1)
-        else:
-            s = header + s
+    """Add header (<body> and doctype)"""
+    if header_tag_re.search (s) == None:
+        body = '<body bgcolor="white" text="black" \\1>'
+        (s, n) = body_tag_re.subn (body + header, s, 1)
+        if not n:
+            (s, n) = html_tag_re.subn ('<html>' + header, s, 1)
+            if not n:
+                s = header + s
 
         s = header_tag + '\n' + s
 
-        if re.search ('(?i)<!DOCTYPE', s) == None:
-            doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n'
+        if doctype_re.search (s) == None:
             s = doctype + s
         return s
 
+title_tag_re = re.compile ('.*?<title>(.*?)</title>', re.DOTALL)
+AT_web_title_re = re.compile ('@WEB-TITLE@')
+
 def add_title (s):
     # urg
     # maybe find first node?
     fallback_web_title = '-- --'
-    m = re.match ('.*?<title>(.*?)</title>', s, re.DOTALL)
+    m = title_tag_re.match (s)
     if m:
         fallback_web_title = m.group (1)
-    s = re.sub ('@WEB-TITLE@', fallback_web_title, s)
+    s = AT_web_title_re.sub (fallback_web_title, s)
     return s
 
-info_nav_bar = re.compile (r'<div class="node">\s*<p>\s*<a name=".+?"></a>(.+?)<hr>\s*</div>', re.M | re.S)
-info_footnote_hr = re.compile (r'<hr>\s*(</div>)?\s*</body>', re.M | re.I)
+end_body_re = re.compile ('(?i)</body>')
+end_html_re = re.compile ('(?i)</html>')
 
 def add_footer (s):
-    """add footer
-
-also add navigation bar to bottom of Info HTML pages"""
-    m = info_nav_bar.search (s)
-    if m:
-        # avoid duplicate <hr> in case there are footnotes at the end of the Info HTML page
-        if info_footnote_hr.search (s):
-            custom_footer = '<div class="node">\n<p>' + m.group (1) + '</div>\n' + footer
-        else:
-            custom_footer = '<br><hr>\n<div class="node">\n<p>' + m.group (1) + '</div>\n' + footer
-    else:
-        custom_footer = footer
-    if re.search ('(?i)</body', s):
-        s = re.sub ('(?i)</body>', footer_tag + custom_footer + '\n' + '</BODY>', s, 1)
-    elif re.search ('(?i)</html', s):                
-        s = re.sub ('(?i)</html>', footer_tag + custom_footer + '\n' + '</HTML>', s, 1)
-    else:
-        s += footer_tag + custom_footer + '\n'
+    """add footer"""
+    (s, n) = end_body_re.subn (footer_tag + footer + '\n' + '</body>', s, 1)
+    if not n:
+        (s, n) = end_html_re.subn (footer_tag + footer + '\n' + '</html>', s, 1)
+        if not n:
+            s += footer_tag + footer + '\n'
     return s
 
 def find_translations (prefix, lang_ext):
@@ -170,35 +170,37 @@ def find_translations (prefix, lang_ext):
         if lang_ext != e:
             if e in pages_dict[prefix]:
                 available.append (l)
-            elif lang_ext == '' and l.enabled and reduce (lambda x, y: x and y, [not prefix.startswith (s) for s in non_copied_pages]):
+            elif lang_ext == '' and l.enabled and reduce (operator.and_, [not prefix.startswith (s) for s in non_copied_pages]):
                 # English version of missing translated pages will be written
                 missing.append (e)
     return available, missing
 
+online_links_re = re.compile ('''(href|src)=[\'"]([^/][.]*[^.:\'"]*)(.html|.png)(#[^"\']*|)[\'"]''')
+offline_links_re = re.compile ('''href=[\'"]([^/][.]*[^.:\'"]*)(.html)(#[^"\']*|)[\'"]''')
+
 def process_links (s, prefix, lang_ext, file_name, missing, target):
     page_flavors = {}
     if target == 'online':
         # Strip .html, .png suffix for auto language selection (content
         # negotiation).  The menu must keep the full extension, so do
         # this before adding the menu.
-        page_flavors[file_name] = [lang_ext, re.sub (
-            '''(href|src)=[\'"]([^/][.]*[^.:\'"]*)(.html|.png)(#[^"\']*|)[\'"]''',
-            '\\1="\\2\\4"', s)]
+        page_flavors[file_name] = \
+            [lang_ext, online_links_re.sub ('\\1="\\2\\4"', s)]
     elif target == 'offline':
-        # in LANG doc index: don't rewrite .html suffixes as not all .LANG.html pages exist
+        # in LANG doc index: don't rewrite .html suffixes
+        # as not all .LANG.html pages exist;
         # the doc index should be translated and contain the right links
         if prefix == 'Documentation/out-www/index':
             page_flavors[file_name] = [lang_ext, s]
         elif lang_ext == '':
             page_flavors[file_name] = [lang_ext, s]
             for e in missing:
-                page_flavors[langdefs.lang_file_name (prefix, e, '.html')] = [e, re.sub (
-                    '''href=[\'"]([^/][.]*[^.:\'"]*)(.html)(#[^"\']*|)[\'"]''',
-                    'href="\\1.' + e + '\\2\\3"', s)]
+                page_flavors[langdefs.lang_file_name (prefix, e, '.html')] = \
+                    [e, offline_links_re.sub ('href="\\1.' + e + '\\2\\3"', s)]
         else:
-            page_flavors[file_name] = [lang_ext, re.sub (
-                '''href=[\'"]([^/][.]*[^.:\'"]*)(.html)(#[^"\']*|)[\'"]''',
-                'href="\\1.' + lang_ext + '\\2\\3"', s)]
+            page_flavors[file_name] = \
+                [lang_ext,
+                 offline_links_re.sub ('href="\\1.' + lang_ext + '\\2\\3"', s)]
     return page_flavors
 
 def add_menu (page_flavors, prefix, available, target, translation):
@@ -222,12 +224,11 @@ def add_menu (page_flavors, prefix, available, target, translation):
             language_available = t (lang_available) % language_menu
             languages = LANGUAGES_TEMPLATE % vars ()
         # put language menu before '</body>' and '</html>' tags
-        if re.search ('(?i)</body', page_flavors[k][1]):
-            page_flavors[k][1] = re.sub ('(?i)</body>', languages + '</BODY>', page_flavors[k][1], 1)
-        elif re.search ('(?i)</html', page_flavors[k][1]):
-            page_flavors[k][1] = re.sub ('(?i)</html>', languages + '</HTML>', page_flavors[k][1], 1)
-        else:
-            page_flavors[k][1] += languages
+        (page_flavors[k][1], n) = end_body_re.subn (languages + '</body>', page_flavors[k][1], 1)
+        if not n:
+            (page_flavors[k][1], n) = end_html_re.subn (languages + '</html>', page_flavors[k][1], 1)
+            if not n:
+                page_flavors[k][1] += languages
     return page_flavors
 
 
@@ -266,12 +267,12 @@ def add_html_footer (package_name = '',
             s = in_f.read()
             in_f.close()
 
-            s = re.sub ('%', '%%', s)
+            s = s.replace ('%', '%%')
             s = hack_urls (s, prefix)
             s = add_header (s)
 
             ### add footer
-            if re.search (footer_tag, s) == None:
+            if footer_tag_re.search (s) == None:
                 s = add_footer (s)
                 
                 available, missing = find_translations (prefix, lang_ext)
index 7d32879a4112b0d0e81e1faf9fc6b034c3831854..02a4c947c0220062f9cbe5a6e8db8b759f67656a 100644 (file)
@@ -86,7 +86,7 @@ for filename in files:
     page = re.sub (r'<title>([^<]*?) - ([^<]*?)</title>', title_gettext, page)
     # ugh
     page = re.sub (r'(?ms)<a ((?:rel="\w+")? ?(?:accesskey="[^"]+?")? ?(?:name=".*?")? ?)(href=".+?">)(<code>)?(Appendix )?([A-Z\d.]+ |)(.+?)(?(3)</code>)</a>:?', a_href_gettext, page)
-    page = re.sub (r'<h(\d)( class="\w+"|)>(Appendix |)([A-Z\d.]+ |)?([^<]+)</h\1>', h_gettext, page)
+    page = re.sub (r'<h(\d)( class="\w+"|)>\s*(Appendix |)([A-Z\d.]+ |)?([^<]+)\s*</h\1>', h_gettext, page)
     page = re.sub (r'<a href="(\.\./(?:music-glossary|lilypond-program/)?(?:.+?))">(.+?)</a>', crossmanual_ref_gettext, page)
     # this is necessary for entries not translated by a_href_gettext
     page = re.sub (r'<a href="(.+?)">(.+?)</a>', crossmanual_ref_gettext, page)
diff --git a/buildscripts/tely-gettext.py b/buildscripts/tely-gettext.py
new file mode 100755 (executable)
index 0000000..b4e5660
--- /dev/null
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# tely-gettext.py
+
+# Temporary script that helps translated docs sources conversion
+# for texi2html processing
+
+# USAGE:  tely-gettext.py BUILDSCRIPT-DIR LOCALEDIR LANG FILES
+
+print "tely_gettext.py"
+
+import sys
+import re
+import os
+import gettext
+
+if len (sys.argv) > 3:
+    buildscript_dir, localedir, lang = sys.argv[1:4]
+else:
+    print """USAGE:  tely-gettext.py BUILDSCRIPT-DIR LOCALEDIR LANG FILES
+  For example buildscripts/tely-gettext.py buildscripts Documentation/po/out-www de Documentation/de/user/*.tely"""
+    sys.exit (1)
+
+sys.path.append (buildscript_dir)
+import langdefs
+
+double_punct_char_separator = langdefs.LANGDICT[lang].double_punct_char_sep
+t = gettext.translation('lilypond-doc', localedir, [lang])
+_doc = t.gettext
+
+include_re = re.compile (r'@include (.*?)$', re.M)
+whitespaces = re.compile (r'\s+')
+ref_re = re.compile (r'(?ms)@(ruser|rprogram|ref|rlearning)\{(.*?)\}')
+node_section_re = re.compile (r'@node (.*?)\n@((?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading) (.*?)\n')
+menu_entry_re = re.compile (r'\* (.*?)::')
+
+def ref_gettext (m):
+    r = whitespaces.sub (' ', m.group (2))
+    return '@' + m.group (1) + '{' + _doc (r) + '}'
+
+def node_gettext (m):
+    return '@node ' + _doc (m.group (1)) + '\n@' + \
+        m.group (2) + ' ' + _doc (m.group (3)) + \
+       '\n@translationof ' + m.group (1) + '\n'
+
+def menu_entry_gettext (m):
+    return '* ' + _doc (m.group (1)) + '::'
+
+def process_file (filename):
+    print "Processing %s" % filename
+    f = open (filename, 'r')
+    page = f.read ()
+    f.close()
+    page = node_section_re.sub (node_gettext, page)
+    page = ref_re.sub (ref_gettext, page)
+    page = menu_entry_re.sub (menu_entry_gettext, page)
+    page = page.replace ("""-- SKELETON FILE --
+When you actually translate this file, please remove these lines as
+well as all `UNTRANSLATED NODE: IGNORE ME' lines.""", """@c -- SKELETON FILE --""")
+    page = page.replace ('UNTRANSLATED NODE: IGNORE ME', "@c UNTRANSLATED NODE: IGNORE ME")
+    includes = [whitespaces.sub ('', f) for f in include_re.findall (page)]
+    f = open (filename, 'w')
+    f.write (page)
+    f.close ()
+    dir = os.path.dirname (filename)
+    for file in includes:
+        p = os.path.join (dir, file)
+        if os.path.exists (p):
+            process_file (p)
+
+for filename in sys.argv[4:]:
+    process_file (filename)
index b2d7ca510cb9bf663e3697d958709bce57acb96d..b05e5e20116bda755232b37f7c6130952acedb3e 100644 (file)
@@ -49,7 +49,7 @@ dirs, symlinks, files = mirrortree.walk_tree (
     tree_roots = doc_dirs,
     process_dirs = outdir,
     exclude_dirs = '(^|/)(' + r'|po|out|out-test|.*?[.]t2d|\w*?-root)(/|$)|Documentation/(' + '|'.join ([l.code for l in langdefs.LANGUAGES]) + ')',
-    find_files = r'.*?\.(?:midi|html|pdf|png|txt|ly|signature)$|VERSION',
+    find_files = r'.*?\.(?:midi|html|pdf|png|txt|ly|signature|css)$|VERSION',
     exclude_files = r'lily-[0-9a-f]+.*\.(pdf|txt)')
 
 # actual mirrorring stuff
index 4d714c3d3f235e62ac8b87bb9635df4f0ce5f808..da0123311f405c6f5d2a378eadd52a50398de12f 100644 (file)
@@ -126,6 +126,7 @@ LINK_GXX_STATICALLY = @LINK_GXX_STATICALLY@
 LN = @LN@
 LN_S = @LN_S@
 MAKEINFO_PROGRAM = @MAKEINFO@
+TEXI2HTML_PROGRAM = @TEXI2HTML@
 METAFONT = @METAFONT@ -progname=mf
 MFMODE = @MFMODE@
 MSGFMT = @MSGFMT@
index 38a7957081b7e1eb7e8e82dac502c9613cfc8340..b7475b7ba96d74bccb794b0f96d4e3c9869da85a 100644 (file)
@@ -126,7 +126,8 @@ AC_MSG_RESULT(Must have patched GUILE rational support. See INSTALL.txt))
 CPPFLAGS="$save_CPPFLAGS"
 
 
-STEPMAKE_MAKEINFO(REQUIRED, 4.11)
+# We check for makeinfo below, too. Really duplicate that check?
+## STEPMAKE_MAKEINFO(REQUIRED, 4.11)
 STEPMAKE_PYTHON_DEVEL(REQUIRED)
 
 STEPMAKE_PATH_PROG(GHOSTSCRIPT, gs, OPTIONAL, 8.15)
@@ -174,6 +175,7 @@ STEPMAKE_GUILE(OPTIONAL)
 STEPMAKE_PERL(OPTIONAL)
 
 STEPMAKE_PROGS(MAKEINFO, makeinfo, REQUIRED, 4.11)
+STEPMAKE_PROGS(TEXI2HTML, texi2html, REQUIRED, 1.79)
 
 AC_DEFINE_UNQUOTED(FLOWER_VERSION, "${FULL_FLOWER_VERSION}")
 
index 52a221029e03c6955caddfc8ad5f327e0526a821..1fd43a833ee94c602248c52512b6aff4c7560c0e 100644 (file)
@@ -1,5 +1,5 @@
 @node Ancient notation
-@unnumbered Ancient notation
+@chapter Ancient notation
 
 @lysnippets
 
index c9980477efcab8fce1be5d87ca590149bf42dbd0..dbd1b2b8849cacce76909968287bb4177d889fa5 100644 (file)
@@ -1,5 +1,5 @@
 @node Chords
-@unnumbered Chords
+@chapter Chords
 
 @lysnippets
 
index ca1031a98dc68c00f431c7c4b0e2ea70be9d386b..a6b3ef7ebd7430cd8de1d281a7260be501435636 100644 (file)
@@ -1,5 +1,5 @@
 @node Contexts and engravers
-@unnumbered Contexts and engravers
+@chapter Contexts and engravers
 
 @lysnippets
 
index 6b6550dd36a1962cbab426811b7b607c2a16562e..91fc34bb5ec1da78f1014e67b4b6a017cd08f8e0 100644 (file)
@@ -1,5 +1,5 @@
 @node Expressive marks
-@unnumbered Expressive marks
+@chapter Expressive marks
 
 @lysnippets
 
index 538988e13c804ca5f31281a964c370a8c98daf63..2b4250945fb39b1cbb01a5962e03b2dc4aae1a6a 100644 (file)
@@ -109,6 +109,8 @@ Other collections
 * Templates::
 @end menu
 
+@contents
+
 
 @c Please take care of naming every .itely
 @c with an existing tag name.
index e46fe431285e89b9f987f34debb1593e3f31a376..0ed89203cb610aa4146644d8442d3ec096f0a3c9 100644 (file)
@@ -1,5 +1,5 @@
 @node MIDI
-@unnumbered MIDI
+@chapter MIDI
 
 @lysnippets
 
index 35774dfab19d7e78b6f06452a22b59b99e5f9be1..8c6ce1966b862a526bfe42a17b7ad453a986c4fd 100644 (file)
@@ -1,5 +1,5 @@
 @node Paper and layout
-@unnumbered Paper and layout
+@chapter Paper and layout
 
 @lysnippets
 
index 9c2c6fdb12dbd1ccdfd513fe4d7a825027ba396d..bafd0aef42a7d3bd9af2f8eb7ebf512596f92d3e 100644 (file)
@@ -1,5 +1,5 @@
 @node Percussion
-@unnumbered Percussion
+@chapter Percussion
 
 @lysnippets
 
index 2d65d943550f9433ffd7be7cca72f4a00971d170..9e23530929b0de1ee30b7ba37aa7929ddceaf610 100644 (file)
@@ -1,5 +1,5 @@
 @node Pitches
-@unnumbered Pitches
+@chapter Pitches
 
 @lysnippets
 
index bda677755af584db9582ba0eca21e325db08ceec..4137c22606f54868091c58333bdb1bc447e3b3e8 100644 (file)
@@ -1,5 +1,5 @@
 @node Repeats
-@unnumbered Repeats
+@chapter Repeats
 
 @lysnippets
 
index a250e5b39870edddd98a438e77f3739b303481fe..4ee0b457efe130830570eb453ee824ba52a40cda 100644 (file)
@@ -1,5 +1,5 @@
 @node Rhythms
-@unnumbered Rhythms
+@chapter Rhythms
 
 @lysnippets
 
index 321010ab4c8a1dba0e53856e815750d3a538edaf..dd5138a13f336d1ffd68f3f253c80df38ab78cd8 100644 (file)
@@ -1,5 +1,5 @@
 @node Simultaneous notes
-@unnumbered Simultaneous notes
+@chapter Simultaneous notes
 
 @lysnippets
 
index 7cd4fcd4776da105d5a191c702b948c32c8e0030..123f1a63eb40957fd643b5dcd6b6989c52ee79d6 100644 (file)
@@ -1,5 +1,5 @@
 @node Spacing
-@unnumbered Spacing
+@chapter Spacing
 
 @lysnippets
 
index 4a2103d87e103fc93465dc71c161e0ca1b31a75d..a2850ebf25b22380f426602d5d49cde98e38b9a7 100644 (file)
@@ -1,5 +1,5 @@
 @node Staff notation
-@unnumbered Staff notation
+@chapter Staff notation
 
 @lysnippets
 
index 22c9952e840cbabbc9718ea396ed137ff104dc94..3fd680a451cb5f470b58f941935ebd37e719cbd0 100644 (file)
@@ -1,5 +1,5 @@
 @node Templates
-@unnumbered Templates
+@chapter Templates
 
 @lysnippets
 
index 29a4f45e0f271da1a576a4653f79f8b0cca152de..c36057492d990d1f3c4cf3d2c7e607f8756b9791 100644 (file)
@@ -1,5 +1,5 @@
 @node Text
-@unnumbered Text
+@chapter Text
 
 @lysnippets
 
index ef18b4d2e8839cd678760c334202f1f94896ff32..fa71a6ecc05bb7827e1dc4ddd0818b470d1b4b7a 100644 (file)
@@ -1,5 +1,5 @@
 @node Titles
-@unnumbered Titles
+@chapter Titles
 
 @lysnippets
 
index e97bfdf0e2baca7d6b1945fb0fb69ed93f80fd89..5b5a06809c165394c3b9ce9b3957f6d95fbd99c5 100644 (file)
@@ -1,5 +1,5 @@
 @node Tweaks and overrides
-@unnumbered Tweaks and overrides
+@chapter Tweaks and overrides
 
 @lysnippets
 
index 4a3866cca1d2b2260fcfbe9bb52cadd455f8be77..0283eeaf041c98b0a1d04cace5a943a3996568b2 100644 (file)
@@ -1,5 +1,5 @@
 @node Vocal music
-@unnumbered Vocal music
+@chapter Vocal music
 
 @lysnippets
 
diff --git a/lilypond-texi2html.init b/lilypond-texi2html.init
new file mode 100644 (file)
index 0000000..953839c
--- /dev/null
@@ -0,0 +1,513 @@
+#!/usr/bin/env perl
+
+# {
+package Texi2HTML::Config;
+
+my $lastfilename;
+my $docnr = 0;
+my $page_toc_depth = 2;
+my @default_toc = [];
+
+use Data::Dumper;
+$Data::Dumper::Maxdepth = 2;
+
+sub print_element_info($) 
+{
+  my $element = shift;
+  print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
+  print "Element: $element\n";
+  print Dumper($element);
+}
+
+
+# Convert a given node name to its proper file name (normalization as explained
+# in the texinfo manual:
+# http://www.gnu.org/software/texinfo/manual/texinfo/html_node/HTML-Xref-Node-Name-Expansion.html
+sub texinfo_file_name($)
+{
+  my $str = shift;
+  # File name normalization by texinfo:
+  # 1/2: letters and numbers are left unchanged
+  # 3/4: multiple, leading and trailing whitespace is removed
+  $str = main::normalise_space($str);
+  # 5/6: all remaining spaces are converted to '-', all other 7- or 8-bit 
+  #      chars are replaced by _xxxx (xxxx=ascii character code)
+  my @chars = split(//, $str);
+  my $str = '';
+  foreach my $char (@chars) {
+    if ( $char eq ' ' ) { # space -> '-'
+      $str .= '-';
+    } elsif ( ('0' le $char and $char le '9' ) or
+              ('A' le $char and $char le 'Z' ) or
+              ('a' le $char and $char le 'z' ) ) { # number or letter
+      $str .= $char;
+    } else {
+      my $ccode = ord($char);
+      my $addstr;
+      if ( ord($char)<= 0xFFFF ) {
+        $addstr = sprintf("_%4x", $ccode);
+      } else {
+        $addstr = sprintf("__%6x", $ccode);
+      }
+      # padding is done by spaces, replace by '0'
+      $addstr =~ s/\ /0/g;
+      $str .= $addstr;
+    }
+  }
+  # 7: if name begins with number, prepend 't_g' (so it starts with a letter)
+  if ($str =~ /^[0-9]/) {
+    $str = 't_g' . $str;
+  }
+  # DONE
+  return $str
+}
+
+
+
+# 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 ($$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") {
+    return;
+  } 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 = main::remove_texi($$element{texi});
+    if ($$element{translationof}) {
+      $anchor = main::remove_texi($$element{translationof});
+    }
+    # normalize to the same file name as texinfo
+    $anchor = texinfo_file_name($anchor);
+    $$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);
+}
+
+sub lilypond_toc_body($)
+{
+    my $elements_list = shift;
+    # Generate a default TOC for pages without THIS_ELEMENT
+    @default_toc = lilypond_generate_page_toc_body(@$elements_list[0]);
+    return T2H_GPL_toc_body($elements_list);
+}
+
+
+
+
+
+
+
+
+
+
+# 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 = @this_page_toc;
+  # use default TOC if no custom lines have been generated
+  @lines = @default_toc if (not @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} . "&nbsp;";
+  } elsif ( ($button eq 'Forward') or ($button eq 'FastForward') ) {
+    $text = "&nbsp;" . $Texi2HTML::NODE{$button} . $text;
+  } elsif ( $button eq 'Up' ) {
+    $text = "&nbsp;".$text.":&nbsp;" . $Texi2HTML::NODE{$button} . "&nbsp;";
+  }
+  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})
+                {
+                  my $anchor_attributes = '';
+                  if ($USE_ACCESSKEY and (defined($BUTTONS_ACCESSKEY{$button_href})) and ($BUTTONS_ACCESSKEY{$button_href} ne ''))
+                  {
+                      $anchor_attributes = "accesskey=\"$BUTTONS_ACCESSKEY{$button_href}\"";
+                  }
+                  if ($USE_REL_REV and (defined($BUTTONS_REL{$button_href})) and ($BUTTONS_REL{$button_href} ne ''))
+                  {
+                      $anchor_attributes .= " rel=\"$BUTTONS_REL{$button_href}\"";
+                  }
+                  print $fh "" .
+                        &$anchor('',
+                                    $Texi2HTML::HREF{$button_href},
+                                    get_navigation_text($$text),
+                                    $anchor_attributes
+                                   );
+                }
+                else
+                {
+                  print $fh get_navigation_text($$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 ($USE_ACCESSKEY and (defined($BUTTONS_ACCESSKEY{$button})) and ($BUTTONS_ACCESSKEY{$button} ne ''))
+            {
+                $btitle .= " accesskey=\"$BUTTONS_ACCESSKEY{$button}\"";
+            }
+            if ($USE_REL_REV and (defined($BUTTONS_REL{$button})) and ($BUTTONS_REL{$button} ne ''))
+            {
+                $btitle .= " rel=\"$BUTTONS_REL{$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::CSS_REFS      = ("lilypond.css");
+$Texi2HTML::Config::USE_ACCESSKEY = 1;
+$Texi2HTML::Config::USE_LINKS     = 1;
+$Texi2HTML::Config::USE_REL_REV   = 1;
+$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;
+$Texi2HTML::Config::toc_body             = \&lilypond_toc_body;
+
+
+# For split pages, use index(.lang).html as start page!
+if ($Texi2HTML::Config::SPLIT == 'section') {
+#   my $lng = $Texi2HTML::THISDOC{'current_lang'};
+#   if ($lng and ($lng ne "en")) {
+#     $Texi2HTML::Config::TOP_FILE = 'index.'.$lng.'.html';
+#   } else {
+    $Texi2HTML::Config::TOP_FILE = 'index.html';
+#   }
+}
+
+# if ($Texi2HTML::THISDOC{'current_lang'}) {
+#   $Texi2HTML::Config::EXTENSION = $Texi2HTML::THISDOC{'current_lang'} . "." . 
+#         $docu_ext = $Texi2HTML::Config::EXTENSION;;
+# }
+
+
+
+# Try to make use of @translationof to generate files according to the original
+# English section title...
+sub lilypond_unknown($$$$$)
+{
+    my $macro = shift;
+    my $line = shift;
+    my $pass = shift;
+    my $stack = shift;
+    my $state = shift;
+
+    # the @translationof macro provides the original English section title, 
+    # which should be used for file/anchor naming, while the title will be
+    # translated to each language
+    if ($pass == 1 and $macro eq "translationof") {
+      if (ref($state->{'element'})=='HASH') {
+        $state->{'element'}->{'translationof'} = main::normalise_space($line);
+      }
+      return ('', true, undef, undef);
+    } else {
+      return t2h_default_unknown($macro, $line, $pass, $stack, $state);
+    }
+}
+$Texi2HTML::Config::unknown                  = \&lilypond_unknown;
+
+
+
+return 1;
index 10fa6ef382ecc95622f0ab6abe94f313070089c4..33101c46b9c68321f58f52b4ad5ab3e39a2be4f7 100644 (file)
@@ -1,14 +1,17 @@
-$(outdir)/%/index.html: $(outdir)/%.texi $(outdir)/version.itexi
+<<<<<<< HEAD:make/doclang-rules.make
+$(outdir)/%/index.html: $(outdir)/%.texi $(OUT_PNG_IMAGES) $(outdir)/version.itexi
        mkdir -p $(dir $@)
-       $(MAKEINFO) -P $(outdir) --output=$(outdir)/$* --css-include=$(top-src-dir)/Documentation/texinfo.css --html $<
+       $(TEXI2HTML) --I=$(outdir) $(TEXI2HTML_FLAGS) --output=$(dir $@) --prefix=index --split=section $(TEXI2HTML_INIT) $<
+       cp $(top-src-dir)/Documentation/lilypond.css $(dir $@)
 
-$(outdir)/%-big-page.html: $(outdir)/%.texi $(outdir)/version.itexi
-       $(MAKEINFO) -P $(outdir) --output=$@ --css-include=$(top-src-dir)/Documentation/texinfo.css --html --no-split --no-headers $< 
+$(outdir)/%-big-page.html: $(outdir)/%.texi $(OUT_PNG_IMAGES) $(outdir)/version.itexi
+       $(TEXI2HTML) --I=$(outdir) $(TEXI2HTML_FLAGS) --output=$@ $(TEXI2HTML_INIT) $<
+       cp $(top-src-dir)/Documentation/lilypond.css $(dir $@)
 
 $(outdir)/%.pdftexi: $(outdir)/%.texi doc-po $(outdir)/version.itexi
        $(PYTHON) $(buildscript-dir)/texi-gettext.py $(ISOLANG) $<
 
-$(outdir)/%.pdf: $(outdir)/%.pdftexi
+$(outdir)/%.pdf: $(outdir)/%.pdftexi $(outdir)/version.itexi
        cd $(outdir); texi2pdf $(TEXI2PDF_FLAGS) $(TEXINFO_PAPERSIZE_OPTION) $(notdir $*).pdftexi
 
 $(outdir)/version.%: $(top-src-dir)/VERSION
@@ -16,6 +19,9 @@ $(outdir)/version.%: $(top-src-dir)/VERSION
        echo $(TOPLEVEL_VERSION)>> $@
        echo '@end macro'>> $@
 
+$(outdir)/%.png: $(top-build-dir)/Documentation/user/$(outdir)/%.png
+       ln -f $< $@
+
 # This makes sure lilypond-doc gettext domain has been compiled
 # before lilypond-book runs
 %.tely: doc-po
index 6e36693044afb525ced2448db4db9c742a51a74a..0d4da0e81bd242b833acca4a959942cfd0131f10 100644 (file)
@@ -2,6 +2,9 @@
 
 LANGS = $(shell $(PYTHON) $(buildscript-dir)/langdefs.py)
 
+SOURCE_PNG_IMAGES=$(shell ls $(top-src-dir)/Documentation/user/*.png)
+OUT_PNG_IMAGES=$(SOURCE_PNG_IMAGES:$(top-src-dir)/Documentation/user/%.png=$(outdir)/%.png) $(outdir)/context-example.png
+
 DOCUMENTATION_INCLUDES = \
   -I $(top-src-dir)/Documentation/user \
   -I $(top-build-dir)/Documentation/user/$(outdir)
@@ -10,6 +13,11 @@ LILYPOND_BOOK_INCLUDES += $(DOCUMENTATION_INCLUDES)
 MAKEINFO_FLAGS += --force --enable-encoding $(DOCUMENTATION_INCLUDES)
 MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS)
 
+TEXI2HTML_INIT= --init-file=$(top-src-dir)/lilypond-texi2html.init
+TEXI2HTML_LANG=--lang=$(ISOLANG)
+TEXI2HTML_FLAGS += $(TEXI2HTML_LANG) $(DOCUMENTATION_INCLUDES)
+TEXI2HTML = LANG= $(TEXI2HTML_PROGRAM)
+
 TEXI2PDF_FLAGS += --batch $(DOCUMENTATION_INCLUDES)
 
 TELY_FILES = $(call src-wildcard,*.tely)
index 94dbf27a240f4fae79c912ab5d88db4c113117fb..3e97f638f0d23d88acfdd1ee67be5ec2f0bafef5 100644 (file)
 @ifclear bigpage
 
 @macro ruser{NAME}
-@ref{\\NAME\\,,,lilypond}
+@ref{\\NAME\\,,,lilypond,Notation Reference}
 @cindex \\NAME\\
 @end macro
 
 @macro glossaryref{NAME}
-@ref{\\NAME\\,,,music-glossary}
+@ref{\\NAME\\,,,music-glossary,Music Glossary}
 @cindex \\NAME\\
 @end macro
 
 @omfcategory Applications|Publishing
 @end ignore
 
-
+@contents
 ")
  out-port)
 
index 24d94215fa19c00ae70b3e5fa808f79aad2d9ed2..0c9e2bdec6a1a5bbe2491e14b645ae29ba1c4f65 100644 (file)
@@ -62,9 +62,9 @@
   (cdr (assoc level '(
                      ;; Hmm, texinfo doesn't have ``part''
                      (0 . "@top")
-                     (1 . "@unnumbered")
-                     (2 . "@unnumberedsec")
-                     (3 . "@unnumberedsubsec")
+                     (1 . "@chapter")
+                     (2 . "@section")
+                     (3 . "@subsection")
                      (4 . "@unnumberedsubsubsec")
                      (5 . "@unnumberedsubsubsec")))))
 
index c6e29cde73e645e1336da3dd7aadd2afff541f5d..649956f6fb5cb5496d231dfccafe58e546559bf2 100644 (file)
@@ -27,10 +27,13 @@ $(outdir)/%.info: $(outdir)/%.texi $(outdir)/$(INFO_IMAGES_DIR).info-images-dir.
        $(MAKEINFO) -I$(outdir) --output=$@ $<
 
 $(outdir)/%-big-page.html: $(outdir)/%.texi $(outdir)/version.itexi
-       $(MAKEINFO) -I $(outdir) --output=$@ --css-include=$(top-src-dir)/Documentation/texinfo.css --html --no-split -D bigpage --no-headers $<
+       $(TEXI2HTML) --I=$(outdir) -D bigpage --output=$@ $(TEXI2HTML_INIT) $< 
+       cp $(top-src-dir)/Documentation/lilypond.css $(dir $@)
+
 
 $(outdir)/%.html: $(outdir)/%.texi $(outdir)/version.itexi
-       $(MAKEINFO) -I $(outdir) --output=$@ --css-include=$(top-src-dir)/Documentation/texinfo.css --html --no-split --no-headers $<
+       $(TEXI2HTML) --I=$(outdir) --output=$@ $(TEXI2HTML_INIT) $<
+       cp $(top-src-dir)/Documentation/lilypond.css $(dir $@)
 
 $(outdir)/%.html.omf: %.texi
        $(call GENERATE_OMF,html)
@@ -43,7 +46,8 @@ $(outdir)/%.ps.gz.omf: %.texi
 
 $(outdir)/%/index.html: $(outdir)/%.texi $(outdir)/version.itexi
        mkdir -p $(dir $@)
-       $(MAKEINFO) -I $(outdir) --output=$(dir $@) --css-include=$(top-src-dir)/Documentation/texinfo.css --html $<
+       $(TEXI2HTML) --I=$(outdir) --output=$(dir $@) --prefix=index --split=section $(TEXI2HTML_INIT) $<
+       cp $(top-src-dir)/Documentation/lilypond.css $(dir $@)
 
 $(outdir)/%.pdf: $(outdir)/%.texi $(outdir)/version.itexi
        cd $(outdir); texi2pdf $(TEXI2PDF_FLAGS) --batch $(TEXINFO_PAPERSIZE_OPTION) $(<F)
index d36ff83b81db972664de69f49987e9341cab6a6c..3b6a0e5ed336eb0d0ac72a5f3309aab2a00c8be2 100644 (file)
@@ -1,4 +1,3 @@
-
 TEXI_FILES = $(call src-wildcard,*.texi)
 
 ALL_SOURCES += $(TEXI_FILES)
@@ -14,6 +13,12 @@ TEXINFO_PAPERSIZE_OPTION= $(if $(findstring $(PAPERSIZE),a4),,-t @afourpaper)
 MAKEINFO_FLAGS = --enable-encoding
 MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS)
 
+ifneq ($(ISOLANG),) 
+TEXI2HTML_LANG = --lang=$(ISOLANG)
+endif
+TEXI2HTML_FLAGS += --css-ref=lilypond.css $(DOCUMENTATION_INCLUDES)
+TEXI2HTML_INIT = --init-file=$(top-src-dir)/lilypond-texi2html.init
+TEXI2HTML = $(TEXI2HTML_PROGRAM) $(TEXI2HTML_FLAGS) $(TEXI2HTML_LANG)
 
 # info stuff
 INFO_INSTALL_FILES = $(wildcard $(addsuffix *, $(INFO_FILES)))