diff --git a/pubs/bibstruct.py b/pubs/bibstruct.py index cd2528f..9832164 100644 --- a/pubs/bibstruct.py +++ b/pubs/bibstruct.py @@ -12,8 +12,9 @@ TYPE_KEY = 'type' CONTROL_CHARS = ''.join(map(uchr, list(range(0, 32)) + list(range(127, 160)))) CITEKEY_FORBIDDEN_CHARS = '@\'\\,#}{~%/ ' # '/' is OK for bibtex but forbidden # here since we transform citekeys into filenames -CITEKEY_EXCLUDE_RE = re.compile('[%s]' - % re.escape(CONTROL_CHARS + CITEKEY_FORBIDDEN_CHARS)) +CITEKEY_EXCLUDE_RE = re.compile( + '[%s]' % re.escape(CONTROL_CHARS + CITEKEY_FORBIDDEN_CHARS)) + def str2citekey(s): key = unicodedata.normalize('NFKD', ustr(s)).encode('ascii', 'ignore').decode() @@ -21,6 +22,7 @@ def str2citekey(s): # Normalize chars and remove non-ascii return key + def check_citekey(citekey): if citekey is None or not citekey.strip(): raise ValueError(u"Empty citekeys are not valid") @@ -30,25 +32,30 @@ def check_citekey(citekey): u"utf-8 citekeys are not supported yet.\n" u"See https://github.com/pubs/pubs/issues/28 for details.") + def verify_bibdata(bibdata): if bibdata is None or len(bibdata) == 0: raise ValueError(u"no valid bibdata") if len(bibdata) > 1: raise ValueError(u"ambiguous: multiple entries in the bibdata.") + def get_entry(bibdata): verify_bibdata(bibdata) for e in bibdata.items(): return e + def extract_citekey(bibdata): citekey, entry = get_entry(bibdata) return citekey + def author_last(author_str): """ Return the last name of the author """ return author_str.split(',')[0] + def generate_citekey(bibdata): """ Generate a citekey from bib_data. @@ -62,7 +69,7 @@ def generate_citekey(bibdata): first_author = entry[author_key][0] except KeyError: raise ValueError( - u"No author or editor defined: cannot generate a citekey.") + u"No author or editor defined: cannot generate a citekey.") try: year = entry['year'] except KeyError: @@ -71,6 +78,7 @@ def generate_citekey(bibdata): return str2citekey(citekey) + def extract_docfile(bibdata, remove=False): """ Try extracting document file from bib data. Returns None if not found.