# bib2texi.py # # This file is part of LilyPond, the GNU music typesetter. # # Copyright (C) 2001--2020 Han-Wen Nienhuys # # LilyPond is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # LilyPond is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LilyPond. If not, see . import codecs import os import sys import getopt import tempfile # usage: def usage(): print('usage: bib2texi.py [-s style] [-o ] [-q] BIBFILES...') print('-q suppresses most output') (options, files) = getopt.getopt(sys.argv[1:], 's:o:hq', []) output = 'bib.itexi' style = 'long' show_output = True for (o, a) in options: if o == '-h' or o == '--help': usage() sys.exit(0) elif o == '-s' or o == '--style': style = a elif o == '-o' or o == '--output': output = a elif o == '-q': show_output = False else: raise Exception('unknown option: %s' % o) if not files: usage() sys.exit(2) marker = """@c This file was autogenerated @c from: %s @c by: %s """ % (", ".join(files), sys.argv[0]) def strip_extension(f, ext): (p, e) = os.path.splitext(f) if e == ext: e = '' return p + e nf = [] for f in files: nf.append(strip_extension(f, '.bib')) files = ','.join(nf) tmpfile = tempfile.mkstemp('bib2texi')[1] # This writes a .aux file to the temporary directory. # The .aux file contains the commands for bibtex # PEH changed the bibstyle to allow a single template file in the parent directory # The template filename is texi-*.bst, where * defaults to 'long' but can be a parameter open(tmpfile + '.aux', 'w', encoding='utf8').write(r''' \relax \citation{*} \bibstyle{%(style)s} \bibdata{%(files)s}''' % vars()) tmpdir = tempfile.gettempdir() if show_output: quiet_flag = '' else: quiet_flag = ' -terse ' # The command line to invoke bibtex cmd = "TEXMFOUTPUT=%s bibtex %s %s" % (tmpdir, quiet_flag, tmpfile) if show_output: sys.stdout.write("Running bibtex on %s\n" % files) sys.stdout.write(cmd) # And invoke it stat = os.system(cmd) if stat != 0: sys.stderr.write("Bibtex exited with nonzero exit status!") sys.exit(1) # TODO: do tex -> itexi on output # Following lines copy tmpfile.bbl to the desired output file bbl = codecs.open(tmpfile + '.bbl', 'r', 'utf-8').read() if bbl.strip() == '': sys.stderr.write("Bibtex generated an empty file!") sys.exit(1) fout = codecs.open(output, 'w', 'utf-8') fout.write(marker) fout.write(bbl) fout.close() def cleanup(tmpfile): for a in ['aux', 'bbl', 'blg']: os.unlink(tmpfile + '.' + a) cleanup(tmpfile) # Following line added by PEH - script was leaving a dangling temporary file with no extension os.unlink(tmpfile)