Source code for firedrake.scripts.firedrake_preprocess_bibtex
#!/usr/bin/env python3
import io
from argparse import ArgumentParser, RawDescriptionHelpFormatter
try:
from bibtexparser.bwriter import BibTexWriter
import bibtexparser
except ImportError:
raise ImportError("Failed to import bibtexparser. Run:\n firedrake-update --documentation-dependencies")
[docs]
def main():
parser = ArgumentParser(description="""Ensure BibTeX entries for inclusion in the Firedrake website have a
URL or DOI, and impose clean formatting.""",
formatter_class=RawDescriptionHelpFormatter)
parser.add_argument("bibtex_file", help="The BibTeX file to process")
parser.add_argument("--validate", action='store_true',
help="Instead of rewriting the bibtex file, raise an exception if anything would have changed.")
args = parser.parse_args()
filename = args.bibtex_file
parser = bibtexparser.bparser.BibTexParser()
parser.common_strings = True
parser.ignore_nonstandard_types = False
with open(filename) as bibtex_file:
bib_database = parser.parse_file(bibtex_file)
for entry in bib_database.entries:
if "url" not in entry and \
"doi" not in entry:
if entry.get("archiveprefix", None) == "arXiv":
entry["url"] = "https://arxiv.org/abs/" + entry["eprint"]
else:
raise ValueError("%s in bibliograpy %s\n has no url and no DOI.\n" % (entry["ID"], filename))
writer = BibTexWriter()
writer.indent = ' ' # indent entries with 2 spaces instead of one
writer.align_values = True
if args.validate:
with io.StringIO() as outbuffer:
outbuffer.write(writer.write(bib_database))
processed = outbuffer.getvalue()
with open(filename) as bibtex_file:
inbuffer = bibtex_file.read()
if processed != inbuffer:
raise ValueError("%s would be changed by firedrake-preprocess-bibtex. Please preprocess it and commit the result" % filename)
else:
with open(filename, 'w') as bibfile:
bibfile.write(writer.write(bib_database))
if __name__ == "__main__":
main()