Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
New script: mass bibtex keyword tagger
  • Loading branch information
Klaus Thoden committed Oct 17, 2018
1 parent 70f27c9 commit 168e4b5
Showing 1 changed file with 87 additions and 0 deletions.
87 changes: 87 additions & 0 deletions 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

0 comments on commit 168e4b5

Please sign in to comment.