o
    mi                     @  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r)ddl
mZmZ dZded	< d
Zded< dddZddddZdS )z
babel.messages.mofile
~~~~~~~~~~~~~~~~~~~~~

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

:copyright: (c) 2013-2026 by the Babel Team.
:license: BSD, see LICENSE for more details.
    )annotationsN)TYPE_CHECKING)CatalogMessage)SupportsReadSupportsWritel   * intLE_MAGICl   $< BE_MAGICfileobjSupportsRead[bytes]returnr   c                   sF  t   i }t| dd}|  }t|}tj}|d|dd d }|tkr5|d|dd \}}}	}
d	}n|tkrI|d
|dd \}}}	}
d}ntdd|t	|D ]}||||	|	d  \}}|| }||||
|
d  \}}|| }||k r||k r||| }||| }ntdd||dkrd }}|
 D ]0}| }|sqd|v r|dd\}}|   }}| ||< q|r||  d| 7  < qd|v r|d\}}nd}d|v r|d}|d} fdd|D } fdd|D }n| j}| j}t|||d |< |	d7 }	|
d7 }
qS|  _ 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                      g | ]}|  jqS  decodecharset.0xcatalogr   O/home/kim/smarthome/.venv/lib/python3.10/site-packages/babel/messages/mofile.py
<listcomp>]       zread_mo.<locals>.<listcomp>c                   r   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   sf   




rF   FSupportsWrite[bytes]r!   	use_fuzzyboolNonec              
     s  t  }fdd|dd D |dd< |  d }}g }|D ]z}|jrad fdd|jD }g }	t|jD ]\}
}|sN|	|jtt	|
d  q:|	| q:d fd	d|	D }n|j
 j}|j
 j}|jr~d
|j
 j|g}|t|t|t|t|f ||d 7 }||d 7 }q!d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(('bar', 'baz'), ('Bahr', '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')
    'Voh'
    >>> translations.ungettext('bar', 'baz', 1)
    'Bahr'
    >>> translations.ungettext('bar', 'baz', 2)
    'Batz'
    >>> translations.ugettext('fuz')
    'fuz'
    >>> translations.ugettext('Fizz')
    'Fizz'
    >>> translations.ugettext('Fuzz')
    'Fuzz'
    >>> translations.ugettext('Fuzzes')
    '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)rH   r   r"   r#      s     zwrite_mo.<locals>.<listcomp>r   N    r   c                 3      | ]	}|  jV  qd S Nencoder   )r   msgidr    r   r"   	<genexpr>       zwrite_mo.<locals>.<genexpr>c                 3  rN   rO   rP   )r   msgstrr    r   r"   rS      rT   r         ZIiiiiiir   r   i)listsortZpluralizablejoinid	enumeraterK   appendminr   rQ   r   r%   r(   r)   packr	   writearraytobytes)r   r!   rH   messagesZidsstrsoffsetsmessagerR   ZmsgstrsidxrK   rU   ZkeystartZ
valuestartZkoffsetsZvoffsetsZo1l1o2l2headerr   )r!   rH   r"   write_mol   sP   0""*rm   )r   r   r   r   )F)r   rG   r!   r   rH   rI   r   rJ   )__doc__
__future__r   rb   r)   typingr   Zbabel.messages.catalogr   r   Z	_typeshedr   r   r	   __annotations__r
   rF   rm   r   r   r   r"   <module>   s    

R