| |
|
|
| """ |
| Извлечение команд из 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) |
|
|