aboutsummaryrefslogtreecommitdiffstats
path: root/BibTeX.py
diff options
context:
space:
mode:
Diffstat (limited to 'BibTeX.py')
-rw-r--r--BibTeX.py36
1 files changed, 15 insertions, 21 deletions
diff --git a/BibTeX.py b/BibTeX.py
index 1fe4c94..e07fe63 100644
--- a/BibTeX.py
+++ b/BibTeX.py
@@ -25,26 +25,24 @@ class ParseError(Exception):
class BibTeX:
"""A parsed BibTeX file"""
def __init__(self):
- self.entries = [] # List of BibTeXEntry
- self.byKey = {} # Map from BibTeX key to BibTeX entry.
+ self.entries = {}
def addEntry(self, ent):
"""Add a BibTeX entry to this file."""
k = ent.key
- if self.byKey.get(ent.key.lower()):
+ if k.lower() in self.entries:
print >> sys.stderr, "Already have an entry named %s" % k
return
- self.entries.append(ent)
- self.byKey[ent.key.lower()] = ent
+ self.entries[k.lower()] = ent
def resolve(self):
"""Validate all entries in this file, and resolve cross-references"""
seen = {}
- for ent in self.entries:
+ for ent in self.entries.values():
seen.clear()
while ent.get('crossref'):
try:
- cr = self.byKey[ent['crossref'].lower()]
+ cr = self.entries[ent['crossref'].lower()]
except KeyError:
print "No such crossref: %s" % ent['crossref']
break
@@ -64,20 +62,16 @@ class BibTeX:
ent.entries[k] = cr.entries[k]
ent.resolve()
- newEntries = []
rk = config.REQUIRE_KEY
if rk is None:
# hack: if no key is required, require "title", since every
# entry will have a title.
rk = "title"
- for ent in self.entries:
+ for ent in self.entries.values():
if ent.type in config.OMIT_ENTRIES or not ent.has_key(rk):
ent.check()
- del self.byKey[ent.key.lower()]
- else:
- newEntries.append(ent)
- self.entries = newEntries
+ del self.entries[ent.key.lower()]
class FileIter:
@@ -117,6 +111,7 @@ BRACE_CLOSE_RE = re.compile(r'^([^\{\}]*)\}(.*)')
BRACE_OPEN_RE = re.compile(r'^([^\{\}]*\{)(.*)')
RAW_DATA_RE = re.compile(r'^([^\s\},]+)(.*)')
+
class Parser:
"""Parser class: reads BibTeX from a file and returns a BibTeX object."""
# Fields
@@ -136,7 +131,7 @@ class Parser:
self.newStrings = {}
self.invStrings = {}
for k, v in config.INITIAL_STRINGS.items():
- self.invStrings[v]=k
+ self.invStrings[v] = k
self.fileiter = fileiter
if result is None:
result = BibTeX()
@@ -326,8 +321,7 @@ class Parser:
self.litStringLine)
elif self.entryLine:
raise ParseError("Unexpected EOF at line %s (entry started "
- "on %s)" % (self.fileiter.lineno,
- self.entryLine))
+ "on %s)" % (self.lineno, self.entryLine))
self.result.invStrings = self.invStrings
self.result.newStrings = self.newStrings
@@ -336,7 +330,7 @@ class Parser:
def _parse(self):
line = self.fileiter.next()
- while 1:
+ while True:
# Skip blank lines.
while not line or line.isspace() or OUTER_COMMENT_RE.match(line):
line = self.fileiter.next()
@@ -349,7 +343,7 @@ class Parser:
self.entryLine = 0
else:
raise ParseError("Bad input at line %s (expected a new entry.)"
- % self.fileiter.lineno)
+ % self.lineno)
def parseFile(filename, result=None):
@@ -358,7 +352,7 @@ def parseFile(filename, result=None):
p = Parser(f, {}, result)
r = p.parse()
r.resolve()
- for e in r.entries:
+ for e in r.entries.values():
e.check()
return r
@@ -369,7 +363,7 @@ def parseString(string, result=None):
p = Parser(f, {}, result)
r = p.parse()
r.resolve()
- for e in r.entries:
+ for e in r.entries.values():
e.check()
return r
@@ -381,7 +375,7 @@ if __name__ == '__main__':
r = parseFile(fname)
- for e in r.entries:
+ for e in r.entries.values():
if e.type in ("proceedings", "journal"):
continue
print e.to_html()