o
    e                     @   s   d Z ddlZddlmZ ddlmZ edZdZdZ	d	Z
ed
e
 d ejZdZedee
ejZdd Zdd Zdd Zdd Zi Zi ZeddD ]ZeeZeee< eee< qNdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Z dS )'zT
Collection of utilities used within the package and also available for client code
    N)digits   )CellCoordinatesExceptionz^[$]?([A-Za-z]{1,3})[$]?(\d+)$z[A-Z]{1,3}:[A-Z]{1,3}:z\d+:\d+:zq
[$]?(?P<min_col>[A-Za-z]{1,3})?
[$]?(?P<min_row>\d+)?
(:[$]?(?P<max_col>[A-Za-z]{1,3})?
[$]?(?P<max_row>\d+)?)?
^$z7
(('(?P<quoted>([^']|'')*)')|(?P<notquoted>[^'^ ^!]*))!z{0}(?P<cells>{1})(?=,?)c                 C   s<   t | tr	t| } t |trt|}dd t| |d D S )z
    Given the start and end columns, return all the columns in the series.

    The start and end columns can be either column letters or 1-based
    indexes.
    c                 S      g | ]}t |qS  get_column_letter).0xr   r   F/var/www/html/venv/lib/python3.10/site-packages/openpyxl/utils/cell.py
<listcomp>'       z'get_column_interval.<locals>.<listcomp>r   )
isinstancestrcolumn_index_from_stringrange)startendr   r   r   get_column_interval   s
   

r   c                 C   sV   t | }|sd|  d}t|| \}}t|}|s'd|  d}t|||fS )z;Convert a coordinate string like 'B12' to a tuple ('B', 12)zInvalid cell coordinates ()zThere is no row 0 ()COORD_REmatchr   groupsint)coord_stringr   msgcolumnrowr   r   r   coordinate_from_string*   s   
r    c                 C   st   t | }|st|  d|d}| D ]\}}|r$d| ||< q|d s-|d r0d}nd}|jd	i |S )
zDConvert a coordinate to an absolute coordinate string (B12 -> $B$12)z  is not a valid coordinate range r   max_colmax_rowz%{min_col}{min_row}:{max_col}{max_row}z{min_col}{min_row}Nr   )ABSOLUTE_REr   
ValueError	groupdictitemsformat)r   mdkvfmtr   r   r   absolute_coordinate8   s   

r.   c                 C   sz   d|   kr
dksn t d| g }| dkr6t| d\} }|dkr)d}| d8 } |t|d  | dksdt|S )zConvert a column number into a column letter (3 -> 'C')

    Right shift the column col_idx by 26 to find column letters in reverse
    order.  These numbers are 1-based, and can be converted to ASCII
    ordinals by adding 64.

    r   ifG  Invalid column index {0}r      @   r!   )r%   r(   divmodappendchrjoinreversed)col_idxletters	remainderr   r   r   _get_column_letterJ   s   
r:   igG  c                 C   s(   zt |  W S  ty   td| w )z?Convert a column index into a column letter
    (3 -> 'C')
    r/   )_STRING_COL_CACHEKeyErrorr%   r(   )idxr   r   r   r
   i   s
   
r
   c                 C   s,   zt |   W S  ty   td| w )z@Convert a column name into a numerical index
    ('A' -> 1)
    z{0} is not a valid column name)_COL_STRING_CACHEupperr<   r%   r(   )str_colr   r   r   r   s   s
   r   c           
      C   s   d | }t| }|st|| \}}}}}|r=||f}||f}	t||	 s=t|r1t|	r=t|	r9t|r=t||durEt|}|durMt|}|durVt|}n|}|durat|}n|}||||fS )z
    Convert a range string into a tuple of boundaries:
    (min_col, min_row, max_col, max_row)
    Cell coordinates will be converted into a range with the cell at both end
    z&{0} is not a valid coordinate or rangeN)	r(   r$   r   r%   r   allanyr   r   )
range_stringr   r)   min_colmin_rowsepr"   r#   colsrowsr   r   r   range_boundaries~   s<   




rI   c                 #   s^    t | \}}}}t||d }dd t||d D }|D ] t fdd|D V  qdS )[
    Get individual addresses for every cell in a range.
    Yields one row at a time.
    r   c                 S   r   r   r	   r   colr   r   r   r      r   z#rows_from_range.<locals>.<listcomp>c                 3   s    | ]	}d  | V  qdS z{0}{1}Nr(   rK   r   r   r   	<genexpr>       z"rows_from_range.<locals>.<genexpr>NrI   r   tuplerC   rD   rE   r"   r#   rH   rG   r   rO   r   rows_from_range      rU   c                 #   s^    t | \}}}}t||d }dd t||d D }|D ] t fdd|D V  qdS )rJ   r   c                 s   s    | ]}t |V  qd S )Nr	   rK   r   r   r   rP      s    z"cols_from_range.<locals>.<genexpr>c                 3   s    | ]	}d   |V  qdS rM   rN   )r   r   rL   r   r   rP      rQ   NrR   rT   r   rW   r   cols_from_range   rV   rX   c                 C   sJ   t | D ]
\}}|tv r nq| d|  }| |d }t|t| fS )zB
    Convert an Excel style coordinate to (row, column) tuple
    N)	enumerater   r?   r   r>   )
coordinater=   crL   r   r   r   r   coordinate_to_tuple   s   r\   c                 C   sH   t | }|du rtd|dp|d}|d}t|}||fS )zc
    Convert a worksheet range to the sheetname and maximum and minimum
    coordinate indices
    Nz)Value must be of the form sheetname!A1:E4quoted	notquotedcells)SHEETRANGE_REr   r%   grouprI   )rC   r)   	sheetnamer_   
boundariesr   r   r   range_to_tuple   s   

rd   c                 C   s"   d| v r
|  dd} d| } | S )z>
    Add quotes around sheetnames if they contain spaces.
    'z''z'{0}')replacer(   )rb   r   r   r   quote_sheetname   s   
rg   )!__doc__restringr   
exceptionsr   compiler   	COL_RANGE	ROW_RANGE
RANGE_EXPRVERBOSEr$   SHEET_TITLEr(   r`   r   r    r.   r:   r>   r;   r   irL   r
   r   rI   rU   rX   r\   rd   rg   r   r   r   r   <module>   sB   


+