-
Notifications
You must be signed in to change notification settings - Fork 3
/
bibliography.py
101 lines (79 loc) · 3.14 KB
/
bibliography.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# Copyright © 2019 Alexander L. Hayes
# MIT License
class Bibliography:
"""
A Bibliography is a collection of References.
:arg references: A list of `reference.Reference` objects.
:arg _verbose: Print status messages.
"""
def __init__(self, references, verbose=False):
self.references = references
self._verbose = verbose
# Private internal data structures.
self._references_by_year = sorted(
self.references, key=(lambda r: r.year), reverse=True
)
self._build_topics_dictionary(references)
def _build_topics_dictionary(self, references):
_topics = dict()
for paper in references:
if _topics.get(paper.note):
_topics[paper.note].append(paper)
else:
_topics[paper.note] = [paper]
self._topics = _topics
def create_toc_papers_by_year(self):
"""
Create "Contents" entries for each year found in `self.references`
:return: A string representing the README contents for papers.
"""
_toc_by_year = ""
_years = set()
for entry in self._references_by_year:
_years.add(entry.year)
_years = sorted(list(_years), reverse=True)
for entry in _years[:-1]:
_toc_by_year += " - [{0}](#{0})\n".format(entry)
_toc_by_year += " - [{0}](#{0})".format(_years[-1])
return _toc_by_year
def create_papers_by_year_list(self):
"""
Create the "Papers by Year" section by sorting `self.references` by
year.
:return: A string representing the "Papers by Year" section.
"""
_papers_by_year = self._references_by_year
_papers_by_year_str = ""
_previous_year = 0
for paper in _papers_by_year:
if paper.year != _previous_year:
_papers_by_year_str += "\n### {0}\n\n".format(paper.year)
_papers_by_year_str += "- {0}\n".format(paper)
_previous_year = paper.year
else:
_papers_by_year_str += "- {0}\n".format(paper)
return _papers_by_year_str
def create_toc_topics(self):
"""
Create "Contents" entries for each topic in `self._topics`
:return: A string representing the "Contents" section for topics.
"""
_topics_toc_str = ""
_topic_keys = list(self._topics.keys())
for entry in _topic_keys[:-1]:
_topics_toc_str += " - [{0}](#{0})\n".format(entry.lower())
_topics_toc_str += " - [{0}](#{0})".format(_topic_keys[-1].lower())
return _topics_toc_str
def create_topics_list(self):
"""
Create "Papers by Topic" section by sorting `self.references` and
grouping by topic.
:return: A string representing the "Papers by Topic" section.
"""
_topics_str = ""
_topic_keys = list(self._topics.keys())
for key in _topic_keys:
_topics_str += "\n### {0}\n\n".format(key.lower())
for entry in self._topics[key]:
_topics_str += "- {0}\n".format(entry)
return _topics_str