
    0i8                       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	  ed      Z
 ee
      ej                  vr"ej                  j                  d ee
              ee      j                  j                  Z eej                        ej                  vr,ej                  j                  d eej                               ddlmZ d;dZd;dZd	d
dddddddddddddddddddddddddddd d!d!d"d#dd$d%d&dd'd(dd)d*d+dd,d-dd.Zd/ed0<   	 	 	 	 	 	 	 	 	 	 	 	 d<d1Z	 	 	 	 	 	 	 	 	 	 	 	 d<d2Z	 	 	 	 	 	 	 	 	 	 	 	 d<d3Z	 	 	 	 	 	 	 	 	 	 	 	 d<d4Z	 	 	 	 	 	 	 	 	 	 	 	 d<d5Zeeeeeed6Zd7ed8<   d9Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 d=d:Zy)>u   단일 (브랜드, 패턴, 사이즈) 조합으로 PNG 렌더 + verify L1 evidence 생성용 헬퍼.

IDS Phase 1 task-2401 — L1 smoke test evidence 생성.
    )annotationsN)Path)Anyz/home/jay/workspacec                     t        d      } t        j                  dt        |             }||j                  t        d|        t        j                  |      }|j                  j                  |       |S )uR   satori-cardnews/_satori.py를 importlib으로 로드 (하이픈 패키지 대응).z5/home/jay/workspace/skills/satori-cardnews/_satori.pysatori_cardnews__satoriz Cannot load _satori module from r   _iluspec_from_file_locationstrloaderImportErrormodule_from_specexec_module)satori_pathspecmods      @/home/jay/workspace/skills/satori-cardnews/scripts/render_one.py_load_satori_moduler      sm    NOK''(A3{CSTD|t{{*<[MJKK



%CKKC J    c                     t        d      } t        j                  dt        |             }||j                  t        d|        t        j                  |      }|j                  j                  |       |S )uC   satori-cardnews/scripts/verify_korean.py를 importlib으로 로드.zC/home/jay/workspace/skills/satori-cardnews/scripts/verify_korean.pysatori_cardnews_verify_koreanz&Cannot load verify_korean module from r   )verify_pathr   r   s      r   _load_verify_moduler   %   sm    \]K''(G[IYZD|t{{*B;-PQQ



%CKKC Jr   z#0a1628z#1a2a4az#C8A96Ez#ffffffz#d4b896zrgba(10, 22, 40, 0.85))bg_frombg_toaccenttitle_color
body_color
overlay_bgz#1a0a3ez#0a2a3az#7c3aedz#a78bfazrgba(26, 10, 62, 0.80)z#2d0a1ez#1e0a2dz#ec4899z#fde68azrgba(45, 10, 30, 0.80)z#0a0a0az#1a1a1az#d4af37z#c9b96azrgba(10, 10, 10, 0.90)z#f8f9faz#e9ecefz#212529z#495057zrgba(248, 249, 250, 0.90)z#1c1c1cz#0f2417z#3ecf8ez#a3e6c5zrgba(28, 28, 28, 0.85)z#0f0f1az#1a1a2ez#5e6ad2z#a8adf4zrgba(15, 15, 26, 0.85))	financialsaasconsumerluxurytech_minimalsupabaselinearzdict[str, dict[str, str]]BRAND_PALETTESc                    t        j                  |       }t        j                  |      }|d   }|d   }|d   }	|d   }
|d   }|d   }d| d| d	| d
| dt         d|	 d| d|
 d| d| d| dS )uM   h1_photo_card: 대형 헤드라인 + 하단 본문 (포토 카드 스타일).r   r   r   r   r   r   7<div style="display:flex; flex-direction:column; width:px; height:'px; background:linear-gradient(160deg,  0%,  100%); font-family:zS; position:relative;"><div style="display:flex; width:100%; height:6px; background:z;"></div><div style="display:flex; flex:1; flex-direction:column; justify-content:flex-end; padding:80px;"><div style="display:flex; flex-direction:column; background:zm; border-radius:24px; padding:56px; word-break:keep-all;"><div style="font-size:72px; font-weight:700; color:zA; line-height:1.25; margin-bottom:28px; letter-spacing:-0.02em;">9</div><div style="font-size:36px; font-weight:400; color:; line-height:1.6;"></div></div></div></div>html_libescape_KOREAN_FONT_STACKtitlebodypalettewidthheighttbr   r   r   r   r   r   s                r   _build_h1_photo_cardr=   o   s     	AAi GGEXF-(K&J&J B%TZS[ \..5YeE7 C)* +HHNx PG HRl S>>I] KJJK M>>H\ JC  	r   c                v   t        j                  |       }t        j                  |      }|d   }|d   }|d   }	|d   }
|d   }t        ||      dz  }dj                  g d| d	| d
| d| dt         d| d	| d|	 d|dz   d|dz   d|	 d|
 d| d| d| d      S )uF   h2_illustration: 중앙 정렬 + 일러스트 스타일 원형 배경.r   r   r   r   r       c<div style="display:flex; flex-direction:column; align-items:center; justify-content:center; width:r*   'px; background:linear-gradient(135deg, r,   r-   zW; padding:80px; position:relative;"><div style="display:flex; position:absolute; width:z=px; border-radius:9999px; background:radial-gradient(circle, z522, transparent 70%); top:50%; left:50%; margin-top:-zpx; margin-left:-zpx;"></div><div style="display:flex; flex-direction:column; align-items:center; text-align:center; word-break:keep-all; z-index:1;"><div style="display:flex; width:64px; height:4px; background:zc; margin-bottom:40px; border-radius:2px;"></div><div style="font-size:80px; font-weight:700; color:zA; line-height:1.2; margin-bottom:32px; letter-spacing:-0.025em;">r.   z$; line-height:1.55; max-width:80%;"></div></div></div>)r2   r3   minjoinr4   )r6   r7   r8   r9   r:   r;   r<   r   r   r   r   r   circle_sizes                r   _build_h2_illustrationrG      s    	AAi GGEXF-(K&JeV$)K	 	 ) 	).	/:	;A(	C.	.5Y	6;	<A7	C	 **	+>	
 ?J]	
K	 	.	 /5X	6*	 +6q.)9	 :K	 LWXY>JZ	[H	 IOx	P>	 ?J]	KJ	 KL	M>	  ?I\!	 J-!	" ./C#	"0#	r   c                    t        j                  |       }t        j                  |      }|d   }|d   }|d   }	|d   }
|d   }d| d| d| d	| d
t         d|	 d|
 d| d| d| dS )uF   h3_gpt_style: 미니멀 + 좌측 강조선 (ChatGPT/Claude 스타일).r   r   r   r   r   r)   r*   z'px; background:linear-gradient(180deg, r,   r-   z; padding:100px;"><div style="display:flex; flex-direction:row; gap:40px; flex:1;"><div style="display:flex; width:6px; min-width:6px; background:z; border-radius:3px; align-self:stretch;"></div><div style="display:flex; flex-direction:column; justify-content:center; word-break:keep-all; gap:32px;"><div style="font-size:76px; font-weight:600; color:,; line-height:1.3; letter-spacing:-0.02em;">z9</div><div style="font-size:38px; font-weight:400; color:r/   r0   r1   )r6   r7   r8   r9   r:   r;   r<   r   r   r   r   r   s               r   _build_h3_gpt_stylerJ      s     	AAi GGEXF-(K&J B%TZS[ \..5YeE7 C)* +J KQ R> ?J] K556C 8>>H\ JC  	r   c                    t        j                  |       }t        j                  |      }|d   }|d   }|d   }	|d   }
|d   }|d   }d| d| d	| d
|	 d| dt         d| d|	 d|
 d| d|	 d| d| dS )u>   h4_gradient: 그라데이션 배경 + 중앙 콘텐츠 박스.r   r   r   r   r   r   rA   r*   rB   r,   z44 50%, r-   za; padding:80px;"><div style="display:flex; flex-direction:column; align-items:center; background:zn; border-radius:32px; padding:72px 80px; word-break:keep-all; text-align:center; width:100%; border:1px solid z833;"><div style="font-size:78px; font-weight:700; color:zB; line-height:1.25; margin-bottom:32px; letter-spacing:-0.025em;">zC</div><div style="display:flex; width:80px; height:3px; background:zc; margin-bottom:32px; border-radius:2px;"></div><div style="font-size:38px; font-weight:400; color:r/   rC   r1   r5   s                r   _build_h4_gradientrL      s     	AAi GGEXF-(K&J&J)).{6( C..5YeF88E7 S)* + \ ""8 $>>I] KKKL# NHHNx P>>H\ JC  	r   c                n   t        j                  |       }t        j                  |      }|d   }|d   }|d   }	|d   }
|d   }d}dj                  g d| d	| d
| d| dt         d| d	| d|	 d|	 d|	 d|
 d|	 d|	 d|	 d|
 d| d| d| d      S )u[   h5_user_photo: 상단 프로필 영역 + 하단 텍스트 (유저 포토 스타일 시뮬).r   r   r   r   r   x   r@   r)   r*   r+   r,   r-   z; padding:80px; gap:56px;"><div style="display:flex; flex-direction:row; align-items:center; gap:32px;"><div style="display:flex; width:z%px; border-radius:9999px; background:z44; border:3px solid zQ; align-items:center; justify-content:center;"><div style="font-size:48px; color:z~;">K</div></div><div style="display:flex; flex-direction:column; gap:8px;"><div style="font-size:28px; font-weight:600; color:zD;">User</div><div style="display:flex; padding:6px 16px; background:z+22; border-radius:9999px; border:1px solid z'44;"><div style="font-size:22px; color:z;">verified</div></div></div></div><div style="display:flex; flex-direction:column; flex:1; justify-content:center; word-break:keep-all; gap:28px;"><div style="font-size:74px; font-weight:700; color:rI   r.   r/   rC   )r2   r3   rE   r4   )r6   r7   r8   r9   r:   r;   r<   r   r   r   r   r   avatar_sizes                r   _build_h5_user_photorP     s     	AAi GGEXF-(K&JK	 	
A 	% 	 	TZS[ 	 \. 	.5Y	6;	<A7	C	)*	++	
 ,7-	
 8C	
 DO-	
P,	 -38	 4I	 JP	Q-	 .4H	5>	 ?J]	KB	 CI	J2	 39	:-	 .4H	5>	* ?J]+	*K5+	, 67C-	,8>-	. ?I\/	.J/	0 C1	0 1	r   )h1_photo_cardh2_illustrationh3_gpt_styleh4_gradienth4_gradient_cardh5_user_photodict[str, Any]_PATTERN_BUILDERSz'Pretendard', 'Noto Sans KR'c           	        t               }t               }|\  }}	t        j                  | j	                         t        d         }
t
        j                  |      }|,t        d|dt        t
        j                                       ||||
||	      }t        |      }|j                  ||||	       |j                  |||g|      }t        |      |d<   |dd |d	<   |S )
u  templates/<pattern>.html 또는 인라인 HTML을 한글 텍스트로 채워 렌더 + 검증.

    Args:
        brand: 브랜드 식별자 (예: "supabase", "linear", "financial", "saas" 등).
        pattern: 패턴명 (예: "h4_gradient", "h1_photo_card" 등).
        size: (width, height) 픽셀.
        title: 한글 헤드라인.
        body: 한글 본문.
        output_path: 출력 PNG 경로.

    Returns:
        verify_korean.verify_png 결과 + {"render_path": str, "html_used": str}.

    Raises:
        ValueError: 알 수 없는 패턴.
        FileNotFoundError: 폰트 또는 Node.js 미존재.
        RuntimeError: 렌더 실패.
    r!   NzUnknown pattern: z. Available: )r9   r:   )expected_koreanhtml_sourcerender_pathi  	html_used)r   r   r'   getlowerrX   
ValueErrorlistkeysr   safe_render_html_to_png
verify_pngr   )brandpatternsizer6   r7   output_path
satori_mod
verify_modr9   r:   r8   builderhtml_strverify_results                 r   render_and_verifyrn   G  s	   8 %&J$&JME6   v0FGG  ##G,G{ +055789;
 	
 E4%@H {#K&&xERX&Y %/$9$9 %: %M $'{#3M- !)%4M+r   )returnr   )r6   r   r7   r   r8   zdict[str, str]r9   intr:   rp   ro   r   )re   r   rf   r   rg   ztuple[int, int]r6   r   r7   r   rh   r   ro   rW   ) __doc__
__future__r   htmlr2   syspathlibr   typingr   
_WORKSPACEr   pathinsert__file__parent
_SKILL_DIRimportlib.utilutilr	   r   r   r'   __annotations__r=   rG   rJ   rL   rP   rX   r4   rn    r   r   <module>r      s  
 #  
   '(
z?#(("HHOOAs:' (^""))
z)HHOOAs:,,-.   .  .  .  .  1  .  .e:-) :|##
# # 	#
 # 	#L''
' ' 	'
 ' 	'T!!
! ! 	!
 ! 	!H""
" " 	"
 " 	"J..
. . 	.
 . 	.f *-'%*)% >  4 == = 	=
 = = = =r   