o
    g                     @  s\   d dl mZ d dlZd dlmZmZmZ d dlm	Z	 d dl
Zd dlmZ G dd deZdS )    )annotationsN)FilePathOrBufferScalarStorageOptions)import_optional_dependency)BaseExcelReaderc                      s   e Zd ZdZ	d+d, fddZed	d
 Zd-ddZed.ddZed/ddZ	d0ddZ
d1ddZd2ddZd3d d!Zd3d"d#Zd4d$d%Zd5d'd(Zd.d)d*Z  ZS )6	ODFReadera"  
    Read tables out of OpenDocument formatted files.

    Parameters
    ----------
    filepath_or_buffer : str, path to be parsed or
        an open readable stream.
    storage_options : dict, optional
        passed to fsspec for appropriate URLs (see ``_get_filepath_or_buffer``)
    Nfilepath_or_bufferr   storage_optionsr   c                   s   t d t j||d d S )Nodf)r
   )r   super__init__)selfr	   r
   	__class__ X/home/ubuntu/cloudmapper/venv/lib/python3.10/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_class%   s   zODFReader._workbook_classc                 C  s   ddl m} ||S )Nr   )load)r   r   )r   r	   r   r   r   r   load_workbook+   s   zODFReader.load_workbookreturnstrc                 C  s   dS )z'Property for compat with other readers. r   )r   r   r   r   empty_value0   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>;   s    z)ODFReader.sheet_names.<locals>.<listcomp>)	odf.tabler   bookgetElementsByType)r   r   tablesr   r   r   sheet_names5   s   zODFReader.sheet_namesindexintc                 C  s*   ddl m} | | | j|}|| S )Nr   r   )r$   r   raise_if_bad_sheet_by_indexr%   r&   )r   r)   r   r'   r   r   r   get_sheet_by_index=   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)r$   r   raise_if_bad_sheet_by_namer%   r&   r    close
ValueError)r   r   r   r'   tabler   r   r   get_sheet_by_nameD   s   
zODFReader.get_sheet_by_nameconvert_floatboollist[list[Scalar]]c                   sj  ddl m}m}m} | j}| j}||h ||}d}	d}
g }|D ]w} fdd|jD }d}g }|D ]3}|j|krC| ||}n| j}| 	|}|| jkrU||7 }q5|
| jg|  d}|
|g|  q5|
t|k rst|}
| |}| |r|	|7 }	q#|
| jgg|	  d}	t|D ]}|| qq#|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 | ]	}|j  v r|qS r   )qname)r!   x
cell_namesr   r   r#   f   s    z,ODFReader.get_sheet_data.<locals>.<listcomp>)r$   r5   r6   r7   r8   r&   
childNodes_get_cell_valuer   _get_column_repeatextendlen_get_row_repeat_is_empty_rowrangeappend)r   sheetr2   r5   r6   r7   covered_cell_nametable_cell_name
sheet_rows
empty_rowsmax_row_lenr0   	sheet_rowsheet_cellsempty_cells	table_row
sheet_cellvaluecolumn_repeat
row_repeat_rowr   r:   r   get_sheet_dataQ   sJ   







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.namespacesrX   r*   
attributesget)r   rT   rX   r   r   r   rA      s   zODFReader._get_row_repeatc                 C  rV   )Nr   rW   znumber-columns-repeatedrY   rZ   )r   cellrX   r   r   r   r>      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)r<   r@   )r   rT   columnr   r   r   rB      s
   
zODFReader._is_empty_rowr   c                 C  s8  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rHt|j|d
f}|rFt	|}||krF|S |S |dkrX|j|d
f}t|S |dkra| 
|S |dkrq|j|d
f}t|S |dkr|j|df}t|S |dkrtt|}| S |   td| )Nr   )OFFICENSz#N/Az
value-typebooleanTRUETFfloatrP   
percentagestringcurrencydatez
date-valuetimezUnrecognized type )r[   r`   r   npnanr\   r]   r   rc   r*   _get_cell_string_valuepdto_datetimerh   r.   r/   )r   r^   r2   r`   	cell_type
cell_valuevalstampr   r   r   r=      sB   

zODFReader._get_cell_valuec           	      C  s   ddl m} ddlm} ddlm} | j}g }|jD ]/}t||rC|j|kr:t	|j
|dfd}|d|  q|| | q|t| qd|S )	z
        Find and decode OpenDocument text:s tags that represent
        a run length encoded sequence of space characters.
        r   )Element)TEXTNS)ScrY    r   )odf.elementrr   r[   rs   odf.textrt   r8   r<   
isinstancer*   r\   r]   rD   rk   r   join)	r   r^   rr   rs   rt   text_srP   fragmentspacesr   r   r   rk      s   



z ODFReader._get_cell_string_value)N)r	   r   r
   r   )r	   r   )r   r   )r   r   )r)   r*   )r   r   )r2   r3   r   r4   )r   r*   )r   r3   )r2   r3   r   r   )__name__
__module____qualname____doc__r   propertyr   r   r   r(   r,   r1   rU   rA   r>   rB   r=   rk   __classcell__r   r   r   r   r      s&    





=




(r   )
__future__r   numpyri   pandas._typingr   r   r   pandas.compat._optionalr   pandasrl   pandas.io.excel._baser   r   r   r   r   r   <module>   s    