-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbibtex_import_server.py
106 lines (80 loc) · 3.02 KB
/
bibtex_import_server.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
102
103
104
from pybtex.database.input import bibtex as bib_in
from pybtex.database.output import bibtex as bib_out
from optparse import OptionParser
from web.models import Reference, ReferenceColumn, ReferenceAttribute, ReferenceAuthor
import StringIO
def generate_nonduplicate_key(ref_key):
rk = ref_key + str(1)
i = 1
while True:
try:
Reference.objects.get(rk)
except:
return rk
else:
i += 1
rk = ref_key + str(i)
def get_ref(ref_key, bibtex):
try:
existing = Reference.objects.get(entry_key=ref_key)
except:
ref_key = generate_nonduplicate_key(ref_key)
ref = Reference(entry_key=ref_key, bibtex=bibtex)
ref.save()
return ref
def get_column(column_name):
col = None
try:
col = ReferenceColumn.objects.get(name=column_name)
except:
col = ReferenceColumn(name=column_name)
col.save()
return col
def bibtex_import(filename):
parser = bib_in.Parser()
bib_data = parser.parse_file(filename)
writer = bib_out.Writer(encoding='ascii')
for key in bib_data.entries.keys():
print 'Key ' + key
stream = StringIO.StringIO()
writer.write_entry(key, bib_data.entries[key], stream)
ref_obj = get_ref(key, stream.getvalue())
ref_obj.save()
for field in bib_data.entries[key].fields:
value = bib_data.entries[key].fields[field]
col = get_column(field)
if 'title' in field.lower():
ref_obj.title = value
elif 'journal' in field.lower():
ref_obj.journal = value
elif 'year' in field.lower():
ref_obj.year = int(value)
attr = ReferenceAttribute(column=col, value=value)
attr.save()
ref_obj.referenceAttributes.add(attr)
if bib_data.entries[key].persons:
for person in bib_data.entries[key].persons['author']:
first = person.get_part_as_text('first')
middle = person.get_part_as_text('middle')
prelast = person.get_part_as_text('prelast')
last = person.get_part_as_text('last')
lineage = person.get_part_as_text('lineage')
auth = ReferenceAuthor(first_name=first,
middle_name=middle,
prelast_name=prelast,
last_name=last,
lineage=lineage)
auth.save()
ref_obj.authors.add(auth)
ref_obj.save()
print "Imported %i BibTeX references." % len(bib_data.entries)
if __name__ == "__main__":
parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
help="input filename", metavar="FILE")
(options, args) = parser.parse_args()
try:
f = open(options.filename)
except:
print "Couldn't open BibTeX file."
bibtex_import(str(options.filename))