from src.application.text.helper import ( extract_starts_ends, filter_indices, ) def color_text( text: str, colored_idx: list[dict], highlighted_idx: list[int], ) -> str: """ Colors specific words in a text based on provided indices. 1. splits the text into words 2. filters the indices 3. wraps the words within the specified ranges with a coloring tag Args: text (str): The input text. colored_idx (list): A list of dictionaries, where each dictionary contains 'start' and 'end' keys representing indices of words to color. highlighted_idx (list): A list of indices to exclude from coloring. Returns: str: The text with colored words. """ sentence = "" words = text.split() # Extract start and end indices from colored_idx. starts, ends = extract_starts_ends(colored_idx) # Filter the start and end indices to exclude highlighted_idx. starts, ends = filter_indices(starts, ends, highlighted_idx) previous_end = 0 for start, end in zip(starts, ends): # Add the words before the current colored range to the sentence. sentence += " ".join(words[previous_end:start]) # Add the colored range to the sentence. equal_words = " ".join(words[start:end]) sentence += f" {equal_words} " # Update the previous end index. previous_end = end # Add the remaining words after the last colored range to the sentence. sentence += " ".join(words[previous_end:]) return sentence def format_entity_count(entity_count: int) -> str: """ Generates a text description based on the number of altered entities. Args: entity_count (int): The number of altered entities. Returns: str: A text description of the entity count. - "" if entity_count is 0 or negative. - "with 1 altered entity" if entity_count is 1. - "with altered entities" if entity_count is greater than 1. """ if entity_count <= 0: entity_count_text = "" elif entity_count == 1: entity_count_text = "with 1 altered entity" else: entity_count_text = "with altered entities" return entity_count_text