파일마다 포맷 폭이 달라(≈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>
108 lines
3.7 KiB
Python
108 lines
3.7 KiB
Python
# -*- 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}")
|