You've already forked HeurAMS-legacy
117 lines
3.4 KiB
Python
117 lines
3.4 KiB
Python
from textual.reactive import reactive
|
|
from textual.widgets import (
|
|
Markdown,
|
|
Label,
|
|
Static,
|
|
Button,
|
|
)
|
|
from textual.containers import Center
|
|
from textual.widget import Widget
|
|
from typing import Dict
|
|
import heurams.kernel.particles as pt
|
|
import re
|
|
from .base_puzzle_widget import BasePuzzleWidget
|
|
from typing import TypedDict, List
|
|
from textual.message import Message
|
|
from heurams.services.logger import get_logger
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
class RecognitionConfig(TypedDict):
|
|
__origin__: str
|
|
__hint__: str
|
|
primary: str
|
|
secondary: List[str]
|
|
top_dim: List[str]
|
|
|
|
|
|
class Recognition(BasePuzzleWidget):
|
|
def __init__(
|
|
self,
|
|
*children: Widget,
|
|
atom: pt.Atom,
|
|
alia: str = "",
|
|
name: str | None = None,
|
|
id: str | None = None,
|
|
classes: str | None = None,
|
|
disabled: bool = False,
|
|
markup: bool = True,
|
|
) -> None:
|
|
super().__init__(
|
|
*children,
|
|
atom=atom,
|
|
name=name,
|
|
id=id,
|
|
classes=classes,
|
|
disabled=disabled,
|
|
markup=markup,
|
|
)
|
|
if alia == "":
|
|
alia = "Recognition"
|
|
self.alia = alia
|
|
|
|
def compose(self):
|
|
cfg: RecognitionConfig = self.atom.registry["orbital"]["puzzles"][self.alia]
|
|
delim = self.atom.registry["nucleon"].metadata["formation"]["delimiter"]
|
|
replace_dict = {
|
|
", ": ",",
|
|
". ": ".",
|
|
"; ": ";",
|
|
": ": ":",
|
|
f"{delim},": ",",
|
|
f".{delim}": ".",
|
|
f"{delim};": ";",
|
|
f";{delim}": ";",
|
|
f":{delim}": ":",
|
|
}
|
|
|
|
nucleon = self.atom.registry["nucleon"]
|
|
metadata = self.atom.registry["nucleon"].metadata
|
|
primary = cfg["primary"]
|
|
|
|
with Center():
|
|
yield Static(f"[dim]{cfg['top_dim']}[/]")
|
|
yield Label("")
|
|
|
|
for old, new in replace_dict.items():
|
|
primary = primary.replace(old, new)
|
|
primary_splited = re.split(r"(?<=[,;:|])", cfg["primary"])
|
|
for item in primary_splited:
|
|
with Center():
|
|
yield Label(
|
|
f"[b][b]{item.replace(delim, ' ')}[/][/]",
|
|
id="sentence" + str(hash(item)),
|
|
)
|
|
|
|
for item in cfg["secondary"]:
|
|
if isinstance(item, list):
|
|
for j in item:
|
|
yield Markdown(f"### {metadata['annotation'][item]}: {j}")
|
|
continue
|
|
if isinstance(item, Dict):
|
|
total = ""
|
|
for j, k in item.items(): # type: ignore
|
|
total += f"> **{j}**: {k} \n"
|
|
yield Markdown(total)
|
|
if isinstance(item, str):
|
|
yield Markdown(item)
|
|
|
|
with Center():
|
|
yield Button("我已知晓", id="ok")
|
|
|
|
def on_button_pressed(self, event: Button.Pressed) -> None:
|
|
if event.button.id == "ok":
|
|
self.screen.rating = 5 # type: ignore
|
|
self.handler(5)
|
|
|
|
def handler(self, rating):
|
|
if not self.atom.registry["runtime"]["locked"]:
|
|
if not self.atom.registry["electron"].is_activated():
|
|
self.atom.registry["electron"].activate()
|
|
logger.debug(f"激活原子 {self.atom}")
|
|
self.atom.lock(1)
|
|
self.atom.minimize(5)
|
|
else:
|
|
pass
|