Первый запуск
This commit is contained in:
15
Generator/Models/ConstLiteral.py
Normal file
15
Generator/Models/ConstLiteral.py
Normal 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()
|
||||
12
Generator/Models/Literal.py
Normal file
12
Generator/Models/Literal.py
Normal 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("", [])
|
||||
8
Generator/Models/RenderResult.py
Normal file
8
Generator/Models/RenderResult.py
Normal 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
53
Generator/Models/Term.py
Normal 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)
|
||||
45
Generator/Models/VariableLiteral.py
Normal file
45
Generator/Models/VariableLiteral.py
Normal 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)])
|
||||
Reference in New Issue
Block a user