default: local-doc
-local-WWW: txt-to-html $(OUT_HTML_FILES)
+local-WWW-2: txt-to-html $(OUT_HTML_FILES)
local-WWW-clean: deep-WWW-clean
-# Documentation/tex/Makefile
+# Documentation/bibliography/Makefile
depth=../..
# urg
default:
-GENHTMLS = engraving colorado computer-notation
+GENHTMLS = engraving colorado computer-notation
OUTGENHTMLS = $(addprefix $(outdir)/, $(GENHTMLS:%=%.html))
-local-WWW: $(addprefix $(outdir)/, $(BIB_FILES:.bib=.html) index.html)
+local-WWW-2: $(addprefix $(outdir)/, $(BIB_FILES:.bib=.html) index.html)
$(outdir)/%.bib: %.bib
ln -f $< $@
LOCALSTEPMAKE_TEMPLATES = lilypond ly doclang
include $(depth)/make/stepmake.make
+
+local-WWW-1: $(XREF_MAP_FILES) $(outdir)/lilypond-snippets.xref-map \
+ $(outdir)/music-glossary.xref-map \
+ $(outdir)/lilypond-internals.xref-map
+
+$(outdir)/lilypond-snippets.xref-map:
+ ln -sf ../../../../input/lsr/$@ $@
+
+$(outdir)/lilypond-internals.xref-map $(outdir)/music-glossary.xref-map:
+ ln -sf ../../../user/$@ $@
LOCALSTEPMAKE_TEMPLATES = lilypond ly doclang
include $(depth)/make/stepmake.make
+
+local-WWW-1: $(XREF_MAP_FILES) $(outdir)/lilypond-snippets.xref-map \
+ $(outdir)/music-glossary.xref-map \
+ $(outdir)/lilypond-internals.xref-map
+
+$(outdir)/lilypond-snippets.xref-map:
+ ln -sf ../../../../input/lsr/$@ $@
+
+$(outdir)/lilypond-internals.xref-map $(outdir)/music-glossary.xref-map:
+ ln -sf ../../../user/$@ $@
LOCALSTEPMAKE_TEMPLATES = lilypond ly doclang
include $(depth)/make/stepmake.make
+local-WWW-1: $(XREF_MAP_FILES) $(outdir)/lilypond-snippets.xref-map \
+ $(outdir)/music-glossary.xref-map \
+ $(outdir)/lilypond-internals.xref-map
+
+$(outdir)/lilypond-snippets.xref-map:
+ ln -sf ../../../../input/lsr/$@ $@
+
+$(outdir)/lilypond-internals.xref-map $(outdir)/music-glossary.xref-map:
+ ln -sf ../../../user/$@ $@
--- /dev/null
+/***********************************************************/
+/* TOC SIDEBAR */
+/***********************************************************/
+body {
+ height: 100%;
+ font-size: 100%;
+ min-height: 0;
+}
+
+/***********************************************************/
+/* MAIN CONTENT */
+/***********************************************************/
+
+div#main {
+ min-height: 0;
+ height: 100%;
+ width: 73%;
+ overflow-x: auto;
+}
+
+/***********************************************************/
+/* TOC SIDEBAR */
+/***********************************************************/
+
+div#tocframe {
+ height: 100%;
+ width: 27%;
+}
--- /dev/null
+/***********************************************************/
+/* PAGE-WIDE SETTINGS */
+/**********************************************************/
+
+html {
+ height:100%;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ height: 100%;
+ font-size: 100%;
+ 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, .example {
+ 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;
+}
+
+/***********************************************************/
+/* MAIN CONTENT */
+/***********************************************************/
+
+div#main {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 27%;
+ padding: 0 1em;
+ margin: 0;
+ overflow: auto;
+}
+
+#languages {
+ padding-bottom: 1em;
+}
+
+/***********************************************************/
+/* TOC SIDEBAR */
+/***********************************************************/
+
+div#tocframe {
+ position: absolute;
+ top: 0;
+ right: 73%;
+ bottom: 0;
+ left: 0;
+ padding: 5px;
+ padding-bottom: 0;
+ margin: 0;
+ overflow: auto;
+ background-color: #FFFACD;
+ z-index:100;
+ list-style-type: none;
+}
+
+@media screen {
+ body>div#tocframe {
+ position: fixed
+ }
+ }
+
+#tocframe .contents {
+ width: 100%;
+ padding-bottom: 0.25em;
+ 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: 100%;
+ background-color: #CCC;
+ border: 0;
+ margin-top: 4px;
+ left: auto;
+ right: auto;
+ font-size: 0.8em;
+}
+
+
+
+
+
+
+/***********************************************************/
+/* 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
#urg default local-WWW target uses footify before its time;
# must add footify with txt-to-html target
OUT_TXT_FILES = $(addprefix $(outdir)/, $(addsuffix .txt, $(TEXTS)))
-##local-WWW: $(OUT_TXT_FILES) $(OUT_HTMLFILES) txt-to-html
+##local-WWW-2: $(OUT_TXT_FILES) $(OUT_HTMLFILES) txt-to-html
copy-for-me:
$(foreach a, $(README_TOP_FILES), cp ../$(a) $(outdir)/$(a).txt && ) true
local-dist: $(icon)
xgifs: $(OUTGIF_FILES)
pngs: $(OUTPNG_FILES)
-local-WWW: $(OUTPNG_FILES)
-
+local-WWW-1: $(OUTPNG_FILES)
STEPMAKE_TEMPLATES=documentation tex texinfo topdocs
LOCALSTEPMAKE_TEMPLATES=lilypond ly
+OUT_TEXI_FILES = $(TELY_FILES:%.tely=$(outdir)/%.texi)
HTML_FILES=$(TEXI_FILES:%.texi=$(outdir)/%.html) $(TELY_FILES:%.tely=$(outdir)/%.html)
PDF_FILES=$(outdir)/NEWS.pdf
README_TOP_FILES=NEWS AUTHORS INSTALL README
MAKEINFO_FLAGS += -I $(top-src-dir)/Documentation/user
+local-WWW-1: $(OUT_TEXI_FILES)
+
.SECONDARY:
OUT_TEXI_FILES=$(ITEXI_FILES:%.itexi=$(outdir)/%.texi)\
$(ITELY_FILES:%.itely=$(outdir)/%.texi)
+
+MASTER_TEXI_FILES = $(TELY_FILES:%.tely=$(outdir)/%.texi)\
+ $(outdir)/lilypond-internals.texi
+
HTML_FILES = $(TELY_FILES:%.tely=$(outdir)/%-big-page.html)\
$(outdir)/lilypond-internals-big-page.html
xml update Docbook xml documentation\n\
"
-# Generic rule using % twice not possible?
-# $(outdir)/%/%.html: $(outdir)/%.texi
$(outdir)/lilypond.texi: $(outdir)/lilypond-internals.texi
#
mkdir -p $(dir $@)
ln -sf $(depth)/.. $(@)
-local-WWW: $(HTML_FILES) $(DEEP_HTML_FILES)\
- $(datafiles) $(PDF_FILES) $(source-links) info
+local-WWW-1: $(MASTER_TEXI_FILES) $(MASTER_TEXI_FILES:%.texi=%.xref-map) $(outdir)/lilypond-snippets.xref-map $(PDF_FILES) info
+
+local-WWW-2: $(HTML_FILES) $(DEEP_HTML_FILES) $(source-links)
$(outdir)/%.bib: %.bib
ln -f $< $@
+$(outdir)/lilypond-snippets.xref-map:
+ ln -fs ../../../input/lsr/$@ $@
# lilypond.texi deps
$(top-build-dir)/mf/$(outconfbase)/feta16list.ly:
$(outdir)/lilypond-internals.texi: $(LILYPOND_BINARY)
cd $(outdir) && $(LILYPOND_BINARY) --verbose $(top-src-dir)/ly/generate-documentation
-
-## unused
-$(outdir)/interfaces.itexi: dummy
- cd $(outdir) && lilypond $(top-src-dir)/ly/generate-interface-doc
-
.SECONDARY:
@ref{\TEXT\,,\DISPLAY\,lilypond-learning,Learning Manual}
@end macro
+@macro rlearningnamed{TEXT,DISPLAY}
+learning manual, @ref{\TEXT\,,\DISPLAY\,lilypond-learning,Learning Manual}
+@end macro
+
@macro ruser{TEXT}
@ref{\TEXT\,,,lilypond,Notation Reference}
@end macro
@ref{\TEXT\,,\DISPLAY\,lilypond,Notation Reference}
@end macro
+@macro rusernamed{TEXT,DISPLAY,DISPLAY}
+notation reference, @ref{\TEXT\,,\DISPLAY\,lilypond,Notation Reference}
+@end macro
+
@macro rprogram{TEXT}
@ref{\TEXT\,,,lilypond-program,Application Usage}
@end macro
@ref{\TEXT\,,\DISPLAY\,lilypond-program,Application Usage}
@end macro
+@macro rprogramnamed{TEXT,DISPLAY}
+program usage manual, @ref{\TEXT\,,\DISPLAY\,lilypond-program,Application Usage}
+@end macro
+
@macro rlsr{TEXT}
@ref{\TEXT\,,,lilypond-snippets,Snippets}
@end macro
* Pitch names::
@end menu
+@contents
+
+
@node Musical terms A-Z
@chapter Musical terms A-Z
# For both online and offline docs, issue `make web WEB_TARGETS="offline online"'
WEB_TARGETS = offline
-local-WWW-post:
+WWW-post:
# need UTF8 setting in case this is hosted on a website.
echo -e 'AddDefaultCharset utf-8\nAddCharset utf-8 .html\nAddCharset utf-8 .en\nAddCharset utf-8 .nl\nAddCharset utf-8 .txt\n' > $(top-build-dir)/.htaccess
$(PYTHON) $(buildscript-dir)/mutopia-index.py -o $(outdir)/examples.html input/
import re
import os
import time
+import operator
import langdefs
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>.')
browser_language_url = "/web/about/browser-language"
LANGUAGES_TEMPLATE = '''
-<P>
+<p id="languages">
%(language_available)s
- <BR>
+ <br/>
%(browser_language)s
-</P>
+</p>
'''
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')
-user_ref_re = re.compile (r'href="(?:\.\./)?lilypond(|-internals|-learning|-program)')
+user_ref_re = re.compile (r'href="(?:\.\./)?lilypond(-internals|-learning|-program|(?!-snippets))')
## Windows does not support symlinks.
# This function avoids creating symlinks for splitted HTML manuals
source_val = os.readlink (source_path)
return re.sub ('href="source/(.*?)"', 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)
-
-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'
+footer_insert_re = re.compile ('<!--\s*FOOTER\s*-->')
+end_body_re = re.compile ('(?i)</body>')
+end_html_re = re.compile ('(?i)</html>')
+
+def add_footer (s, footer_text):
+ """add footer"""
+ (s, n) = footer_insert_re.subn (footer_text + '\n' + '<!-- FOOTER -->', s, 1)
+ if not n:
+ (s, n) = end_body_re.subn (footer_text + '\n' + '</body>', s, 1)
+ if not n:
+ (s, n) = end_html_re.subn (footer_text + '\n' + '</html>', s, 1)
+ if not n:
+ s += footer_text + '\n'
return s
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):
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] = add_footer (page_flavors[k][1], languages)
return page_flavors
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:
- s = add_footer (s)
+ if footer_tag_re.search (s) == None:
+ s = add_footer (s, footer_tag + footer)
available, missing = find_translations (prefix, lang_ext)
page_flavors = process_links (s, prefix, lang_ext, file_name, missing, target)
--- /dev/null
+#!@PYTHON@
+# -*- coding: utf-8 -*-
+# extrace_texi_filenames.py
+
+# USAGE: extract_texi_filenames.py [-o OUTDIR] FILES
+#
+# -o OUTDIR specifies that output files should rather be written in OUTDIR
+#
+# Description:
+# This script parses the .texi file given and creates a file with the
+# nodename <=> filename/anchor map.
+# The idea behind: Unnumbered subsections go into the same file as the
+# previous numbered section, @translationof gives the original node name,
+# which is then used for the filename/anchor.
+#
+# If this script is run on a file texifile.texi, it produces a file
+# texifile.xref-map with tab-separated entries of the form
+# NODE\tFILENAME\tANCHOR
+# Note: The filename does not have any extension appended!
+# This file can then be used by our texi2html init script to determine
+# the correct file name and anchor for external refs
+
+import sys
+import re
+import os
+import getopt
+
+#import langdefs
+
+optlist, args = getopt.getopt (sys.argv[1:],'o:')
+files = args
+
+outdir = '.'
+for x in optlist:
+ if x[0] == '-o':
+ outdir = x[1]
+
+include_re = re.compile (r'@include ((?!../lily-).*?)\.texi$', re.M)
+whitespaces = re.compile (r'\s+')
+section_translation_re = re.compile (r'@(node|(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading|translationof) (.*?)\s*\n')
+
+def expand_includes (m, filename):
+ filepath = os.path.join (os.path.dirname (filename), m.group(1)) + '.texi'
+ if os.path.exists (filepath):
+ return extract_sections (filepath)
+ else:
+ print "Unable to locate include file " + filepath
+ return ''
+
+def extract_sections (filename):
+ result = ''
+ f = open (filename, 'r')
+ page = f.read ()
+ f.close()
+ # Replace all includes by their list of sections and extract all sections
+ page = include_re.sub (lambda m: expand_includes (m, filename), page)
+ sections = section_translation_re.findall (page)
+ for sec in sections:
+ result += "@" + sec[0] + " " + sec[1] + "\n"
+ return result
+
+# 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
+def texinfo_file_name(title):
+ # exception: The top node is always mapped to index.html
+ if title == "Top":
+ return "index"
+ # File name normalization by texinfo (described in the texinfo manual):
+ # 1/2: letters and numbers are left unchanged
+ # 3/4: multiple, leading and trailing whitespace is removed
+ title = title.strip ();
+ title = whitespaces.sub (' ', title)
+ # 5: all remaining spaces are converted to '-'
+ # 6: all other 7- or 8-bit chars are replaced by _xxxx (xxxx=ascii character code)
+ result = ''
+ for index in range(len(title)):
+ char = title[index]
+ if char == ' ': # space -> '-'
+ result += '-'
+ elif ( ('0' <= char and char <= '9' ) or
+ ('A' <= char and char <= 'Z' ) or
+ ('a' <= char and char <= 'z' ) ): # number or letter
+ result += char
+ else:
+ ccode = ord(char)
+ if ccode <= 0xFFFF:
+ result += "_%04x" % ccode
+ else:
+ result += "__%06x" % ccode
+ # 7: if name begins with number, prepend 't_g' (so it starts with a letter)
+ if (result != '') and (ord(result[0]) in range (ord('0'), ord('9'))):
+ result = 't_g' + result
+ return result
+
+texinfo_re = re.compile (r'@.*{(.*)}')
+def remove_texinfo (title):
+ return texinfo_re.sub (r'\1', title)
+
+def create_texinfo_anchor (title):
+ return texinfo_file_name (remove_texinfo (title))
+
+unnumbered_re = re.compile (r'unnumbered.*')
+def process_sections (filename, page):
+ sections = section_translation_re.findall (page)
+ # TODO: Don't rely on the file having a 4-letter extension (texi)!!!
+ p = os.path.join (outdir, filename) [:-5] + '.xref-map'
+ f = open (p, 'w')
+
+ this_title = ''
+ this_filename = 'index'
+ this_anchor = ''
+ this_unnumbered = False
+ had_section = False
+ for sec in sections:
+ if sec[0] == "node":
+ # Write out the cached values to the file and start a new section:
+ if this_title != '' and this_title != 'Top':
+ f.write (this_title + "\t" + this_filename + "\t" + this_anchor + "\n")
+ had_section = False
+ this_title = remove_texinfo (sec[1])
+ this_anchor = create_texinfo_anchor (sec[1])
+ elif sec[0] == "translationof":
+ anchor = create_texinfo_anchor (sec[1])
+ # If @translationof is used, it gives the original node name, which
+ # we use for the anchor and the file name (if it is a numbered node)
+ this_anchor = anchor
+ if not this_unnumbered:
+ this_filename = anchor
+ else:
+ # Some pages might not use a node for every section, so treat this
+ # case here, too: If we already had a section and encounter enother
+ # one before the next @node, we write out the old one and start
+ # with the new values
+ if had_section and this_title != '':
+ f.write (this_title + "\t" + this_filename + "\t" + this_anchor + "\n")
+ this_title = remove_texinfo (sec[1])
+ this_anchor = create_texinfo_anchor (sec[1])
+ had_section = True
+
+ # unnumbered nodes use the previously used file name, only numbered
+ # nodes get their own filename! However, top-level @unnumbered
+ # still get their own file.
+ this_unnumbered = unnumbered_re.match (sec[0])
+ if not this_unnumbered or sec[0] == "unnumbered":
+ this_filename = this_anchor
+
+ if this_title != '' and this_title != 'Top':
+ f.write (this_title + "\t" + this_filename + "\t" + this_anchor + "\n")
+ f.close ()
+
+
+for filename in files:
+ print "extract_texi_filenames.py: Processing %s" % filename
+ sections = extract_sections (filename)
+ process_sections (filename, sections)
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)
--- /dev/null
+#!/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)
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
LN = @LN@
LN_S = @LN_S@
MAKEINFO_PROGRAM = @MAKEINFO@
+TEXI2HTML_PROGRAM = @TEXI2HTML@
METAFONT = @METAFONT@ -progname=mf
MFMODE = @MFMODE@
MSGFMT = @MSGFMT@
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)
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}")
local-clean:
rm -f $(INFO_IMAGES_DIR)
-local-WWW: info $(outdir)/lilypond-snippets.pdf \
- $(outdir)/lilypond-snippets/index.html \
+local-WWW-1: info $(outdir)/lilypond-snippets.pdf \
+ $(outdir)/lilypond-snippets.texi \
+ $(outdir)/lilypond-snippets.xref-map \
+ $(outdir)/lilypond.xref-map \
+ $(outdir)/lilypond-learning.xref-map
+
+local-WWW-2: $(outdir)/lilypond-snippets/index.html \
$(outdir)/lilypond-snippets-big-page.html \
$(source-links)
+%.xref-map: %.texi
+ $(PYTHON) $(buildscript-dir)/extract_texi_filenames.py $<
+
+$(outdir)/lilypond.xref-map $(outdir)/lilypond-learning.xref-map:
+ ln -sf ../../../Documentation/user/$@ $@
+
.SECONDARY:
@unnumberedsec \TEXT\
@end macro
-@ifnottex
+@ifhtml
+
+@ifset bigpage
+
+@macro rlearning{NAME}
+See also Learning Manual, section
+@ref{\NAME\,,,lilypond-learning-big-page,Learning Manual}.
+@end macro
+
@macro ruser{NAME}
These snippets illustrate the Notation Reference,
-section @ref{\NAME\,,,lilypond,Notation Reference}.
+section @ref{\NAME\,,,lilypond-big-page,Notation Reference}.
@end macro
+@end ifset
+
+
+@ifclear bigpage
+
@macro rlearning{NAME}
See also Learning Manual, section
@ref{\NAME\,,,lilypond-learning,Learning Manual}.
@end macro
-@end ifnottex
-@iftex
@macro ruser{NAME}
-These snippets illustrate @ref{\NAME\,,,lilypond,Notation Reference}.
+These snippets illustrate the Notation Reference,
+section @ref{\NAME\,,,lilypond,Notation Reference}.
@end macro
+@end ifclear
+
+@end ifhtml
+
+
+@ifnothtml
+
@macro rlearning{NAME}
See also @ref{\NAME\,,,lilypond-learning,Learning Manual}.
@end macro
-@end iftex
+
+@macro ruser{NAME}
+These snippets illustrate @ref{\NAME\,,,lilypond,Notation Reference}.
+@end macro
+
+@end ifnothtml
@dircategory GNU LilyPond --- the music typesetter
@direntry
* Templates::
@end menu
+@contents
+
@c Please take care of naming every .itely
@c with an existing tag name.
--- /dev/null
+#!/usr/bin/env perl
+
+### texi2html customization script for Lilypond
+### Author: Reinhold Kainhofer <reinhold@kainhofer.com>, 2008.
+### Some code parts copied from texi2html and adapted.
+### License: GPLv2+
+###
+###
+### Features implemented here:
+### -) For split manuals, the main page is index.html.
+### -) All @unnumbered* sections are placed into the same file
+### (implemented by split_at_numbered_sections)
+### -) Use our custom CSS file, with IE-specific fixes in another CSS file,
+### impelmented by lilypond_css_lines
+### -) TOC (folded, with the current page highlighted) in an iframe is added
+### to every page; implemented by:
+### lilypond_print_element_header -- building of the TOC
+### lilypond_toc_body -- generation of customized TOC output
+### lilypond_print_page_head -- start <div id="main">
+### print_lilypond_page_foot -- closing id=main, output of footer & TOC
+### -) External refs are formatted only as "Text of the node" (not as >>see
+### "NODE" section "SECTION" in "BOOK"<< like with default texi2html). Also,
+### the leading "(book-name)" is removed.
+### Implemented by overriding lilypond_external_ref
+### -) Navigation bars on top/bottom of the page and between sections are not
+### left-aligned, but use a combination of left/center/right aligned table
+### cells; For this, I heavily extend the texi2html code to allow for
+### differently aligned cells and for multi-line tables);
+### Implemented in lilypond_print_navigation
+### -) Different formatting than the default: example uses the same formatting
+### as quote.
+### -) Allow translated section titles: All section titles can be translated,
+### the original (English) title is associated with @translationof. This is
+### needed, because the file name / anchor is generated from the original
+### English title, since otherwise language-autoselection would break with
+### posted links.
+### Since it is then no longer possible to obtain the file name from the
+### section title, I keep a sectionname<=>filename/anchor around. This way,
+### xrefs from other manuals can simply load that map and retrieve the
+### 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_init_map (read in the externally created map from disk)
+### lilypond_external_href (load the map for xrefs, use the correct
+### link target)
+###
+###
+### Useful helper functions:
+### -) texinfo_file_name($node_name): returns a texinfo-compatible file name
+### for the given string $node_name (whitespace trimmed/replaced by -,
+### non-standard chars replaced by _xxxx (ascii char code) and forced to
+### start with a letter by prepending t_g if necessary)
+
+
+package Texi2HTML::Config;
+
+
+
+
+
+#############################################################################
+### SETTINGS FOR TEXI2HTML
+#############################################################################
+
+@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::external_href = \&lilypond_external_href;
+$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;
+
+# Examples should be formatted similar to quotes:
+$Texi2HTML::Config::complex_format_map->{'example'} = {
+ 'begin' => q{"<blockquote><pre class=\"example\">"},
+ 'end' => q{"</pre></blockquote>\n"},
+ };
+
+
+my @section_to_filename;
+
+
+
+
+#############################################################################
+### DEBUGGING
+#############################################################################
+
+use Data::Dumper;
+$Data::Dumper::Maxdepth = 2;
+
+sub print_element_info($)
+{
+ my $element = shift;
+ print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
+ print "Element: $element\n";
+ print Dumper($element);
+}
+
+
+
+
+
+#############################################################################
+### HELPER FUNCTIONS
+#############################################################################
+
+# 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 $text = shift;
+ my $result = '';
+ # File name normalization by texinfo:
+ # 1/2: letters and numbers are left unchanged
+ # 3/4: multiple, leading and trailing whitespace is removed
+ $text = main::normalise_space($text);
+ # 5/6: all remaining spaces are converted to '-', all other 7- or 8-bit
+ # chars are replaced by _xxxx (xxxx=ascii character code)
+ while ($text ne '') {
+ if ($text =~ s/^([A-Za-z0-9]+)//o) { # number or letter stay unchanged
+ $result .= $1;
+ } elsif ($text =~ s/^ //o) { # space -> '-'
+ $result .= '-';
+ } elsif ($text =~ s/^(.)//o) { # Otherwise use _xxxx (ascii char code)
+ my $ccode = ord($1);
+ if ( $ccode <= 0xFFFF ) {
+ $result .= sprintf("_%04x", $ccode);
+ } else {
+ $result .= sprintf("__%06x", $ccode);
+ }
+ }
+ }
+ # 7: if name does not begin with a letter, prepend 't_g' (so it starts with a letter)
+ if ($result !~ /^[a-zA-Z]/) {
+ $result = 't_g' . $result;
+ }
+ # DONE
+ return $result
+}
+
+
+# Load a file containing a nodename<=>filename map (tab-sepatared, i.e.
+# NODENAME\tFILENAME\tANCHOR
+# Returns a ref to a hash "Node title" => ["FilenameWithoutExt", "Anchor"]
+sub load_map_file ($)
+{
+ my $mapfile = shift;
+ my $node_map = ();
+
+ if (open(XREFFILE, $mapfile)) {
+ my $line;
+ while ( $line = <XREFFILE> ) {
+ # parse the tab-separated entries and insert them into the map:
+ chomp($line);
+ my @entries = split(/\t/, $line);
+ if (scalar (@entries) == 3) {
+ $node_map->{$entries[0]} = [$entries[1], $entries[2]];
+ } else {
+ print STDERR "Invalid entry in the node file $mapfile: $line\n";
+ }
+ }
+ close (XREFFILE);
+ } else {
+ print STDERR "WARNING: Unable to load the map file $mapfile\n";
+ }
+ return $node_map;
+}
+
+
+# Split the given path into dir and basename (with .texi removed). Used mainly
+# to get the path/basename of the original texi input file
+sub split_texi_filename ($)
+{
+ my $docu = shift;
+ my $docu_dir, $docu_name;
+ if ($docu =~ /(.*\/)/) {
+ chop($docu_dir = $1);
+ $docu_name = $docu;
+ $docu_name =~ s/.*\///;
+ } else {
+ $docu_dir = '.';
+ $docu_name = $docu;
+ }
+ $docu_name =~ s/\.te?x(i|info)?$//;
+ return ($docu_dir, $docu_name);
+}
+
+
+
+
+
+#############################################################################
+### CSS HANDLING
+#############################################################################
+
+# Include our standard CSS file, not hard-coded CSS code directly in the HTML!
+# For IE, conditionally include the lilypond-ie-fixes.css style sheet
+sub lilypond_css_lines ($$)
+{
+ my $import_lines = shift;
+ my $rule_lines = shift;
+ return if (defined($CSS_LINES));
+ if (@$rule_lines or @$import_lines)
+ {
+ $CSS_LINES = "<style type=\"text/css\">\n<!--\n";
+ $CSS_LINES .= join('',@$import_lines) . "\n" if (@$import_lines);
+ $CSS_LINES .= join('',@$rule_lines) . "\n" if (@$rule_lines);
+ $CSS_LINES .= "-->\n</style>\n";
+ }
+ foreach my $ref (@CSS_REFS)
+ {
+ $CSS_LINES .= "<link rel=\"stylesheet\" type=\"text/css\" href=\"$ref\">\n";
+ }
+ $CSS_LINES .= "<!--[if lte IE 7]>\n<link href=\"lilypond-ie-fixes.css\" rel=\"stylesheet\" type=\"text/css\">\n<![endif]-->\n";
+}
+
+
+
+
+
+#############################################################################
+### SPLITTING BASED ON NUMBERED SECTIONS
+#############################################################################
+
+my $lastfilename;
+my $docnr = 0;
+my $node_to_filename_map = ();
+
+# 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.
+# 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($$$)
+{
+ my $element = shift;
+ my $type = shift;
+ my $docu_name = shift;
+ my $docu_ext = $Texi2HTML::Config::EXTENSION;
+
+ my $node_name = main::remove_texi($element->{'node_ref'}->{'texi'});
+ # the snippets page does not use nodes for the snippets, so in this case
+ # we'll have to use the section name!
+ 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 filename/anchor here. In the latter case, external manuals
+ # will not be able to retrieve the file name for xrefs!!! Still, I already
+ # had that code, so I'll leave it in in case something goes wrong with the
+ # extract_texi_filenames.py script in the lilypond build process!
+ if (exists ($node_to_filename_map->{$node_name})) {
+ (my $filename, my $anchor) = @{$node_to_filename_map->{$node_name}};
+ $filename .= ".$docu_ext" if (defined($docu_ext));
+
+ $element->{id} = $anchor;
+ if ($filename eq $lastfilename) {
+ $$element{doc_nr} = $docnr;
+ } else {
+ $docnr += 1;
+ $$element{doc_nr} = $docnr;
+ $lastfilename = $filename;
+ }
+ 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"
+ 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);
+ $$element{id} = $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;
+ $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;
+}
+
+
+## Load the map file for the corrently processed texi file. We do this
+# (mis-)using a command init handler, since texi2html does not have any
+# other hooks that are called after THISDOC is filled but before phase 2
+# of the texi2html conversion.
+sub lilypond_init_map ()
+{
+ my ($docu_dir, $docu_name) = split_texi_filename ($Texi2HTML::THISDOC{'input_file_name'});
+ my $map_filename = "$docu_dir/${docu_name}.xref-map";
+ $node_to_filename_map = load_map_file ($map_filename);
+}
+push @Texi2HTML::Config::command_handler_init, \&lilypond_init_map;
+
+
+
+#############################################################################
+### CLEANER LINK TITLE FOR EXTERNAL REFS
+#############################################################################
+
+# The default formatting of external refs returns e.g.
+# "(lilypond-internals)Timing_translator", so we remove all (...) from the
+# file_and_node argument. Also, we want only a very simple format, so we don't
+# even call 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;
+
+ my $displaytext = '';
+
+ # 1) if we have a cross ref name, that's the text to be displayed:
+ # 2) For the top node, use the (printable) name of the manual, unless we
+ # have an explicit cross ref name
+ # 3) In all other cases use the section name
+ if ($cross_ref ne '') {
+ $displaytext = $cross_ref;
+ } elsif (($section eq '') or ($section eq 'Top')) {
+ $displaytext = $book;
+ } else {
+ $displaytext = $section;
+ }
+
+ $displaytext = &$anchor('', $href, $displaytext) if ($displaytext ne '');
+ return &$I('%{node_file_href}', { 'node_file_href' => $displaytext });
+
+# Default: format as "see <a ..>NODE</a> section 'SECTION' in BOOK". We don't want this!
+# return t2h_default_external_ref($type, $section, $book, $file_node, $href, $cross_ref);
+}
+
+
+
+
+
+#############################################################################
+### HANDLING TRANSLATED SECTIONS: handle @translationof, secname<->filename
+### map stored on disk, xrefs in other manuals load that map
+#############################################################################
+
+
+# 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
+ # It is already used by extract_texi_filenames.py, so this should not be
+ # necessary here at all. Still, I'll leave the code in just in case the
+ # python script messed up ;-)
+ if ($pass == 1 and $macro eq "translationof") {
+ if (ref($state->{'element'}) eq 'HASH') {
+ $state->{'element'}->{'translationof'} = main::normalise_space($line);
+ }
+ return ('', true, undef, undef);
+ } else {
+ return t2h_default_unknown($macro, $line, $pass, $stack, $state);
+ }
+}
+
+
+
+
+my %translated_books = ();
+# Construct a href to an external source of information.
+# node is the node with texinfo @-commands
+# node_id is the node transliterated and transformed as explained in the
+# texinfo manual
+# node_xhtml_id is the node transformed such that it is unique and can
+# be used to make an html cross ref as explained in the texinfo manual
+# file is the file in '(file)node'
+sub lilypond_external_href($$$)
+{
+ my $node = shift;
+ my $node_id = shift;
+ my $node_hxmlt_id = shift;
+ my $file = shift;
+ my $original_func = \&t2h_default_external_href;
+
+ # 1) Keep a hash of book->section_map
+ # 2) if not file in keys hash => try to load the map (assign empty map if
+ # non-existent => will load only once!)
+ # 3) if node in the section=>(file, anchor) map, replace node_id and
+ # node_xhtml_id by the map's values
+ # 4) call the t2h_default_external_href with these values (or the old ones if not found)
+
+ if (($node_id ne '') and defined($file) and ($node_id ne 'Top')) {
+ my $map_name = $file;
+ $map_name =~ s/-big-page//;
+
+ # Load the map if we haven't done so already
+ if (!exists($translated_books{$map_name})) {
+ my ($docu_dir, $docu_name) = split_texi_filename ($Texi2HTML::THISDOC{'input_file_name'});
+ my $map_filename = "$docu_dir/${map_name}.xref-map";
+ $translated_books{$map_name} = load_map_file ($map_filename);
+ }
+
+ # look up translation. use these values instead of the old filename/anchor
+ my $section_name_map = $translated_books{$map_name};
+ my $node_text = main::remove_texi($node);
+ if (defined($section_name_map->{$node_text})) {
+ ($node_id, $node_hxmlt_id) = @{$section_name_map->{$node_text}};
+ } else {
+ print STDERR "WARNING: Unable to find node '$node_text' in book $map_name.\n";
+ }
+ }
+
+ if (defined $file) {
+ return &$original_func($node, $node_id, $node_hxmlt_id, $file);
+ } else {
+ return &$original_func($node, $node_id, $node_hxmlt_id);
+ }
+}
+
+
+
+
+
+#############################################################################
+### CUSTOM TOC FOR EACH PAGE (in a frame on the left)
+#############################################################################
+
+my $page_toc_depth = 2;
+my @default_toc = [];
+
+# 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.
+# Unnumbered entries are only printed out if they are at top-level or their
+# parent element is an ancestor of the currently viewed node.
+sub generate_ly_toc_entries($$$$)
+{
+ my $element = shift;
+ my $element_path = shift;
+ my $maxlevel = shift;
+ my $always_show_unnumbered_children = 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->{'id'} && $element_path->{$element->{'id'}};
+ 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'};
+ # Don't add unnumbered entries, unless they are at top-level or a parent of the current!
+ if (not ($element->{'number'} or $always_show_unnumbered_children)) {
+ return @result;
+ }
+ 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, $is_parent_of_current));
+ }
+ # 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, "\n$ind<ul$NO_BULLET_LIST_ATTRIBUTE>\n");
+ 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->{'id'}} = 1;
+ # Find the path to the current element
+ while ( defined($current_element->{'sectionup'}) and
+ ($current_element->{'sectionup'} ne $current_element) )
+ {
+ $parentelements{$current_element->{'sectionup'}->{'id'}} = 1
+ if ($current_element->{'sectionup'}->{'id'} ne '');
+ $current_element = $current_element->{'sectionup'};
+ }
+ return () if not defined($current_element);
+ # Create the toc entries recursively
+ my @toc_entries = ("<div class=\"contents\">\n", "<ul$NO_BULLET_LIST_ATTRIBUTE>\n");
+ my $children = $current_element->{'section_childs'};
+ foreach ( @$children ) {
+ push (@toc_entries, generate_ly_toc_entries($_, \%parentelements, $page_toc_depth, False));
+ }
+ push (@toc_entries, "</ul>\n");
+ push (@toc_entries, "</div>\n");
+ return @toc_entries;
+}
+
+sub lilypond_print_toc_div ($$)
+{
+ my $fh = shift;
+ my $tocref = shift;
+ my @lines = @$tocref;
+ # use default TOC if no custom lines have been generated
+ @lines = @default_toc if (not @lines);
+ if (@lines) {
+ print $fh "\n\n<div id=\"tocframe\">\n";
+ print $fh '<h4> ' . $Texi2HTML::NAME{'Contents'} . "</h4>\n";
+ foreach my $line (@lines) {
+ print $fh $line;
+ }
+ print $fh "</div>\n\n";
+ }
+}
+
+# Create the custom TOC for this page (partially folded, current page is
+# highlighted) and store it in a global variable. The TOC is written out after
+# the html contents (but positioned correctly using CSS), so that browsers with
+# css turned off still show the contents first.
+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) {
+ 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);
+}
+
+# Generate the HTML output for the TOC
+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 beginning of the page
+sub lilypond_print_page_head($)
+{
+ my $fh = shift;
+ T2H_DEFAULT_print_page_head($fh);
+ print $fh "<div id=\"main\">\n";
+}
+
+# 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 $program_string = &$program_string();
+ print $fh "<p><font size='-1'>$program_string</font><br>$PRE_BODY_CLOSE</p>\n";
+ print $fh "<!-- FOOTER -->\n\n";
+ print $fh "<!-- end div#main here -->\n</div>\n\n";
+
+ # Print the TOC frame and reset the TOC:
+ lilypond_print_toc_div ($fh, \@this_page_toc);
+ @this_page_toc = ();
+
+ # Close the page:
+ print $fh "</body>\n</html>\n";
+}
+
+
+
+
+
+#############################################################################
+### NICER / MORE FLEXIBLE NAVIGATION PANELS
+#############################################################################
+
+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 = " ".$text.": " . $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})
+ {
+ 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'
+ );
+
+
+
+
+
+#############################################################################
+### OTHER SETTINGS
+#############################################################################
+
+# For split pages, use index.html as start page!
+if ($Texi2HTML::Config::SPLIT eq 'section') {
+ $Texi2HTML::Config::TOP_FILE = 'index.html';
+}
+
+
+return 1;
default:
-local-WWW: $(OUT_HTML_FILES)
+local-WWW-2: $(OUT_HTML_FILES)
$(PYTHON) $(buildscript-dir)/mass-link.py --prepend-suffix .$(ISOLANG) hard $(outdir) $(top-build-dir)/Documentation/$(outdir) $(HTML_FILES)
-$(outdir)/%/index.html: $(outdir)/%.texi $(outdir)/version.itexi
+$(outdir)/%/index.html: $(outdir)/%.texi $(outdir)/%.xref-map $(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 $(outdir)/%.xref-map $(OUT_PNG_IMAGES) $(outdir)/version.itexi
+ $(TEXI2HTML) --I=$(outdir) -D bigpage $(TEXI2HTML_FLAGS) --output=$@ $(TEXI2HTML_INIT) $<
+ cp $(top-src-dir)/Documentation/lilypond*.css $(dir $@)
-$(outdir)/%.pdftexi: $(outdir)/%.texi doc-po $(outdir)/version.itexi
+$(outdir)/%.pdftexi: $(outdir)/%.texi $(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
echo $(TOPLEVEL_VERSION)>> $@
echo '@end macro'>> $@
+$(outdir)/%.png: $(top-build-dir)/Documentation/user/$(outdir)/%.png
+ ln -f $< $@
+
+$(outdir)/%.xref-map: $(outdir)/%.texi
+ $(PYTHON) $(buildscript-dir)/extract_texi_filenames.py $<
+
# This makes sure lilypond-doc gettext domain has been compiled
# before lilypond-book runs
-%.tely: doc-po
-
-$(OUT_TEXI_FILES): $(ITELY_FILES) $(ITEXI_FILES)
+$(TELY_FILES): doc-po
-$(DEEP_HTML_FILES) $(PDF_FILES): $(ITELY_FILES) $(ITEXI_FILES)
+$(MASTER_TEXI_FILES): $(ITELY_FILES) $(ITEXI_FILES)
.SECONDARY:
default:
+local-WWW-1: $(MASTER_TEXI_FILES) $(PDF_FILES) $(XREF_MAP_FILES)
+
# BIG_PAGE_HTML_FILES is defined differently in each language makefile
-local-WWW: $(DEEP_HTML_FILES) $(PDF_FILES) doc-po $(BIG_PAGE_HTML_FILES)
+local-WWW-2: $(DEEP_HTML_FILES) $(BIG_PAGE_HTML_FILES)
find $(outdir) -name '*.html' | xargs grep -L 'UNTRANSLATED NODE: IGNORE ME' | xargs $(PYTHON) $(buildscript-dir)/html-gettext.py $(ISOLANG)
find $(outdir) -name '*.html' | xargs grep -L --label="" 'UNTRANSLATED NODE: IGNORE ME' | sed 's!$(outdir)/!!g' | xargs $(PYTHON) $(buildscript-dir)/mass-link.py --prepend-suffix .$(ISOLANG) hard $(outdir) $(top-build-dir)/Documentation/user/$(outdir) $(TELY_FILES:%.tely=%.pdf)
find $(outdir) \( -name 'lily-*.png' -o -name 'lily-*.ly' \) | sed 's!$(outdir)/!!g' | xargs $(PYTHON) $(buildscript-dir)/mass-link.py hard $(outdir) $(top-build-dir)/Documentation/user/$(outdir)
doc-po:
$(MAKE) -C $(depth)/Documentation/po out=www messages
+
+.PHONY: doc-po
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)
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 += -q --batch $(DOCUMENTATION_INCLUDES)
-TELY_FILES = $(call src-wildcard,*.tely)
-OUT_TEXI_FILES = $(TELY_FILES:%.tely=$(outdir)/%.texi)
-DEEP_HTML_FILES = $(TELY_FILES:%.tely=$(outdir)/%/index.html)
-PDF_FILES = $(TELY_FILES:%.tely=$(outdir)/%.pdf)
+TELY_FILES := $(call src-wildcard,*.tely)
+MASTER_TEXI_FILES := $(TELY_FILES:%.tely=$(outdir)/%.texi)
+DEEP_HTML_FILES := $(TELY_FILES:%.tely=$(outdir)/%/index.html)
+PDF_FILES := $(TELY_FILES:%.tely=$(outdir)/%.pdf)
+XREF_MAP_FILES := $(TELY_FILES:%.tely=$(outdir)/%.xref-map)
ITELY_FILES := $(call src-wildcard,*.itely)
ITEXI_FILES := $(call src-wildcard,*.itexi)
# don't do ``cd $(outdir)'', and assume that $(outdir)/.. is the src dir.
# it is not, for --srcdir builds
$(outdir)/%.texi: %.tely $(outdir)/version.itexi
- $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BOOK_PROCESS) $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) $(LILYPOND_BOOK_FLAGS) $<
+ $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BOOK_PROCESS) $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) $(LILYPOND_BOOK_FLAGS) $<
$(outdir)/%.texi: $(outdir)/%.tely $(outdir)/version.itexi
$(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BOOK_PROCESS) $(LILYPOND_BOOK_INCLUDES) $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) $(LILYPOND_BOOK_FLAGS) $<
-#
-# DON'T REMOVE SOURCE FILES, otherwise the .TEXI ALWAYS OUT OF DATE.
-# rm -f $<
$(outdir)/%.html.omf: %.tely
$(call GENERATE_OMF,html)
-
$(outdir)/collated-files.tely: $(LY_FILES) $(OUT_LY_FILES)
$(PYTHON) $(buildscript-dir)/lys-to-tely.py --name=$(outdir)/collated-files.tely --title="$(TITLE)" $^
+local-WWW-1: $(outdir)/collated-files.texi $(outdir)/collated-files.pdf
-
-local-WWW: $(outdir)/collated-files.html $(outdir)/collated-files.pdf
-
-#.PRECIOUS: $(outdir)/$(NAME).texi
+local-WWW-2: $(outdir)/collated-files.html
local-test-baseline:
rm -rf $(outdir)-baseline
TITLE=LYs Doc
-NAME=collated-files
-
.PHONY: download mutopia png ps scores tar
.PRECIOUS: $(outdir)/%.ps $(outdir)/%-book.ps
-.PRECIOUS: $(outdir)-letter/%.dvi $(outdir)-letter/%.ps
+.PRECIOUS: $(outdir)-letter/%.ps
all: $(OUT_FILES)
-# we want dvi_examples as well, because they get thrown away otherwise
-# incurring another costly lilypond run.
-local-WWW: $(ly_examples) $(pdf_examples) $(png_examples)
+local-WWW-1: $(ly_examples) $(pdf_examples) $(png_examples)
tar:
mkdir -p $(outdir)/$(tarball)
$(MAKE) ps_examples="$<" ps
local-mutopia:
- $(MAKE) examples="$(mutopia-examples)" PAPERSIZE=letter local-WWW $(mutopia-letter)
+ $(MAKE) examples="$(mutopia-examples)" PAPERSIZE=letter local-WWW-1 $(mutopia-letter)
mutopia: local-mutopia
$(LOOP)
@omfcategory Applications|Publishing
@end ignore
-
+@contents
")
out-port)
(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")))))
-# do we need this?
default:
-
-local-WWW: $(OUTHTML_FILES)
-
-.PHONY : all clean bin-clean config default dist doc exe help\
- html lib TAGS po
+.PHONY : all clean bin-clean config default dist doc exe help html lib TAGS\
+ po web web-1 WWW-1 WWW-2 WWW-post local-WWW-1 local-WWW-2\
+ web-install
all: default
$(LOOP)
touch $@ # do something for multiple simultaneous configs.
-################ website.
+#### Documentation (website and tarball)
-local-WWW:
-local-WWW-post:
+# documentation is built in two stages,
+# plus WWW-post (only at toplevel)
+# see INSTALL for more information.
+
+local-WWW-1:
+local-WWW-2:
web-install:
+WWW-post:
-WWW: local-WWW
+WWW-1: local-WWW-1
$(LOOP)
-WWW-post: local-WWW-post
+WWW-2: local-WWW-2
$(LOOP)
web:
- $(MAKE) out=www WWW
+ $(MAKE) out=www WWW-1
+ $(MAKE) out=www WWW-2
$(MAKE) out=www WWW-post
+web-1:
+ $(MAKE) out=www WWW-1
+
web-clean:
find -name out-www | xargs rm -rf
$(MAKE) out=www clean
$(outdir)/%.info: $(outdir)/%.texi $(outdir)/$(INFO_IMAGES_DIR).info-images-dir.dep $(outdir)/version.itexi
$(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 $<
+$(outdir)/%-big-page.html: $(outdir)/%.texi $(outdir)/%.xref-map $(outdir)/version.itexi
+ $(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 $<
+
+$(outdir)/%.html: $(outdir)/%.texi $(outdir)/%.xref-map $(outdir)/version.itexi
+ $(TEXI2HTML) --I=$(outdir) --output=$@ $(TEXI2HTML_INIT) $<
+ cp $(top-src-dir)/Documentation/lilypond*.css $(dir $@)
$(outdir)/%.html.omf: %.texi
$(call GENERATE_OMF,html)
$(outdir)/%.ps.gz.omf: %.texi
$(call GENERATE_OMF,ps.gz)
-$(outdir)/%/index.html: $(outdir)/%.texi $(outdir)/version.itexi
+$(outdir)/%/index.html: $(outdir)/%.texi $(outdir)/%.xref-map $(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)
rm -f $@
cp $< $@
+%.xref-map: %.texi
+ $(PYTHON) $(buildscript-dir)/extract_texi_filenames.py $<
+
+
$(outdir)/version.%: $(top-src-dir)/VERSION
echo '@macro version'> $@
echo $(TOPLEVEL_VERSION)>> $@
default: $(INFO_FILES)
-local-WWW: $(addprefix $(outdir)/,$(TEXI_FILES:.texi=.html))
+local-WWW-2: $(addprefix $(outdir)/,$(TEXI_FILES:.texi=.html))
local-doc: $(OUTTXT_FILES)
-
TEXI_FILES = $(call src-wildcard,*.texi)
ALL_SOURCES += $(TEXI_FILES)
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)
+
TEXI2PDF_FLAGS += -q
# info stuff
default: local-doc
-local-WWW: $(HTML_FILES) $(PDF_FILES)
+local-WWW-1: $(PDF_FILES)
+
+local-WWW-2: $(HTML_FILES)
make-txt-files: $(TO_TOP_FILES)