acquire-core-x/tools/gen_screens.py
hyeongwoo-choi c5692410f6 fix(ui): 매니페스트 헤더 주석의 글롭(*/)이 JS 주석 조기종료 → 블록 사망 버그 수정
/* 자동생성: app/src/*/svc/*.pgc ... */ 주석에서 src/*/ 의 */ 가 주석을 끝내고
잔여 텍스트(svc)가 코드로 평가되어 ReferenceError → SVC_SCREENS 미정의 → 메뉴 공백.
파싱은 통과(문법상 유효)하고 런타임에만 죽는 함정. 주석에서 */ 시퀀스 제거 후 재생성.
헤드리스 chromium 스크린샷으로 330화면 메뉴 + AC0101 렌더링 확인.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 03:01:42 +00:00

37 lines
2.2 KiB
Python
Executable file

#!/usr/bin/env python3
"""app/src/*/svc/*.pgc 에서 화면 매니페스트(app/ui/screens.js)를 재생성한다.
각 tpservice 의 입력(getl/gets_)·출력(setl/sets) 필드와 한글 설명을 추출."""
import re, os, json, glob
MOD_NAMES = {'ac':'매입','au':'승인/한도','rc':'대사','st':'정산/수수료','py':'지급',
'lg':'원장','cl':'마감','mm':'마스터','vl':'정합성검증','mg':'전문게이트웨이','cm':'공통'}
screens=[]
for path in sorted(glob.glob('app/src/*/svc/*.pgc')):
mod = path.split('/')[2]
svc = os.path.basename(path)[:-4]
src = open(path, encoding='utf-8', errors='ignore').read()
desc=''
for line in src.splitlines()[:12]:
line=line.strip().lstrip('/*').strip(' *')
if re.search(r'[가-힣]', line) and svc not in line[:len(svc)+8]:
desc=line.strip(); break
if re.search(r'[가-힣]', line) and ':' in line:
desc=line.split('-',1)[-1].strip(); break
if not desc:
m=re.search(r'\*\s*([^\n]*[가-힣][^\n]*)', src[:600])
desc=m.group(1).strip() if m else ''
dedup=lambda xs: list(dict.fromkeys(xs))
screens.append({'mod':mod,'modnm':MOD_NAMES.get(mod,mod),'svc':svc,'desc':desc[:80],
'in':dedup(re.findall(r'(?:getl|gets_)\(b,\s*([A-Z_0-9]+)',src)),
'out':dedup(re.findall(r'(?:setl|sets|sets_)\(b,\s*([A-Z_0-9]+)',src))})
with open('app/ui/screens.js','w',encoding='utf-8') as f:
f.write("/* 자동생성 화면 매니페스트 - tools/gen_screens.py 가 svc 소스에서 추출 */\n")
f.write("const SVC_SCREENS = "); json.dump(screens,f,ensure_ascii=False,indent=1); f.write(";\n")
# index.html 에 인라인 반영 (외부 스크립트는 프록시 프리뷰에서 로드 실패 이력)
idx='app/ui/index.html'
h=open(idx,encoding='utf-8').read()
import re as _re
new='<script>\n/* === 화면 매니페스트 (인라인; 재생성: tools/gen_screens.py) === */\n'+open('app/ui/screens.js',encoding='utf-8').read()+'</script>'
h=_re.sub(r'<script>\n/\* === 화면 매니페스트.*?</script>', lambda m: new, h, count=1, flags=_re.S)
open(idx,'w',encoding='utf-8').write(h)
print(f"screens: {len(screens)} (index.html 인라인 갱신)")