From b0a3a31d5caaeafb63ff415fc9b86b537b759f21 Mon Sep 17 00:00:00 2001 From: Thibaut Horel Date: Thu, 4 Feb 2016 21:15:50 -0500 Subject: Remove redundant entry list --- BibTeX.py | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) (limited to 'BibTeX.py') 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() -- cgit v1.2.3-70-g09d2