U
    ÎZjv  ã                   @  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 eed
 d�G dd„ deƒƒZdS )é    )Úannotations)ÚTYPE_CHECKINGÚcastN)ÚFilePathÚ
ReadBufferÚScalarÚStorageOptions)Úimport_optional_dependency)Údoc)Ú_shared_docs)ÚBaseExcelReader)ÚNaTTypeÚstorage_options©r   c                      sâ   e Zd ZdZd.ddddœ‡ fdd„Zed	d
„ ƒZ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 d!„Zddœd"d#„Zddœd$d%„Zddœd&d'„Zdd(d)œd*d+„Zddœd,d-„Z‡  ZS )0Ú	ODFReaderzÃ
    Read tables out of OpenDocument formatted files.

    Parameters
    ----------
    filepath_or_buffer : str, path to be parsed or
        an open readable stream.
    {storage_options}
    NzFilePath | ReadBuffer[bytes]r   ÚNone)Úfilepath_or_bufferr   Úreturnc                   s   t dƒ tƒ j||d� d S )NZodfr   )r	   ÚsuperÚ__init__)Úselfr   r   ©Ú	__class__© ú]/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/pandas/io/excel/_odfreader.pyr   (   s    zODFReader.__init__c                 C  s   ddl m} |S )Nr   )ÚOpenDocument)Úodf.opendocumentr   )r   r   r   r   r   Ú_workbook_class0   s    zODFReader._workbook_class)r   c                 C  s   ddl m} ||ƒS )Nr   )Úload)r   r   )r   r   r   r   r   r   Úload_workbook6   s    zODFReader.load_workbookÚstr)r   c                 C  s   dS )z'Property for compat with other readers.Ú r   )r   r   r   r   Úempty_value;   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>F   s     z)ODFReader.sheet_names.<locals>.<listcomp>)Ú	odf.tabler$   ÚbookÚgetElementsByType)r   r$   Útablesr   r   r   Úsheet_names@   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   r1   r$   r.   r   r   r   Úget_sheet_by_indexH   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$   r.   Útabler   r   r   Úget_sheet_by_nameO   s    

zODFReader.get_sheet_by_nameÚboolz
int | Nonezlist[list[Scalar | NaTType]])Úconvert_floatÚ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 ]f}|j|krˆ|  ||¡}n| j}|  	|¡}|| jkr¬||7 }ql| 
| jg| ¡ d}| 
|g| ¡ ql|t|ƒk rèt|ƒ}|  |¡}|  |¡�r|
|7 }
n2| 
| jgg|
 ¡ d}
t|ƒD ]}| |¡ �q(|dk	rFt|ƒ|krF �qVqF|D ].}t|ƒ|k �rZ| 
| jg|t|ƒ  ¡ �qZ|S )z9
        Parse an ODF Table into a list of lists
        r   )ÚCoveredTableCellÚ	TableCellÚTableRowc                   s$   g | ]}t |d ƒr|jˆ kr|‘qS )Úqname)Úhasattrr=   )r(   Úx©Ú
cell_namesr   r   r*   s   s   
 
þz,ODFReader.get_sheet_data.<locals>.<listcomp>N)r+   r:   r;   r<   r=   r-   Ú
childNodesÚ_get_cell_valuer"   Ú_get_column_repeatÚextendÚlenÚ_get_row_repeatÚ_is_empty_rowÚrangeÚappend)r   Zsheetr8   r9   r:   r;   r<   Zcovered_cell_nameZtable_cell_nameZ
sheet_rowsZ
empty_rowsZmax_row_lenr5   Z	sheet_rowZsheet_cellsZempty_cellsZ	table_rowZ
sheet_cellÚvalueZcolumn_repeatZ
row_repeatÚ_Úrowr   r@   r   Úget_sheet_data\   sN    


þ





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.namespacesrP   r0   Ú
attributesÚget)r   rM   rP   r   r   r   rG   ¡   s    zODFReader._get_row_repeatc                 C  s"   ddl m} t|j |dfd¡ƒS )Nr   rO   znumber-columns-repeatedrQ   rR   )r   ÚcellrP   r   r   r   rD   «   s    zODFReader._get_column_repeatc                 C  s$   |j D ]}t|j ƒdkr dS qdS )z4
        Helper function to find empty rows
        r   FT)rB   rF   )r   rM   Úcolumnr   r   r   rH   °   s    
zODFReader._is_empty_rowzScalar | NaTType)r8   r   c                 C  sF  ddl m} t|ƒdkrtjS |j |df¡}|dkrJt|ƒdkrFdS dS |d krX| jS |d	kr�t|j |d
f¡ƒ}|rŒ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 )rS   rX   r    ÚnpÚnanrT   rU   r"   r[   r0   Ú_get_cell_string_valueÚpdÚto_datetimer   r   r`   r3   r4   )r   rV   r8   rX   Z	cell_typeZ
cell_valueÚvalZstampr   r   r   rC   º   sB    



zODFReader._get_cell_valuec           	      C  s¦   ddl m} ddlm} ddlm} |ƒ j}g }|jD ]d}t||ƒr†|j|krtt	|j
 |dfd¡ƒ}| d| ¡ qš| |  |¡¡ q6| t|ƒ d¡¡ q6d	 |¡S )
z„
        Find and decode OpenDocument text:s tags that represent
        a run length encoded sequence of space characters.
        r   )ÚElement)ÚTEXTNS)ÚSÚcrQ   ú Ú
r!   )Zodf.elementrg   rS   rh   Zodf.textri   r=   rB   Ú
isinstancer0   rT   rU   rJ   rc   r    ÚstripÚjoin)	r   rV   rg   rh   ri   Ztext_srK   ÚfragmentÚspacesr   r   r   rc   â   s    


z ODFReader._get_cell_string_value)N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   r   r"   r/   r2   r6   rN   rG   rD   rH   rC   rc   Ú__classcell__r   r   r   r   r      s&    ý
 ÿE

(r   )Ú
__future__r   Útypingr   r   Únumpyra   Zpandas._typingr   r   r   r   Zpandas.compat._optionalr	   Zpandas.util._decoratorsr
   Zpandasrd   Zpandas.core.shared_docsr   Zpandas.io.excel._baser   Zpandas._libs.tslibs.nattyper   r   r   r   r   r   Ú<module>   s   