U
    sVcv                     @  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 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__ >/tmp/pip-unpacked-wheel-xj8nt62q/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 rt|}| |}| |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rt|j|d
f}|rt	|}||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pdZ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.elementrf   rS   rg   Zodf.textrh   r=   rB   
isinstancer0   rT   rU   rJ   rc   r    stripjoin)	r   rV   rf   rg   rh   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   Z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   