ó
    ”)Òjý
  ã                   ó  • S r SSKrSSKrSSKrSSKrSSKr\R                  R                  S\R                  R                  \R                  R                  \
5      5      5        SSKJrJrJrJrJr  \R"                  " S5      r\R"                  " S\R&                  5      r\R"                  " S5      rSrS rS	 r\S
:X  aG  \R4                  R7                  SSS9  \R8                  SS =(       d    \ H  r\" \" \5      SS9  M     gg)aˆ  Finish a Level-4 book once all its OCR chunks exist:
  1. join the chunks into <book folder>/<book name>.md (next to the PDF), '# Page N' headings, pages separated by ---;
  2. download every extracted picture (/media/...) into <book folder>/assets/<media id>/ and link it as ./assets/...
Idempotent: pictures already on disk are not downloaded again.   python tools/l4_finalize.py [slug ...]é    N)ÚBOOKSÚOUTÚBASEÚbook_pdfÚchunksz#(!\[[^\]]*\]\()(/media/[^)\s]+)(\))zZ(?:```markdown\s*)?\| Table 1: Data Analysis.*?\*\*r = 0:\*\* No correlation\.?\s*(?:```)?z```markdown\s*```u   *(Page sans texte imprimÃ©.)*c                 óf   • [         R                  [        [        R                  [        U 5      5      $ )N)ÚEMPTYÚsubÚNOTEÚHALLU)Útexts    Ú)F:\Yaseen\AI\French2\tools\l4_finalize.pyÚcleanr      s   € Ü�9‰9”Tœ5Ÿ9™9¤T¨4Ó0Ó1Ð1ó    c           
      ó¾  ^^^^• [        U 5       Vs/ s H  oS   PM	     nnU Vs/ s H+  n[        R                  R                  U5      (       a  M)  UPM-     nnU(       a  U  S[	        U5       S[	        U5       S3$ [        R                  R                  [        U 5      5      m[        R                  R                  [        R                  R                  [        U 5      5      5      S   nSR                  S U 5       5      S-   n[        R                  " 5       SSsmmmUUUU4S	 jn[        R                  U[        U5      5      n[        R                  R                  TUS
-   5      n[        USSS9 n	U	R!                  U5        S S S 5        [	        ["        R$                  " SU5      5      n
U  SU SU
 ST ST S3
$ s  snf s  snf ! , (       d  f       NI= f)Né   z: z of z chunks still missingr   z

---

c              3   ón   #   • U  H+  n[        US S9R                  5       R                  5       v •  M-     g7f)úutf-8©ÚencodingN)ÚopenÚreadÚstrip)Ú.0Úps     r   Ú	<genexpr>Úfinalize.<locals>.<genexpr>   s.   é € ÐYÒPXÈ1œd 1¨wÑ7×<Ñ<Ó>×DÑD×FÐFÒPXùs   ‚35Ú
c                 ó(  >• U R                  S5      [        S5      S  n[        R                  R                  " TS/UR                  S5      Q76 n[        R                  R                  U5      (       d�   T	R                  [        U R                  S5      -   SS9o3R                  5         [        R                  " [        R                  R                  U5      SS9  [        US	5       nUR                  UR                  5        S S S 5        TS
-  mU R                  S
5      S-   U-   U R                  S5      -   $ ! , (       d  f       N<= f! [         a<  nTS
-  m[!        SU R                  S5      U5        U R                  S5      s S nA$ S nAff = f)Né   z/media/ÚassetsÚ/é<   )ÚtimeoutT)Úexist_okÚwbé   z  picture failed:r   z	./assets/r   )ÚgroupÚlenÚosÚpathÚjoinÚsplitÚexistsÚgetr   Úraise_for_statusÚmakedirsÚdirnamer   ÚwriteÚcontentÚ	ExceptionÚprint)
Úmr
   ÚlocalÚrÚfÚeÚfailÚfolderÚgotÚss
         €€€€r   ÚfixÚfinalize.<locals>.fix    s.  ø€ à�g‰g�a‹jœ˜Y›˜Ð)ˆÜ—‘—’˜V XÐ?°·	±	¸#³Ò?ˆÜ�w‰w�~‰~˜e×$Ñ$ð	"Ø—E‘Eœ$ §¡¨£Ñ+°R�EÐ8�×:LÑ:LÔ:NÜ—’œBŸG™GŸO™O¨EÓ2¸TÒBÜ˜% Ô&¨!Ø—G‘G˜AŸI™IÔ&÷ 'à�q‘�ð
 �w‰w�q‹z˜KÑ'¨#Ñ-°·±¸³
Ñ:Ð:÷ 'Õ&ûô ó "Ø˜‘	�ÜÐ)¨1¯7©7°1«:°qÔ9Ø—w‘w˜q“zÕ!ûð"ús7   Á5A3E Ã(D:ÄE Ä:
EÅE Å
FÅ1FÆFÆFz.mdÚwr   r   z(?m)^# Page \d+u    â€” z pages, z pictures downloaded, z failed)r   r*   r+   r.   r)   r2   r   ÚsplitextÚbasenamer,   ÚrequestsÚSessionÚRXr
   r   r   r3   ÚreÚfindall)ÚslugÚcÚexpectedr   ÚmissingÚnamer   r@   Údstr:   Úpagesr<   r=   r>   r?   s              @@@@r   ÚfinalizerQ      s  û€ Ü$ TœlÓ+šl˜�!”™l€HÐ+Ù"Ó<š(�Q¬"¯'©'¯.©.¸×*;�q™(€GÐ<ÞØ��rœ#˜g›,˜ t¬C°«M¨?Ð:OÐPÐPÜ�W‰W�_‰_œX d›^Ó,€FÜ�7‰7×ÑœBŸG™G×,Ñ,¬X°d«^Ó<Ó=¸aÑ@€DØ×ÑÑYÑPXÓYÓYÐ\`Ñ`€DÜ×#Ò#Ó% q¨!€L€A€sˆD÷;ð ;ô" �6‰6�#”u˜T“{Ó#€DÜ
�'‰'�,‰,�v˜t e™|Ó
,€CÜ	ˆc�3 Ò	)¨QØ	�‰�Œ÷ 
*ä”—
’
Ð-¨tÓ4Ó5€EØˆV�2�c�U˜% ˜w h¨s¨eÐ3IÈ$ÈÈwÐWÐWùò? ,ùÚ<÷6 
*Õ	)ús   ’G¦(G	ÁG	Å9GÇ
GÚ__main__r   Úreplace)r   Úerrorsr'   T)Úflush)Ú__doc__r*   rH   ÚsysÚglobrE   r+   Úinsertr2   ÚabspathÚ__file__Ú
ocr_level4r   r   r   r   r   ÚcompilerG   ÚSr   r	   r   r   rQ   Ú__name__ÚstdoutÚreconfigureÚargvrJ   r6   © r   r   Ú<module>rd      sá   ðñk÷ #× "Ó "Ø ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >ß 9Õ 9à‡Z‚ZÐ6Ó7€ð 	�
Š
ÐpÐrt×rvÑrvÓw€Ø
�
Š
Ð'Ó(€Ø&€ò2ò XðF ˆzÓØ‡J�J×Ñ G°IÐÑ>Ø—‘˜!˜"�×& Ò&ˆÙ‰h�t‹n DÔ)ò 'ð r   