diff --git a/bib_add_keyword.py b/bib_add_keyword.py new file mode 100644 index 0000000..7540d55 --- /dev/null +++ b/bib_add_keyword.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8; mode: python -*- + +"""This script adds one or more keywords to all entries of a bibtex file. + +This is a feature that surprisingly no bibtex editor offers.""" + +__version__ = "1.0" +__date__ = "20181017" +__author__ = "kthoden@mpiwg-berlin.mpg.de" + +import argparse +import logging +import bibtexparser +from bibtexparser.bwriter import BibTexWriter +from bibtexparser.bibdatabase import BibDatabase + +logging.basicConfig(level=logging.INFO, format=' %(asctime)s - %(levelname)s - %(message)s') + +def add_keyword(entry, keyword): + """Add keyword to bibtex entry""" + + try: + entry_keyword = entry["keyword"] + # bibtex parser uses keyword rather than keywords, we correct this here + if entry["keyword"]: + entry["keywords"] = entry["keyword"] + entry.pop("keyword") + except KeyError as err: + print("no keyword found", err) + try: + entry_keywords = entry["keywords"] + # entry["keywords"] = args.keyword + all_keywords = [x.strip() for x in entry_keywords.split(",")] + print(all_keywords) + if keyword in all_keywords: + logging.info("Keyword %s already in.", keyword) + else: + logging.info("Adding keyword %s.", keyword) + entry["keywords"] = entry_keyword + "," + keyword + except KeyError as err: + logging.info("%s, Found no keywords, adding one.", err) + entry["keywords"] = keyword + + return entry +# def add_keyword ends here + +def main(): + """The main bit""" + + parser = argparse.ArgumentParser() + parser.add_argument("-k", "--keyword", help="Assign one or more\ + keywords. Several keyword must be separated by ',' and wrapped in\ + quotes.") + parser.add_argument("bibtexfile", help="A text file containing a formatted bibliography.") + args = parser.parse_args() + + with open(args.bibtexfile) as btf: + btb = bibtexparser.load(btf) + + bib_database = BibDatabase() + db_list = [] + + for entry in btb.entries: + new_keywords = args.keyword.split(",") + print(new_keywords) + for keywords in new_keywords: + newentry = add_keyword(entry, keywords) + + db_list.append(newentry) + + bib_database.entries = db_list + + bibfile_path = args.bibtexfile.replace(".bib", "-addedkeyword.bib") + + writer = BibTexWriter() + # indent entries with 4 spaces instead of one + writer.indent = ' ' + with open(bibfile_path, 'w') as fakebibfile: + fakebibfile.write(writer.write(bib_database)) + logging.debug("Added keywords to entries and wrote %s.", bibfile_path) +# def main ends here + + +if __name__ == '__main__': + main() +# finis