Source code for protokolo.replace

# SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER <carmen@carmenbianca.eu>
#
# SPDX-License-Identifier: EUPL-1.2+

"""Code to find-and-insert in CHANGELOG."""

# TODO: This code should probably be refactored to not rely on line count, but
# on character count.


[docs] def insert_into_str(text: str, target: str, lineno: int) -> str: """Insert *text* into *target* after *lineno*. *lineno* is 1-indexed. *lineno* 0 means inserting at the very start of *target*. A newline is automatically inserted after *text* if one is missing. """ target_lines = target.splitlines(keepends=True) text_lines = [*text.splitlines(keepends=True)] # If the inserted text does not end with a newline, add one. if text_lines and not text_lines[-1].endswith("\n"): text_lines.append("\n") # Corner case for when inserting at the end, but the last character is not a # newline. if ( lineno == len(target_lines) and target_lines and not target_lines[-1].endswith("\n") ): text_lines.insert(0, "\n") new_lines = target_lines[:lineno] + text_lines + target_lines[lineno:] return "".join(new_lines)
[docs] def find_first_occurrence(text: str, source: str) -> int | None: """Return the line number (1-indexed) of the first occurrence of *text* in *source*. Return :const:`None` if no occurrence was found. """ for lineno, line in enumerate(source.splitlines(), 1): if text in line: return lineno return None