53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
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) |