Files
Aislo/resources/knowledge/original/_pipeline/index_images.py
T
eomsangdonandClaude Opus 5 4cb9b15939 style: 저장소 전체 포맷터 일괄 적용 (prettier·biome·ruff)
파일마다 포맷 폭이 달라(≈80 대 100) 한 줄만 고쳐도 포맷터가 무관한 줄을 대량
재포맷했음. 사용자 지시로 전체를 한 번에 맞춤. 코드 동작 변경 없음 — 포맷만.

- 프론트엔드 `.ts/.css/.html` → 저장소 prettier (`.prettierrc`, printWidth 100)
- `B07_DesignDetail/openwebcad/**` → 자체 biome (tab 들여쓰기·single quote·lineWidth 100).
  `biome format` 만 사용 — `biome lint --write` 는 포맷 아닌 코드 수정까지 하므로 제외
- 파이썬 → `ruff format` (엔진 코드는 이미 정합, resources·scratch 스크립트 24개만 변경)

두 포맷터가 서로 되돌리지 않도록 `.prettierignore` 신규 — openwebcad 와 빌드·산출물
폴더를 prettier 대상에서 뺌. `.prettierrc` 에 `endOfLine: "auto"` 추가 — 기본값 `lf` 가
`core.autocrlf=true` 로 받은 CRLF 파일을 매번 전부 다시 써서 `--list-different` 가
실제 포맷 차이를 가리고 있었음.

검증: `tsc --noEmit` 통과(루트·openwebcad 둘 다), pytest 349 passed / 17 skipped /
0 failed, CAD vitest 87건 중 81 passed / 6 failed(laptop-sub 기준선과 동일, 회귀 없음).
포맷터 재실행 시 prettier·biome 모두 변경 0건.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-02 07:08:24 +09:00

108 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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}")