a
    é´«jF   ã                   @  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r�d 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__© úY/var/www/html/laksyashrimp/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 rætˆƒ}
|  |¡}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rŒt|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rˆt|	j |dfd¡ƒ}
| d|
 ¡ q¼|	j|kr–qJq¼| |  |	¡¡ 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   