# -*- coding: utf-8 -*- """명칭 폴더마다 _index.md 생성 — 폴더 내 모든 md를 분류·링크한 개별 리스트. 법률/행정규칙/표준시방서/<명칭>/ 하위의 본문·별표·첨부·압축해제·KCS md를 전부 링크. 최상위 `0. 참조 법령·기준 목록.md` 의 명칭이 이 _index.md 로 연결된다(gen_md). """ import re, sys from pathlib import Path ROOT = Path(__file__).resolve().parent.parent CATS = ["법률", "행정규칙", "표준시방서"] SKIP = {"_index.md", "_목록.md"} def rel(p, base): return p.relative_to(base).as_posix() def build(folder): name = folder.name lines = [f"# {name} — 문서 목록", ""] # 1) 본문(명칭 폴더 바로 아래 md) top = sorted([p for p in folder.glob("*.md") if p.name not in SKIP]) if top: lines.append("## 본문") lines.append("") for p in top: label = {"_meta": "메타정보", "CHANGELOG": "변경이력"}.get(p.stem, p.stem.replace("_", " ")) lines.append(f"- [{label}](<{p.name}>)") lines.append("") # 2) 별표·서식 byl = sorted((folder / "별표").glob("*.md")) if (folder / "별표").is_dir() else [] byl = [p for p in byl if p.name not in SKIP] if byl: lines.append(f"## 별표·서식 ({len(byl)})") lines.append("") for p in byl: lines.append(f"- [{p.stem}](<별표/{p.name}>)") lines.append("") # 3) 첨부 본문 att = sorted((folder / "첨부").glob("*.md")) if (folder / "첨부").is_dir() else [] att = [p for p in att if p.name not in SKIP] if att: lines.append(f"## 첨부 ({len(att)})") lines.append("") for p in att: lines.append(f"- [{p.stem}](<첨부/{p.name}>)") lines.append("") # 4) 첨부 압축해제([압축] …) zdirs = sorted((folder / "첨부").glob("[[]압축[]]*")) if (folder / "첨부").is_dir() else [] for zd in zdirs: zmds = sorted(p for p in zd.rglob("*.md") if p.name not in SKIP) if not zmds: continue title = zd.name.replace("[압축]", "").strip() lines.append(f"## 압축해제 「{title}」 ({len(zmds)})") lines.append("") idx = zd / "_목록.md" if idx.exists(): lines.append(f"- [📑 전체 목록](<첨부/{zd.name}/_목록.md>)") # 하위 폴더별 그룹 tree = {} for p in zmds: r = p.relative_to(zd) grp = "/".join(r.parts[:-1]) tree.setdefault(grp, []).append(p) for grp in sorted(tree): if grp: lines.append(f" - **{grp}**") for p in tree[grp]: lines.append(f" - [{p.stem}](<첨부/{zd.name}/{p.relative_to(zd).as_posix()}>)") else: for p in tree[grp]: lines.append(f" - [{p.stem}](<첨부/{zd.name}/{p.name}>)") lines.append("") # 5) KCS 본문 kcs = sorted((folder / "KCS").glob("*.md")) if (folder / "KCS").is_dir() else [] kcs = [p for p in kcs if p.name not in SKIP] if kcs: lines.append(f"## KCS 본문 ({len(kcs)})") lines.append("") for p in kcs: lines.append(f"- [{p.stem}]()") lines.append("") total = len(top) + len(byl) + len(att) + len(kcs) + sum( len([p for p in zd.rglob("*.md") if p.name not in SKIP]) for zd in zdirs) lines.insert(1, f"> 총 {total}건 (본문 {len(top)} · 별표 {len(byl)} · 첨부 {len(att)} · 압축 {total-len(top)-len(byl)-len(att)-len(kcs)} · KCS {len(kcs)})") (folder / "_index.md").write_text("\n".join(lines).rstrip() + "\n", encoding="utf-8") return total if __name__ == "__main__": n = 0 for cat in CATS: base = ROOT / cat if not base.is_dir(): continue for folder in sorted(base.iterdir()): if folder.is_dir(): c = build(folder) n += 1 print(f"명칭 폴더 _index.md {n}개 생성")