# -*- coding: utf-8 -*- """pic/ 이미지 164개 전건 리스트 README 생성 — 표 변환 여부 판단용. 각 이미지: 미리보기 링크 · 크기 · 형식 · 소속(명칭) · 참조 md 링크. 사용자가 표로 옮길 이미지를 직접 판단한다. """ import re from pathlib import Path from PIL import Image ROOT = Path(__file__).resolve().parent.parent OUT = ROOT / "_이미지 목록(표 변환 검토용).md" def _cand(p): try: w, h = Image.open(p).size return w >= 350 and 1.3 <= w / max(1, h) <= 6 except Exception: return False def build(): # 1) 이미지 → 참조 md 역매핑 ref = {} for m in ROOT.rglob("*.md"): if "_pipeline" in str(m): continue t = m.read_text(encoding="utf-8") # 경로에 괄호가 있어도 <...> 안이면 확장자까지 잡는다 for mm in re.finditer( r"!\[[^\]]*\]\(<([^>]+\.(?:png|jpg|jpeg|gif|bmp))>\)" r"|!\[[^\]]*\]\(([^)\s]+\.(?:png|jpg|jpeg|gif|bmp))\)", t, ): path = mm.group(1) or mm.group(2) img = (m.parent / path).resolve() ref.setdefault(str(img), []).append(m) imgs = sorted(ROOT.rglob("pic/*")) # 소속(명칭 폴더) 기준 그룹 groups = {} for p in imgs: rel = p.relative_to(ROOT) parts = rel.parts # 분류/명칭/pic/파일 또는 분류/명칭/첨부/[압축]…/pic/… cat = parts[0] name = parts[1] if len(parts) > 2 else "(기타)" groups.setdefault((cat, name), []).append(p) def row(idx, p): try: w, h = Image.open(p).size size = f"{w}×{h}" except Exception: size = "?" rel = p.relative_to(OUT.parent).as_posix() fmt = p.suffix[1:].upper() seen, uniq = set(), [] for m in ref.get(str(p.resolve()), []): if m not in seen: seen.add(m) uniq.append(m) rlinks = ( " · ".join( f"[{m.stem[:18]}](<{m.relative_to(OUT.parent).as_posix()}>)" for m in uniq[:2] ) if uniq else "_미참조_" ) return f"| ☐ | {idx} | [{p.name[:40]}](<{rel}>) | {size} | {fmt} | {rlinks} |" cand = [p for p in imgs if _cand(p)] rest = [p for p in imgs if not _cand(p)] L = [ "# 이미지 목록 — 표 변환 검토용", "", f"> pic/ 이미지 전건 **{len(imgs)}개**. 각 이미지를 열어 **표로 옮길지** `☐` 열에 체크(→ `☑`)한다.", "> 체크한 이미지를 알려주면 md 표로 옮기고 이미지는 대조용으로 병기한다.", "", f"## ★ 표 후보 (가로형 {len(cand)}개) — 우선 검토", "", "> 셀 경계가 뚜렷한 가로형. 표일 가능성 높음(단, 수식·표시·도형 섞여 있으니 실제로 열어 확인).", "", "| 반영 | # | 이미지 | 크기 | 형식 | 참조 문서 |", "|:-:|---:|---|---|---|---|", ] for i, p in enumerate(sorted(cand, key=lambda x: -Image.open(x).size[0]), 1): L.append(row(i, p)) L += [ "", f"## 그 외 이미지 ({len(rest)}개)", "", "> 대부분 로고·점·수식·표시·도형. 표 가능성 낮으나 필요시 검토.", "", "| 반영 | # | 이미지 | 크기 | 형식 | 참조 문서 |", "|:-:|---:|---|---|---|---|", ] for i, p in enumerate(sorted(rest), len(cand) + 1): L.append(row(i, p)) OUT.write_text("\n".join(L) + "\n", encoding="utf-8") return len(imgs) if __name__ == "__main__": n = build() print(f"이미지 목록 {n}개 → {OUT.name}")