a
    ÇZEg±  ã                   @  s”   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m	Z	 erRddl
mZmZ dZded	< d
Zded< dddœdd„Zddddddœdd„ZdS )zÝ
    babel.messages.mofile
    ~~~~~~~~~~~~~~~~~~~~~

    Writing of files in the ``gettext`` MO (machine object) format.

    :copyright: (c) 2013-2024 by the Babel Team.
    :license: BSD, see LICENSE for more details.
é    )ÚannotationsN)ÚTYPE_CHECKING)ÚCatalogÚMessage)ÚSupportsReadÚSupportsWritel   Þ* ÚintÚLE_MAGICl   •$< ÚBE_MAGICzSupportsRead[bytes]r   )ÚfileobjÚreturnc                   sl  t ƒ ‰ i }t| ddƒ}|  ¡ }t|ƒ}tj}|d|dd… ƒd }|tkrj|d|dd… ƒ\}}}	}
d	}n4|tkr’|d
|dd… ƒ\}}}	}
d}ntdd|ƒ‚t	|ƒD �]´}||||	|	d … ƒ\}}|| }||||
|
d … ƒ\}}|| }||k �r||k �r|||… }|||… }ntdd|ƒ‚|dk�r°d }}| 
¡ D ]j}| ¡ }|�sZ�qDd|v �r’| dd¡\}}| ¡  ¡  }}| ¡ ||< n|�rD||  d| 7  < �qDd|v �rÊ| d¡\}}nd}d|v �r| d¡}| d¡}ˆ j�r:‡ fdd„|D ƒ}‡ fdd„|D ƒ}n ˆ j�r:| ˆ j¡}| ˆ j¡}t|||d�ˆ |< |	d7 }	|
d7 }
q¦| ¡ ˆ _ˆ S )aa  Read a binary MO file from the given file-like object and return a
    corresponding `Catalog` object.

    :param fileobj: the file-like object to read the MO file from

    :note: The implementation of this function is heavily based on the
           ``GNUTranslations._parse`` method of the ``gettext`` module in the
           standard library.
    ÚnameÚ z<INé   r   z<4Ié   z<IIz>4Iz>IIzBad magic numberé   zFile is corruptó   :é   ó   
ó   ó    c                   s   g | ]}|  ˆ j¡‘qS © ©ÚdecodeÚcharset©Ú.0Úx©Úcatalogr   úN/var/www/sistema_ama/venv/lib/python3.9/site-packages/babel/messages/mofile.pyÚ
<listcomp>]   ó    zread_mo.<locals>.<listcomp>c                   s   g | ]}|  ˆ j¡‘qS r   r   r   r   r   r    r!   ^   r"   )Úcontext)r   ÚgetattrÚreadÚlenÚstructÚunpackr	   r
   ÚOSErrorÚrangeÚ
splitlinesÚstripÚsplitÚlowerr   r   r   ÚitemsZmime_headers)r   ÚheadersÚfilenameÚbufÚbuflenr(   ÚmagicÚversionÚmsgcountZorigidxÚtransidxÚiiZ_iÚmlenÚmoffÚmendÚtlenÚtoffÚtendÚmsgÚtmsgZlastkeyÚkeyÚitemÚvalueZctxtr   r   r    Úread_mo   sh    








rD   FzSupportsWrite[bytes]ÚboolÚNone)r   r   Ú	use_fuzzyr   c                   sæ  t ˆ ƒ}‡fdd„|dd… D ƒ|dd…< | ¡  d }}g }|D ]ô}|jrÂd ‡ fdd„|jD ƒ¡}g }	t|jƒD ]2\}
}|sœ|	 |jtt	|
ƒdƒ ¡ qt|	 |¡ qtd ‡ fdd„|	D ƒ¡}n|j 
ˆ j¡}|j 
ˆ j¡}|jrüd	 |j 
ˆ j¡|g¡}| t|ƒt|ƒt|ƒt|ƒf¡ ||d 7 }||d 7 }qBd
dt|ƒ  }|t|ƒ }g }g }|D ].\}}}}|||| g7 }|||| g7 }�q`|| }|  t dtdt|ƒd
d
t|ƒd  dd¡tj t d|¡¡ | | ¡ dS )a¨  Write a catalog to the specified file-like object using the GNU MO file
    format.

    >>> import sys
    >>> from babel.messages import Catalog
    >>> from gettext import GNUTranslations
    >>> from io import BytesIO

    >>> catalog = Catalog(locale='en_US')
    >>> catalog.add('foo', 'Voh')
    <Message ...>
    >>> catalog.add((u'bar', u'baz'), (u'Bahr', u'Batz'))
    <Message ...>
    >>> catalog.add('fuz', 'Futz', flags=['fuzzy'])
    <Message ...>
    >>> catalog.add('Fizz', '')
    <Message ...>
    >>> catalog.add(('Fuzz', 'Fuzzes'), ('', ''))
    <Message ...>
    >>> buf = BytesIO()

    >>> write_mo(buf, catalog)
    >>> x = buf.seek(0)
    >>> translations = GNUTranslations(fp=buf)
    >>> if sys.version_info[0] >= 3:
    ...     translations.ugettext = translations.gettext
    ...     translations.ungettext = translations.ngettext
    >>> translations.ugettext('foo')
    u'Voh'
    >>> translations.ungettext('bar', 'baz', 1)
    u'Bahr'
    >>> translations.ungettext('bar', 'baz', 2)
    u'Batz'
    >>> translations.ugettext('fuz')
    u'fuz'
    >>> translations.ugettext('Fizz')
    u'Fizz'
    >>> translations.ugettext('Fuzz')
    u'Fuzz'
    >>> translations.ugettext('Fuzzes')
    u'Fuzzes'

    :param fileobj: the file-like object to write to
    :param catalog: the `Catalog` instance
    :param use_fuzzy: whether translations marked as "fuzzy" should be included
                      in the output
    c                   s    g | ]}|j rˆ s|js|‘qS r   )ÚstringZfuzzy)r   Úm)rG   r   r    r!   ž   s   ÿzwrite_mo.<locals>.<listcomp>r   Nr"   r   c                   s   g | ]}|  ˆ j¡‘qS r   ©Úencoder   )r   Úmsgidr   r   r    r!   ©   s   c                   s   g | ]}|  ˆ j¡‘qS r   rJ   )r   Úmsgstrr   r   r    r!   ²   s   r   é   é   ZIiiiiiir   r   Úi)ÚlistÚsortZpluralizableÚjoinÚidÚ	enumeraterH   ÚappendÚminr   rK   r   r#   r&   Úwriter'   Úpackr	   ÚarrayÚtobytes)r   r   rG   ÚmessagesÚidsÚstrsÚoffsetsÚmessagerL   ZmsgstrsÚidxrH   rM   ZkeystartZ
valuestartZkoffsetsZvoffsetsZo1Úl1Zo2Úl2r   )r   rG   r    Úwrite_mom   sb    0"ÿÿ
ÿ"
úùùùrd   )F)Ú__doc__Ú
__future__r   rZ   r'   Útypingr   Zbabel.messages.catalogr   r   Z	_typeshedr   r   r	   Ú__annotations__r
   rD   rd   r   r   r   r    Ú<module>   s   	T