Spaces:
Sleeping
Sleeping
# bib2texi.py | |
# | |
# This file is part of LilyPond, the GNU music typesetter. | |
# | |
# Copyright (C) 2001--2020 Han-Wen Nienhuys <[email protected]> | |
# | |
# 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) | |