U
    e»{j²O  ã                   @   sŒ   d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZmZ ddlmZ d	d
„ ZG dd„ deƒZG dd„ deƒZdS )z-
Handles a "generic" string format for units
é    N©ÚFraction)ÚclasspropertyÚparsing)Údid_you_meané   )ÚcoreÚutils)ÚBasec                 C   sê   t |tjƒrÐg }| jr0|jdkr0| |jd›¡ t|jƒrÆt 	|j|j
¡\}}t|ƒrh| |  |¡¡ nt|ƒdkr~| d¡ t|ƒrÆ| d¡ |  |¡}t|ƒdkr´| |› ¡ n| d|› d�¡ d |¡S t |tjƒræ|  |¡S d S )	Nr   Úgr   Ú1ú/ú(ú)ú )Ú
isinstancer   ZCompositeUnitÚ_show_scaleÚscaleÚappendÚlenÚbasesr	   Zget_grouped_by_powersZpowersÚ_format_unit_listÚjoinZ	NamedUnitÚ_get_unit_name)ÚclsÚunitÚpartsZ	positivesZ	negativesZ	unit_list© r   ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/units/format/generic.pyÚ
_to_string   s&    




r   c                   @   sˆ  e Zd ZdZdZdZedd�dd„ ƒZedd�dd„ ƒZedd�d	d
„ ƒZ	edd�dd„ ƒZ
edd�dd„ ƒZedd�dd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedCdd„ƒZddddddœZdd d!d"œZd#d#d$d$d%d&d'd(œZe d)d*d+œ¡Zd,Ze ed-¡Ze d.e› d/ed0d1… › d2�¡Ze d3¡Zed4d5„ ƒZed6d7„ ƒZedDd9d:„ƒZ edEd;d<„ƒZ!ed=d>„ ƒZ"ed?d@„ ƒZ#edAdB„ ƒZ$d1S )FÚGenericzì
    A "generic" format.

    The syntax of the format is based directly on the FITS standard,
    but instead of only supporting the units that FITS knows about, it
    supports any unit available in the `astropy.units` namespace.
    T)ÚCOMMAZDOUBLE_STARÚSTARZPERIODZSOLIDUSZCARETZ
OPEN_PARENZCLOSE_PARENZFUNCNAMEZUNITZSIGNÚUINTZUFLOAT)Zlazyc                 C   s   |   ¡ S ©N)Z_generate_unit_names©r   r   r   r   Ú
_all_unitsS   s    zGeneric._all_unitsc                 C   s
   | j d S ©Nr   ©r&   r%   r   r   r   Ú_unitsW   s    zGeneric._unitsc                 C   s
   | j d S )Nr   r(   r%   r   r   r   Ú_deprecated_units[   s    zGeneric._deprecated_unitsc                 C   s
   | j d S )Né   r(   r%   r   r   r   Ú
_functions_   s    zGeneric._functionsc                 C   s   |   ¡ S r$   )Ú_make_parserr%   r   r   r   Ú_parserc   s    zGeneric._parserc                 C   s   |   ¡ S r$   )Ú_make_lexerr%   r   r   r   Ú_lexerg   s    zGeneric._lexerc                    st   ˆ j }d}d}d}d}d}d}d}d}	d	d
„ }
dd„ }dd„ }dd„ }‡ fdd„}d}dd„ }tjddttjƒd�S )Nz\,z\*z\.r   z\*\*z\^z\(z\)c                 S   sZ   t  d| j¡s"d| _t| jƒ| _n4| j d¡rJd| _t| jdd… ƒ| _nt| jƒ| _| S )z$((\d+\.?\d*)|(\.\d+))([eE][+-]?\d+)?z[eE\.]r#   Ú.Néÿÿÿÿ)ÚreÚsearchÚvalueÚtypeÚintÚendswithÚfloat©Útr   r   r   Út_UFLOATz   s    z%Generic._make_lexer.<locals>.t_UFLOATc                 S   s   t | jƒ| _| S )z\d+©r7   r5   r:   r   r   r   Út_UINT†   s    z#Generic._make_lexer.<locals>.t_UINTc                 S   s   t | jd ƒ| _| S )z
[+-](?=\d)r   r=   r:   r   r   r   Út_SIGN‹   s    z#Generic._make_lexer.<locals>.t_SIGNc                 S   s   | S )z3((sqrt)|(ln)|(exp)|(log)|(mag)|(dB)|(dex))(?=\ *\()r   r:   r   r   r   Ú
t_FUNCNAME’   s    z'Generic._make_lexer.<locals>.t_FUNCNAMEc                    s   ˆ   | ¡| _| S )u5   %|([YZEPTGMkhdcmuÂµnpfazy]?'((?!\d)\w)+')|((?!\d)\w)+)Ú	_get_unitr5   r:   r%   r   r   Út_UNIT–   s    z#Generic._make_lexer.<locals>.t_UNITr   c                 S   s   t d| j› �ƒ‚d S )NzInvalid character at col )Ú
ValueErrorÚlexposr:   r   r   r   Út_errorž   s    z$Generic._make_lexer.<locals>.t_errorZgeneric_lextabúastropy/units)ZlextabÚpackageZreflags)Ú_tokensr   Úlexr7   r3   ÚUNICODE)r   ÚtokensZt_COMMAZt_STARZt_PERIODZ	t_SOLIDUSZt_DOUBLE_STARZt_CARETZt_OPEN_PARENZt_CLOSE_PARENr<   r>   r?   r@   rB   Zt_ignorerE   r   r%   r   r/   k   s*      ÿzGeneric._make_lexerc                    sô   ˆ j }dd„ }dd„ }dd„ }dd„ }d	d
„ }dd„ }dd„ }dd„ }	‡ fdd„}
‡ fdd„}‡ fdd„}dd„ }dd„ }dd„ }dd„ }dd „ }d!d"„ }d#d$„ }d%d&„ }d'd(„ }d)d*„ }d+d,„ }d-d.„ }d/d0„ }‡ fd1d2„}d3d4„ }tjd5d6d7�S )8aô  
        The grammar here is based on the description in the `FITS
        standard
        <http://fits.gsfc.nasa.gov/standard30/fits_standard30aa.pdf>`_,
        Section 4.3, which is not terribly precise.  The exact grammar
        is here is based on the YACC grammar in the `unity library
        <https://bitbucket.org/nxg/unity/>`_.

        This same grammar is used by the `"fits"` and `"vounit"`
        formats, the only difference being the set of available unit
        strings.
        c                 S   s0   t | d tƒr | d d | d< n| d | d< dS )zn
            main : unit
                 | structured_unit
                 | structured_subunit
            r   r   N)r   Útuple©Úpr   r   r   Úp_mainµ   s    z$Generic._make_parser.<locals>.p_mainc                 S   s   | d f| d< dS )zU
            structured_subunit : OPEN_PAREN structured_unit CLOSE_PAREN
            r+   r   Nr   rM   r   r   r   Úp_structured_subunitÂ   s    z2Generic._make_parser.<locals>.p_structured_subunitc                 S   s†   ddl m} t| ƒdkr"| d fn| d | d f}d}|D ]:}t|tƒrR||7 }q:t||ƒrj|| ¡ 7 }q:||f7 }q:||ƒ| d< dS )zm
            structured_unit : subunit COMMA
                            | subunit COMMA subunit
            r+   )ÚStructuredUnité   r   r   r   N)Z
structuredrQ   r   r   rL   Úvalues)rN   rQ   ÚinputsÚunitsZsubunitr   r   r   Úp_structured_unitË   s    &


z/Generic._make_parser.<locals>.p_structured_unitc                 S   s   | d | d< dS )zw
            subunit : unit
                    | structured_unit
                    | structured_subunit
            r   r   Nr   rM   r   r   r   Ú	p_subunitã   s    z'Generic._make_parser.<locals>.p_subunitc                 S   sx   ddl m} t| ƒdkr*|| d ƒ| d< nJt| ƒdkrP|| d | d  ƒ| d< n$t| ƒdkrt|| d | d  ƒ| d< dS )a¼  
            unit : product_of_units
                 | factor product_of_units
                 | factor product product_of_units
                 | division_product_of_units
                 | factor division_product_of_units
                 | factor product division_product_of_units
                 | inverse_unit
                 | factor inverse_unit
                 | factor product inverse_unit
                 | factor
            r   ©ÚUnitr+   r   rR   é   N©Zastropy.units.corerY   r   ©rN   rY   r   r   r   Úp_unitë   s    z$Generic._make_parser.<locals>.p_unitc                 S   sB   ddl m} t| ƒdkr2|| d | d  ƒ| d< n| d | d< dS )z¢
            division_product_of_units : division_product_of_units division product_of_units
                                      | product_of_units
            r   rX   rZ   r   rR   Nr[   r\   r   r   r   Úp_division_product_of_units  s    z9Generic._make_parser.<locals>.p_division_product_of_unitsc                 S   s   | d d | d< dS )zA
            inverse_unit : division unit_expression
            r+   r2   r   Nr   rM   r   r   r   Úp_inverse_unit  s    z,Generic._make_parser.<locals>.p_inverse_unitc                 S   s   | d | d< dS )zp
            factor : factor_fits
                   | factor_float
                   | factor_int
            r   r   Nr   rM   r   r   r   Úp_factor  s    z&Generic._make_parser.<locals>.p_factorc                    sŠ   ˆ j dkrtdƒ‚t| ƒdkr@| d | d t| d ƒ  | d< nFt| ƒdkrn| d | d t| d ƒ  | d< nt| ƒdkr†| d | d< d	S )
z®
            factor_float : signed_float
                         | signed_float UINT signed_int
                         | signed_float UINT power numeric_power
            Úfitsú$Numeric factor not supported by FITSrZ   r   r+   rR   r   é   N)ÚnamerC   r   r9   rM   r%   r   r   Úp_factor_float  s    
""z,Generic._make_parser.<locals>.p_factor_floatc                    sÔ   ˆ j dkrtdƒ‚t| ƒdkr,| d | d< n¤t| ƒdkrR| d t| d ƒ | d< n~t| ƒdkr¨t| d tƒrŽ| d | d t| d ƒ  | d< qÐ| d t| d ƒ | d< n(t| ƒdkrÐ| d | d | d   | d< d	S )
zë
            factor_int : UINT
                       | UINT signed_int
                       | UINT power numeric_power
                       | UINT UINT signed_int
                       | UINT UINT power numeric_power
            ra   rb   r+   r   r   rR   rZ   rc   N)rd   rC   r   r9   r   r7   rM   r%   r   r   Úp_factor_int*  s    
"z*Generic._make_parser.<locals>.p_factor_intc                    s¦   | d dkr$ˆ j dkr tdƒ‚ndS t| ƒdkrh| d dkrNd| d	  | d
< q¢d| d | d	   | d
< n:t| ƒdkr†d| d	  | d
< nt| ƒdkr¢d| d  | d
< dS )aY  
            factor_fits : UINT power OPEN_PAREN signed_int CLOSE_PAREN
                        | UINT power OPEN_PAREN UINT CLOSE_PAREN
                        | UINT power signed_int
                        | UINT power UINT
                        | UINT SIGN UINT
                        | UINT OPEN_PAREN signed_int CLOSE_PAREN
            r   é
   ra   zBase must be 10NrZ   r+   )z**ú^rR   r   rc   é   )rd   rC   r   rM   r%   r   r   Úp_factor_fits@  s    	

z+Generic._make_parser.<locals>.p_factor_fitsc                 S   sT   t | ƒdkr| d | d< n6t | ƒdkr<| d | d  | d< n| d | d  | d< dS )zÄ
            product_of_units : unit_expression product product_of_units
                             | unit_expression product_of_units
                             | unit_expression
            r+   r   r   rR   N©r   rM   r   r   r   Úp_product_of_unitsX  s
    z0Generic._make_parser.<locals>.p_product_of_unitsc                 S   s*   t | ƒdkr| d | d< n| d | d< dS )z¨
            unit_expression : function
                            | unit_with_power
                            | OPEN_PAREN product_of_units CLOSE_PAREN
            r+   r   r   Nrk   rM   r   r   r   Úp_unit_expressione  s    z/Generic._make_parser.<locals>.p_unit_expressionc                 S   sT   t | ƒdkr| d | d< n6t | ƒdkr<| d | d  | d< n| d | d  | d< dS )z˜
            unit_with_power : UNIT power numeric_power
                            | UNIT numeric_power
                            | UNIT
            r+   r   r   rR   Nrk   rM   r   r   r   Úp_unit_with_powerp  s
    z/Generic._make_parser.<locals>.p_unit_with_powerc                 S   s>   t | ƒdkr"| d | d  | d< nt | ƒdkr:| d | d< dS )zq
            numeric_power : sign UINT
                          | OPEN_PAREN paren_expr CLOSE_PAREN
            rR   r   r+   r   rZ   Nrk   rM   r   r   r   Úp_numeric_power}  s    z-Generic._make_parser.<locals>.p_numeric_powerc                 S   s2   t | ƒdkr"| d | d  | d< n| d | d< dS )zt
            paren_expr : sign UINT
                       | signed_float
                       | frac
            rR   r   r+   r   Nrk   rM   r   r   r   Úp_paren_expr‡  s    z*Generic._make_parser.<locals>.p_paren_exprc                 S   s*   t | d | d  | d | d  ƒ| d< dS )z=
            frac : sign UINT division sign UINT
            r   r+   rZ   rc   r   Nr   rM   r   r   r   Úp_frac’  s    z$Generic._make_parser.<locals>.p_fracc                 S   s&   t | ƒdkr| d | d< nd| d< dS )z8
            sign : SIGN
                 |
            r+   r   r   Nrk   rM   r   r   r   Úp_sign˜  s    z$Generic._make_parser.<locals>.p_signc                 S   s   dS )zE
            product : STAR
                    | PERIOD
            Nr   rM   r   r   r   Ú	p_product¢  s    z'Generic._make_parser.<locals>.p_productc                 S   s   dS )z,
            division : SOLIDUS
            Nr   rM   r   r   r   Ú
p_division©  s    z(Generic._make_parser.<locals>.p_divisionc                 S   s   | d | d< dS )zG
            power : DOUBLE_STAR
                  | CARET
            r   r   Nr   rM   r   r   r   Úp_power¯  s    z%Generic._make_parser.<locals>.p_powerc                 S   s   | d | d  | d< dS )z0
            signed_int : SIGN UINT
            r   r+   r   Nr   rM   r   r   r   Úp_signed_int¶  s    z*Generic._make_parser.<locals>.p_signed_intc                 S   s   | d | d  | d< dS )zY
            signed_float : sign UINT
                         | sign UFLOAT
            r   r+   r   Nr   rM   r   r   r   Úp_signed_float¼  s    z,Generic._make_parser.<locals>.p_signed_floatc                 S   s   | d | d< dS )z2
            function_name : FUNCNAME
            r   r   Nr   rM   r   r   r   Úp_function_nameÃ  s    z-Generic._make_parser.<locals>.p_function_namec                    sn   | d dkr | d d | d< dS | d dkrVˆ   | d ¡}t|ƒrV|| d ƒ| d< dS td| d › d	�ƒ‚dS )
zN
            function : function_name OPEN_PAREN main CLOSE_PAREN
            r   ÚsqrtrR   g      à?r   N)ÚmagZdBZdexú'z' is not a recognized function)Ú_parse_unitÚcallablerC   )rN   Zfunction_unitr%   r   r   Ú
p_functionÉ  s    z(Generic._make_parser.<locals>.p_functionc                 S   s
   t ƒ ‚d S r$   )rC   rM   r   r   r   Úp_errorÚ  s    z%Generic._make_parser.<locals>.p_errorZgeneric_parsetabrF   )Z	tabmodulerG   )rH   r   Zyacc)r   rK   rO   rP   rV   rW   r]   r^   r_   r`   re   rf   rj   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   r~   r   r   r%   r   r-   ¥   s8    	

zGeneric._make_parserc              
   C   sx   z|   |j¡W S  tk
rr } zFt ¡ }|j|jkrH|j|j  W Y ¢ S td|j› dt|ƒ› �ƒ‚W 5 d }~X Y nX d S )NzAt col z, )r|   r5   rC   r   Úget_current_unit_registryÚaliasesrD   Ústr)r   r;   ÚeÚregistryr   r   r   rA   ß  s    zGeneric._get_unitc                 C   sö   t  ¡ j}|| jkr | j| }nž| ¡ s¾|d dkrDd|dd …  }|d | jkrn|d d… | j|d   }nPt|ƒdkr¤|d | jkr¤|d d… | j|d   }n| d¡r¾|d d… d }||krÎ|| S |rìt	|› d	t
||ƒ› �ƒ‚nt	ƒ ‚d S )
Nr   õ   ÂµÚur   r2   u   RâˆžéþÿÿÿZRyz is not a valid unit. )r   r€   r„   Ú_unit_symbolsÚisasciiÚ_prefixable_unit_symbolsr   Ú_unit_suffix_symbolsr8   rC   r   )r   ÚsÚdetailed_exceptionr„   r   r   r   r|   ê  s"    


zGeneric._parse_unitÚpercentZarcminZarcsecZ	hourangleZelectron)ú%u   â€²u   â€³u   Ê°u   eâ�»ZOhmZAngstromÚl)u   Î©õ   Ã…u   â„“ÚsunÚearthZjupiterÚ_eÚ_p)u   âŠ™u   â˜‰u   âŠ•u   â™�u   â™ƒu   â‚‘u   â‚šr…   ú-)u   Î¼u   âˆ’u!   â�»â�ºâ�°Â¹Â²Â³â�´â�µâ�¶â�·â�¸â�¹z-+0123456789ú[z]?[r+   Nz]+u	   Â°([CF])?c                 C   s   d|  ¡  | j¡› d�S )Nr   r   )ÚgroupÚ	translateÚ_superscript_translations©r   Úmr   r   r   Ú_convert_superscript9  s    zGeneric._convert_superscriptc                 C   s    t |jƒdkrdS |j dd¡S )Nr   Údegõ   Â°Zdeg_)r   ÚstringÚreplacer›   r   r   r   Ú_convert_deg=  s    zGeneric._convert_degFc                 C   s¦   t |tƒs| d¡}n@| ¡ sVt d|¡}| | j¡}| j 	| j
|¡}| j 	| j|¡}| j||d�}| d¡}|dkr¢|tt d|¡ƒ dkr¢t d |¡tj¡ |S )NÚasciiÚNFC)Údebugr   r   z\(\d+/\d+\)zI'{}' contains multiple slashes, which is discouraged by the FITS standard)r   r‚   Údecoder‰   ÚunicodedataÚ	normalizer™   Ú_translationsÚ_regex_superscriptÚsubr�   Ú
_regex_degr¢   Ú	_do_parseÚcountr   r3   ÚfindallÚwarningsÚwarnÚformatr   ZUnitsWarning)r   rŒ   r¥   ÚresultZ	n_slashesr   r   r   ÚparseC  s"    

 ÿýzGeneric.parsec                 C   s–   z| j |dd�W S  tk
r� } zbz| jj|| j|d�W  W Y ¢DS  tk
r~ } z t|ƒr^‚ ntd|› d�ƒ‚W 5 d }~X Y nX W 5 d }~X Y nX d S )NF)r�   )Úlexerr¥   zSyntax error parsing unit 'r{   )r|   rC   r.   r´   r0   r‚   )r   rŒ   r¥   rƒ   r   r   r   r­   c  s    zGeneric._do_parsec                 C   s
   |  d¡S )NZgeneric)Zget_format_name©r   r   r   r   r   r   r  s    zGeneric._get_unit_namec                    sš   g }|j ‡ fdd„d� |D ]r\}}|dkr>| ˆ  |¡¡ qt |¡}d|ksXd|krv| ˆ  |¡› d|› d�¡ q| ˆ  |¡› |› �¡ qd	 |¡S )
Nc                    s   ˆ   | d ¡ ¡ S r'   )r   Úlower)Úxr%   r   r   Ú<lambda>y  ó    z+Generic._format_unit_list.<locals>.<lambda>)Úkeyr   r   r1   r   r   r   )Úsortr   r   r	   Zformat_powerr   )r   rU   ÚoutÚbaseÚpowerr   r%   r   r   v  s    
zGeneric._format_unit_listc                 C   s
   t | |ƒS r$   )r   r¶   r   r   r   Ú	to_string†  s    zGeneric.to_string)T)F)F)%Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rH   r   r&   r)   r*   r,   r.   r0   Úclassmethodr/   r-   rA   r|   rˆ   rŠ   r‹   r‚   Ú	maketransr©   Z_superscriptsrš   r3   Úcompilerª   r¬   r�   r¢   r´   r­   r   r   rÀ   r   r   r   r   r    8   s†   






9
  ;

û	ýù
þÿÿ 




r    c                   @   s   e Zd ZdZdZdS )ÚUnscaledzÉ
    A format that doesn't display the scale part of the unit, other
    than that, it is identical to the `Generic` format.

    This is used in some error messages where the scale is irrelevant.
    FN)rÁ   rÂ   rÃ   rÄ   r   r   r   r   r   rÈ   ‹  s   rÈ   )rÄ   r3   r§   r°   Ú	fractionsr   Zastropy.utilsr   r   Zastropy.utils.miscr   Ú r   r	   r¾   r
   r   r    rÈ   r   r   r   r   Ú<module>   s       W