§
    ô’²j¯  ã                   ó\  — d Z ddlZddlZddlZddlmZmZmZ dZdZ	dZ
 ej        d¦  «        Zded	efd
„Zded	ej        fd„Z ej        dej        ¦  «        Zdedefd„Zdedefd„Zded	efd„Zdedefd„Zd„ Zedk    r© eej        ¦  «        dk     r ej        e ¦  «         ej        dd…         Z ee¦  «        dk    rZed                              d¦  «        r? e ed         dd…         d¬¦  «         !                    ¦   «          "                    ¦   «         Z ee¦  «         dS dS )a¿  Move string keys from the Android app's res/ to commons Compose resources.

Usage: tools/strings-migrate/migrate.py key1 key2 ...
       tools/strings-migrate/migrate.py @keylist.txt   (one key per line)

For the default locale and every values-* locale dir, each named
<string> or <plurals> element is removed from
  amethyst/src/main/res/<values*>/strings.xml
and appended (before </resources>) to
  commonsUI/src/commonMain/composeResources/<values*>/strings.xml
creating the commons locale file when a translation exists that commons
doesn't carry yet. Elements are moved verbatim (raw XML slice), so
escaping, CDATA and comments inside values survive byte-for-byte and
Crowdin sees a pure move.

Fails loudly when a key's default-locale value uses non-positional format
specifiers (bare %s / %d): compose-resources only formats the positional
%1$s form, so those keys must be rewritten (in code AND all locales)
before migrating. Run from the repo root.
é    N)Ú	STRING_ELÚfix_textÚstrip_android_only_attrszamethyst/src/main/resz)commonsUI/src/commonMain/composeResourcesz@<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
z,%%|%(?!\d+\$)[-#+ 0,(]*\d*(?:\.\d+)?[a-zA-Z]ÚtextÚreturnc                 ód   — t          d„ t                               | ¦  «        D ¦   «         ¦  «        S )z?True when text uses a non-positional conversion (bare %s / %d).c              3   óH   K  — | ]}|                      d ¦  «        dk    V — ŒdS )r   z%%N)Úgroup)Ú.0Úms     ú4/home/user/amethyst/tools/strings-migrate/migrate.pyú	<genexpr>zis_bare.<locals>.<genexpr>+   s1   è è € ÐFÐF aˆq�wŠw�q‰zŒz˜TÒ!ÐFÐFÐFÐFÐFÐFó    )ÚanyÚFORMAT_SPECÚfinditer)r   s    r   Úis_barer   )   s-   € åÐFÐF­;×+?Ò+?ÀÑ+EÔ+EÐFÑFÔFÑFÔFÐFr   Úkeyc                 óp   — t          j        dt          j        | ¦  «        z   dz   t           j        ¦  «        S )Nz([ \t]*<(string|plurals)\b[^>]*?\sname=\"z!\"[^>]*?(?:/>|>.*?</\1>)[ \t]*\n?)ÚreÚcompileÚescapeÚS)r   s    r   Úelement_patternr   .   s3   € õ Œ:Ø3µb´iÀ±n´nÑDÐGkÑkÝ
Œñô ð r   zQ[ \t]*<(string|plurals)\b[^>]*?\sname=\"([^\"]+)\"[^>]*?(?:/>|>.*?</\1>)[ \t]*\n?ÚpathÚkeysc                 ó  ‡— t           j                             | ¦  «        sg S t          | d¬¦  «                             ¦   «         }t          |¦  «        }i Šg }d}t                               |¦  «        D ]²}|                     d¦  «        |vs|                     d¦  «        ‰v rŒ1|                     d¦  «         	                    d¦  «        ‰|                     d¦  «        <   | 
                    |||                     ¦   «         …         ¦  «         |                     ¦   «         }Œ³‰sg S | 
                    ||d…         ¦  «         t          | dd¬¦  «                             d                     |¦  «        ¦  «         ˆfd	„|D ¦   «         S )
zÐRemove every element in `keys` from `path` in ONE pass.

    Returns them ordered by `keys`, matching what repeated extract() calls
    produced, so the appended block is byte-identical to the slow path.
    úutf-8©Úencodingr   é   ú
NÚwÚ c                 ó(   •— g | ]}|‰v ¯‰|         ‘ŒS © r&   )r   ÚkÚfounds     €r   ú
<listcomp>z extract_many.<locals>.<listcomp>X   s"   ø€ Ð1Ð1Ð1˜ a¨5 j jˆE�!ŒH j j jr   )Úosr   ÚexistsÚopenÚreadÚsetÚANY_ELEMENTr   r
   ÚstripÚappendÚstartÚendÚwriteÚjoin)r   r   ÚsrcÚwantedÚoutÚlastr   r(   s          @r   Úextract_manyr:   A   sn  ø€ õ Œ7�>Š>˜$ÑÔð Øˆ	Ý
ˆt˜gÐ
&Ñ
&Ô
&×
+Ò
+Ñ
-Ô
-€CÝ�‰YŒY€FØ€EØ
€CØ€DÝ×!Ò! #Ñ&Ô&ð ð ˆØ�7Š7�1‰:Œ:˜VÐ#Ð# q§w¢w¨q¡z¤z°UÐ':Ð':ØØŸGšG A™JœJ×,Ò,¨TÑ2Ô2ˆˆa�gŠg�a‰jŒjÑØ�
Š
�3�t˜aŸgšg™iœiÐ'Ô(Ñ)Ô)Ð)Ø�uŠu‰wŒwˆˆØð Øˆ	Ø‡J‚Jˆs�4�5�5ŒzÑÔÐÝˆˆs˜WÐ%Ñ%Ô%×+Ò+¨B¯GªG°C©L¬LÑ9Ô9Ð9Ø1Ð1Ð1Ð1˜dÐ1Ñ1Ô1Ð1r   c                 óÞ  — t           j                             | ¦  «        sdS t          | d¬¦  «                             ¦   «         }t          |¦  «                             |¦  «        }|sdS t          | dd¬¦  «                             |d|                     ¦   «         …         || 	                    ¦   «         d…         z   ¦  «         | 
                    d¦  «                             d¦  «        S )z@Remove key's element from path; return the element text or None.Nr   r   r#   r   r"   )r*   r   r+   r,   r-   r   Úsearchr4   r2   r3   r
   r0   )r   r   r6   r   s       r   Úextractr=   [   sÊ   € åŒ7�>Š>˜$ÑÔð ØˆtÝ
ˆt˜gÐ
&Ñ
&Ô
&×
+Ò
+Ñ
-Ô
-€CÝ˜ÑÔ×#Ò# CÑ(Ô(€AØð ØˆtÝˆˆs˜WÐ%Ñ%Ô%×+Ò+¨C°°!·'²'±)´)°Ô,<¸sÀ1Ç5Â5Á7Ä7À9À9¼~Ñ,MÑNÔNÐNØ�7Š7�1‰:Œ:×Ò˜DÑ!Ô!Ð!r   Úelementc                 óX   — t          j        d„ | ¦  «        } t          | ¦  «        d         S )av  Rewrite Android-only escaping that Compose resources do not understand.

    Compose resolves \uXXXX, \n and \t itself but leaves \', \", \? and \@
    alone, and renders Android's quote-wrapping literally. Moving an element verbatim
    therefore shipped `Don\'t have a Nostr account?` to the login screen. See
    fix_escapes.py, which repairs files already migrated.
    c                 óž   — |                       d¦  «        t          |                       d¦  «        ¦  «        z   |                       d¦  «        z   S )Né   r!   é   )r
   r   )r   s    r   ú<lambda>z"convert_escaping.<locals>.<lambda>o   s7   €  a§g¢g¨a¡j¤jµ8¸A¿GºGÀA¹J¼JÑ3GÔ3GÑ&GÈ!Ï'Ê'ÐRSÉ*Ì*Ñ&T€ r   r   )r   Úsubr   )r>   s    r   Úconvert_escapingrE   g   s-   € õ ŒmÐTÐTÐV]Ñ^Ô^€GÝ# GÑ,Ô,¨QÔ/Ð/r   Úelementsc                 óÞ  — t           j                             | ¦  «        r$t          | d¬¦  «                             ¦   «         }n:t          j        t           j                             | ¦  «        d¬¦  «         t          }|                     d¦  «        }d 	                    d„ |D ¦   «         ¦  «        }t          | dd¬¦  «         
                    |d |…         |z   ||d …         z   ¦  «         d S )	Nr   r   T)Úexist_okz</resources>r$   c              3   ód   K  — | ]+}d t          |                     ¦   «         ¦  «        z   dz   V — Œ,dS )z    r"   N)rE   r0   )r   Úels     r   r   zappend.<locals>.<genexpr>z   s=   è è € ÐTÐTÀR�FÕ-¨b¯hªh©j¬jÑ9Ô9Ñ9¸DÑ@ÐTÐTÐTÐTÐTÐTr   r#   )r*   r   r+   r,   r-   ÚmakedirsÚdirnameÚNEW_FILE_TEMPLATEÚrindexr5   r4   )r   rF   r6   ÚcloseÚblocks        r   r1   r1   s   sÔ   € Ý	„w‡~‚~�dÑÔð  Ý�4 'Ð*Ñ*Ô*×/Ò/Ñ1Ô1ˆˆå
Œ•B”G—O’O DÑ)Ô)°DÐ9Ñ9Ô9Ð9ÝˆØ�JŠJ�~Ñ&Ô&€EØ�GŠGÐTÐTÈ8ÐTÑTÔTÑTÔT€EÝˆˆs˜WÐ%Ñ%Ô%×+Ò+¨C°°°¬K¸%Ñ,?À#ÀeÀfÀfÄ+Ñ,MÑNÔNÐNÐNÐNr   c                 óŒ  — t           j                             t          dd¦  «        }t	          |d¬¦  «                             ¦   «         }| D ]z}t          |¦  «                             |¦  «        }|st          j	        d|› d|› �¦  «         t          |                     d¦  «        ¦  «        rt          j	        d|› d�¦  «         Œ{dgt          d	„ t          j        t          ¦  «        D ¦   «         ¦  «        z   }d}|D ]¡}t           j                             t          |d¦  «        }t          || ¦  «        }	|	rgt          t           j                             t           |d¦  «        |	¦  «         |t#          |	¦  «        z  }t%          |› d
t#          |	¦  «        › �¦  «         Œ¢t%          d|› dt#          |¦  «        › d�¦  «         d S )NÚvaluesústrings.xmlr   r   zERROR: key 'z' not found in r   zŸ' uses a non-positional format specifier (bare %s/%d).
compose-resources only formats %1$s-style args - rewrite the key (code + every locale) before migrating.c              3   óÊ   K  — | ]^}|                      d ¦  «        ¯t          j                             t          j                             t
          |d¦  «        ¦  «        ¯Z|V — Œ_dS )zvalues-rS   N)Ú
startswithr*   r   r+   r5   ÚAPP_RES)r   Úds     r   r   zmain.<locals>.<genexpr>�   sv   è è € ð &ð &Ø¨!¯,ª,°yÑ*AÔ*Að&ÝFHÄgÇnÂnÕUWÔU\×UaÒUaÕbiÐklÐn{ÑU|ÔU|ÑF}ÔF}ð&Ø	ð&ð &ð &ð &ð &ð &r   z: moved zdone: z elements across z locale dirs)r*   r   r5   rV   r,   r-   r   r<   ÚsysÚexitr   r
   ÚsortedÚlistdirr:   r1   ÚCOMMONS_RESÚlenÚprint)
r   Údefault_srcÚdefault_textr   r   Úlocale_dirsÚmoved_totalrW   Úsrc_pathrF   s
             r   Úmainrd   ~   sÙ  € Ý”'—,’,�w¨°-Ñ@Ô@€KÝ˜¨gÐ6Ñ6Ô6×;Ò;Ñ=Ô=€Làð 	ð 	ˆÝ˜CÑ Ô ×'Ò'¨Ñ5Ô5ˆØð 	GÝŒHÐE CÐEÐE¸ÐEÐEÑFÔFÐFÝ�1—7’7˜1‘:”:ÑÔð 	ÝŒHð:˜sð :ð :ð :ñô ð øð �*�vð &ð &Ý”:�gÑ&Ô&ð&ñ &ô &ñ  ô  ñ €Kð €KØð 1ð 1ˆÝ”7—<’<¥¨¨MÑ:Ô:ˆÝ ¨$Ñ/Ô/ˆØð 	1Ý•2”7—<’<¥¨Q°Ñ>Ô>ÀÑIÔIÐIØ�3˜x™=œ=Ñ(ˆKÝ�QÐ/Ð/¥ H¡¤Ð/Ð/Ñ0Ô0Ð0øÝ	Ð
O�;Ð
OÐ
Oµ°[Ñ1AÔ1AÐ
OÐ
OÐ
OÑPÔPÐPÐPÐPr   Ú__main__r!   rA   ú@r   r   )#Ú__doc__r*   r   rX   Úfix_escapesr   r   r   rV   r\   rM   r   r   ÚstrÚboolr   ÚPatternr   r   r/   Úlistr:   r=   rE   r1   rd   Ú__name__r]   ÚargvrY   ÚargsrU   r,   r-   Úsplitr&   r   r   ú<module>rq      s2  ððð ð( 
€	€	€	Ø 	€	€	€	Ø 
€
€
€
à EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ Eà
!€Ø9€àYÐ ð ˆbŒjÐHÑIÔI€ðG�#ð G˜$ð Gð Gð Gð Gð
˜ð  ¤ð ð ð ð ð ˆbŒjØXØ„Dñô €ð2�sð 2 $ð 2ð 2ð 2ð 2ð4	"�#ð 	"˜Cð 	"ð 	"ð 	"ð 	"ð	0˜cð 	0 cð 	0ð 	0ð 	0ð 	0ðO�ð O ð Oð Oð Oð OðQð Qð Qð< ˆzÒÐØ
€sˆ3Œ8�}„}�qÒÐØˆŒ�ÑÔÐØŒ8�A�B�BŒ<€DØ
€sˆ4�y„y�A‚~€~˜$˜qœ'×,Ò,¨SÑ1Ô1€~Øˆt�D˜”G˜A˜B˜B”K¨'Ð2Ñ2Ô2×7Ò7Ñ9Ô9×?Ò?ÑAÔAˆØ€Dˆ�J„J€J€J€Jð Ðr   