"""M02 불러오기 엑셀 보기 하이라이트 재료(PLAN 779-2 · 요구서 621 3장 5) — 읽기만(파일 · storage 변화 0). 블록 `[{번, 판정, SK, 갈래, 못옮김}]` = 단가산출 만들기 결과(`Sangeun.made`) + 맞춤셈 캐시(`Fit.result`)를 읽기만. - `판정` = 그 블록을 부르는 첫 줄의 맞춤셈 판정 상태(맞음 · 다른 점 · 후보 …) · 안 불리거나 셈 전이면 None - `SK` = 만든 SK 키 · 없으면 None / `갈래` · `못옮김` = 그 SK 본뜬(출처별) · 없으면 None · [] 줄 상태는 `Match.view` 호표마다 `줄상태 [[차례, 상태, 체크]]` · `만든`(SC 키)로 실려 감. 칠 꼴(화면 779-4 가 정함 · 상태 이름 맞춤표 — 「이어짐」 = 확인 창과 한 규칙 `체크`): | 칠 | 줄 상태 (`줄상태`) | 블록 (`판정` · `SK` · `못옮김`) | | 초록 이어짐 | 맞음 · 별칭 · 호표(`체크`) · 체크한 다른 점 | SK 있음 + 못옮김 [] (갈래 「기초」 포함) | | 주황 엑셀과 다름 | 다른 점 + `체크` | SK 있음 + 갈래 「SK」(차이) | | 파랑 고를 것 | 후보 · `체크` 아닌 다른 점 · 호표(`체크` 아님) | SK 없음 + 판정 후보 · 고름 대기 | | 빨강 못 이음 | 없음 · 노임 · (안 이은 줄 = 마법사 몫) | SK 있음 + 못옮김 남음 | | 흐림 밖 | % · 뺌 | 판정 None (안 불리는 블록) | | 띠 내가 고름 | 화면 캐시(서버 아님) | — | 최종 판정은 화면(`SheetMap`)이 이 재료 + 캐시 고름으로 내림 — 여기는 상태 이름을 그대로 실음. """ from __future__ import annotations import json from pathlib import Path from typing import Any from M02_MasterTemplete import M02_Hopyo_Fit as fit from M02_MasterTemplete import M02_Hopyo_Sangeun as sangeun from M02_MasterTemplete import M02_Hopyo_Store as hopyo_store from M02_MasterTemplete import M02_Labor_Ref as refs def _origin(to: Path, sk: str, mark: str, here: refs.Here) -> dict[str, Any]: try: doc = json.loads((to / sangeun.KIND / f"{sk}.json").read_bytes()) except (OSError, ValueError): return {} return sangeun.origin_of(doc, mark, here) def blocks(folder: Path, key: str, to: Path | None = None) -> list[dict[str, Any]]: """블록마다 `{번, 판정, SK, 갈래, 못옮김}` — `to` = 만든 SK 를 볼 층(없으면 파일 층).""" folder, to = Path(folder), Path(to or folder) hp = hopyo_store.read(folder, key) here = refs.where(folder) cache = (fit.result(folder, key) or {}).get("블록") or {} have = sangeun.made(to, key, here) all_, first = sangeun.calls(hp) out = [] for no in sorted(all_): line = first.get(no) entry = cache.get(fit.unit_key(line)) if line else None mark = sangeun.mark(key, no) sk = have.get(mark) origin = _origin(to, sk, mark, here) if sk else {} out.append( { "번": no, "판정": ((entry or {}).get("판정") or {}).get("상태"), "SK": sk, "갈래": origin.get("갈래"), "못옮김": origin.get("못옮김") or [], } ) return out