Spaces:
Running
Running
| # bib2texi.py | |
| # | |
| # This file is part of LilyPond, the GNU music typesetter. | |
| # | |
| # Copyright (C) 2001--2020 Han-Wen Nienhuys <hanwen@xs4all.nl> | |
| # | |
| # 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 <http://www.gnu.org/licenses/>. | |
| import codecs | |
| import os | |
| import sys | |
| import getopt | |
| import tempfile | |
| # usage: | |
| def usage(): | |
| print('usage: bib2texi.py [-s style] [-o <outfile>] [-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) | |