| | |
| |
|
| | """ |
| | Извлечение команд из JSON или размеченного текста. |
| | Поддерживает следующие варианты: |
| | - Явно размеченные JSON-блоки (```json ... ```) |
| | - Префиксные команды (например, !shell, !graph) |
| | """ |
| |
|
| | import json |
| | import re |
| | from typing import List, Optional, Dict, Any |
| |
|
| |
|
| | COMMAND_PREFIXES = ["shell", "graph", "diary", "note"] |
| |
|
| |
|
| | class ParsedCommand: |
| | def __init__(self, command_type: str, payload: Any): |
| | self.command_type = command_type |
| | self.payload = payload |
| |
|
| | def __repr__(self): |
| | return f"<ParsedCommand {self.command_type}: {repr(self.payload)}>" |
| |
|
| |
|
| | def parse_commands(text: str) -> List[ParsedCommand]: |
| | """Основной интерфейс: принимает текст, возвращает список ParsedCommand.""" |
| | commands = [] |
| |
|
| | |
| | for match in re.finditer(r"```json\n(.*?)```", text, re.DOTALL): |
| | block = match.group(1).strip() |
| | try: |
| | data = json.loads(block) |
| | if isinstance(data, dict) and "type" in data: |
| | commands.append(ParsedCommand(data["type"], data.get("payload"))) |
| | except json.JSONDecodeError: |
| | continue |
| |
|
| | |
| | for line in text.splitlines(): |
| | for prefix in COMMAND_PREFIXES: |
| | if line.strip().startswith(f"!{prefix}"): |
| | payload = line.strip()[len(f"!{prefix}"):].strip() |
| | commands.append(ParsedCommand(prefix, payload)) |
| |
|
| | return commands |
| |
|
| |
|
| | if __name__ == "__main__": |
| | sample = """ |
| | Вот пример команды: |
| | ```json |
| | { |
| | "type": "shell", |
| | "payload": "ls -la" |
| | } |
| | ``` |
| | А вот другая: !note Надо не забыть включить свет |
| | """ |
| | cmds = parse_commands(sample) |
| | for c in cmds: |
| | print(c) |
| |
|