
    Mha                        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ZdddZdS )z
    babel.messages.mofile
    ~~~~~~~~~~~~~~~~~~~~~

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

    :copyright: (c) 2013-2025 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                   t                      i }t          | dd          }|                                 }t          |          }t          j        } |d|dd                   d         }|t          k    r |d|dd                   \  }}}	}
d	}n8|t          k    r |d
|dd                   \  }}}	}
d}nt          dd|          t          |          D ]} ||||	|	dz                      \  }}||z   } ||||
|
dz                      \  }}||z   }||k     r||k     r|||         }|||         }nt          dd|          |dk    rdx}}|
                                D ]}|                                }|sd|v rY|                    dd          \  }}|                                                                x}}|                                ||<   v|r||xx         d|z   z  cc<   d|v r|                    d          \  }}nd}d|v rG|                    d          }|                    d          }fd|D             }fd|D             }n4|                    j                  }|                    j                  }t!          |||          |<   |	dz  }	|
dz  }
|                                _        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                D    g | ]}|                     j                  S  decodecharset.0xcatalogs     U/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/babel/messages/mofile.py
<listcomp>zread_mo.<locals>.<listcomp>\   s'    :::188GO,,:::    c                D    g | ]}|                     j                  S r   r   r   s     r#   r$   zread_mo.<locals>.<listcomp>]   s'    <<<!AHHW_--<<<r%   )context)r   getattrreadlenstructunpackr
   r   OSErrorrange
splitlinesstripsplitlowerr   r   r   itemsmime_headers)r   headersfilenamebufbuflenr,   magicversionmsgcountorigidxtransidxii_imlenmoffmendtlentofftendmsgtmsglastkeykeyitemvaluectxtr"   s                             @r#   read_morM      s:    iiGGw++H
,,..CXXF]F F4RaR!!!$E/5veS2Y/G/G,7H	(		/5veS2Y/G/G,7Ha+X666 Hoo + +VBGGaK$7 899
dd{VBHX\$9 :;;
dd{&==TF]]d4i.CtDy>DD!.999 199  Gc)) 	5 	5zz|| 4<<!%D!!4!4JC$'IIKK$5$5$7$77Gc#(;;==GCLL 5G$$$4$$$c>>		'**ID##Dc>>))G$$C::g&&D::::c:::C<<<<t<<<DD**W_--C;;w//DsD$777 	1A"==??GNr%   FSupportsWrite[bytes]r"   	use_fuzzyboolNonec                |   t                    }fd|dd         D             |dd<   |                                 dx}}g }|D ]}|j        rd                    fd|j        D                       }g }	t          |j                  D ]X\  }
}|s<|	                    |j        t          t          |
          d                              C|	                    |           Yd                    fd|	D                       }n>|j        
                    j                  }|j        
                    j                  }|j        r4d                    |j        
                    j                  |g          }|                    t          |          t          |          t          |          t          |          f           ||dz   z  }||dz   z  }d	d
t          |          z  z   }|t          |          z   }g }g }|D ]\  }}}}||||z   gz  }||||z   gz  }||z   }|                     t          j        dt"          dt          |          d	d	t          |          dz  z   dd          t$          j                            t%          j        d|                    z   |z   |z              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                4    g | ]}|j         	s|j        |S r   )stringfuzzy)r    mrO   s     r#   r$   zwrite_mo.<locals>.<listcomp>   sJ     @ @ @!x@%.@67g@A @ @ @r%   r   Nr%   r   c                D    g | ]}|                     j                  S r   encoder   )r    msgidr"   s     r#   r$   zwrite_mo.<locals>.<listcomp>   s4     " " "27W_--" " "r%   c                D    g | ]}|                     j                  S r   rX   )r    msgstrr"   s     r#   r$   zwrite_mo.<locals>.<listcomp>   s4     # # #39go..# # #r%   r         Iiiiiiir   r   i)listsortpluralizablejoinid	enumeraterT   appendminr	   rY   r   r'   r*   writer+   packr
   arraytobytes)r   r"   rO   messagesidsstrsoffsetsmessagerZ   msgstrsidxrT   r\   keystart
valuestartkoffsetsvoffsetso1l1o2l2s    ``                  r#   write_mor|   k   sB   ` G}}H@ @ @ @x| @ @ @HQRRLMMOOOC$G ! !  	<LL " " " ";B:" " "  E G(88 + +V +NN7:c#c((A.>.>#?@@@@NN6****\\ # # # #=D# # #  FF J%%go66E^**7?;;F? 	*LL'/"8"8"I"I"'") * *EC#e**c$iiVEFFFuw   rCMM))HCHH$J HH! * *BBRh''Rj))!GMM&+i&!(mm##c(mma&77    #(+"5"5ek#w6O6O"P"PQ TWW Z^^ _ _ _ _ _r%   )r   r   r   r   )F)r   rN   r"   r   rO   rP   r   rQ   )__doc__
__future__r   rk   r+   typingr   babel.messages.catalogr   r   	_typeshedr   r   r
   __annotations__r   rM   r|   r   r%   r#   <module>r      s      # " " " " "               3 3 3 3 3 3 3 3 655555555        O O O Odg_ g_ g_ g_ g_ g_ g_r%   