o
    ä›eÂ  ã                   @   s¢   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	Z	ddlZej
d dkr-eZdZedfedfedfed	fed
fedfedfdœZG dd„ deƒZdS )z:Class to show and manipulate user fields in odf documents.é    N)ÚUserFieldDecl)ÚOFFICENS)Úloadé   zutf-8Úvaluez
date-valuez
time-valuezboolean-valuezstring-value)ÚfloatÚ
percentageÚcurrencyÚdateÚtimeÚbooleanÚstringc                   @   sd   e Zd ZdZdZdZddd„Zdd„ Zdd„ Zd	d
„ Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )Ú
UserFieldsz&List, view and manipulate user fields.Nc                 C   s–   |dks dt |ƒv s dt |ƒv s dt |ƒv s t|ƒtdƒks J ‚|dks@dt |ƒv s@dt |ƒv s@dt |ƒv s@t|ƒtdƒks@J ‚|| _|| _d| _dS )a  Constructor

        @param src open file in binary mode: source document,
        or filename as a unicode string, or None for stdin.
        @param dest opendile in binary mode: destination document,
        or filename as a unicode string, or None for stdout.
        NÚrbÚBufferedReaderÚBytesIOÚ ÚwbÚBufferedWriter)ÚreprÚtypeÚsrc_fileÚ	dest_fileÚdocument)ÚselfÚsrcÚdest© r   ú@/var/www/html/venv/lib/python3.10/site-packages/odf/userfield.pyÚ__init__9   s
   @@
zUserFields.__init__c                 C   s€   t jd dkrt| jtƒs!t| jtjƒs!t jd dkr/t| jtƒr/t 	| j¡s.t
d| j ƒ‚n	| jd u r8t j| _t| jƒ| _d S )Nr   r   é   z%s is no odt file.)ÚsysÚversion_infoÚ
isinstancer   ÚstrÚioÚIOBaseÚ
basestringÚzipfileÚ
is_zipfileÚ	TypeErrorÚstdinr   r   ©r   r   r   r   ÚloaddocG   s   Bÿ
zUserFields.loaddocc                 C   s,   | j d u r| j d¡ d S | j | j ¡ d S )Nú-)r   r   Úsaver,   r   r   r   ÚsavedocR   s   
zUserFields.savedocc                 C   s   dd„ |   ¡ D ƒS )zlList (extract) all known user-fields.

        @return list of user-field names as unicode strings.
        c                 S   ó   g | ]}|d  ‘qS )r   r   ©Ú.0Úxr   r   r   Ú
<listcomp>_   ó    z*UserFields.list_fields.<locals>.<listcomp>©Úlist_fields_and_valuesr,   r   r   r   Úlist_fieldsZ   s   zUserFields.list_fieldsc                 C   sx   |   ¡  g }| j t¡}|D ]+}| d¡}|dkr| d¡}n| d¡}| d¡}|du s1||v r9| |||f¡ q|S )a(  List (extract) user-fields with type and value.

        @param field_names list of field names as unicode strings
        to show, or None for all.

        @return list of tuples (<field name>, <field type>, <value>)
        as type (unicode string, stringified type, unicode string).

        Ú	valuetyper   Ústringvaluer   ÚnameN)r-   r   ÚgetElementsByTyper   ÚgetAttributeÚappend)r   Úfield_namesÚfound_fieldsÚ
all_fieldsÚfÚ
value_typer   Ú
field_namer   r   r   r8   a   s    



þ€z!UserFields.list_fields_and_valuesc                 C   s   dd„ |   |¡D ƒS )z¿Extract the contents of given field names from the file.

        @param field_names list of field names as unicode strings

        @return list of field values as unicode strings.

        c                 S   r1   )r    r   r2   r   r   r   r5   „   r6   z*UserFields.list_values.<locals>.<listcomp>r7   )r   r@   r   r   r   Úlist_values|   s   zUserFields.list_valuesc                 C   s0   t |ƒt dƒks
J ‚|  |g¡}|sdS |d S )zÆExtract the contents of this field from the file.
        @param field_name unicode string: name of a field
        @return field value as a unicode string or None if field does not exist.

        r   Nr   )r   rF   )r   rE   Úvaluesr   r   r   Úget†   s
   zUserFields.getc                 C   s>   t |ƒt dƒks
J ‚|  |g¡}|sdS |d \}}}||fS )zòExtract the type and contents of this field from the file.
        @param field_name unicode string: name of a field
        @return tuple (<type>, <field-value>) as a pair of unicode strings
        or None if field does not exist.

        r   Nr   )r   r8   )r   rE   ÚfieldsrD   r   r   r   r   Úget_type_and_value’   s   zUserFields.get_type_and_valuec                 C   sr   |   ¡  | j t¡}|D ]&}| d¡}||v r2| d¡}| |¡}|dkr,| d|¡ q| d|¡ q|  ¡  dS )z¤Set the value of user fields. The field types will be the same.

        data ... dict, with field name as key, field value as value

        Returns None

        r<   r:   r   r;   r   N)r-   r   r=   r   r>   rH   ÚsetAttributer0   )r   ÚdatarB   rC   rE   rD   r   r   r   r   Úupdate    s   


€zUserFields.update)NN)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r-   r0   r9   r8   rF   rH   rJ   rM   r   r   r   r   r   2   s    


r   )rQ   r!   r(   Úodf.textr   Úodf.namespacesr   Úodf.opendocumentr   r%   r"   r$   ÚunicodeÚOUTENCODINGÚVALUE_TYPESÚobjectr   r   r   r   r   Ú<module>   s&   ù