From e983676f6c9b53c94c0c94c2805073a8fa6832c8 Mon Sep 17 00:00:00 2001 From: Thibaut Cuvelier Date: Sun, 26 Sep 2021 21:00:59 +0200 Subject: [PATCH] DocBook: work around bug in LilyPond. https://lists.gnu.org/archive/html/bug-lilypond/2021-09/msg00039.html --- lib/scripts/docbook_copy.py | 60 ++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/lib/scripts/docbook_copy.py b/lib/scripts/docbook_copy.py index 8e00db773f..034d504f16 100644 --- a/lib/scripts/docbook_copy.py +++ b/lib/scripts/docbook_copy.py @@ -19,6 +19,8 @@ import os +import os.path +import re import shutil import sys @@ -42,21 +44,59 @@ def copy_docbook(args): has_lilypond = lilypond_command != "" and lilypond_command != "none" + # Guess the path for LilyPond. + lilypond_folder = os.path.split(lilypond_command)[0] if has_lilypond else '' + + # Help debugging. + print("Given arguments:") + print("LilyPond: " + ("present" if has_lilypond else "not found") + " " + lilypond_command) + print("LilyPond path: " + lilypond_folder) + print("Input file: " + in_file) + print("Output file: " + out_file) + # Apply LilyPond to the original file if available and needed. if has_lilypond and need_lilypond(in_file): - # LilyPond requires that its input file has the .lyxml extension. - # Move the file, so that LilyPond doesn't have to erase the contents of the original file before - # writing the converted output. in_lily_file = in_file.replace(".xml", ".lyxml") - shutil.move(in_file, in_lily_file) + print("The input file needs a LilyPond pass and LilyPond is available.") + print("Rewriting " + in_file + " as " + in_lily_file) + + # LilyPond requires that its input file has the .lyxml extension. Due to a bug in LilyPond, + # use " instead of ' to encode XML attributes. + # https://lists.gnu.org/archive/html/bug-lilypond/2021-09/msg00039.html + # Typical transformation: + # FROM: language='lilypond' role='fragment verbatim staffsize=16 ragged-right relative=2' + # TO: language="lilypond" role="fragment verbatim staffsize=16 ragged-right relative=2" + with open(in_file, 'r', encoding='utf-8') as f, open(in_lily_file, 'w', encoding='utf-8') as f_lily: + for line in f: + if "language='lilypond'" in line: + # print(line) + # print(re.match('.*?)\')?>', line)) + line = re.sub( + '.*?)\')?>', + '', + line + ) + # print(line) + f_lily.write(line) + os.unlink(in_file) + # shutil.move(in_file, in_lily_file) + + # Add LilyPond to the PATH. + if os.path.isdir(lilypond_folder): + os.environ['PATH'] += os.pathsep + lilypond_folder # Start LilyPond on the copied file. First test the binary, then check if adding Python helps. - command = lilypond_command + ' --format=docbook ' + in_lily_file - print(command) - if os.system(command) != 0: - command = 'python -tt "' + lilypond_command + '" --format=docbook ' + in_lily_file - print(command) - if os.system(command) != 0: + command_raw = lilypond_command + ' --format=docbook ' + in_lily_file + command_python = 'python -tt "' + lilypond_command + '" --format=docbook ' + in_lily_file + + if os.system(command_raw) == 0: + print("Success running LilyPond:") + print(command_raw) + else: + if os.system(command_python) == 0: + print("Success running LilyPond:") + print(command_python) + else: print('Error from LilyPond') sys.exit(1) -- 2.39.5