Skip to content

bib.bibtexparser.splitter

Classes

Splitter

Splitter()

Splitter class to split standardizing bib data list to library.

Attributes:

Name Type Description
regex_block_type

Regular expression to match block type.

Source code in pybibtexer/bib/bibtexparser/splitter.py
def __init__(self):
    self.regex_block_type = re.compile(r"@([a-zA-Z]+){")

Functions

splitter
splitter(data_list, implicit_coments)

Split standardizing bib data list to library.

Source code in pybibtexer/bib/bibtexparser/splitter.py
def splitter(self, data_list: list[str], implicit_coments: list[list[str]]):
    """Split standardizing bib data list to library."""
    _blocks = []

    _blocks.extend([ImplicitComment(i[0]) for i in implicit_coments if i])

    implicit_comment_blocks = []
    explicit_comment_blocks = []
    string_blocks = []
    preamble_blocks = []
    entry_blocks = []

    # Initialize
    data_list = "".join(data_list).splitlines(keepends=True)
    data_list = [line for line in data_list if line.strip()]

    line_index, len_data = 0, len(data_list)
    while line_index < len_data:
        line = data_list[line_index]
        line_index += 1

        if not (mch_block := self.regex_block_type.search(line)):
            implicit_comment_blocks.append(ImplicitComment(line, line_index))
            continue

        block_type = mch_block.group(1)
        if block_type == "comment":
            block, line_index = self._splitter_comment(block_type, line, line_index, len_data, data_list)
            if isinstance(block, Block):
                explicit_comment_blocks.append(block)
            elif isinstance(block, str):
                implicit_comment_blocks.append(ImplicitComment(block, line_index - 1))

        elif block_type == "string":
            block, line_index = self._splitter_string(block_type, line, line_index, len_data, data_list)
            if isinstance(block, Block):
                string_blocks.append(block)
            elif isinstance(block, str):
                implicit_comment_blocks.append(ImplicitComment(block, line_index - 1))

        elif block_type == "preamble":
            block, line_index = self._splitter_preamble(block_type, line, line_index, len_data, data_list)
            if isinstance(block, Block):
                preamble_blocks.append(block)
            elif isinstance(block, str):
                implicit_comment_blocks.append(ImplicitComment(block, line_index - 1))

        else:
            block, line_index, temp = self._splitter_entry(block_type, line, line_index, len_data, data_list)
            entry_blocks.append(block)
            implicit_comment_blocks.extend(temp)

    _blocks.extend(implicit_comment_blocks)
    _blocks.extend(explicit_comment_blocks)
    _blocks.extend(string_blocks)
    _blocks.extend(preamble_blocks)
    _blocks.extend(entry_blocks)
    return Library(_blocks)