+
    ƒ£Ìj(  ã                   ó  € R t ^ RIt^ RIt^ RIt^ RIt^ RItRtRtRtRt	Rt
RtRt]P                  P                  R	4      tR(tR
t^Ht/ t]3R ltRtR)R ltR*R ltR)R ltR tR tR tR+R ltR tR t]R8X  Ed‹   R]P@                  9   d·   Rt!]! ]!RR7      t"]! ]"RR7      t#]"]#8X  g   Q R4       h]! ]"4      t$]%! ]$PM                  4       4      '       g   Q R]$,          4       h]'! R4       ]'! R](! ]! 4       4      ](! ]4      3,          4       ]$PS                  4        F   w  t*t+]'! R ]+'       d   R!MR": R#]*: 24       K"  	  R# R$]P@                  9   d©   ]P@                  R%,           F�  t,]! ],4      t$]$PS                  4        U Uu. uF  w  rV'       d   K  V NK  	  upp t-]'! ]-'       g   R!MR": R#]P                  P]                  ],4      : R#]-'       g   RMR&R'P_                  ]-4      ,           : 24       K‘  	  R# ]'! ] 4       R# R# u upp i ),u.  
å®�é”�å“�ç‰Œå¥—ä»¶ â€”â€” Logo + Slogan æ ‡å‡†ï¼ˆå”¯ä¸€æ�ƒå¨�å®žçŽ°ï¼‰
================================================================
ã€�é“�å¾‹ã€‘æ‰€æœ‰å¯¹å¤–ç‰©æ–™ä¸Žå·¥ä½œæ–‡æ¡£ï¼ˆHTML/PDFï¼‰å¿…é¡»å�« Logo + sloganã€‚
æœ¬æ¨¡å�—æ˜¯å”¯ä¸€å®žçŽ°ï¼Œä»»ä½•ç”Ÿæˆ�å™¨éƒ½ä»Žè¿™é‡Œå�–ï¼Œä¸�å¾—å�„å†™ä¸€ä»½ã€‚

  é¡µçœ‰ï¼šLogoï¼ˆbase64 å†…è�”ï¼‰+ BIORI BIOTECH + å®�é”�ç”Ÿç‰© + æ ‡ç­¾ + ã€�sloganã€‘
  é¡µè„šï¼šBIORI BIOTECH Â· å®�é”�ç”Ÿç‰© ï½œ ç”µè¯� ï½œ ç½‘å�€ ï½œ é‚®ç®± ï½œ åœ°å�€  + ã€�sloganã€‘

ç”¨æ³•ï¼ˆç”Ÿæˆ�å™¨é‡Œï¼‰ï¼š
    import brand_kit as BK
    html = BK.inject(html, theme='dark', tag='è�¥é”€ä¸­å¿ƒ', footer_extra='...')
    # å¹‚ç­‰ï¼šé‡�å¤�è°ƒç”¨ä¸�ä¼šå� ä¸¤å¥—

è‡ªæ£€ï¼š
    python3 brand_kit.py --verify æ–‡ä»¶.html      # å�•æ–‡ä»¶
    python3 brand_kit.py --selftest              # æ¨¡å�—è‡ªæ£€
Nu'   å®ˆæŠ¤ç”Ÿå‘½å�¥åº·ï¼Œç¼”é€ ç¾Žå¥½ç”Ÿæ´»zBIORI BIOTECHu   å®�é”�ç”Ÿç‰©z0756-8699969zwww.biori.comzmarketing@biori.comu#   ç� æµ·å¸‚é¦™æ´²åŒºæ°´å²¸ä¸€è·¯88å�·u(   ~/work/å…¬å�¸èµ„æ–™/logo_transparent.pngu   å®ˆæŠ¤ç”Ÿå‘½å�¥åº·c                ó¬  € V \         9   d   \         V ,          #  ^ RIHp \
        P                  P                  \        4      '       g   \        R\        ,          4      hTP                  \        4      P                  R4      pTP                  w  r4\        \        Y0,          T,          4      4      pTP                  YP3TP                   4      p\"        P$                  ! 4       pTP'                  TRRR7       R\(        P*                  ! TP-                  4       4      P/                  4       ,           pT\         T &   T#   \         d    \	        R4      hi ; i)	uN   è¿”å›ž logo çš„ data URIï¼ˆç¼©æ”¾åˆ°é«˜åº¦ hï¼ŒPNG ä¼˜åŒ–ï¼‰ã€‚ç»“æžœç¼“å­˜ã€‚)ÚImageu6   éœ€è¦� Pillowï¼š/usr/bin/python3 -m pip install pillowu   Logo æº�æ–‡ä»¶ä¸�å­˜åœ¨ï¼š%sÚRGBAÚPNGT)ÚformatÚoptimizezdata:image/png;base64,)Ú_logo_cacheÚPILr   ÚImportErrorÚRuntimeErrorÚosÚpathÚexistsÚLOGO_SRCÚFileNotFoundErrorÚopenÚconvertÚsizeÚintÚroundÚresizeÚLANCZOSÚioÚBytesIOÚsaveÚbase64Ú	b64encodeÚgetvalueÚdecode)Úhr   ÚimÚwÚhhÚnwÚbufÚuris   &       ôD   /Users/liuxinyuan/Desktop/Hermesè¾“å‡º-å·¥ä½œç±»/è„šæœ¬/brand_kit.pyÚlogo_data_urir'   -   s   € àŒKÔÜ˜1�~ÐðUÝô �7‰7�>‰>œ(×#Ò#ÜÐ >ÄÕ IÓJÐJØ	�‰”HÓ	×	%Ñ	% fÓ	-€BØ�G‰G�E€AÜ	ŒU�1•5˜2•:ÓÓ	€BØ	�‰�B�7˜EŸM™MÓ	*€BÜ
�*Š*‹,€CØ‡G�GˆC˜¨€GÔ-Ø
"¤V×%5Ò%5°c·l±l³nÓ%E×%LÑ%LÓ%NÕ
N€CØ„K��NØ€Jøô ô UÜÐSÓTÐTðUús   šD< Ä<EuÒ  
/* ===== bior-brand-v1 Â· å®�é”�å“�ç‰Œæ ‡å‡†ï¼ˆLogo+Sloganï¼‰===== */
.bior-header{background:linear-gradient(135deg,#0d47a1 0%,#1565c0 50%,#1a73e8 100%);color:#fff;
  box-shadow:0 2px 8px rgba(13,71,161,.18);
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif}
.bior-header-inner{max-width:1560px;margin:0 auto;display:flex;align-items:center;gap:13px;padding:10px 22px}
.bior-logo-chip{background:#fff;border-radius:8px;padding:3px 10px;display:flex;align-items:center;
  box-shadow:0 1px 3px rgba(0,0,0,.16);flex:none}
.bior-logo-chip img{height:34px;width:auto;display:block}
.bior-brand{line-height:1.24;flex:none}
.bior-name{font-size:15px;font-weight:700;letter-spacing:.6px;display:block}
.bior-cn{font-size:11px;opacity:.86;display:block;letter-spacing:1.5px}
.bior-tagwrap{margin-left:auto;text-align:right;line-height:1.3;flex:none}
.bior-tag{font-size:11px;opacity:.85;display:block}
.bior-slogan{font-size:13.5px;font-weight:600;letter-spacing:2px;display:block;
  text-shadow:0 1px 2px rgba(0,0,0,.13)}
.bior-footer{background:#0d2a52;color:#c9d8ee;padding:15px 22px;text-align:center;line-height:1.9;
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif}
.bior-footer-slogan{font-size:14px;font-weight:700;letter-spacing:3px;color:#fff;margin-bottom:5px}
.bior-footer-meta{font-size:11px;opacity:.8}
.bior-footer-meta b{font-weight:600;color:#fff;opacity:.95}
.bior-footer-extra{font-size:10.5px;opacity:.6;margin-top:5px}
/* ç™½åº•é¡¶æ �å�˜ä½“ï¼ˆå·¥ä½œå�°é¡µé�¢ï¼‰ */
.bior-header.light{background:#fff;border-bottom:1px solid #e0e0e0;box-shadow:0 1px 4px rgba(0,0,0,.06)}
.bior-header.light .bior-name{color:#1852B6}
.bior-header.light .bior-cn{color:#5f6368;opacity:1}
.bior-header.light .bior-tag{color:#9aa0a6;opacity:1}
.bior-header.light .bior-slogan{color:#1565c0;text-shadow:none}
.bior-header.light .bior-logo-chip{box-shadow:none;padding:0;background:transparent;border-radius:0}
@media(max-width:760px){
  .bior-slogan{font-size:11px;letter-spacing:1px}
  .bior-header-inner{gap:9px;padding:9px 13px}
  .bior-logo-chip img{height:26px}
}
@media print{.bior-footer{background:#0d2a52 !important;-webkit-print-color-adjust:exact;print-color-adjust:exact}}
õ   è�¥é”€ä¸­å¿ƒc                ó”   € RV R8X  d   RMR,           pRV: R\        4       : R\        : R\        : R	\        : R
V: R\        : R2# )uB   é¡µçœ‰ï¼šLogo + å“�ç‰Œå�� + æ ‡ç­¾ + sloganã€‚theme='dark'|'light'úbior-headerÚdarkÚ z lightz<div class="z[" data-bior-brand="1"><div class="bior-header-inner"><div class="bior-logo-chip"><img src="z" alt="z8"></div><div class="bior-brand"><span class="bior-name">z</span><span class="bior-cn">z></span></div><div class="bior-tagwrap"><span class="bior-tag">z!</span><span class="bior-slogan">z</span></div></div></div>)r'   ÚBRAND_ENÚBRAND_CNÚSLOGAN)ÚthemeÚtagÚclss   && r&   Úheader_htmlr3   i   s3   € à
 ¨&¤™2°hÕ
?�Có 
ŒmŽoŸx¯·8»SÇ&ðJð Jó    r,   c                óè   € V'       d4   R\         : R\        : R\        : R\        : R\        : R\
        : 2pMR\         : R\        : 2pV '       d
   RV ,          MRpR\        : RV: R	V: R	2# )
u0   é¡µè„šè�½æ¬¾ï¼šslogan + å“�ç‰Œ + è�”ç³»æ–¹å¼�ã€‚z<b>u   </b> Â· u    ï½œ ç”µè¯� u    ï½œ z'<div class="bior-footer-extra">%s</div>r,   zM<div class="bior-footer" data-bior-brand="1"><div class="bior-footer-slogan">z$</div><div class="bior-footer-meta">z</div>)r-   r.   ÚTELÚSITEÚMAILÚADDRr/   )ÚextraÚcontactÚmetaÚxss   &&  r&   Úfooter_htmlr>   |   sN   € ç€wçŸX§s¯D·$¾ð>‰ð ÷ %-®hÐ7ˆß>CÐ	2°UÖ	:È�B÷ 
““rðð r4   c                ó$   € \         \        W4      3# )u@   è¿”å›ž (css, html)ã€‚æ³¨å…¥åˆ° <head> å‰�è¯·è‡ªè¡ŒåŒ… <style>ã€‚)ÚCSSr3   )r0   r1   s   &&r&   Ú
head_blockrA   Œ   s   € ä”˜EÓ'Ð'Ð'r4   c                ó   € RV 9   # )u¶   âš ï¸� å¿…é¡»åŒ¹é…�ã€�å…ƒç´ ã€‘è€Œé�žç±»å��ï¼šCSS é‡Œæœ‰ .bior-header{...}ï¼Œ
ç”¨ 'bior-header' in html ä¼šåœ¨æ³¨å…¥ CSS å�Žè¯¯åˆ¤ä¸ºã€Œå·²æœ‰é¡µçœ‰ã€�â†’ é¡µçœ‰ HTML æ°¸ä¸�å†™å…¥ã€‚zclass="bior-header© ©Úhtmls   &r&   Ú_has_headerrF   ’   s   € ð   4Ñ'Ð'r4   c                ó   € RV 9   # )u(   å�Œä¸Šï¼šCSS é‡Œæœ‰ .bior-footer{...}ã€‚zclass="bior-footerrC   rD   s   &r&   Ú_has_footerrH   ˜   s   € à 4Ñ'Ð'r4   c                 ó   € \         V 9   # )N)Ú
SLOGAN_KEYrD   s   &r&   Ú_has_sloganrK   �   s   € Ü˜ÑÐr4   c                óP  € T pV'       d?   RV9  d8   R\         ,          pRV9   d   VP                  RVR,           ^4      pMW‡,           p\        V4      '       gƒ   \        W4      p	\        P
                  ! RV\        P                  4      p
V
'       d:   VRV
P                  4        R,           V	,           WzP                  4       R ,           pMV	R,           V,           pV'       dt   \        V4      '       gc   RV9   d&   \        P                  ! RR	\        ,          V^R
7      p\        V4      '       g&   RV9   d   VP                  RR\        ,          ^4      pV'       dH   \        V4      '       g7   \        V4      pRV9   d   VP                  RVR,           ^4      pV# W{,           pV# )u©   
å¹‚ç­‰æ³¨å…¥å“�ç‰Œé¡µçœ‰/é¡µè„šã€‚é‡�å¤�è°ƒç”¨ä¸�å� åŠ ã€‚
  theme='dark'  å·¥ä¸šè“�æ¸�å�˜ï¼ˆå¯¹å¤–äº¤ä»˜ä»¶é»˜è®¤ï¼‰
  theme='light' ç™½è‰²é¡¶æ �ï¼ˆå·¥ä½œå�°é¡µé�¢ï¼‰
úbior-brand-v1z
<style>
%s
</style>
z</head>z<body[^>]*>NÚ
zclass="bior-tagwrap"z%(<span class="bior-tag">[^<]*</span>)z%\1<span class="bior-slogan">%s</span>)Úcountz</body>z)<div class="bior-slogan">%s</div>
</body>z
</body>)r@   ÚreplacerF   r3   ÚreÚsearchÚIÚendrK   Úsubr/   rH   r>   )rE   r0   r1   ÚfooterÚfooter_extraÚ
ensure_cssÚensure_sloganÚoutÚstyleÚhbÚmÚfbs   &&&&&&&     r&   Úinjectr_   ¡   s\  € ð €C÷ �o¨SÔ0Ø+¬cÕ1ˆØ˜ÔØ—+‘+˜i¨°Õ):¸AÓ>‰Cà•+ˆCô �s×ÒÜ˜Ó$ˆÜ�IŠI�n c¬2¯4©4Ó0ˆßØ�h�q—u‘u“w�- $Õ&¨Õ+¨c·%±%³'°(¨mÕ;‰Cà�t•)˜c•/ˆC÷ œ[¨×-Ò-Ø! SÔ(Ü—&’&ÐAØAÄFÕJØ Aô'ˆCô ˜3×Ò I°Ô$4Ø—+‘+˜iÐ)UÔX^Õ)^Ð`aÓbˆC÷ ”k #×&Ò&Ü˜Ó&ˆØ˜ÔØ—+‘+˜i¨¨kÕ)9¸1Ó=ˆCð €Jð •(ˆCØ€Jr4   c                ó¤   € RRV 9   R\         V 9   R\        V 9   R\        V 9   RRV 9   RR	V 9   R
\        V 9   R\        P
                  ! RV 4      '       * /# )u   è¿”å›žè‡ªæ£€æ¸…å�• dictã€‚Úlogozdata:image/png;base64u   å“�ç‰Œè‹±æ–‡u   å“�ç‰Œä¸­æ–‡Úsloganu   é¡µçœ‰r*   u   é¡µè„šzbior-footeru   è�”ç³»æ–¹å¼�u   ç¦�ç”¨å� ä½�ç¬¦z'\{\{[A-Z_]+\}\}|\{LOGO_B64\}|\{SLOGAN\})r-   r.   rJ   r6   rQ   rR   rD   s   &r&   Úverifyrc   Ï   si   € ð 	Ð'¨4Ñ/Øœ DÑ(Øœ DÑ(Ø”* Ñ$Ø�- 4Ñ'Ø�- 4Ñ'Øœ˜t™ØœrŸyšyÐ)SÐUYÓZÔZð	ð 	r4   c                 ó´   € \         P                  ! V R RR7      ;_uu_ 4       p\        VP                  4       4      uuRRR4       #   + '       g   i     R# ; i)zutf-8Úignore)ÚencodingÚerrorsN)r   r   rc   Úread)r   Úfs   & r&   Ú
check_filerj   Ý   s4   € Ü	�Š� °×	9Õ	9¸QÜ�a—f‘f“hÓ÷ 
:×	9×	9Ó	9ús   ¢AÁA	Ú__main__z
--selftestu6   <html><head></head><body><h1>æµ‹è¯•</h1></body></html>)r1   u   â�Œ æ³¨å…¥ä¸�å¹‚ç­‰u   â�Œ è‡ªæ£€æœªè¿‡: %su4   âœ… brand_kit è‡ªæ£€é€šè¿‡ï¼ˆå¹‚ç­‰ + 6 é¡¹é½�å¤‡ï¼‰u*      header é•¿åº¦ %d å­—ç¬¦ï¼ŒCSS %d å­—ç¬¦z   u   âœ…u   â�ŒÚ z--verify:é   NNu   ç¼º: z, )rM   r*   zbior-slogan)r+   r(   )r,   T)r+   r(   Tr,   TT)0Ú__doc__r   r   r   rQ   Úsysr/   r-   r.   r6   r7   r8   r9   r   Ú
expanduserr   ÚMARKSrJ   ÚLOGO_Hr   r'   r@   r3   r>   rA   rF   rH   rK   r_   rc   rj   Ú__name__Úargvr   ÚaÚbÚvÚallÚvaluesÚprintÚlenÚitemsÚkÚokÚpÚbadÚbasenameÚjoin)r}   r~   s   00r&   Ú<module>rƒ      s  ðñó$ Û 	Û 	Û 	Û 
ð 
3€Ø€Ø€Ø€Ø€Ø€Ø,€à�7‰7×ÑÐHÓI€Ø7€Ø!€
ð 
€Ø€ð ô ð,#€ôLJô&ô (ò(ò(ò
ô*ò\ò ð
 ˆzÕØ�s—x‘xÔØDˆÙ�1˜.Ô)ˆÙ�1˜.Ô)ˆØ�AŒvÐ,Ð,Ó,ˆvÙ�1‹IˆÙ�1—8‘8“:�ŠÐ:Ð 6¸Õ :Ó:ˆÙÐDÔEÙÐ:¹cÁ+Ã-Ó>PÑRUÐVYÓRZÐ=[Õ[Ô\Ø—W‘W–Y‰EˆAˆrÚ¯¡°Ò 6ºÐ:Ö;ó à	�s—x‘xÔ	Ø—‘˜"—�ˆAÙ˜1“ˆAØ"#§'¡'¤)Ô6¡)™˜´2—1�1¡)Ò6ˆCÙ¯S¡°eÒ ;¸R¿W¹W×=MÑ=MÈaÖ=Pß*-¡°7¸T¿Y¹YÀs»^Õ3KÑ KðMö Nó ñ 	ˆgŽñ' ùó 7s   ÆHÆH