Первый запуск

This commit is contained in:
KuzarinM
2026-05-02 18:33:38 +03:00
commit cb55eaef01
51 changed files with 2127373 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
from dataclasses import dataclass
from Generator.Models.Literal import Literal
from Generator.Models.RenderResult import RenderResult
@dataclass
class ConstLiteral(Literal):
text: str
def render(self, chanse: float = 1) -> RenderResult:
return RenderResult(self.text, [])
def structure(self) -> RenderResult:
return self.render()

View File

@@ -0,0 +1,12 @@
from dataclasses import dataclass
from Generator.Models.RenderResult import RenderResult
@dataclass
class Literal:
def render(self, chanse: float = 1) -> RenderResult:
return RenderResult("", [])
def structure(self) -> RenderResult:
return RenderResult("", [])

View File

@@ -0,0 +1,8 @@
from dataclasses import dataclass
from typing import List, Tuple
@dataclass
class RenderResult:
text: str
spans: List[Tuple[int, int, str]]

53
Generator/Models/Term.py Normal file
View File

@@ -0,0 +1,53 @@
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)

View File

@@ -0,0 +1,45 @@
import random
from dataclasses import dataclass
from Generator.Enums.RandomType import RandomType
from Generator.Models.Literal import Literal
from Generator.Models.RenderResult import RenderResult
from Generator.UniversalRandomizer import UniversalRandomizer
@dataclass
class VariableLiteral(Literal):
name: str
type: RandomType
prefix: str = ""
postfix: str = ""
last_value: str | None = None
def render(self, chanse: float = 1) -> RenderResult:
if self.last_value is None or random.random() <= chanse:
# Генерируем значение
val = str(UniversalRandomizer().get_random(self.type))
self.last_value = val
else:
val = self.last_value
# Формируем строку: префикс + значение + постфикс
full_text = f"{self.prefix}{val}{self.postfix}"
# Вычисляем координаты ЧИСТОГО значения (без префикса)
start = len(self.prefix)
end = start + len(val)
return RenderResult(full_text, [(start, end, self.type.name)])
def structure(self) -> RenderResult:
val = f"<{self.type.name}>"
# Формируем строку: префикс + значение + постфикс
full_text = f"{self.prefix}{val}{self.postfix}"
# Вычисляем координаты ЧИСТОГО значения (без префикса)
start = len(self.prefix)
end = start + len(val)
return RenderResult(full_text, [(start, end, self.type.name)])