
    [i                        U d Z ddlmZ ddlZddlZddlmZ ddlmZ dZ	de
d<   d	Zde
d
<    ej                  dej                        ZddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZg dZy)uG  magazine-ppt-ko / verify_korean — 한글 100% 검증 모듈.

IDS Phase 2의 G2 검증 모듈. manifest의 모든 한글 문자열이 HTML(또는 PPTX 추출
텍스트)에 string-match로 존재하는지 확인. OCR을 사용하지 않는 코드 패스 검증이며,
font-family fallback chain도 정규식으로 점검한다.

표준 라이브러리만 사용한다 (외부 의존 0).

Public API:
    verify_html(manifest_path, html_dir) -> dict[str, Any]
    verify_pptx_text(manifest_path, pptx_path) -> dict[str, Any]
    verify_font_stack_in_html(html_dir) -> dict[str, Any]
    )annotationsN)Path)Any
PretendardstrPRIMARY_FONTzNoto Sans KRFALLBACK_FONTzLfont-family\s*:\s*['\"]?Pretendard['\"]?\s*(?:,\s*['\"]?Noto Sans KR['\"]?)?c                    t        |       j                  dd      5 }t        j                  |      }ddd       |S # 1 sw Y   S xY w)u   manifest.json 읽기.rutf-8encodingN)r   openjsonload)manifest_pathfdatas      C/home/jay/workspace/skills/magazine-ppt-ko/scripts/verify_korean.py_read_manifestr       sC    	m		!	!#	!	8 ,A#yy|,K,Ks	   =Ac           	     
   t        |       }t        |      }g }d}|j                  dg       D ]  }|j                  dd      }t        |j                  dg       xs g       }||z  }	|	j	                         s|j                  |d|g dd       d}c|	j                  d	
      }
g }g }|D ]+  }|r||
v r|j                  |       |j                  |       - t        |      dk(  }|sd}|j                  ||||d        ||dS )uV  manifest의 모든 한글 문자열이 대응 HTML 파일에 string-match로 존재하는지 검증.

    Args:
        manifest_path: build_deck.py가 출력한 manifest.json 경로.
        html_dir: 슬라이드 HTML 디렉토리.

    Returns:
        {"pass": bool, "results": [{"file": ..., "missing": [...], "found": [...]}, ...]}
    Tslidesfile korean_stringsFzhtml file not found)r   passmissingfounderrorr   r   r   r   r   r   r   r   results)r   r   getlistexistsappend	read_textlen)r   html_dirmanifest
html_dir_pr"   overall_passslidefilenamer   	html_path	html_textr   r   s
slide_passs                  r   verify_htmlr3   '   s5    m,HhJ$&GLh+ %
99VR($(3CR)H)NB$O)	!NN$!-2 !L'''9	 	"AQ)^Qq!		" \Q&
 L ""		
=%
N !W55    c                   	 ddl }t        |       }|j                  t	        |            }g }|j
                  D ]  }g }|j                  D ]j  }	t        |	dd      st        |	dd      }
|
!|
j                  D ];  }|j                  D ]*  }|j                  s|j                  |j                         , = l |j                  dj                  |              g }d}|j                  d	g       }t        |      t        |      k7  rdt        |      t        |      d
g dS t        ||      D ]  \  }}t!        |j                  dg       xs g       }g }g }|D ]+  }|r||v r|j                  |       |j                  |       - t        |      dk(  }|sd}|j                  |j                  dd      |||d        |t        |      |dS # t        $ r}t        d      |d}~ww xY w)uD  python-pptx로 PPTX를 다시 읽어 한글 텍스트 string-match 검증.

    Args:
        manifest_path: manifest.json 경로.
        pptx_path: 컴파일된 .pptx 파일 경로.

    Returns:
        {"pass": bool, "results": [...], "slide_count": int}

    Raises:
        ImportError: python-pptx 미설치 시.
    r   Nz)python-pptx required for verify_pptx_texthas_text_frameF
text_frame
Tr   zslide count mismatch)r   slide_countexpected_countr   r"   r   r   r   r    )r   r9   r"   )pptxImportErrorr   Presentationr   r   shapesgetattr
paragraphsrunstextr&   joinr#   r(   zipr$   )r   	pptx_pathr;   excr*   presentationslide_textsr-   partsshaper7   	paragraphrunr"   r,   manifest_slides
slide_metarB   r   r   r   r1   r2   s                          r   verify_pptx_textrO   d   s      m,H$$S^4L  K$$ -\\ 		/E5"2E: d;J!'22 /	$>> /CxxSXX.//		/ 	499U+,- %'GLll8R0O
;3//{+!/2+
 	
  = 

D$(8H")M)SQS$T 	"AQ$YQq!		"
 \Q&
 L"vr2""		

, ;' u  7
	s   G 	G(G##G(c                T   t        |       }g }d}t        |j                  d            D ]  }|j                  d      }t        j                  |      }t        j
                  d|t        j                        }|D cg c]O  }|j                         j                  d      j                         j                  d      r@|j                         Q }	}t        |      dk\  xr t        |	      d	k(  }
|
sd
}|j                  |j                  |
t        |      |	d        ||dS c c}w )u   모든 HTML의 font-family가 Pretendard로 시작하는지 정규식 확인.

    Args:
        html_dir: 슬라이드 HTML 디렉토리.

    Returns:
        {"pass": bool, "results": [{"file": ..., "pass": bool, "matches": int}, ...]}
    Tz*.htmlr   r   zfont-family\s*:\s*([^;}]+)z'"
pretendard   r   F)r   r   matchesbad_declarationsr!   )r   sortedglobr'   _FONT_FAMILY_REfindallre
IGNORECASEstriplstriplower
startswithr(   r&   name)r)   r+   r"   r,   r/   rB   rS   	all_declsd	bad_declsr2   s              r   verify_font_stack_in_htmlrc      s    hJ$&GLJOOH56 
	""G"4!))$/JJ<dBMMR	(1r19I9I%9P9V9V9X9c9cdp9qQWWYr	r\Q&>3y>Q+>
 L!"w<$-		

$ !W55 ss   =AD%?D%)r3   rO   rc   )r   
str | Pathreturndict[str, Any])r   rd   r)   rd   re   rf   )r   rd   rE   rd   re   rf   )r)   rd   re   rf   )__doc__
__future__r   r   rY   pathlibr   typingr   r   __annotations__r	   compilerZ   rW   r   r3   rO   rc   __all__ r4   r   <module>ro      s    #  	   c  #s # "**SMM:6:6:6 :6zPPP Pf6Dr4   