manual_teachbooks/book/_ext/pybtexapastyle/labels/apa.py

67 lines
2.1 KiB
Python

# -*- coding:Utf-8 -*-
from __future__ import unicode_literals
from collections import Counter
import re
import unicodedata
from pybtex.style.labels import BaseLabelStyle
_nonalnum_pattern = re.compile('[^A-Za-z0-9 \-]+', re.UNICODE)
def _strip_accents(s):
return "".join(
(c for c in unicodedata.normalize('NFD', s)
if not unicodedata.combining(c)))
def _strip_nonalnum(parts):
"""Strip all non-alphanumerical characters from a list of strings.
>>> print(_strip_nonalnum([u"ÅA. B. Testing 12+}[.@~_", u" 3%"]))
AABTesting123
"""
s = "".join(parts)
return _nonalnum_pattern.sub("", _strip_accents(s))
class LabelStyle(BaseLabelStyle):
def format_labels(self, sorted_entries):
labels = [self.format_label(entry) for entry in sorted_entries]
count = Counter(labels)
counted = Counter()
for label in labels:
if count[label] == 1:
yield label
else:
yield label # + chr(ord('a') + counted[label])
# counted.update([label])
def format_label(self, entry):
label = "Anonymous"
if 'author' in entry.persons:
label = self.format_author_or_editor_names(entry.persons['author'])
elif 'editor' in entry.persons:
label = self.format_author_or_editor_names(entry.persons['editor'])
elif 'organization' in entry.fields:
label = entry.fields['organization']
if label.startswith("The "):
label = label[4:]
return ''
# if 'year' in entry.fields:
# return "{}, {}".format(label, entry.fields['year'])
# else:
# return "{}, n.d.".format(label)
def format_author_or_editor_names(self, persons):
if len(persons)==1:
return _strip_nonalnum(persons[0].last_names)
elif len(persons)==2:
return "{} & {}".format(
_strip_nonalnum(persons[0].last_names),
_strip_nonalnum(persons[1].last_names))
else:
return "{} et al.".format(
_strip_nonalnum(persons[0].last_names))