mirror of
https://github.com/TeachBooks/manual.git
synced 2026-11-12 22:35:51 +00:00
67 lines
2.1 KiB
Python
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))
|