a
    OfF                      @  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rd 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dddd fddZed	d
ddZdddddZedd
ddZedd
ddZddddZ	ddddZ
d-ddd d!d"Zdd
d#d$Zdd
d%d&Zd'd
d(d)Zdd
d*d+Z  ZS ).	ODFReaderNzFilePath | ReadBuffer[bytes]zStorageOptions | Nonezdict | NoneNone)filepath_or_bufferr   engine_kwargsreturnc                   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__ S/var/www/ai-form-bot/venv/lib/python3.9/site-packages/pandas/io/excel/_odfreader.pyr       s    zODFReader.__init__ztype[OpenDocument])r   c                 C  s   ddl m} |S )Nr   r   )odf.opendocumentr   )r   r   r   r   r   _workbook_class8   s    zODFReader._workbook_classr   )r   r   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_valuez	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       z)ODFReader.sheet_names.<locals>.<listcomp>)	odf.tabler%   bookgetElementsByType)r   r%   tablesr   r   r   sheet_namesJ   s    zODFReader.sheet_namesint)indexc                 C  s*   ddl m} | | | j|}|| S )Nr   r$   )r-   r%   Zraise_if_bad_sheet_by_indexr.   r/   )r   r3   r%   r0   r   r   r   get_sheet_by_indexR   s    
zODFReader.get_sheet_by_indexr&   c                 C  s^   ddl m} | | | j|}|D ]}|d|kr&|  S q&|   td| dd S )Nr   r$   r'   zsheet z
 not found)r-   r%   Zraise_if_bad_sheet_by_namer.   r/   r(   close
ValueError)r   r'   r%   r0   tabler   r   r   get_sheet_by_nameY   s    

zODFReader.get_sheet_by_namez
int | Nonezlist[list[Scalar | NaTType]])file_rows_neededr   c                   s  ddl m}m}m} | j}| j}||h ||}d}	d}
g }|D ]} fdd|jD }d}g |D ]d}|j|kr| |}n| j}| 	|}|| jkr||7 }ql
| jg|  d}
|g|  ql|
tk rt}
| |}tdkr|	|7 }	n4|
| jgg|	  d}	|
fddt|D  |durFt||krF qXqF|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)hasattrr=   )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>   r,   z+ODFReader.get_sheet_data.<locals>.<genexpr>N)r-   r:   r;   r<   r=   r/   
childNodes_get_cell_valuer#   _get_column_repeatextendlen_get_row_repeatrange)r   Zsheetr9   r:   r;   r<   Zcovered_cell_nameZtable_cell_nameZ
sheet_rowsZ
empty_rowsZmax_row_lenr7   Z	sheet_rowZsheet_cellsZempty_cellsZ
sheet_cellvalueZcolumn_repeatZ
row_repeatrowr   )r@   rB   r   get_sheet_dataf   sL    








zODFReader.get_sheet_datac                 C  s"   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.namespacesrO   r2   
attributesget)r   rL   rO   r   r   r   rI      s    zODFReader._get_row_repeatc                 C  s"   ddl m} t|j|dfdS )Nr   rN   znumber-columns-repeatedrP   rQ   )r   cellrO   r   r   r   rF      s    zODFReader._get_column_repeatzScalar | NaTTypec                 C  sB  ddl m} t|dkrtjS |j|df}|dkrJt|dkrFdS dS |d u rX| jS |d	krt|j|d
f}t	|}||kr|S |S |dkr|j|d
f}t|S |dkr| 
|S |dkr|j|d
f}t|S |dkr|j|df}t|S |dkr(tt|}tt| S |   td| d S )Nr   )OFFICENSz#N/Az
value-typebooleanTRUETFfloatrK   
percentagestringcurrencydatez
date-valuetimezUnrecognized type )rR   rV   r!   npnanrS   rT   r#   rY   r2   _get_cell_string_valuepd	Timestampr   r   r^   r5   r6   )r   rU   rV   Z	cell_typeZ
cell_valuevalZstampr   r   r   rE      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 ]r}	t
|	|r|	j|krt|	j|dfd}
|d|
  q|	j|krqJq|| |	 qJ|t|	d	 qJd
|S )z
        Find and decode OpenDocument text:s tags that represent
        a run length encoded sequence of space characters.
        r   )Element)TEXTNS)
Annotation)ScrP    
r"   )Zodf.elementre   rR   rf   Z
odf.officerg   Zodf.textrh   r=   rD   
isinstancer2   rS   rT   appendra   r!   stripjoin)r   rU   re   rf   rg   rh   Zoffice_annotationZtext_srK   fragmentspacesr   r   r   ra      s"    



z ODFReader._get_cell_string_value)NN)N)__name__
__module____qualname__r   propertyr   r    r#   r1   r4   r8   rM   rI   rF   rE   ra   __classcell__r   r   r   r   r      s$      D
'r   r   )
__future__r   typingr   r   numpyr_   Zpandas._typingr   r   r   r   Zpandas.compat._optionalr	   Zpandas.util._decoratorsr
   Zpandasrb   Zpandas.core.shared_docsr   Zpandas.io.excel._baser   r   r   Zpandas._libs.tslibs.nattyper   r   r   r   r   r   <module>   s   