# -*- 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/."""
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/ 로컬화")