"""Shared runtime for Hugging Face Space scoring.""" from __future__ import annotations import json import re from pathlib import Path from typing import Any, Dict, List, Mapping, MutableMapping DATA_DIR = Path(__file__).resolve().parent / "data" DATASET_PATH = DATA_DIR / "pentadrive-v1.json" I18N_PATH = DATA_DIR / "markers-i18n.json" HAS_LATIN = re.compile(r"[a-zA-Z\u00C0-\u024F]") def _load_json(path: Path) -> Dict[str, Any]: with path.open("r", encoding="utf-8") as f: return json.load(f) DATASET = _load_json(DATASET_PATH) I18N = _load_json(I18N_PATH) def match_marker(marker: str, lowered: str) -> int: m = marker.lower() if not m: return 0 if " " not in m and HAS_LATIN.search(m): escaped = re.escape(m) return len(re.findall(rf"\b{escaped}\b", lowered, re.IGNORECASE)) count = 0 start = 0 while start <= len(lowered): idx = lowered.find(m, start) if idx < 0: break count += 1 start = idx + max(1, len(m)) return count def detect_drives(text: str) -> Dict[str, Any]: lowered = (text or "").lower() by_drive: MutableMapping[str, int] = {k: 0 for k in ("S", "K", "A", "M", "G")} hits: List[Dict[str, str]] = [] phases = DATASET.get("phases") or () for node in DATASET.get("nodes") or (): drive = node.get("drive") node_phases = node.get("phases") if not drive or not isinstance(node_phases, Mapping): continue for phase in phases: phase_data = node_phases.get(phase) markers = phase_data.get("markers") if isinstance(phase_data, Mapping) else None if not isinstance(markers, list): continue for marker in markers: count = match_marker(str(marker), lowered) if count == 0: continue by_drive[str(drive)] = by_drive.get(str(drive), 0) + count hits.append( { "drive": str(drive), "node": str(node.get("node", "")), "phase": str(phase), "marker": str(marker), } ) i18n_drives = I18N.get("drives") if isinstance(i18n_drives, dict): for drive_code, langs in i18n_drives.items(): if not isinstance(langs, dict): continue for _, markers in langs.items(): if not isinstance(markers, list): continue for marker in markers: count = match_marker(str(marker), lowered) if count == 0: continue by_drive[str(drive_code)] = by_drive.get(str(drive_code), 0) + count hits.append( { "drive": str(drive_code), "node": "i18n", "phase": "all", "marker": str(marker), } ) ranked = [ {"drive": d, "score": s} for d, s in sorted(by_drive.items(), key=lambda x: (-x[1], x[0])) if s > 0 ] return {"ranked": ranked, "by_drive": dict(by_drive), "matches": hits}