# -*- coding: utf-8 -*- """법령 본문 md의 원시 태그를 pic/로 내려받아 md 이미지 참조로 교체. 법령 XML 조문·개정문에 인라인으로 박힌 수식·그림 이미지 처리. 이미지는 각 명칭 폴더의 pic/ 에 저장하고 md에서 ../pic 상대참조. """ import re, sys, time, urllib.request from pathlib import Path ROOT = Path(__file__).resolve().parent.parent UA = {"User-Agent": "Mozilla/5.0"} # src="URL" 형식과 id="flSeq" 형식(내부 이미지) 모두 처리 IMG = re.compile(r"]*?)/?>") SRC = re.compile(r'src="([^"]+)"') IID = re.compile(r'id="(\d+)"') EXT = { b"\x89PNG": ".png", b"\xff\xd8\xff": ".jpg", b"GIF8": ".gif", b"BM": ".bmp", b"II*\x00": ".tif", b"MM\x00*": ".tif", } def sniff(b): for sig, ext in EXT.items(): if b.startswith(sig): return ext return ".png" def download(url): u = url.replace("http://", "https://") for _ in range(3): try: with urllib.request.urlopen(urllib.request.Request(u, headers=UA), timeout=40) as r: b = r.read() if b and len(b) > 100: return b except Exception: time.sleep(1.5) return None def fix(md_path): """md 파일: → pic/ 저장 + ![그림](../pic/..) 참조. 폴더는 명칭 폴더의 pic/.""" text = md_path.read_text(encoding="utf-8") if ")" new = IMG.sub(repl, text) # 부칙 등에서 여는 태그와 분리돼 남은 고아 닫는 태그 제거(단독 줄/인용줄 포함) new = re.sub(r"^>?\s*\s*$", ">", new, flags=re.M) new = new.replace("", "") if new != text: md_path.write_text(new, encoding="utf-8") return seq[0] if __name__ == "__main__": mds = ( list(ROOT.rglob("현행_*.md")) + list(ROOT.rglob("교본시점_*.md")) + list(ROOT.rglob("CHANGELOG.md")) ) mds = [m for m in mds if "임도기술교본" not in str(m) and "_pipeline" not in str(m)] tot = 0 for md in sorted(mds): n = fix(md) if n: tot += n print(f" {n}장 {md.parent.parent.name[:30]}/{md.name}") print(f"\n법령 본문 이미지 {tot}장 → pic/ 로컬화")