
    [i*                        U d Z ddlm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
<   dZde	d<   dZde	d<   ddZddZddZ	 	 	 	 	 	 	 	 ddZg dZy)u  magazine-ppt-ko / html_to_pptx — manifest+HTML → 단일 PPTX 컴파일러.

IDS Phase 2의 G2 모듈. ``python-pptx``로 1920x1080 16:9 PPTX를 생성하며,
모든 텍스트박스에 한글 폰트(Pretendard 우선, 없을 시 Noto Sans KR)를 강제 지정한다.

외부 API/SDK는 일절 임포트/호출하지 않는다 (IDS §0.5).

Public API:
    compile_pptx(html_dir, manifest_path, output_pptx) -> Path
    )annotationsN)Path)Any
PretendardstrPRIMARY_FONTzNoto Sans KRFALLBACK_FONTi 	 intSLIDE_WIDTH_EMUih SLIDE_HEIGHT_EMUc                 J    	 ddl } | S # t        $ r}t        d      |d}~ww xY w)u   python-pptx를 lazy import. 실패 시 명확한 ImportError 를 raise.

    Raises:
        ImportError: python-pptx 미설치 시.
    r   NzOpython-pptx is required for compile_pptx; install via `pip install python-pptx`)pptxImportError)r   excs     B/home/jay/workspace/skills/magazine-ppt-ko/scripts/html_to_pptx.py_import_python_pptxr      s:     K  (
 	s    	""c                    | j                  d      }t        |      dk\  r-	 t        |dd d      t        |dd d      t        |dd d      fS y# t        $ r Y yw xY w)u<   ``#RRGGBB`` → (r, g, b) tuple. 잘못된 입력은 흰색.#   r            )   r   r   )lstriplenr
   
ValueError)	hex_colorss     r   _hex_to_rgb_tupler   ,   sl    A
1v{	#!AOS1Q_c!Aa&"oFF   	#"	#s   +A 	AAc                l   | j                   D ]  }|j                  D ]  }t        |j                  _        	 |j
                  j                         }ddlm} |j                   |d            }|ddl
m} |j                  | |d            }|j                  dt                 y# t        $ r Y w xY w)u   텍스트 프레임의 모든 run에 한글 폰트 강제.

    - run.font.name = "Pretendard" (없을 시 PowerPoint가 fallback chain 사용)
    - east_asia 속성도 Pretendard로 지정 (한글 글리프 보장)
    r   )qnza:eaN)etreetypeface)
paragraphsrunsr   fontname_rget_or_add_rPrpptx.oxml.nsr!   findlxmlr"   
SubElementset	Exception)
text_frame	paragraphrunrprr!   ear"   s          r   _apply_korean_fontr5   7   s      ** 	>> 	C(CHHMff++-+XXbj):*))#r&z:Bz<0	  s   A-B''	B32B3c           
     
   t               }ddlm}m} ddlm} t        |      }|j                         st        d|       |j                  dd      5 }t        j                  |      }	ddd       	j                  d	i       }
t        t        |
j                  d
d                  }t        t        |
j                  dd                  }t        t        |
j                  dd                  }|j                         } |t               |_         |t$              |_        |j(                  d   }t        |      }|j*                  j-                  dd       t        |       }|	j                  dg       D ]  }|j.                  j1                  |      }	 |j2                  j4                  }|j7                           || |j8                  _        |j>                  jA                  d |d       |d       |t                |t$                    }|j4                  j7                           || |j4                  j8                  _        |jB                  j4                  j3                          	 |jD                  jF                  }|jI                  dd       |j>                  jK                   |d       |d       |d       |d            }|jL                  }d|_'        t        |j                  dd            }| |_(        |jR                  d   jT                  D ]H  } |d      |jV                  _,        d|jV                  _-         || |jV                  j\                  _        J t_        |       |j>                  jK                   |d       |d       |d       |d            }|jL                  }d|_'        |j                  di       xs i }ta        |j                  d g       xs g       }g }tI               } |D ],  }!|!s|!| vs|jc                  |!       | je                  |!       . |jg                         D ]7  }"t        |"      }#|#s|#| vs|jc                  |#       | je                  |#       9 |s|g}|d   |_(        |dd D ]  }$|ji                         }%|$|%_(         |jR                  D ]H  }&|&jT                  D ]7  } |d!      |jV                  _,         || |jV                  j\                  _        9 J t_        |       t        |j                  d"d            }'|'r||'z  j                         nd#}( |jk                  t        |             |S # 1 sw Y   xY w# t<        $ r Y w xY w# t<        $ r Y w xY w)$u  manifest.json의 슬라이드 정보 + HTML 텍스트로 단일 PPTX 빌드.

    Args:
        html_dir: build_deck.py가 출력한 HTML/manifest 디렉토리.
        manifest_path: manifest.json 경로.
        output_pptx: 출력 .pptx 파일 경로.

    Returns:
        생성된 PPTX 파일의 Path.

    Raises:
        ImportError: python-pptx 미설치 시.
        FileNotFoundError: manifest_path가 존재하지 않을 때.
    r   )EmuPt)RGBColorzmanifest not found: rzutf-8)encodingNtokens
backgroundz#fffffftext_primaryz#111111accentz#3ecf8er   T)parentsexist_okslides   alphaEffectsApplied0i 	 iا i layout    i i >I 	variableskorean_strings   fileF)6r   	pptx.utilr7   r8   pptx.dml.colorr9   r   existsFileNotFoundErroropenjsonloadgetr   r   Presentationr   slide_widthr   slide_heightslide_layoutsparentmkdirrB   	add_slider=   fillsolid
fore_colorrgbr/   shapes	add_shapeline_elementspPrr.   add_textboxr0   	word_wraptextr$   r%   r&   sizeboldcolorr5   listappendaddvaluesadd_paragraphsave))html_dirmanifest_pathoutput_pptxpptx_moduler7   r8   r9   
manifest_pfmanifestr<   bg_rgbtext_rgb
accent_rgbpresentationblank_layoutout_path
html_dir_p
slide_metaslidebg_fillbg_boxsp_pr	title_boxtitle_tflayout_namer2   body_boxbody_tfrI   rJ   body_text_linesseenr   vsvalrb   pr1   html_filename_s)                                            r   compile_pptxr   Q   s   & &'K!'m$J"6zl CDD	w	/ 01#'99Q<0 &\\(B7Fs6::lI#FGHF VZZ	%J!KLH"3vzz(I'F#GHJ++-L"?3L #$4 5L--a0LK HOO$6hJll8R0 SN
##--l;	&&++GMMO%-v%6G" ''FF  !
 	%-v%6"##%	OO((EII+S1
 LL,,KVc(mS[
	 ''!*..267&-&&q).. 	7CrFCHHM CHHM!):!6CHHNN	7 	8$ <<++KWs8}c'l
 %% $.NN;$C$Ir	$(8H")M)SQS$T &( 	AQd]&&q)	 !!# 	Aq6DD(&&t,		 *mO&q)#AB' 	D%%'AAF	 !++ 	9I ~~ 9 "2%-x%8"9	9 	7# JNN62675BZ-'//1gSNj c(m$OQ0 04  		$  		s0   U:U%-(U5U"%	U21U25	VV)r   r   r	   )returnr   )r   r   r   ztuple[int, int, int])r0   r   r   None)rq   
str | Pathrr   r   rs   r   r   r   )__doc__
__future__r   rR   pathlibr   typingr   r   __annotations__r	   r   r   r   r   r5   r   __all__     r   <module>r      s   	 #    !c  #s #  #  4CCC C 
	CL <r   