From dd41d8981e1e7c4255ae155f03822f893048c55d Mon Sep 17 00:00:00 2001 From: John Mandereau Date: Sat, 16 Feb 2008 22:33:01 +0100 Subject: [PATCH] Clean up translated docs generation * sort makefile stuff into approriate make/doclang-{vars,rules,targets}.make * make lilypond-book look for snippets already compiled in directories given with -I option * use -I flags for the whole lilypond-book/makeinfo/texi2pdf chain, which makes building faster than before * as a consequence, get rid of symlinks from Documentation/user/out-www to out-www * add support for big-page HTML manuals (not yet used) * also update deprecated Python code in lilypond-book (string functions and string exceptions) --- make/doclang-rules.make | 16 +++++++- make/doclang-targets.make | 50 ++---------------------- make/doclang-vars.make | 22 ++++++++++- scripts/lilypond-book.py | 81 +++++++++++++++++---------------------- 4 files changed, 75 insertions(+), 94 deletions(-) diff --git a/make/doclang-rules.make b/make/doclang-rules.make index ea30561d83..f7b95d4478 100644 --- a/make/doclang-rules.make +++ b/make/doclang-rules.make @@ -1 +1,15 @@ -#empty +# cancel the rule that generates .n[o lilypond images t]exi files +$(outdir)/%.nexi: $(ITELY_FILES) $(ITEXI_FILES) + +$(outdir)/%/index.html: $(outdir)/%.texi + mkdir -p $(dir $@) + -$(MAKEINFO) -P $(outdir) --output=$(outdir)/$* --css-include=$(top-src-dir)/Documentation/texinfo.css --html $< + +$(outdir)/%-big-page.html: $(outdir)/%.texi + -$(MAKEINFO) -P $(outdir) --output=$@ --css-include=$(top-src-dir)/Documentation/texinfo.css --html --no-split --no-headers $< + +$(outdir)/%.pdftexi: $(outdir)/%.texi doc-po + $(PYTHON) $(buildscript-dir)/texi-gettext.py $(buildscript-dir) $(top-build-dir)/Documentation/po/$(outdir) $(ISOLANG) $< + +$(outdir)/%.pdf: $(outdir)/%.pdftexi + cd $(outdir); texi2pdf $(TEXI2PDF_FLAGS) $(TEXINFO_PAPERSIZE_OPTION) $(notdir $*).pdftexi diff --git a/make/doclang-targets.make b/make/doclang-targets.make index 496c1d9de4..cddd58615e 100644 --- a/make/doclang-targets.make +++ b/make/doclang-targets.make @@ -1,53 +1,11 @@ -# one assumes depth and ISOLANG are defined - -OUT_ITEXI_FILES = $(ITELY_FILES:%.itely=$(outdir)/%.itexi) - -TEXINFO_PAPERSIZE_OPTION= $(if $(findstring $(PAPERSIZE),a4),,-t @afourpaper) - -LILYPOND_BOOK_INCLUDES += \ - -I$(top-src-dir)/Documentation/user \ - -I$(top-build-dir)/Documentation/user/$(outdir) - default: -$(outdir)/%.nexi: $(ITELY_FILES) $(ITEXI_FILES) - -MAKEINFO_FLAGS += --force - -$(outdir)/%/index.html: $(outdir)/%.nexi $(outdir)/user-ln doc-po - mkdir -p $(dir $@) - -$(MAKEINFO) $(MAKEINFO_FLAGS) -I$(outdir) --output=$(outdir)/$* --css-include=$(top-src-dir)/Documentation/texinfo.css --html $< - -# we don't make the big page until the whole manual is translated -# if this happens, we'll have to define local-WWW differently for this language -#$(outdir)/lilypond.html: $(outdir)/lilypond.nexi -# -$(MAKEINFO) $(MAKEINFO_FLAGS) -I$(outdir) --output=$@ --css-include=$(top-src-dir)/Documentation/texinfo.css --html --no-split --no-headers $< - -$(outdir)/%.pdf: $(outdir)/%.texi $(outdir)/user-ln doc-po - $(PYTHON) $(buildscript-dir)/texi-gettext.py $(buildscript-dir) $(top-build-dir)/Documentation/po/$(outdir) $(ISOLANG) $< - cd $(outdir); texi2pdf --batch $(TEXINFO_PAPERSIZE_OPTION) $(notdir $*).pdftexi - -TELY_FILES = $(call src-wildcard,*.tely) -DEEP_HTML_FILES = $(TELY_FILES:%.tely=$(outdir)/%/index.html) -PDF_FILES = $(TELY_FILES:%.tely=$(outdir)/%.pdf) - -local-WWW: $(DEEP_HTML_FILES) $(PDF_FILES) +# BIG_PAGE_HTML_FILES is defined differently in each language makefile +local-WWW: $(DEEP_HTML_FILES) $(PDF_FILES) doc-po $(BIG_PAGE_HTML_FILES) find $(outdir) -name '*.html' | xargs grep -L 'UNTRANSLATED NODE: IGNORE ME' | xargs $(PYTHON) $(buildscript-dir)/html-gettext.py $(buildscript-dir) $(top-build-dir)/Documentation/po/$(outdir) $(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' \) -a -not -type l | sed 's!$(outdir)/!!g' | xargs $(PYTHON) $(buildscript-dir)/mass-link.py hard $(outdir) $(top-build-dir)/Documentation/user/$(outdir) - -LINKED_PNGS = henle-flat-gray.png baer-flat-gray.png lily-flat-bw.png + 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) -# makeinfo MUST have PNGs in cwd for info images to work -# symlinking PNGs... -# texi2pdf -I flag confuses pdfetex with .aux and other files -# from English manual -# symlinking lily-*... -$(outdir)/user-ln: $(top-build-dir)/Documentation/user/$(outdir) - $(PYTHON) $(buildscript-dir)/mass-link.py symbolic $(top-build-dir)/Documentation/user/$(outdir) $(outdir) 'lily-*.pdf' 'lily-*.tex' 'lily-*.texi' 'lily-*.ly' 'lily-*.txt' 'lily-*.png' 'henle-flat-gray.*' 'baer-flat-gray.*' 'lily-flat-bw.*' 'context-example.*' - mkdir -p $(outdir)/lilypond - cd $(outdir)/lilypond && $(foreach i, $(LINKED_PNGS), ln -sf ../../$(depth)/Documentation/user/$(i) $(i) &&) true - touch -mr $(top-build-dir)/Documentation/user/$(outdir) $@ local-WWW-clean: deep-WWW-clean @@ -58,4 +16,4 @@ web-clean: clean $(MAKE) out=www local-WWW-clean doc-po: - $(MAKE) -C $(depth)/Documentation/po messages + $(MAKE) -C $(depth)/Documentation/po out=www messages diff --git a/make/doclang-vars.make b/make/doclang-vars.make index ea30561d83..96c8bec42d 100644 --- a/make/doclang-vars.make +++ b/make/doclang-vars.make @@ -1 +1,21 @@ -#empty +# ISOLANG must be defined + +LANGS = $(shell $(PYTHON) $(buildscript-dir)/langdefs.py) + +OUT_ITEXI_FILES = $(ITELY_FILES:%.itely=$(outdir)/%.itexi) + +DOCUMENTATION_INCLUDES = \ + -I $(top-src-dir)/Documentation/user \ + -I $(top-build-dir)/Documentation/user/$(outdir) +DOCUMENTATION_INCLUDES += $(foreach lang, $(LANGS), -I $(top-build-dir)/Documentation/$(lang)/user/$(outdir)) + +LILYPOND_BOOK_INCLUDES += $(DOCUMENTATION_INCLUDES) +MAKEINFO_FLAGS += --force --enable-encoding $(DOCUMENTATION_INCLUDES) +MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS) + +TEXI2PDF_FLAGS += --batch --tidy +TEXI2PDF_FLAGS += $(DOCUMENTATION_INCLUDES) + +TELY_FILES = $(call src-wildcard,*.tely) +DEEP_HTML_FILES = $(TELY_FILES:%.tely=$(outdir)/%/index.html) +PDF_FILES = $(TELY_FILES:%.tely=$(outdir)/%.pdf) diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py index 21d6f44c67..23db868985 100644 --- a/scripts/lilypond-book.py +++ b/scripts/lilypond-book.py @@ -29,13 +29,13 @@ TODO: ''' import stat -import string import tempfile import commands import os import sys import re import md5 +import operator """ @relocate-preamble@ @@ -69,7 +69,7 @@ authors = ('Jan Nieuwenhuizen ', ################################################################ def exit (i): if global_options.verbose: - raise _ ('Exiting (%d)...') % i + raise Exception (_ ('Exiting (%d)...') % i) else: sys.exit (i) @@ -88,7 +88,7 @@ def ps_page_count (ps_name): header = open (ps_name).read (1024) m = re.search ('\n%%Pages: ([0-9]+)', header) if m: - return string.atoi (m.group (1)) + return int (m.group (1)) return 0 def warranty (): @@ -779,14 +779,15 @@ def classic_lilypond_book_compatibility (key, value): return (None, None) -def find_file (name): +def find_file (name, raise_error=True): for i in global_options.include_path: full = os.path.join (i, name) if os.path.exists (full): return full - error (_ ("file not found: %s") % name + '\n') - exit (1) + if raise_error: + error (_ ("file not found: %s") % name + '\n') + exit (1) return '' def verbatim_html (s): @@ -1006,7 +1007,7 @@ class Lilypond_snippet (Snippet): option_list.append (key) else: option_list.append (key + '=' + value) - option_string = string.join (option_list, ',') + option_string = ','.join (option_list) compose_dict = {} compose_types = [NOTES, PREAMBLE, LAYOUT, PAPER] @@ -1062,14 +1063,10 @@ class Lilypond_snippet (Snippet): elif relative > 0: relative_quotes += "'" * relative - paper_string = string.join (compose_dict[PAPER], - '\n ') % override - layout_string = string.join (compose_dict[LAYOUT], - '\n ') % override - notes_string = string.join (compose_dict[NOTES], - '\n ') % vars () - preamble_string = string.join (compose_dict[PREAMBLE], - '\n ') % override + paper_string = '\n '.join (compose_dict[PAPER]) % override + layout_string = '\n '.join (compose_dict[LAYOUT]) % override + notes_string = '\n '.join (compose_dict[NOTES]) % vars () + preamble_string = '\n '.join (compose_dict[PREAMBLE]) % override padding_mm = global_options.padding_mm font_dump_setting = '' if FONTLOAD in self.option_dict: @@ -1105,10 +1102,9 @@ class Lilypond_snippet (Snippet): def ly_is_outdated (self): base = self.basename () - ly_file = base + '.ly' - tex_file = base + '.tex' - eps_file = base + '.eps' - systems_file = base + '-systems.tex' + ly_file = find_file (base + '.ly', raise_error=False) + tex_file = find_file (base + '.tex', raise_error=False) + systems_file = find_file (base + '-systems.tex', raise_error=False) if (os.path.exists (ly_file) and os.path.exists (systems_file) @@ -1123,33 +1119,26 @@ class Lilypond_snippet (Snippet): def png_is_outdated (self): base = self.basename () - # FIXME: refactor stupid OK stuff - ok = not self.ly_is_outdated () - if global_options.format in (HTML, TEXINFO): - ok = ok and os.path.exists (base + '.eps') - - page_count = 0 - if ok: - page_count = ps_page_count (base + '.eps') - - if page_count <= 1: - ok = ok and os.path.exists (base + '.png') - - elif page_count > 1: - for a in range (1, page_count + 1): - ok = ok and os.path.exists (base + '-page%d.png' % a) - - return not ok + eps_file = find_file (base + '.eps', raise_error=False) + png_file = find_file (base + '.png', raise_error=False) + if not self.ly_is_outdated () and global_options.format in (HTML, TEXINFO): + if os.path.exists (eps_file): + page_count = ps_page_count (eps_file) + if page_count <= 1: + return not os.path.exists (png_file) + else: + return not reduce (operator.or_, + [find_file (base + '-page%d.png' % a, raise_error=False) + for a in range (1, page_count + 1)]) + return True def texstr_is_outdated (self): if backend == 'ps': return 0 - # FIXME: refactor stupid OK stuff base = self.basename () - ok = self.ly_is_outdated () - ok = ok and (os.path.exists (base + '.texstr')) - return not ok + return not (self.ly_is_outdated () + and find_file (base + '.texstr', raise_error=False)) def filter_text (self): code = self.substring ('code') @@ -1483,16 +1472,16 @@ def process_snippets (cmd, ly_snippets, texstr_snippets, png_snippets): # the --process=CMD switch is a bad idea # it is too generic for lilypond-book. if texstr_names: - my_system (string.join ([cmd, '--backend texstr', - 'snippet-map.ly'] + texstr_names)) + my_system (' '.join ([cmd, '--backend texstr', + 'snippet-map.ly'] + texstr_names)) for l in texstr_names: my_system ('latex %s.texstr' % l) if ly_names: open ('snippet-names', 'wb').write ('\n'.join (['snippet-map.ly'] - + ly_names)) + + ly_names)) - my_system (string.join ([cmd, 'snippet-names'])) + my_system (' '.join ([cmd, 'snippet-names'])) LATEX_INSPECTION_DOCUMENT = r''' @@ -1648,7 +1637,7 @@ def write_if_updated (file_name, lines): try: f = open (file_name) oldstr = f.read () - new_str = string.join (lines, '') + new_str = ''.join (lines) if oldstr == new_str: progress (_ ("%s is up to date.") % file_name) progress ('\n') @@ -1837,7 +1826,7 @@ def main (): + ' --formats=%s --backend eps ' % formats) if global_options.process_cmd: - global_options.process_cmd += string.join ([(' -I %s' % ly.mkarg (p)) + global_options.process_cmd += ' '.join ([(' -I %s' % ly.mkarg (p)) for p in global_options.include_path]) if global_options.format in (TEXINFO, LATEX): -- 2.39.5