def iterentries(filename, encoding=None): encoding = encoding or 'utf8' with memorymapped(str(filename)) as source: try: for entrytype, (bibkey, fields) in iterentries_from_text(source, encoding): yield entrytype, (bibkey, fields) except PybtexSyntaxError as e: # pragma: no cover debug_pybtex(source, e)
def __getitem__(self, item): if item.startswith(self.id + ':'): item = item.split(':', 1)[1] text = None with memorymapped(self.fname) as string: m = re.search(b'@[A-Za-z]+\{' + re.escape(item.encode('utf8')), string) if m: next = string.find(b'\n@', m.end()) if next >= 0: text = string[m.start():next] else: text = string[m.start():] if text: for k, (t, f) in _bibtex.iterentries_from_text(text, encoding=self.encoding): return Entry(k, t, f, self) raise KeyError(item)
def __getitem__(self, item: str) -> 'Entry': """ :param item: BibTeX citation key of an entry :raises KeyError: if no matching `Entry` is contained in the `BibFile` """ if item.startswith(self.id + ':'): item = item.split(':', 1)[1] text = None with memorymapped(self.fname) as string: m = re.search( b'@[A-Za-z]+{' + re.escape(item.encode(self.encoding)) + rb'[\s,]', string) if m: next = string.find(b'\n@', m.end()) if next >= 0: text = string[m.start():next] else: text = string[m.start():] if text: for k, (t, f) in bibtex.iterentries_from_text(text, encoding=self.encoding): return Entry(k, t, f, self, self.api) raise KeyError(item)
def test_memorymapped(tmppath): p = make_file(tmppath, text='äöü', encoding='utf-8') with memorymapped(p) as b: assert b.find('ö'.encode('utf-8')) == 2