started stripping down risk-and-reliability to create template

This commit is contained in:
Guilherme Alvarenga 2024-02-23 18:02:52 +02:00
parent 6697c0f5f8
commit 75ff95fa67
127 changed files with 54699 additions and 0 deletions

View file

@ -0,0 +1,69 @@
from __future__ import unicode_literals
from pybtex.style import FormattedEntry, FormattedBibliography
from pybtex.style.template import node, join
from pybtex.richtext import Symbol
from pybtex.plugin import Plugin, find_plugin
@node
def toplevel(children, data):
return join(sep=Symbol('newblock')) [children].format_data(data)
class BaseStyle(Plugin):
"""
The base class for pythonic formatting styles.
"""
default_name_style = None
default_label_style = None
default_sorting_style = None
def __init__(self, label_style=None, name_style=None, sorting_style=None, abbreviate_names=False, min_crossrefs=2, **kwargs):
self.name_style = find_plugin('pybtex.style.names', name_style or self.default_name_style)()
self.label_style = find_plugin('pybtex.style.labels', label_style or self.default_label_style)()
self.sorting_style = find_plugin('pybtex.style.sorting', sorting_style or self.default_sorting_style)()
self.format_name = self.name_style.format
self.format_labels = self.label_style.format_labels
self.sort = self.sorting_style.sort
self.abbreviate_names = abbreviate_names
self.min_crossrefs = min_crossrefs
def format_entries(self, entries, bib_data=None):
sorted_entries = self.sort(entries)
labels = self.format_labels(sorted_entries)
for label, entry in zip(labels, sorted_entries):
yield self.format_entry(label, entry, bib_data=bib_data)
def format_entry(self, label, entry, bib_data=None):
context = {
'entry': entry,
'style': self,
'bib_data': bib_data,
}
try:
get_template = getattr(self, 'get_{}_template'.format(entry.type))
except AttributeError:
format_method = getattr(self, "format_" + entry.type)
text = format_method(context)
else:
text = get_template(entry).format_data(context)
return FormattedEntry(entry.key, text, label)
def format_bibliography(self, bib_data, citations=None):
"""
Format bibliography entries with the given keys and return a
``FormattedBibliography`` object.
:param bib_data: A :py:class:`pybtex.database.BibliographyData` object.
:param citations: A list of citation keys.
"""
if citations is None:
citations = list(bib_data.entries.keys())
citations = bib_data.add_extra_citations(citations, self.min_crossrefs)
entries = [bib_data.entries[key] for key in citations]
formatted_entries = self.format_entries(entries)
formatted_bibliography = FormattedBibliography(formatted_entries, style=self, preamble=bib_data.preamble)
return formatted_bibliography

View file

@ -0,0 +1,12 @@
from __future__ import unicode_literals
from pybtex.plugin import Plugin
class BaseSortingStyle(Plugin):
def sorting_key(self, entry):
raise NotImplementedError
def sort(self, entries):
return sorted(entries, key=self.sorting_key)

View file

@ -0,0 +1,39 @@
from __future__ import unicode_literals
from pybtex.style.sorting import BaseSortingStyle
class SortingStyle(BaseSortingStyle):
def sorting_key(self, entry):
if entry.type in ('book', 'inbook'):
author_key = self.author_editor_key(entry)
elif 'author' in entry.persons:
author_key = self.persons_key(entry.persons['author'])
else:
author_key = ''
return (author_key, entry.fields.get('year', ''), entry.fields.get('title', ''))
def persons_key(self, persons):
return ' '.join(self.person_key(person) for person in persons)
def person_key(self, person):
if person.prelast_names[0] != '{' and person.last_names[0] != '{' and person.first_names[0] != '{':
return ' '.join((
' '.join(person.prelast_names + person.last_names),
' '.join(person.first_names + person.middle_names),
' '.join(person.lineage_names),
)).lower()
else:
return ' '.join((
' '.join(person.first_names + person.middle_names),
' '.join(person.prelast_names + person.last_names),
' '.join(person.lineage_names),
)).lower()
def author_editor_key(self, entry):
if entry.persons.get('author'):
return self.persons_key(entry.persons['author'])
elif entry.persons.get('editor'):
return self.persons_key(entry.persons['editor'])
else:
return ''