§
    –ë®j¤  ã                   óš  — d Z ddlZddlZddlZ ej        dej        ¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z	dde
d	ed
e
fd„Zde
d
efd„Zdde
d	ed
efd„Zdd„Zedk    rNd„ ej        dd…         D ¦   «         Z ee¦  «        dk     r ej        e ¦  «          eedej        v¬¦  «         dS dS )uâ  Convert Android string-resource escaping to what Compose resources understand.

Android's aapt and Compose Multiplatform do NOT share escaping rules. Moving a
strings.xml from `res/values/` to `composeResources/values/` verbatim therefore
renders some strings wrong -- the login screen showed `Don\'t have a Nostr account?`
with a literal backslash.

Compose 1.11.1 `handleSpecialCharacters` (compose-gradle-plugin) resolves ONLY:

    \uXXXX, \n, \t     and collapses \\ -> \

It does not handle these Android conventions, so this script applies them itself:

    \'  -> '        \"  -> "        \?  -> ?        \@  -> @
    "â€¦"  -> â€¦        (Android wraps a value in quotes to preserve leading/trailing
                      spaces; Compose would render the quotes literally)

\n, \t, \uXXXX and \\ are deliberately left alone -- Compose already resolves
them, and converting them here would double-process.

Usage:  fix_escapes.py <file-or-dir> [...]        (idempotent; safe to re-run)
é    Nz3(<(?:string|item)\b[^>]*>)(.*?)(</(?:string|item)>)z\s+tools:[\w.-]+="[^"]*"z\s+xmlns:tools="[^"]*"z(?<!\\)\\(['\"?@])TÚtextÚunwrap_quotesÚreturnc                 óÊ   — |rGt          | ¦  «        dk    r4|                      d¦  «        r|                      d¦  «        r
| dd…         } t                               d| ¦  «        S )a²  Convert one element's text.

    NOTE: quote-unwrapping is NOT idempotent and must run exactly once per file, at
    migration time. Android wraps a value in quotes to protect whitespace, but after
    `"` has been converted to `"` a legitimately quoted value is indistinguishable
    from a wrapped one -- a second pass strips the real quotes. Repair runs over
    already-migrated files must therefore pass unwrap_quotes=False.
    é   ú"é   éÿÿÿÿz\1)ÚlenÚ
startswithÚendswithÚANDROID_ONLYÚsub)r   r   s     ú8/home/user/amethyst/tools/strings-migrate/fix_escapes.pyÚfix_textr   (   s^   € ð ð �˜T™œ aš˜¨D¯OªO¸CÑ,@Ô,@˜ÀTÇ]Â]ÐSVÑEWÔEW˜Ø�A�b�DŒzˆÝ×Ò˜E 4Ñ(Ô(Ð(ó    Úsrcc                 óˆ   — t                                d| ¦  «        \  }}t                               d|¦  «        \  }}|||z   fS )zFDrop `tools:` attributes (and any xmlns:tools) that mean nothing here.Ú )Ú
TOOLS_ATTRÚsubnÚTOOLS_NS)r   ÚoutÚnÚms       r   Ústrip_android_only_attrsr   6   s>   € å�_Š_˜R Ñ%Ô%�F€CˆÝ�]Š]˜2˜sÑ#Ô#�F€CˆØ��A‘ˆ:Ðr   Úpathc                 ó  ‡‡— t          | d¬¦  «                             ¦   «         }dŠˆˆfd„}t                               ||¦  «        }t	          |¦  «        \  }}‰|z  Š‰r%t          | dd¬¦  «                             |¦  «         ‰S )Nzutf-8)Úencodingr   c                 óâ   •— t          |                      d¦  «        ‰¦  «        }||                      d¦  «        k    r‰dz  Š|                      d¦  «        |z   |                      d¦  «        z   S )Nr   r	   é   )r   Úgroup)r   ÚfixedÚchangedr   s     €€r   Úreplzfix_file.<locals>.replA   s^   ø€ å˜Ÿš ™œ ]Ñ3Ô3ˆØ�A—G’G˜A‘J”JÒÐØ�q‰LˆGØ�wŠw�q‰zŒz˜EÑ! A§G¢G¨A¡J¤JÑ.Ð.r   Úw)ÚopenÚreadÚ	STRING_ELr   r   Úwrite)r   r   r   r%   r   Ústrippedr$   s    `    @r   Úfix_filer,   =   s¥   øø€ Ý
ˆt˜gÐ
&Ñ
&Ô
&×
+Ò
+Ñ
-Ô
-€CØ€Gð/ð /ð /ð /ð /ð /õ �-Š-˜˜cÑ
"Ô
"€CÝ,¨SÑ1Ô1�M€CˆØˆxÑ€GØð 5ÝˆT�3 Ð)Ñ)Ô)×/Ò/°Ñ4Ô4Ð4Ø€Nr   c           	      óp  ‡
— dx}}| D ]—}g }t           j                             |¦  «        r-t          j        |¦  «        D ]\  Š
}}|ˆ
fd„|D ¦   «         z  }Œn|g}t	          |¦  «        D ]4}t          ||¦  «        }	|	r |dz  }||	z  }t          d|› d|	› d�¦  «         Œ5Œ˜t          d|› d|› d	�¦  «         d S )
Nr   c                 óz   •— g | ]7}|                      d ¦  «        ¯t          j                             ‰|¦  «        ‘Œ8S )z.xml)r   Úosr   Újoin)Ú.0r   Úroots     €r   ú
<listcomp>zmain.<locals>.<listcomp>V   s:   ø€ ÐUÐUÐU°AÀ!Ç*Â*ÈVÑBTÔBTÐU�"œ'Ÿ,š, t¨QÑ/Ô/ÐUÐUÐUr   r	   z  z: z entriesz
fixed z entries across z files)r/   r   ÚisdirÚwalkÚsortedr,   Úprint)Úpathsr   Útotal_filesÚtotal_entriesÚpÚfilesÚ_ÚnamesÚfr   r2   s             @r   Úmainr@   P   s  ø€ Ø"#Ð#€K�-Øð -ð -ˆØˆÝŒ7�=Š=˜ÑÔð 	Ý"$¤'¨!¡*¤*ð Vð V‘��a˜ØÐUÐUÐUÐU¸ÐUÑUÔUÑU��ðVð �CˆEÝ˜‘”ð 	-ð 	-ˆAÝ˜˜MÑ*Ô*ˆAØð -Ø˜qÑ �Ø Ñ"�ÝÐ+˜1Ð+Ð+ Ð+Ð+Ð+Ñ,Ô,Ð,øð	-õ 
Ð
G�]Ð
GÐ
G°KÐ
GÐ
GÐ
GÑHÔHÐHÐHÐHr   Ú__main__c                 ó   — g | ]
}|d k    ¯|‘ŒS )ú--no-unwrap-quotes© )r1   Úas     r   r3   r3   c   s#   € ÐAÐAÐA�! qÐ,@Ò'@Ð'@ˆAÐ'@Ð'@Ð'@r   r	   rC   )r   )T)Ú__doc__ÚreÚsysr/   ÚcompileÚSr)   r   r   r   ÚstrÚboolr   Útupler   Úintr,   r@   Ú__name__ÚargvÚargsr   ÚexitrD   r   r   ú<module>rS      sˆ  ððð ð, 
€	€	€	Ø 
€
€
€
Ø 	€	€	€	àˆBŒJÐMÈrÌtÑTÔT€	ð ˆRŒZÐ3Ñ4Ô4€
Øˆ2Œ:Ð/Ñ0Ô0€àˆrŒzÐ/Ñ0Ô0€ð)ð )�3ð ) tð )°sð )ð )ð )ð )ð #ð ¨%ð ð ð ð ðð �3ð  tð °sð ð ð ð ð&Ið Ið Ið Ið$ ˆzÒÐØAÐA�s”x   ”|ÐAÑAÔA€DØ
€sˆ4�y„y�1‚}€}ØˆŒ�ÑÔÐØ€DˆÐ1¸¼ÐAÐBÑBÔBÐBÐBÐBð	 Ðr   