k-l-lambda's picture
added node-addon-lilypond
f65fe85
# 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)