from dataclasses import dataclass from typing import List from Generator.Models.ConstLiteral import ConstLiteral from Generator.Models.Literal import Literal from Generator.Models.RenderResult import RenderResult from Generator.Models.VariableLiteral import VariableLiteral @dataclass class Term: literals: List[Literal] separator: str = " " def render(self, chanse: float = 1) -> RenderResult: final_text = "" final_spans = [] for i, literal in enumerate(self.literals): res = literal.render(chanse) current_offset = len(final_text) final_text += res.text # Сдвигаем координаты с учетом позиции слова в строке for (start, end, label) in res.spans: final_spans.append((current_offset + start, current_offset + end, label)) # Добавляем разделитель, если это не последнее слово if i < len(self.literals) - 1: final_text += self.separator return RenderResult(final_text, final_spans) def structure(self) -> RenderResult: final_text = "" final_spans = [] for i, literal in enumerate(self.literals): res = literal.structure() current_offset = len(final_text) final_text += res.text # Сдвигаем координаты с учетом позиции слова в строке for (start, end, label) in res.spans: final_spans.append((current_offset + start, current_offset + end, label)) # Добавляем разделитель, если это не последнее слово if i < len(self.literals) - 1: final_text += self.separator return RenderResult(final_text, final_spans)