From: Reinhold Kainhofer Date: Sun, 24 Aug 2008 14:41:05 +0000 (+0200) Subject: Merge commit 'origin/master' into dev/texi2html X-Git-Tag: release/2.11.58-1~32^2~15 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=7e57eb7daf165db3cc1ed70c8173f8692818f83b;hp=31d5777da879c275c19dbd926664b6d613314f3a;p=lilypond.git Merge commit 'origin/master' into dev/texi2html --- diff --git a/Documentation/GNUmakefile b/Documentation/GNUmakefile index d265a1ee96..53243aa542 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 @@ -86,14 +86,14 @@ fix-xrefs: $(DOCUMENTS_INCLUDES) $(buildscript-dir)/manuals_definitions.py check-translation: - $(PYTHON) $(buildscript-dir)/check_translation.py $(buildscript-dir) $(CHECKED_FILES) + $(PYTHON) $(buildscript-dir)/check_translation.py $(CHECKED_FILES) update-translation: - $(PYTHON) $(buildscript-dir)/check_translation.py --update $(buildscript-dir) $(CHECKED_FILES) + $(PYTHON) $(buildscript-dir)/check_translation.py --update $(CHECKED_FILES) translation-status: make -C po out=www messages - $(PYTHON) $(buildscript-dir)/translations-status.py $(buildscript-dir) + $(PYTHON) $(buildscript-dir)/translations-status.py local-help: extra-local-help 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..50042f40cb 100644 --- a/Documentation/de/user/GNUmakefile +++ b/Documentation/de/user/GNUmakefile @@ -1,5 +1,4 @@ ISOLANG = de depth = ../../.. -LOCALSTEPMAKE_TEMPLATES = lilypond ly doclang +LOCALSTEPMAKE_TEMPLATES = lilypond ly doc-i18n-user include $(depth)/make/stepmake.make - diff --git a/Documentation/de/user/macros.itexi b/Documentation/de/user/macros.itexi index 9114eea639..05db816617 100644 --- a/Documentation/de/user/macros.itexi +++ b/Documentation/de/user/macros.itexi @@ -355,12 +355,12 @@ @macro rinternals{TEXT} @vindex \TEXT\ -@code{\TEXT\} +@ref{\TEXT\,,,lilypond-internals,Programmreferenz} @end macro @macro rinternalsnamed{TEXT,DISPLAY} @vindex \TEXT\ -@code{\DISPLAY\} +@ref{\TEXT\,,\DISPLAY\,lilypond-internals,Programmreferenz} @end macro @end iftex diff --git a/Documentation/es/index.html.in b/Documentation/es/index.html.in index ca25d52ad0..98ced1df05 100644 --- a/Documentation/es/index.html.in +++ b/Documentation/es/index.html.in @@ -49,8 +49,8 @@ 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..3fd59d3675 --- /dev/null +++ b/Documentation/lilypond.css @@ -0,0 +1,183 @@ +/***********************************************************/ +/* 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, .subsubheading { + font-size: large; + color: #1d7b85; +} + +/***********************************************************/ +/* 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..537f761b0a 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 @@ -11,6 +12,9 @@ OUTTXT_FILES= $(outdir)/NEWS.txt include $(depth)/make/stepmake.make MAKEINFO_FLAGS += -I $(top-src-dir)/Documentation/user +TEXI2HTML_FLAGS += -I $(top-src-dir)/Documentation/user + +local-WWW-1: $(OUT_TEXI_FILES) .SECONDARY: diff --git a/Documentation/topdocs/NEWS.tely b/Documentation/topdocs/NEWS.tely index c5a8513280..a12fc779a1 100644 --- a/Documentation/topdocs/NEWS.tely +++ b/Documentation/topdocs/NEWS.tely @@ -216,7 +216,7 @@ performance, page layout, MIDI results and warnings. This helps to reduce the number of regression errors during development, resulting in more stable releases. -See @uref{INSTALL.html#testing} for more information. +See @uref{INSTALL.html#Testing-LilyPond} for more information. @item Nested properties, such as @code{details} in @code{Slur}, can be reverted as well. The syntax for this is diff --git a/Documentation/user/GNUmakefile b/Documentation/user/GNUmakefile index eb4577dcc3..5d7affd551 100644 --- a/Documentation/user/GNUmakefile +++ b/Documentation/user/GNUmakefile @@ -16,11 +16,16 @@ 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 # todo: add latex. -PDF_FILES = $(TELY_FILES:%.tely=$(outdir)/%.pdf) +PDF_FILES = $(TELY_FILES:%.tely=$(outdir)/%.pdf)\ + $(outdir)/lilypond-internals.pdf MAIN_INFO_DOC = lilypond INFO_DOCS = lilypond lilypond-internals music-glossary lilypond-program lilypond-learning @@ -63,8 +68,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 # @@ -112,7 +115,7 @@ DEEP_HTML_FILES =\ # Symlinks to refer to external source documents from split and non-split HTML source-links = $(outdir)/source $(outdir)/lilypond/source $(outdir)/music-glossary/source \ - $(outdir)/lilypond-program/source $(outdir)/lilypond-learning/source + $(outdir)/lilypond-program/source $(outdir)/lilypond-learning/source $(outdir)/lilypond-internals/source $(outdir)/source: @rm -f $(@) @@ -123,13 +126,13 @@ $(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) $(PDF_FILES) info + +local-WWW-2: $(HTML_FILES) $(DEEP_HTML_FILES) $(source-links) $(outdir)/%.bib: %.bib ln -f $< $@ - # lilypond.texi deps $(top-build-dir)/mf/$(outconfbase)/feta16list.ly: $(MAKE) -C $(top-src-dir)/mf @@ -146,9 +149,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..6801ff4f34 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 @@ -314,12 +326,12 @@ @macro rinternals{TEXT} @vindex \TEXT\ -@code{\TEXT\} +@ref{\TEXT\,,,lilypond-internals,Internals Reference} @end macro @macro rinternalsnamed{TEXT,DISPLAY} @vindex \TEXT\ -@code{\DISPLAY\} +@ref{\TEXT\,,\DISPLAY\,lilypond-internals,Internals Reference} @end macro @end iftex 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..aa7d227c59 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -82,12 +82,12 @@ 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/ find $(outdir) -name '*-root' | xargs rm -rf - $(PYTHON) $(buildscript-dir)/www_post.py $(PACKAGE_NAME) $(TOPLEVEL_VERSION) $(buildscript-dir) $(outdir) "$(WEB_TARGETS)" + $(PYTHON) $(buildscript-dir)/www_post.py $(PACKAGE_NAME) $(TOPLEVEL_VERSION) $(outdir) "$(WEB_TARGETS)" find $(outdir)/offline-root -type l -delete diff --git a/buildscripts/add_html_footer.py b/buildscripts/add_html_footer.py deleted file mode 100644 index f063132132..0000000000 --- a/buildscripts/add_html_footer.py +++ /dev/null @@ -1,312 +0,0 @@ -#!@PYTHON@ - -""" -Print a nice footer. -""" -import re -import os -import time - -import langdefs - -# This is to try to make the docball not too big with almost duplicate files -# see process_links() -non_copied_pages = ['Documentation/user/out-www/lilypond-big-page', - 'Documentation/user/out-www/lilypond-internals-big-page', - 'Documentation/user/out-www/lilypond-learning-big-page', - 'Documentation/user/out-www/lilypond-program-big-page', - 'Documentation/user/out-www/music-glossary-big-page', - 'out-www/examples', - 'Documentation/topdocs', - 'Documentation/bibliography', - 'Documentation/out-www/THANKS', - 'Documentation/out-www/DEDICATION', - 'Documentation/out-www/devel', - 'input/'] - -def _doc (s): - return s - -header = r""" -""" - -footer = ''' -
-

- -%(footer_name_version)s -
-

-%(footer_report_errors)s
-
-%(footer_suggest_docs)s -
-

-
-''' -footer_name_version = _doc ('This page is for %(package_name)s-%(package_version)s (%(branch_str)s).') -footer_report_errors = _doc ('Report errors to %(mail_address)s.') -# ugh, must not have "_doc" in strings because it is naively replaced with "_" in hacked gettext process -footer_suggest_docs = _doc ('Your suggestions for the documentation are welcome.') - -mail_address = 'http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs' -suggest_Docs_url = 'http://lilypond.org/web/devel/participating/documentation-adding' - -header_tag = '' -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 -

-''' - - -html_re = re.compile ('(.*?)(?:[.]([^/.]*))?[.]html$') -pages_dict = {} - -def build_pages_dict (filelist): - """Build dictionary of available translations of each page""" - global pages_dict - for f in filelist: - m = html_re.match (f) - if m: - g = m.groups() - if len (g) <= 1 or g[1] == None: - e = '' - else: - e = g[1] - if not g[0] in pages_dict: - pages_dict[g[0]] = [e] - else: - pages_dict[g[0]].append (e) - -def source_links_replace (m, source_val): - return 'href="' + os.path.join (source_val, m.group (1)) + '"' - -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)') - -## Windows does not support symlinks. -# This function avoids creating symlinks for splitted HTML manuals -# Get rid of symlinks in GNUmakefile.in (local-WWW-post) -# this also fixes missing PNGs only present in translated docs -def hack_urls (s, prefix): - if splitted_docs_re.match (prefix): - s = re.sub ('(href|src)="(../lily-.*?|.*?[.]png)"', '\\1="../\\2"', s) - - # fix xrefs between documents in different directories ad hoc - if 'user/out-www/lilypond' in prefix: - s = snippets_ref_re.sub ('href="source/input/lsr/lilypond-snippets', s) - elif 'input/lsr' in prefix: - s = user_ref_re.sub ('href="source/Documentation/user/lilypond\\1', s) - - source_path = os.path.join (os.path.dirname (prefix), 'source') - if not os.path.islink (source_path): - return s - source_val = os.readlink (source_path) - return re.sub ('href="source/(.*?)"', lambda m: source_links_replace (m, source_val), s) - -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 - - s = header_tag + '\n' + s - - if re.search ('(?i)\n' - s = doctype + s - return s - -def add_title (s): - # urg - # maybe find first node? - fallback_web_title = '-- --' - m = re.match ('.*?(.*?)', s, re.DOTALL) - if m: - fallback_web_title = m.group (1) - s = re.sub ('@WEB-TITLE@', 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' - return s - -def find_translations (prefix, lang_ext): - """find available translations of a page""" - available = [] - missing = [] - for l in langdefs.LANGUAGES: - e = l.webext - 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]): - # English version of missing translated pages will be written - missing.append (e) - return available, missing - -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)] - elif target == 'offline': - # 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)] - else: - page_flavors[file_name] = [lang_ext, re.sub ( - '''href=[\'"]([^/][.]*[^.:\'"]*)(.html)(#[^"\']*|)[\'"]''', - 'href="\\1.' + lang_ext + '\\2\\3"', s)] - return page_flavors - -def add_menu (page_flavors, prefix, available, target, translation): - for k in page_flavors: - language_menu = '' - languages = '' - if page_flavors[k][0] != '': - t = translation[page_flavors[k][0]] - else: - t = _doc - for lang in available: - lang_file = lang.file_name (os.path.basename (prefix), '.html') - if language_menu != '': - language_menu += ', ' - language_menu += '%s' % (lang_file, t (lang.name)) - if target == 'offline': - browser_language = '' - elif target == 'online': - browser_language = t (browser_lang) % browser_language_url - if language_menu: - 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 - return page_flavors - - -def add_html_footer (package_name = '', - package_version = '', - target = 'offline', - name_filter = lambda s: s): - """Add header, footer to a number of HTML files - - Arguments: - package_name=NAME set package_name to NAME - package_version=VERSION set package version to VERSION - targets=offline|online set page processing depending on the target - offline is for reading HTML pages locally - online is for hosting the HTML pages on a website with content - negotiation - name_filter a HTML file name filter - """ - translation = langdefs.translation - localtime = time.strftime ('%c %Z', time.localtime (time.time ())) - - if "http://" in mail_address: - mail_address_url = mail_address - else: - mail_address_url= 'mailto:' + mail_address - - versiontup = package_version.split ('.') - branch_str = _doc ('stable-branch') - if int (versiontup[1]) % 2: - branch_str = _doc ('development-branch') - - # Initialize dictionaries for string formatting - subst = {} - subst[''] = dict ([i for i in globals ().items() if type (i[1]) is str]) - subst[''].update (dict ([i for i in locals ().items() if type (i[1]) is str])) - for l in translation: - e = langdefs.LANGDICT[l].webext - if e: - subst[e] = {} - for name in subst['']: - subst[e][name] = translation[l] (subst[''][name]) - # Do deeper string formatting as early as possible, - # so only one '%' formatting pass is needed later - for e in subst: - subst[e]['footer_name_version'] = subst[e]['footer_name_version'] % subst[e] - subst[e]['footer_report_errors'] = subst[e]['footer_report_errors'] % subst[e] - subst[e]['footer_suggest_docs'] = subst[e]['footer_suggest_docs'] % subst[e] - - for prefix, ext_list in pages_dict.items (): - for lang_ext in ext_list: - file_name = langdefs.lang_file_name (prefix, lang_ext, '.html') - in_f = open (file_name) - s = in_f.read() - in_f.close() - - s = re.sub ('%', '%%', s) - s = hack_urls (s, prefix) - s = add_header (s) - - ### add footer - if re.search (footer_tag, s) == None: - s = add_footer (s) - - available, missing = find_translations (prefix, lang_ext) - page_flavors = process_links (s, prefix, lang_ext, file_name, missing, target) - # Add menu after stripping: must not have autoselection for language menu. - page_flavors = add_menu (page_flavors, prefix, available, target, translation) - for k in page_flavors: - page_flavors[k][1] = page_flavors[k][1] % subst[page_flavors[k][0]] - out_f = open (name_filter (k), 'w') - out_f.write (page_flavors[k][1]) - out_f.close() - # if the page is translated, a .en.html symlink is necessary for content negotiation - if target == 'online' and ext_list != ['']: - os.symlink (os.path.basename (prefix) + '.html', name_filter (prefix + '.en.html')) diff --git a/buildscripts/check_translation.py b/buildscripts/check_translation.py index a0ac7d48cc..887e7c210b 100755 --- a/buildscripts/check_translation.py +++ b/buildscripts/check_translation.py @@ -5,6 +5,9 @@ import optparse import os import sys +import langdefs +import buildlib + verbose = 0 lang = 'C' C = lang @@ -53,7 +56,7 @@ def do_file (file_name, lang_codes, buildlib): def usage (): sys.stdout.write (r''' Usage: -check-translation [--language=LANG] [--verbose] [--update] BUILDSCRIPT-DIR FILE... +check-translation [--language=LANG] [--verbose] [--update] FILE... This script is licensed under the GNU GPL. ''') @@ -83,20 +86,17 @@ def do_options (): lang = options.language update_mode = options.update_mode - return (files[0], files[1:]) + return files def main (): global update_mode, text_editor - import_path, files = do_options () + files = do_options () if 'EDITOR' in os.environ: text_editor = os.environ['EDITOR'] else: update_mode = False - sys.path.append (import_path) - import langdefs - import buildlib buildlib.verbose = verbose for i in files: diff --git a/buildscripts/extract_texi_filenames.py b/buildscripts/extract_texi_filenames.py new file mode 100755 index 0000000000..c85a18fb22 --- /dev/null +++ b/buildscripts/extract_texi_filenames.py @@ -0,0 +1,168 @@ +#!@PYTHON@ +# -*- coding: utf-8 -*- +# extract_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[.LANG].xref-map with tab-separated entries of the form +# NODE\tFILENAME\tANCHOR +# LANG is the document language in case it's not 'en' +# 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 + +optlist, args = getopt.getopt (sys.argv[1:],'o:') +files = args + +outdir = '.' +for x in optlist: + if x[0] == '-o': + outdir = x[1] + +if not os.path.isdir (outdir): + if os.path.exists (outdir): + os.unlink (outdir) + os.makedirs (outdir) + +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*$', re.MULTILINE) + +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)[1] + else: + print "Unable to locate include file " + filepath + return '' + +lang_re = re.compile (r'^@documentlanguage (.+)', re.M) + +def extract_sections (filename): + result = '' + f = open (filename, 'r') + page = f.read () + f.close() + # Search document language + m = lang_re.search (page) + if m and m.group (1) != 'en': + lang_suffix = '.' + m.group (1) + else: + lang_suffix = '' + # 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 (lang_suffix, 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, lang_suffix, page): + sections = section_translation_re.findall (page) + basename = os.path.splitext (os.path.basename (filename))[0] + p = os.path.join (outdir, basename) + lang_suffix + '.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 + (lang_suffix, sections) = extract_sections (filename) + process_sections (filename, lang_suffix, 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/postprocess_html.py b/buildscripts/postprocess_html.py new file mode 100644 index 0000000000..f4c4797f98 --- /dev/null +++ b/buildscripts/postprocess_html.py @@ -0,0 +1,309 @@ +#!@PYTHON@ + +""" +Postprocess HTML files. +""" +import re +import os +import time +import operator + +import langdefs + +# This is to try to make the docball not too big with almost duplicate files +# see process_links() +non_copied_pages = ['Documentation/user/out-www/lilypond-big-page', + 'Documentation/user/out-www/lilypond-internals-big-page', + 'Documentation/user/out-www/lilypond-learning-big-page', + 'Documentation/user/out-www/lilypond-program-big-page', + 'Documentation/user/out-www/music-glossary-big-page', + 'out-www/examples', + 'Documentation/topdocs', + 'Documentation/bibliography', + 'Documentation/out-www/THANKS', + 'Documentation/out-www/DEDICATION', + 'Documentation/out-www/devel', + 'input/'] + +def _doc (s): + return s + +header = r""" +""" + +footer = ''' +
+

+ +%(footer_name_version)s +
+

+%(footer_report_errors)s
+
+%(footer_suggest_docs)s +
+

+
+''' +footer_name_version = _doc ('This page is for %(package_name)s-%(package_version)s (%(branch_str)s).') +footer_report_errors = _doc ('Report errors to %(mail_address)s.') +# ugh, must not have "_doc" in strings because it is naively replaced with "_" in hacked gettext process +footer_suggest_docs = _doc ('Your suggestions for the documentation are welcome.') + +mail_address = 'http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs' +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 +

+''' + + +html_re = re.compile ('(.*?)(?:[.]([^/.]*))?[.]html$') +pages_dict = {} + +def build_pages_dict (filelist): + """Build dictionary of available translations of each page""" + global pages_dict + for f in filelist: + m = html_re.match (f) + if m: + g = m.groups() + if len (g) <= 1 or g[1] == None: + e = '' + else: + e = g[1] + if not g[0] in pages_dict: + pages_dict[g[0]] = [e] + else: + pages_dict[g[0]].append (e) + +def source_links_replace (m, source_val): + return 'href="' + os.path.join (source_val, m.group (1)) + '"' + +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|(?!-snippets))') + +## Windows does not support symlinks. +# This function avoids creating symlinks for splitted HTML manuals +# Get rid of symlinks in GNUmakefile.in (local-WWW-post) +# this also fixes missing PNGs only present in translated docs +def hack_urls (s, prefix): + if splitted_docs_re.match (prefix): + s = re.sub ('(href|src)="(../lily-.*?|.*?[.]png)"', '\\1="../\\2"', s) + + # fix xrefs between documents in different directories ad hoc + if 'user/out-www/lilypond' in prefix: + s = snippets_ref_re.sub ('href="source/input/lsr/lilypond-snippets', s) + elif 'input/lsr' in prefix: + s = user_ref_re.sub ('href="source/Documentation/user/lilypond\\1', s) + + source_path = os.path.join (os.path.dirname (prefix), 'source') + if not os.path.islink (source_path): + return s + source_val = os.readlink (source_path) + return re.sub ('href="source/(.*?)"', lambda m: source_links_replace (m, source_val), s) + +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 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 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 = title_tag_re.match (s) + if m: + fallback_web_title = m.group (1) + s = AT_web_title_re.sub (fallback_web_title, s) + return s + +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): + """find available translations of a page""" + available = [] + missing = [] + for l in langdefs.LANGUAGES: + e = l.webext + if lang_ext != e: + if e in pages_dict[prefix]: + available.append (l) + 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, 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; + # 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, offline_links_re.sub ('href="\\1.' + e + '\\2\\3"', s)] + else: + 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): + for k in page_flavors: + language_menu = '' + languages = '' + if page_flavors[k][0] != '': + t = translation[page_flavors[k][0]] + else: + t = _doc + for lang in available: + lang_file = lang.file_name (os.path.basename (prefix), '.html') + if language_menu != '': + language_menu += ', ' + language_menu += '%s' % (lang_file, t (lang.name)) + if target == 'offline': + browser_language = '' + elif target == 'online': + browser_language = t (browser_lang) % browser_language_url + if language_menu: + language_available = t (lang_available) % language_menu + languages = LANGUAGES_TEMPLATE % vars () + # put language menu before '' and '' tags + page_flavors[k][1] = add_footer (page_flavors[k][1], languages) + return page_flavors + + +def process_html_files (package_name = '', + package_version = '', + target = 'offline', + name_filter = lambda s: s): + """Add header, footer and tweak links to a number of HTML files + + Arguments: + package_name=NAME set package_name to NAME + package_version=VERSION set package version to VERSION + targets=offline|online set page processing depending on the target + offline is for reading HTML pages locally + online is for hosting the HTML pages on a website with content + negotiation + name_filter a HTML file name filter + """ + translation = langdefs.translation + localtime = time.strftime ('%c %Z', time.localtime (time.time ())) + + if "http://" in mail_address: + mail_address_url = mail_address + else: + mail_address_url= 'mailto:' + mail_address + + versiontup = package_version.split ('.') + branch_str = _doc ('stable-branch') + if int (versiontup[1]) % 2: + branch_str = _doc ('development-branch') + + # Initialize dictionaries for string formatting + subst = {} + subst[''] = dict ([i for i in globals ().items() if type (i[1]) is str]) + subst[''].update (dict ([i for i in locals ().items() if type (i[1]) is str])) + for l in translation: + e = langdefs.LANGDICT[l].webext + if e: + subst[e] = {} + for name in subst['']: + subst[e][name] = translation[l] (subst[''][name]) + # Do deeper string formatting as early as possible, + # so only one '%' formatting pass is needed later + for e in subst: + subst[e]['footer_name_version'] = subst[e]['footer_name_version'] % subst[e] + subst[e]['footer_report_errors'] = subst[e]['footer_report_errors'] % subst[e] + subst[e]['footer_suggest_docs'] = subst[e]['footer_suggest_docs'] % subst[e] + + for prefix, ext_list in pages_dict.items (): + for lang_ext in ext_list: + file_name = langdefs.lang_file_name (prefix, lang_ext, '.html') + in_f = open (file_name) + s = in_f.read() + in_f.close() + + s = s.replace ('%', '%%') + s = hack_urls (s, prefix) + s = add_header (s) + + ### add footer + 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) + # Add menu after stripping: must not have autoselection for language menu. + page_flavors = add_menu (page_flavors, prefix, available, target, translation) + for k in page_flavors: + page_flavors[k][1] = page_flavors[k][1] % subst[page_flavors[k][0]] + out_f = open (name_filter (k), 'w') + out_f.write (page_flavors[k][1]) + out_f.close() + # if the page is translated, a .en.html symlink is necessary for content negotiation + if target == 'online' and ext_list != ['']: + os.symlink (os.path.basename (prefix) + '.html', name_filter (prefix + '.en.html')) 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/translations-status.py b/buildscripts/translations-status.py index 1c62ee56d2..4180ea8672 100755 --- a/buildscripts/translations-status.py +++ b/buildscripts/translations-status.py @@ -19,19 +19,15 @@ import string import os import langdefs +import buildlib def progress (str): sys.stderr.write (str + '\n') progress ("translations-status.py") -buildscript_dir = sys.argv[1] - _doc = lambda s: s -sys.path.append (buildscript_dir) -import buildlib - # load gettext messages catalogs translation = langdefs.translation diff --git a/buildscripts/www_post.py b/buildscripts/www_post.py index b2d7ca510c..6fdb84f660 100644 --- a/buildscripts/www_post.py +++ b/buildscripts/www_post.py @@ -10,7 +10,12 @@ import sys import os import re -package_name, package_version, buildscript_dir, outdir, targets = sys.argv[1:] +import langdefs + +import mirrortree +import postprocess_html + +package_name, package_version, outdir, targets = sys.argv[1:] targets = targets.split (' ') outdir = os.path.normpath (outdir) doc_dirs = ['input', 'Documentation', outdir] @@ -29,8 +34,6 @@ static_files = { Redirecting to the documentation index...\n''' } -import langdefs - for l in langdefs.LANGUAGES: static_files[os.path.join ('Documentation', 'user', outdir, l.file_name ('index', '.html'))] = \ ', 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 overflown
+### 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) +### -) The HTML anchors for all sections are derived from the node name / +### section title (pre-generated in the .xref-map file). Implemented by: +### split_at_numbered_sections (adjust section anchors) +### -) Use the standard footnote format "nr text" instead of the +### ugly format of texi2html (

(nr)

text

). Implemented in +### lilypond_foot_line_and_ref +### +### +### 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::SEPARATED_FOOTNOTES = 0; # Print footnotes on same page, not separated +$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; +$Texi2HTML::Config::foot_line_and_ref = \&lilypond_foot_line_and_ref; + +# Examples should be formatted similar to quotes: +$Texi2HTML::Config::complex_format_map->{'example'} = { + 'begin' => q{"
"},
+  'end' => q{"
\n"}, + }; + +%Texi2HTML::config::misc_pages_targets = ( + 'Overview' => 'Overview', + 'Contents' => 'Contents', + 'About' => 'About' +); + + +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)); + + # need to override both target (used as anchor in links to this section) and + # id (used in the tag for this section)! + $element->{'id'} = $element->{'target'} = $anchor; + + # unnumbered sections (except those at top-level!) always go to the same + # file as the previous numbered section + if (not ($element->{number}) and not ($lastfilename eq '') and ($element->{level} > 1)) { + $filename = $lastfilename; + } + 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" + if ($type eq "top") { + $element->{'id'} = $element->{'target'} = "Top"; + } + return; + } else { + print STDERR "WARNING: Node '$node_name' was NOT found in the map\n" + unless ($node_name eq '') or ($element->{'tag'} eq 'unnumberedsec') + or ($node_name =~ /NOT REALLY USED/); + + # derive the name of the anchor (i.e. the part after # in the links!), + # don't use texi2html's SECx.x default! + my $sec_name = main::remove_texi($element->{'texi'}); + # if we have a node, use its name: + if ($element->{'node_ref'}->{'texi'} ne '') { + $sec_name = main::remove_texi($element->{'node_ref'}->{'texi'}); + } + my $anchor = $sec_name; + if ($element->{translationof}) { + $anchor = main::remove_texi($$element{translationof}); + } + # normalize to the same file name as texinfo + $anchor = texinfo_file_name($anchor); + # need to override both target (used as anchor in links to this section) and + # id (used in the tag for this section)! + $element->{'id'} = $element->{'target'} = $anchor; + # Numbered sections will get a filename Node_title, unnumbered sections will use + # the file name of the previous numbered section: + if (($element->{number}) or ($lastfilename eq '') or ($element->{level} == 1)) { + my $filename = $anchor; + $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 +# 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 = main::locate_include_file ("${docu_name}.$Texi2HTML::THISDOC{current_lang}.xref-map") + || main::locate_include_file ("${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 = main::locate_include_file ("${map_name}.$Texi2HTML::THISDOC{current_lang}.xref-map") + || main::locate_include_file ("${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' + ); + + + + + +############################################################################# +### FOOTNOTE FORMATTING +############################################################################# + +# Format footnotes in a nicer way: Instead of printing the number in a separate +# (nr) heading line, use the standard way of prepending nr immediately +# before the fn text. +sub lilypond_foot_line_and_ref($$$$$$$) +{ + my $number_in_doc = shift; + my $number_in_page = shift; + my $footnote_id = shift; + my $place_id = shift; + my $document_file = shift; + my $footnote_file = shift; + my $lines = shift; + my $state = shift; + + if ($document_file eq $footnote_file) + { + $document_file = $footnote_file = ''; + } + # FN number printed before the fn text: + my $tmptxt = &$anchor($footnote_id, $document_file . "#$place_id", + "$number_in_doc"); + # unfortunately, the @$lines contain the already formatted footnote in the + # from

...

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

/

$tmptxt /; + # this is a bit obscure, this allows to add an anchor only if formatted + # as part of the document. + $place_id = '' if ($state->{'outside_document'} or $state->{'multiple_pass'}); + # return FN lines and text to be inserted in the running text (link to FN) + return ($lines, &$anchor($place_id, $footnote_file . "#$footnote_id", + "$number_in_doc")); +} + + + +############################################################################# +### 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/doc-i18n-user-rules.make b/make/doc-i18n-user-rules.make new file mode 100644 index 0000000000..91f09c47a1 --- /dev/null +++ b/make/doc-i18n-user-rules.make @@ -0,0 +1,33 @@ +$(outdir)/%/index.html: $(outdir)/%.texi $(XREF_MAPS_DIR)/%.$(ISOLANG).xref-map $(OUT_PNG_IMAGES) $(outdir)/version.itexi + mkdir -p $(dir $@) + $(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 $(XREF_MAPS_DIR)/%.$(ISOLANG).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 $(outdir)/version.itexi + $(PYTHON) $(buildscript-dir)/texi-gettext.py $(ISOLANG) $< + +$(outdir)/%.pdf: $(outdir)/%.pdftexi $(outdir)/version.itexi + cd $(outdir); texi2pdf $(TEXI2PDF_FLAGS) $(TEXINFO_PAPERSIZE_OPTION) $(notdir $*).pdftexi + +$(outdir)/version.%: $(top-src-dir)/VERSION + echo '@macro version'> $@ + echo $(TOPLEVEL_VERSION)>> $@ + echo '@end macro'>> $@ + +$(outdir)/%.png: $(top-build-dir)/Documentation/user/$(outdir)/%.png + ln -f $< $@ + +$(XREF_MAPS_DIR)/%.$(ISOLANG).xref-map: $(outdir)/%.texi + $(PYTHON) $(buildscript-dir)/extract_texi_filenames.py -o $(XREF_MAPS_DIR) $< + +# This makes sure lilypond-doc gettext domain has been compiled +# before lilypond-book runs +$(TELY_FILES): doc-po + +$(MASTER_TEXI_FILES): $(ITELY_FILES) $(ITEXI_FILES) + +.SECONDARY: diff --git a/make/doc-i18n-user-targets.make b/make/doc-i18n-user-targets.make new file mode 100644 index 0000000000..7f8f6799b0 --- /dev/null +++ b/make/doc-i18n-user-targets.make @@ -0,0 +1,14 @@ +default: + +local-WWW-1: $(MASTER_TEXI_FILES) $(PDF_FILES) $(XREF_MAPS_FILES) + +# BIG_PAGE_HTML_FILES is defined differently in each language makefile +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/doc-i18n-user-vars.make b/make/doc-i18n-user-vars.make new file mode 100644 index 0000000000..bee28ee46b --- /dev/null +++ b/make/doc-i18n-user-vars.make @@ -0,0 +1,36 @@ +# ISOLANG must be defined + +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 + +TELY_FILES := $(call src-wildcard,*.tely) +MASTER_TEXI_FILES := $(TELY_FILES:%.tely=$(outdir)/%.texi) +BIG_PAGE_HTML_FILES := $(BIG_PAGE_MANUALS:%=$(outdir)/%-big-page.html) +DEEP_HTML_FILES := $(TELY_FILES:%.tely=$(outdir)/%/index.html) +PDF_FILES := $(TELY_FILES:%.tely=$(outdir)/%.pdf) + +ITELY_FILES := $(call src-wildcard,*.itely) +ITEXI_FILES := $(call src-wildcard,*.itexi) + +DOCUMENTATION_INCLUDES = \ + -I $(top-src-dir)/Documentation/user \ + -I $(top-build-dir)/Documentation/user/$(outdir) + +LILYPOND_BOOK_INCLUDES += $(DOCUMENTATION_INCLUDES) +MAKEINFO_FLAGS += --force --enable-encoding $(DOCUMENTATION_INCLUDES) +MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS) + +# texi2html xref map files +XREF_MAPS_DIR=$(top-build-dir)/out/xref-maps +XREF_MAPS_FILES=$(TELY_FILES:%.tely=$(XREF_MAPS_DIR)/%.$(ISOLANG).xref-map) + +# texi2html flags +TEXI2HTML_INIT= --init-file=$(top-src-dir)/lilypond-texi2html.init +TEXI2HTML_LANG=--lang=$(ISOLANG) +TEXI2HTML_FLAGS += $(TEXI2HTML_LANG) $(DOCUMENTATION_INCLUDES) \ + -I $(XREF_MAPS_DIR) +TEXI2HTML = LANG= $(TEXI2HTML_PROGRAM) + +TEXI2PDF_FLAGS += -q --batch $(DOCUMENTATION_INCLUDES) diff --git a/make/doclang-rules.make b/make/doclang-rules.make deleted file mode 100644 index 10fa6ef382..0000000000 --- a/make/doclang-rules.make +++ /dev/null @@ -1,27 +0,0 @@ -$(outdir)/%/index.html: $(outdir)/%.texi $(outdir)/version.itexi - mkdir -p $(dir $@) - $(MAKEINFO) -P $(outdir) --output=$(outdir)/$* --css-include=$(top-src-dir)/Documentation/texinfo.css --html $< - -$(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)/%.pdftexi: $(outdir)/%.texi doc-po $(outdir)/version.itexi - $(PYTHON) $(buildscript-dir)/texi-gettext.py $(ISOLANG) $< - -$(outdir)/%.pdf: $(outdir)/%.pdftexi - cd $(outdir); texi2pdf $(TEXI2PDF_FLAGS) $(TEXINFO_PAPERSIZE_OPTION) $(notdir $*).pdftexi - -$(outdir)/version.%: $(top-src-dir)/VERSION - echo '@macro version'> $@ - echo $(TOPLEVEL_VERSION)>> $@ - echo '@end macro'>> $@ - -# This makes sure lilypond-doc gettext domain has been compiled -# before lilypond-book runs -%.tely: doc-po - -$(OUT_TEXI_FILES): $(ITELY_FILES) $(ITEXI_FILES) - -$(DEEP_HTML_FILES) $(PDF_FILES): $(ITELY_FILES) $(ITEXI_FILES) - -.SECONDARY: diff --git a/make/doclang-targets.make b/make/doclang-targets.make deleted file mode 100644 index 4fd4bad694..0000000000 --- a/make/doclang-targets.make +++ /dev/null @@ -1,10 +0,0 @@ -default: - -# BIG_PAGE_HTML_FILES is defined differently in each language makefile -local-WWW: $(DEEP_HTML_FILES) $(PDF_FILES) doc-po $(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 diff --git a/make/doclang-vars.make b/make/doclang-vars.make deleted file mode 100644 index 08d17b919a..0000000000 --- a/make/doclang-vars.make +++ /dev/null @@ -1,21 +0,0 @@ -# ISOLANG must be defined - -LANGS = $(shell $(PYTHON) $(buildscript-dir)/langdefs.py) - -DOCUMENTATION_INCLUDES = \ - -I $(top-src-dir)/Documentation/user \ - -I $(top-build-dir)/Documentation/user/$(outdir) - -LILYPOND_BOOK_INCLUDES += $(DOCUMENTATION_INCLUDES) -MAKEINFO_FLAGS += --force --enable-encoding $(DOCUMENTATION_INCLUDES) -MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS) - -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) - -ITELY_FILES := $(call src-wildcard,*.itely) -ITEXI_FILES := $(call src-wildcard,*.itexi) diff --git a/make/generic-vars.make b/make/generic-vars.make index 201a9ea7a4..428e5b900a 100644 --- a/make/generic-vars.make +++ b/make/generic-vars.make @@ -18,6 +18,7 @@ mi2mu-dir = $(src-depth)/mi2mu make-dir = $(src-depth)/make include-flower = $(src-depth)/flower/include +export PYTHONPATH:=$(buildscript-dir):$(PYTHONPATH) LILYPOND_INCLUDES = $(include-flower) $(depth)/flower/$(outdir) 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/document-backend.scm b/scm/document-backend.scm index 02a09736b0..8d7bb3bc25 100644 --- a/scm/document-backend.scm +++ b/scm/document-backend.scm @@ -25,13 +25,13 @@ (if (pair? uprops) (string-append - "\n\n@unnumberedsubsubsec User settable properties:\n" + "\n\n@subsubheading User settable properties:\n" (description-list->texi user-propdocs #t)) "") (if (pair? iprops) (string-append - "\n\n@unnumberedsubsubsec Internal properties:\n" + "\n\n@subsubheading Internal properties:\n" (description-list->texi internal-propdocs #t)) "")))) diff --git a/scm/documentation-generate.scm b/scm/documentation-generate.scm index 7f87df80fd..36af5b3a69 100644 --- a/scm/documentation-generate.scm +++ b/scm/documentation-generate.scm @@ -70,98 +70,60 @@ "(lilypond/lilypond-internals.info)") " -@c NOTE: This is documentation-generate.scm, not macros.itexi +@include macros.texi +@ignore +@omftitle LilyPond internals +@omfcreator Han-Wen Nienhuys and Jan Nieuwenhuizen +@omfdescription Programmer's reference of the LilyPond music engraving system +@omftype user's guide +@omflanguage English +@omfcategory Applications|Publishing +@end ignore -@macro q{TEXT} -@quoteleft{}\\TEXT\\@quoteright{} -@end macro - -@macro qq{TEXT} -@quotedblleft{}\\TEXT\\@quotedblright{} -@end macro - +@iftex +@afourpaper +@c don't replace quotes with directed quotes +@tex +\\gdef\\SETtxicodequoteundirected{Foo} +\\gdef\\SETtxicodequotebacktick{Bla} +@end tex +@end iftex @ifhtml -@c ***** HTML ***** - -@ifset bigpage - -@macro ruser{TEXT} -@ref{\\TEXT\\,,,lilypond-big-page,Notation Reference} -@cindex \\TEXT\\ -@end macro - -@end ifset - -@ifclear bigpage - -@macro ruser{NAME} -@ref{\\NAME\\,,,lilypond,Notation Reference} -@cindex \\NAME\\ -@end macro - -@end ifclear - -@macro inputfileref{DIR,NAME} -@uref{source/\\DIR\\/out-www/collated-files.html#\\NAME\\,@file{\\DIR\\/\\NAME\\}}@c -@end macro - +This document is also available as a +@uref{source/Documentation/user/lilypond-internals.pdf,PDF} and as +@uref{source/Documentation/user/lilypond-internals-big-page.html,one big page}. @end ifhtml +@finalout -@ifinfo -@c ***** info ***** +@titlepage +@title LilyPond +@subtitle The music typesetter +@titlefont{Internals Reference} +@author The LilyPond development team -@macro ruser{NAME} -@ref{\\NAME\\,,,lilypond,Notation Reference} -@cindex \\NAME\\ -@end macro +Copyright @copyright{} 1999--2008 by the authors -@macro inputfileref{DIR,NAME} -@file{\\DIR\\/\\NAME\\} -@end macro +@vskip 20pt -@end ifinfo - - -@iftex -@c ***** TeX ***** - -@macro ruser{NAME} -@ref{\\NAME\\}@c -@end macro - -@macro inputfileref{DIR,NAME}@c -@file{\\DIR\\/\\NAME\\}@c -@end macro - -@end iftex - - -@macro rinternals{NAME} -@ref{\\NAME\\} -@end macro - - -@ignore -@omftitle LilyPond internals -@omfcreator Han-Wen Nienhuys and Jan Nieuwenhuizen -@omfdescription Programmer's reference of the LilyPond music engraving system -@omftype user's guide -@omflanguage English -@omfcategory Applications|Publishing -@end ignore +For LilyPond version @version{} +@end titlepage +@contents +@ifnottex ") out-port) (define top-node (make #:name "Top" - #:text - (string-append "This is the program reference for version " + #:text + (string-append " +@end ifnottex +This is the program reference for version " (lilypond-version) " of LilyPond, the GNU music typesetter.") diff --git a/scm/documentation-lib.scm b/scm/documentation-lib.scm index bd824aebc9..4a25f5420c 100644 --- a/scm/documentation-lib.scm +++ b/scm/documentation-lib.scm @@ -63,9 +63,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 24f8f65aed..2df68ac3ca 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) @@ -168,22 +169,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..b44b6300ec 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 $(XREF_MAPS_DIR)/%.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 $(XREF_MAPS_DIR)/%.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 $(XREF_MAPS_DIR)/%.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 245b2e6c62..75365a2e7d 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-1: $(XREF_MAPS_FILES) local-doc: $(OUTTXT_FILES) diff --git a/stepmake/stepmake/texinfo-vars.make b/stepmake/stepmake/texinfo-vars.make index d53bd8f7dd..1a67332d4b 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,19 @@ TEXINFO_PAPERSIZE_OPTION= $(if $(findstring $(PAPERSIZE),a4),,-t @afourpaper) MAKEINFO_FLAGS = --enable-encoding MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS) +# texi2html xref map files +XREF_MAPS_DIR=$(top-build-dir)/out/xref-maps +XREF_MAPS_FILES=$(INFO_DOCS:%=$(XREF_MAPS_DIR)/%.xref-map) + +# texi2html flags +ifneq ($(ISOLANG),) +TEXI2HTML_LANG = --lang=$(ISOLANG) +endif +TEXI2HTML_FLAGS += --css-ref=lilypond.css $(DOCUMENTATION_INCLUDES) \ + --I=$(XREF_MAPS_DIR) +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)