o
    թZhF                      @  s   d dl mZ d dlmZmZ d dlZd dlmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlZd dlmZ d dlmZ erHd d	lmZ d d
lmZ eed dG dd ded ZdS )    )annotations)TYPE_CHECKINGcastN)FilePath
ReadBufferScalarStorageOptions)import_optional_dependency)doc)_shared_docs)BaseExcelReaderOpenDocument)NaTTypestorage_options)r   c                      s   e Zd Z		d-d. fd
dZed/ddZd0ddZed1ddZed2ddZd3ddZ	d4ddZ
	d5d6d"d#Zd7d$d%Zd7d&d'Zd8d)d*Zd1d+d,Z  ZS )9	ODFReaderNfilepath_or_bufferFilePath | ReadBuffer[bytes]r   StorageOptions | Noneengine_kwargsdict | NonereturnNonec                   s   t d t j|||d dS )aF  
        Read tables out of OpenDocument formatted files.

        Parameters
        ----------
        filepath_or_buffer : str, path to be parsed or
            an open readable stream.
        {storage_options}
        engine_kwargs : dict, optional
            Arbitrary keyword arguments passed to excel engine.
        Zodf)r   r   N)r	   super__init__)selfr   r   r   	__class__ Q/var/www/html/lang_env/lib/python3.10/site-packages/pandas/io/excel/_odfreader.pyr       s   
zODFReader.__init__type[OpenDocument]c                 C  s   ddl m} |S )Nr   r   )odf.opendocumentr   )r   r   r   r   r   _workbook_class8   s   zODFReader._workbook_classr   c                 C  s   ddl m} ||fi |S )Nr   )load)r!   r#   )r   r   r   r#   r   r   r   load_workbook>   s   zODFReader.load_workbookstrc                 C  s   dS )z'Property for compat with other readers. r   )r   r   r   r   empty_valueE   s   zODFReader.empty_value	list[str]c                 C  s&   ddl m} | j|}dd |D S )z4Return a list of sheet names present in the documentr   Tablec                 S  s   g | ]}| d qS )name)getAttribute).0tr   r   r   
<listcomp>P   s    z)ODFReader.sheet_names.<locals>.<listcomp>)	odf.tabler*   bookgetElementsByType)r   r*   tablesr   r   r   sheet_namesJ   s   zODFReader.sheet_namesindexintc                 C  s*   ddl m} | | | j|}|| S )Nr   r)   )r0   r*   Zraise_if_bad_sheet_by_indexr1   r2   )r   r5   r*   r3   r   r   r   get_sheet_by_indexR   s   
zODFReader.get_sheet_by_indexr+   c                 C  sZ   ddl m} | | | j|}|D ]}|d|kr |  S q|   td| d)Nr   r)   r+   zsheet z
 not found)r0   r*   Zraise_if_bad_sheet_by_namer1   r2   r,   close
ValueError)r   r+   r*   r3   tabler   r   r   get_sheet_by_nameY   s   
zODFReader.get_sheet_by_namefile_rows_needed
int | Nonelist[list[Scalar | NaTType]]c                   s  ddl m}m}m} | j}| j}||h ||}d}	d}
g }|D ]} fdd|jD }d}g |D ]2}|j|krB| |}n| j}| 	|}|| jkrT||7 }q5
| jg|  d}
|g|  q5|
tk rrt}
| |}tdkr|	|7 }	n|
| jgg|	  d}	|
fddt|D  |durt||kr nq#|D ]}t||
k r|
| jg|
t|   q|S )z9
        Parse an ODF Table into a list of lists
        r   )CoveredTableCell	TableCellTableRowc                   s$   g | ]}t |d r|j v r|qS )qname)hasattrrB   )r-   x)
cell_namesr   r   r/   }   s    
z,ODFReader.get_sheet_data.<locals>.<listcomp>c                 3  s    | ]} V  qd S Nr   )r-   _)	table_rowr   r   	<genexpr>   s    z+ODFReader.get_sheet_data.<locals>.<genexpr>N)r0   r?   r@   rA   rB   r2   
childNodes_get_cell_valuer'   _get_column_repeatextendlen_get_row_repeatrange)r   Zsheetr<   r?   r@   rA   Zcovered_cell_nameZtable_cell_nameZ
sheet_rowsZ
empty_rowsZmax_row_lenr:   Z	sheet_rowZsheet_cellsZempty_cellsZ
sheet_cellvalueZcolumn_repeatZ
row_repeatrowr   )rE   rH   r   get_sheet_dataf   sP   







zODFReader.get_sheet_datac                 C  "   ddl m} t|j|dfdS )z
        Return number of times this row was repeated
        Repeating an empty row appeared to be a common way
        of representing sparse rows in the table.
        r   TABLENSznumber-rows-repeated   odf.namespacesrV   r6   
attributesget)r   rR   rV   r   r   r   rO      s   zODFReader._get_row_repeatc                 C  rT   )Nr   rU   znumber-columns-repeatedrW   rX   )r   cellrV   r   r   r   rL      s   zODFReader._get_column_repeatScalar | NaTTypec                 C  s:  ddl m} t|dkrtjS |j|df}|dkr%t|dkr#dS dS |d u r,| jS |d	krFt|j|d
f}t	|}||krD|S |S |dkrV|j|d
f}t|S |dkr_| 
|S |dkro|j|d
f}t|S |dkr|j|df}t|S |dkrtt|}tt| S |   td| )Nr   )OFFICENSz#N/Az
value-typebooleanTRUETFfloatrQ   
percentagestringcurrencydatez
date-valuetimezUnrecognized type )rY   r^   r%   npnanrZ   r[   r'   ra   r6   _get_cell_string_valuepd	Timestampr   r   rf   r8   r9   )r   r\   r^   Z	cell_typeZ
cell_valuevalZstampr   r   r   rK      s@   

zODFReader._get_cell_valuec                 C  s   ddl m} ddlm} ddlm} ddlm} | j}| j}g }|j	D ]8}	t
|	|rS|	j|krDt|	j|dfd}
|d|
  q%|	j|krJq%|| |	 q%|t|	d	 q%d
|S )z
        Find and decode OpenDocument text:s tags that represent
        a run length encoded sequence of space characters.
        r   )Element)TEXTNS)
Annotation)ScrW    
r&   )Zodf.elementrm   rY   rn   Z
odf.officero   Zodf.textrp   rB   rJ   
isinstancer6   rZ   r[   appendri   r%   stripjoin)r   r\   rm   rn   ro   rp   Zoffice_annotationZtext_srQ   fragmentspacesr   r   r   ri      s"   




z ODFReader._get_cell_string_value)NN)r   r   r   r   r   r   r   r   )r   r    )r   r   r   r   )r   r%   )r   r(   )r5   r6   )r+   r%   rF   )r<   r=   r   r>   )r   r6   )r   r]   )__name__
__module____qualname__r   propertyr"   r$   r'   r4   r7   r;   rS   rO   rL   rK   ri   __classcell__r   r   r   r   r      s&    



D


'r   r   )
__future__r   typingr   r   numpyrg   Zpandas._typingr   r   r   r   Zpandas.compat._optionalr	   Zpandas.util._decoratorsr
   Zpandasrj   Zpandas.core.shared_docsr   Zpandas.io.excel._baser   r!   r   Zpandas._libs.tslibs.nattyper   r   r   r   r   r   <module>   s    