Source code for bibpy.lexers.namelist_lexer
# -*- coding: utf-8 -*-
"""Lexer for splitting names on zero brace-level 'and'."""
from bibpy.lexers.base_lexer import BaseLexer
[docs]class NamelistLexer(BaseLexer):
"""Lexer for splitting names on zero brace-level 'and'."""
def __init__(self):
"""Initialise the lexer."""
super().__init__()
self.reset('')
self.mode = 'normal'
self._modes = {
'normal': self.lex_namelist,
}
self._compile_regexes([
('braces', (r'{|}', None)),
('delimiter', (r'\band\b', None))
])
[docs] def reset(self, string):
"""Reset the internal state of the lexer."""
super().reset(string)
[docs] def lex_namelist(self):
"""Lex a list of names, preserving braces for later name parsing."""
content = ''
while True:
for before, token in self.scan():
value = token and token.value or None
if value == '{':
self.brace_level += 1
content += before + value
elif value == '}':
self.brace_level -= 1
if self.brace_level < 0:
self.raise_unbalanced()
content += before + value
elif value == 'and':
content = (content + before).strip()
if content:
yield content
content = ''
else:
all_content = (content + before).strip()
if all_content:
yield all_content
if token is None:
return