-
Notifications
You must be signed in to change notification settings - Fork 5
/
format_bibliography.py
93 lines (77 loc) · 2.75 KB
/
format_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
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Formats the bibliography as a markdown file for inclusion in the repo.
Usage: python format_bibtex.py <INPUT_FILE >OUTPUT_FILE
"""
import re
import sys
bibtex = []
entry = {}
for line in sys.stdin:
if not line.strip():
continue
m = re.match(r'@\S+{(.*),$', line)
if m:
entry['citekey'] = m.group(1)
continue
if line.strip() == '}':
bibtex.append(entry)
entry = {}
continue
m = re.match(r'\s*(\S+)\s*=\s*{(.*)},?$', line)
if m:
entry[m.group(1)] = m.group(2)
continue
print('WARNING: Unknown bibtex: ' + line)
for b in bibtex:
for kv in b['annote'].split(';'):
e = kv.split('=')
b[e[0]] = e[1].split(',')
def print_category(entries, level):
"""Recursively prints categories and entries."""
categories = set([b['CATEGORY'][level] for b in entries])
for c in sorted(categories):
print('%s %s\n' % ('#' * (level+2), c))
subentries = [b for b in entries if b['CATEGORY'][level] == c]
for se in subentries:
if len(se['CATEGORY']) > level + 1:
print_category(subentries, level+1)
break
else:
if not 'booktitle' in se:
if 'archivePrefix' in se and 'eprint' in se:
se['booktitle'] = '%s:%s' % (se['archivePrefix'], se['eprint'])
if 'journal' in se and 'volume' in se and 'number' in se:
se['booktitle'] = '%s, %s(%s)' % (se['journal'], se['volume'], se['number'])
print('* **%s**, %s, *%s*\n' %
(se['title'], se['author'], se['booktitle']))
print(' * Taxonomy Category: %s\n' % ', '.join(se['TYPE']))
print(' * ML Strategies: %s\n' % ', '.join(se['STRATEGIES']))
print('# ML for Systems Bibliography\n')
print('''This file contains a formatted version of the ML for Systems
bibliography associated with the article "A Taxonomy of ML for Systems Problems"
in IEEE Micro. For the full annotated bibliography in bibtex format, see
`bibliography.bib`. To cite, please use:\n''')
print('```')
print('''@article{maas2020_ml_taxonomy,
author={Martin Maas},
journal={IEEE Micro},
title={A Taxonomy of ML for Systems Problems},
year={2020},
volume={40},
number={5},
pages={8-16},
}''')
print('```\n')
print_category(bibtex, 0)