From: Reinhold Kainhofer Date: Sun, 17 Aug 2008 15:50:57 +0000 (+0200) Subject: Merge branch 'master' of ssh://kainhofer@git.sv.gnu.org/srv/git/lilypond into dev... X-Git-Tag: release/2.11.58-1~32^2~55 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=4cf1c1f0def359889bf9dc326cd6f7ec6edceecd;hp=9ddb926d01938067b665f0085ee882ded31e028a;p=lilypond.git Merge branch 'master' of ssh://kainhofer@git.sv.gnu.org/srv/git/lilypond into dev/texi2html Conflicts: Documentation/user/macros.itexi buildscripts/add_html_footer.py stepmake/stepmake/generic-targets.make --- diff --git a/Documentation/GNUmakefile b/Documentation/GNUmakefile index d265a1ee96..447337efc9 100644 --- a/Documentation/GNUmakefile +++ b/Documentation/GNUmakefile @@ -16,7 +16,7 @@ OUT_HTML_FILES= $(HTML_PAGE_NAMES:%=$(outdir)/%.html) 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 diff --git a/Documentation/bibliography/GNUmakefile b/Documentation/bibliography/GNUmakefile index 4a7bab0111..89eb2d0bcb 100644 --- a/Documentation/bibliography/GNUmakefile +++ b/Documentation/bibliography/GNUmakefile @@ -1,4 +1,4 @@ -# Documentation/tex/Makefile +# Documentation/bibliography/Makefile depth=../.. @@ -18,10 +18,10 @@ ps: $(PS_FILES) # 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 $< $@ diff --git a/Documentation/de/user/GNUmakefile b/Documentation/de/user/GNUmakefile index 662d176be1..810efc38e7 100644 --- a/Documentation/de/user/GNUmakefile +++ b/Documentation/de/user/GNUmakefile @@ -3,3 +3,13 @@ depth = ../../.. 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/$@ $@ diff --git a/Documentation/es/user/GNUmakefile b/Documentation/es/user/GNUmakefile index 4928d75252..d51764115b 100644 --- a/Documentation/es/user/GNUmakefile +++ b/Documentation/es/user/GNUmakefile @@ -3,3 +3,13 @@ depth = ../../.. 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/$@ $@ diff --git a/Documentation/fr/user/GNUmakefile b/Documentation/fr/user/GNUmakefile index e492cfeb9c..f32ebf319f 100644 --- a/Documentation/fr/user/GNUmakefile +++ b/Documentation/fr/user/GNUmakefile @@ -3,3 +3,12 @@ depth = ../../.. 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/$@ $@ diff --git a/Documentation/lilypond-ie-fixes.css b/Documentation/lilypond-ie-fixes.css new file mode 100644 index 0000000000..8a068900f0 --- /dev/null +++ b/Documentation/lilypond-ie-fixes.css @@ -0,0 +1,28 @@ +/***********************************************************/ +/* 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%; +} diff --git a/Documentation/lilypond.css b/Documentation/lilypond.css new file mode 100644 index 0000000000..21145a8ab0 --- /dev/null +++ b/Documentation/lilypond.css @@ -0,0 +1,187 @@ +/***********************************************************/ +/* 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 diff --git a/Documentation/misc/GNUmakefile b/Documentation/misc/GNUmakefile index b84aa786b8..bb3beb4998 100644 --- a/Documentation/misc/GNUmakefile +++ b/Documentation/misc/GNUmakefile @@ -14,7 +14,7 @@ default: local-doc #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 diff --git a/Documentation/pictures/GNUmakefile b/Documentation/pictures/GNUmakefile index 6665721085..438389f944 100644 --- a/Documentation/pictures/GNUmakefile +++ b/Documentation/pictures/GNUmakefile @@ -21,5 +21,4 @@ endif # PLATFORM_WINDOWS local-dist: $(icon) xgifs: $(OUTGIF_FILES) pngs: $(OUTPNG_FILES) -local-WWW: $(OUTPNG_FILES) - +local-WWW-1: $(OUTPNG_FILES) diff --git a/Documentation/topdocs/GNUmakefile b/Documentation/topdocs/GNUmakefile index 7e2d2641d9..6fd3a7504f 100644 --- a/Documentation/topdocs/GNUmakefile +++ b/Documentation/topdocs/GNUmakefile @@ -3,6 +3,7 @@ depth = ../.. 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 @@ -12,5 +13,7 @@ include $(depth)/make/stepmake.make MAKEINFO_FLAGS += -I $(top-src-dir)/Documentation/user +local-WWW-1: $(OUT_TEXI_FILES) + .SECONDARY: diff --git a/Documentation/user/GNUmakefile b/Documentation/user/GNUmakefile index eb4577dcc3..b930b98e16 100644 --- a/Documentation/user/GNUmakefile +++ b/Documentation/user/GNUmakefile @@ -16,6 +16,10 @@ OUT_PNG_IMAGES=$(OUT_PDF_IMAGES:%.pdf=%.png) 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 @@ -63,8 +67,6 @@ extra-local-help: xml update Docbook xml documentation\n\ " -# Generic rule using % twice not possible? -# $(outdir)/%/%.html: $(outdir)/%.texi $(outdir)/lilypond.texi: $(outdir)/lilypond-internals.texi # @@ -123,12 +125,15 @@ $(outdir)/%/source: 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: @@ -146,9 +151,4 @@ $(outdir)/lilypond.texi $(outdir)/lilypond-program.texi $(outdir)/lilypond-learn $(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: diff --git a/Documentation/user/macros.itexi b/Documentation/user/macros.itexi index 07cf74a547..25daba0a82 100644 --- a/Documentation/user/macros.itexi +++ b/Documentation/user/macros.itexi @@ -288,6 +288,10 @@ @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 @@ -296,6 +300,10 @@ @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 @@ -304,6 +312,10 @@ @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 diff --git a/Documentation/user/music-glossary.tely b/Documentation/user/music-glossary.tely index cdcb02e370..dbed2449a1 100644 --- a/Documentation/user/music-glossary.tely +++ b/Documentation/user/music-glossary.tely @@ -129,6 +129,9 @@ documentation, see @rlearning{About the documentation}. * Pitch names:: @end menu +@contents + + @node Musical terms A-Z @chapter Musical terms A-Z diff --git a/GNUmakefile.in b/GNUmakefile.in index 5160939baa..cec5d29937 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -82,7 +82,7 @@ final-install: # 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/ diff --git a/buildscripts/add_html_footer.py b/buildscripts/add_html_footer.py index f063132132..8536ef3956 100644 --- a/buildscripts/add_html_footer.py +++ b/buildscripts/add_html_footer.py @@ -6,6 +6,7 @@ Print a nice footer. import re import os import time +import operator import langdefs @@ -53,18 +54,21 @@ 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_re = re.compile (header_tag) + footer_tag = '' +footer_tag_re = re.compile (footer_tag) lang_available = _doc ("Other languages: %s.") browser_lang = _doc ('About automatic language selection.') browser_language_url = "/web/about/browser-language" LANGUAGES_TEMPLATE = ''' -

+

%(language_available)s -
+
%(browser_language)s -

+

''' @@ -93,7 +97,7 @@ 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') -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 @@ -115,57 +119,53 @@ def hack_urls (s, prefix): 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)]*)>') +html_tag_re = re.compile ('(?i)') +doctype_re = re.compile ('(?i)\n' + def add_header (s): - """Add header ( and doctype)""" - if re.search (header_tag, s) == None: - body = '' - s = re.sub ('(?i)', body, s) - if re.search ('(?i)]*>', body + header, s, 1) - elif re.search ('(?i)', '' + header, s, 1) - else: - s = header + s + """Add header ( and doctype)""" + if header_tag_re.search (s) == None: + body = '' + (s, n) = body_tag_re.subn (body + header, s, 1) + if not n: + (s, n) = html_tag_re.subn ('' + header, s, 1) + if not n: + s = header + s s = header_tag + '\n' + s - if re.search ('(?i)\n' + if doctype_re.search (s) == None: s = doctype + s return s +title_tag_re = re.compile ('.*?(.*?)', 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 ('.*?(.*?)', 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'
\s*

\s*(.+?)


\s*
', re.M | re.S) -info_footnote_hr = re.compile (r'
\s*()?\s*', 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
in case there are footnotes at the end of the Info HTML page - if info_footnote_hr.search (s): - custom_footer = '
\n

' + m.group (1) + '

\n' + footer - else: - custom_footer = '

\n
\n

' + m.group (1) + '

\n' + footer - else: - custom_footer = footer - if re.search ('(?i)
', footer_tag + custom_footer + '\n' + '', s, 1) - elif re.search ('(?i)', footer_tag + custom_footer + '\n' + '', s, 1) - else: - s += footer_tag + custom_footer + '\n' +footer_insert_re = re.compile ('') +end_body_re = re.compile ('(?i)') +end_html_re = re.compile ('(?i)') + +def add_footer (s, footer_text): + """add footer""" + (s, n) = footer_insert_re.subn (footer_text + '\n' + '', s, 1) + if not n: + (s, n) = end_body_re.subn (footer_text + '\n' + '', s, 1) + if not n: + (s, n) = end_html_re.subn (footer_text + '\n' + '', s, 1) + if not n: + s += footer_text + '\n' return s def find_translations (prefix, lang_ext): @@ -177,35 +177,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): @@ -229,12 +231,7 @@ def add_menu (page_flavors, prefix, available, target, translation): language_available = t (lang_available) % language_menu languages = LANGUAGES_TEMPLATE % vars () # put language menu before '' and '' tags - if re.search ('(?i)', languages + '', page_flavors[k][1], 1) - elif re.search ('(?i)', languages + '', 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 @@ -290,13 +287,13 @@ 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: - 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) diff --git a/buildscripts/extract_texi_filenames.py b/buildscripts/extract_texi_filenames.py new file mode 100755 index 0000000000..beea07e433 --- /dev/null +++ b/buildscripts/extract_texi_filenames.py @@ -0,0 +1,156 @@ +#!@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) diff --git a/buildscripts/html-gettext.py b/buildscripts/html-gettext.py index 7d32879a41..02a4c947c0 100644 --- a/buildscripts/html-gettext.py +++ b/buildscripts/html-gettext.py @@ -86,7 +86,7 @@ for filename in files: page = re.sub (r'([^<]*?) - ([^<]*?)', title_gettext, page) # ugh page = re.sub (r'(?ms))()?(Appendix )?([A-Z\d.]+ |)(.+?)(?(3)):?', a_href_gettext, page) - page = re.sub (r'(Appendix |)([A-Z\d.]+ |)?([^<]+)', h_gettext, page) + page = re.sub (r'\s*(Appendix |)([A-Z\d.]+ |)?([^<]+)\s*', h_gettext, page) page = re.sub (r'(.+?)', crossmanual_ref_gettext, page) # this is necessary for entries not translated by a_href_gettext page = re.sub (r'(.+?)', crossmanual_ref_gettext, page) diff --git a/buildscripts/tely-gettext.py b/buildscripts/tely-gettext.py new file mode 100755 index 0000000000..b4e566044f --- /dev/null +++ b/buildscripts/tely-gettext.py @@ -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) diff --git a/buildscripts/www_post.py b/buildscripts/www_post.py index b2d7ca510c..b05e5e2011 100644 --- a/buildscripts/www_post.py +++ b/buildscripts/www_post.py @@ -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 diff --git a/config.make.in b/config.make.in index 4d714c3d3f..da0123311f 100644 --- a/config.make.in +++ b/config.make.in @@ -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@ diff --git a/configure.in b/configure.in index 1f3040a93f..2a4350be74 100644 --- a/configure.in +++ b/configure.in @@ -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) @@ -176,6 +177,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}") diff --git a/input/lsr/GNUmakefile b/input/lsr/GNUmakefile index eacbcb9220..97e188eb88 100644 --- a/input/lsr/GNUmakefile +++ b/input/lsr/GNUmakefile @@ -56,9 +56,20 @@ local-uninstall-WWW: local-uninstall-info 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: diff --git a/input/lsr/lilypond-snippets.tely b/input/lsr/lilypond-snippets.tely index 29d814ab57..678d93b87c 100644 --- a/input/lsr/lilypond-snippets.tely +++ b/input/lsr/lilypond-snippets.tely @@ -19,27 +19,51 @@ @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 @@ -136,6 +160,8 @@ Other collections * Templates:: @end menu +@contents + @c Please take care of naming every .itely @c with an existing tag name. diff --git a/lilypond-texi2html.init b/lilypond-texi2html.init new file mode 100644 index 0000000000..3ed3fcc6da --- /dev/null +++ b/lilypond-texi2html.init @@ -0,0 +1,840 @@ +#!/usr/bin/env perl + +### texi2html customization script for Lilypond +### Author: Reinhold Kainhofer , 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
+### 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{"
"},
+  'end' => q{"
\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 = ) { + # 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 = "\n"; + } + foreach my $ref (@CSS_REFS) + { + $CSS_LINES .= "\n"; + } + $CSS_LINES .= "\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 NODE 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" . &$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\n"); + push (@result, @child_result); + push (@result, "$ind\n"); + } + } else { + push (@result, $entry . "\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 = ("
\n", "\n"); + my $children = $current_element->{'section_childs'}; + foreach ( @$children ) { + push (@toc_entries, generate_ly_toc_entries($_, \%parentelements, $page_toc_depth, False)); + } + push (@toc_entries, "\n"); + push (@toc_entries, "
\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
\n"; + print $fh '

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

\n"; + foreach my $line (@lines) { + print $fh $line; + } + print $fh "
\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
at the beginning of the page +sub lilypond_print_page_head($) +{ + my $fh = shift; + T2H_DEFAULT_print_page_head($fh); + print $fh "
\n"; +} + +# Print out the TOC in a
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 "

$program_string
$PRE_BODY_CLOSE

\n"; + print $fh "\n\n"; + print $fh "\n
\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 "\n\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 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 '\n"; + print $fh "
\n"; + + print $fh "" unless $vertical; + my $beginofline = 1; + foreach my $button (@$buttons) + { + print $fh qq{\n} if $vertical; + # Allow (left|right|center)-aligned-cell and newline as buttons! + if ( $button =~ /^(.*)-aligned-cell-(.*)$/ ) + { + print $fh qq{} unless $beginofline; + print $fh qq{} unless $beginofline; + print $fh qq{}; + print $fh qq{}; + $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 "\n" if $vertical; + print $fh "\n" if $vertical; + } + print $fh "" unless $beginofline; + print $fh "" unless $vertical; + print $fh "
}; + $beginofline = 0; + } + elsif ( $button eq 'newline' ) + { + print $fh qq{
\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; diff --git a/make/doc-i18n-root-targets.make b/make/doc-i18n-root-targets.make index 4e917c5da0..8afe50af84 100644 --- a/make/doc-i18n-root-targets.make +++ b/make/doc-i18n-root-targets.make @@ -1,4 +1,4 @@ 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) diff --git a/make/doclang-rules.make b/make/doclang-rules.make index 10fa6ef382..201e49fd93 100644 --- a/make/doclang-rules.make +++ b/make/doclang-rules.make @@ -1,14 +1,16 @@ -$(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 @@ -16,12 +18,16 @@ $(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: diff --git a/make/doclang-targets.make b/make/doclang-targets.make index 4fd4bad694..72e8ada4ad 100644 --- a/make/doclang-targets.make +++ b/make/doclang-targets.make @@ -1,10 +1,14 @@ 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 diff --git a/make/doclang-vars.make b/make/doclang-vars.make index 08d17b919a..f7b25ae284 100644 --- a/make/doclang-vars.make +++ b/make/doclang-vars.make @@ -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,12 +13,18 @@ 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 += -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) diff --git a/make/ly-rules.make b/make/ly-rules.make index bc9e47b963..fe849db405 100644 --- a/make/ly-rules.make +++ b/make/ly-rules.make @@ -12,14 +12,11 @@ $(outdir)/%.latex: %.doc # 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) diff --git a/make/lysdoc-rules.make b/make/lysdoc-rules.make index b465501883..be960222b7 100644 --- a/make/lysdoc-rules.make +++ b/make/lysdoc-rules.make @@ -1,4 +1,3 @@ - $(outdir)/collated-files.tely: $(LY_FILES) $(OUT_LY_FILES) $(PYTHON) $(buildscript-dir)/lys-to-tely.py --name=$(outdir)/collated-files.tely --title="$(TITLE)" $^ diff --git a/make/lysdoc-targets.make b/make/lysdoc-targets.make index c2d08b5fec..0b5d6ec2ed 100644 --- a/make/lysdoc-targets.make +++ b/make/lysdoc-targets.make @@ -1,8 +1,6 @@ +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 diff --git a/make/lysdoc-vars.make b/make/lysdoc-vars.make index e653213363..96d44b12f3 100644 --- a/make/lysdoc-vars.make +++ b/make/lysdoc-vars.make @@ -1,4 +1,2 @@ TITLE=LYs Doc -NAME=collated-files - diff --git a/make/mutopia-targets.make b/make/mutopia-targets.make index 4a12833a55..deaf240861 100644 --- a/make/mutopia-targets.make +++ b/make/mutopia-targets.make @@ -1,14 +1,12 @@ .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) @@ -24,7 +22,7 @@ scores: $(score_ps) $(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) diff --git a/scm/documentation-generate.scm b/scm/documentation-generate.scm index da2763f5aa..d79a701bc0 100644 --- a/scm/documentation-generate.scm +++ b/scm/documentation-generate.scm @@ -153,7 +153,7 @@ @omfcategory Applications|Publishing @end ignore - +@contents ") out-port) diff --git a/scm/documentation-lib.scm b/scm/documentation-lib.scm index 24d94215fa..0c9e2bdec6 100644 --- a/scm/documentation-lib.scm +++ b/scm/documentation-lib.scm @@ -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"))))) diff --git a/stepmake/stepmake/documentation-targets.make b/stepmake/stepmake/documentation-targets.make index 8bcb8223fc..0f63330a21 100644 --- a/stepmake/stepmake/documentation-targets.make +++ b/stepmake/stepmake/documentation-targets.make @@ -1,5 +1 @@ -# do we need this? default: - -local-WWW: $(OUTHTML_FILES) - diff --git a/stepmake/stepmake/generic-targets.make b/stepmake/stepmake/generic-targets.make index 0307404080..a9ba8453e1 100644 --- a/stepmake/stepmake/generic-targets.make +++ b/stepmake/stepmake/generic-targets.make @@ -1,5 +1,6 @@ -.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) @@ -169,22 +170,31 @@ $(config_make): $(top-src-dir)/configure 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 diff --git a/stepmake/stepmake/texinfo-rules.make b/stepmake/stepmake/texinfo-rules.make index c6e29cde73..fc23bcb3fd 100644 --- a/stepmake/stepmake/texinfo-rules.make +++ b/stepmake/stepmake/texinfo-rules.make @@ -26,11 +26,14 @@ endif $(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) @@ -41,9 +44,10 @@ $(outdir)/%.pdf.omf: %.texi $(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) $( $@ echo $(TOPLEVEL_VERSION)>> $@ diff --git a/stepmake/stepmake/texinfo-targets.make b/stepmake/stepmake/texinfo-targets.make index aeda6e6171..8b6669af21 100644 --- a/stepmake/stepmake/texinfo-targets.make +++ b/stepmake/stepmake/texinfo-targets.make @@ -2,7 +2,7 @@ default: $(INFO_FILES) -local-WWW: $(addprefix $(outdir)/,$(TEXI_FILES:.texi=.html)) +local-WWW-2: $(addprefix $(outdir)/,$(TEXI_FILES:.texi=.html)) local-doc: $(OUTTXT_FILES) diff --git a/stepmake/stepmake/texinfo-vars.make b/stepmake/stepmake/texinfo-vars.make index d53bd8f7dd..d0ffdf90d6 100644 --- a/stepmake/stepmake/texinfo-vars.make +++ b/stepmake/stepmake/texinfo-vars.make @@ -1,4 +1,3 @@ - TEXI_FILES = $(call src-wildcard,*.texi) ALL_SOURCES += $(TEXI_FILES) @@ -14,6 +13,13 @@ 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) + TEXI2PDF_FLAGS += -q # info stuff diff --git a/stepmake/stepmake/topdocs-targets.make b/stepmake/stepmake/topdocs-targets.make index 5c4777ec92..93d2f9cccf 100644 --- a/stepmake/stepmake/topdocs-targets.make +++ b/stepmake/stepmake/topdocs-targets.make @@ -1,6 +1,8 @@ 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)