U
    e»{j,(  ã                   @   sl   d 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 G d	d
„ d
eƒZdS )z(Handles the CDS string format for units.é    N)Úis_effectively_unity)ÚclasspropertyÚparsing)Údid_you_meané   )ÚcoreÚutils)ÚBasec                   @   sº   e 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„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZeddd„ƒZed dd„ƒZe	dd„ ƒZedd„ ƒZedd„ ƒZdS )!ÚCDSul  
    Support the `Centre de DonnÃ©es astronomiques de Strasbourg
    <http://cds.u-strasbg.fr/>`_ `Standards for Astronomical
    Catalogues 2.0 <http://vizier.u-strasbg.fr/vizier/doc/catstd-3.2.htx>`_
    format, and the `complete set of supported units
    <https://vizier.u-strasbg.fr/viz-bin/Unit>`_.  This format is used
    by VOTable up to version 1.2.
    )ZPRODUCTZDIVISIONZ
OPEN_PARENZCLOSE_PARENZOPEN_BRACKETZCLOSE_BRACKETÚXZSIGNÚUINTZUFLOATZUNITZDIMENSIONLESST)Zlazyc                 C   s   |   ¡ S ©N)Ú_generate_unit_names©Úcls© r   úW/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/units/format/cds.pyÚ_units3   s    z
CDS._unitsc                 C   s   |   ¡ S r   )Ú_make_parserr   r   r   r   Ú_parser7   s    zCDS._parserc                 C   s   |   ¡ S r   )Ú_make_lexerr   r   r   r   Ú_lexer;   s    z
CDS._lexerc                  C   sH   ddl m}  ddlm} i }|j ¡ D ]\}}t|| jƒr&|||< q&|S )Nr   )Úunits)Úcds)Zastropyr   Úastropy.unitsr   Ú__dict__ÚitemsÚ
isinstanceZUnitBase)Úur   ÚnamesÚkeyÚvalr   r   r   r   ?   s    
zCDS._generate_unit_namesc                    sx   ˆ j }d}d}d}d}d}d}dd„ }d	d
„ }	dd„ }
dd„ }‡ fdd„}‡ fdd„}d}dd„ }tjddttjƒd�S )Nz\.ú/z\(z\)z\[z\]c                 S   s2   t  d| j¡s"d| _t| jƒ| _nt| jƒ| _| S )z$((\d+\.?\d+)|(\.\d+))([eE][+-]?\d+)?z[eE\.]r   )ÚreÚsearchÚvalueÚtypeÚintÚfloat©Útr   r   r   Út_UFLOATZ   s
    z!CDS._make_lexer.<locals>.t_UFLOATc                 S   s   t | jƒ| _| S )z\d+)r'   r%   r)   r   r   r   Út_UINTc   s    zCDS._make_lexer.<locals>.t_UINTc                 S   s   t | jd ƒ| _| S )z
[+-](?=\d)Ú1)r(   r%   r)   r   r   r   Út_SIGNh   s    zCDS._make_lexer.<locals>.t_SIGNc                 S   s   | S )u   [xÃ—]r   r)   r   r   r   Út_Xm   s    zCDS._make_lexer.<locals>.t_Xc                    s   ˆ   | ¡| _| S )u   \%|Â°|\\h|((?!\d)\w)+©Ú	_get_unitr%   r)   r   r   r   Út_UNITq   s    zCDS._make_lexer.<locals>.t_UNITc                    s   ˆ   | ¡| _| S )z---|-r0   r)   r   r   r   Út_DIMENSIONLESSv   s    z(CDS._make_lexer.<locals>.t_DIMENSIONLESSÚ c                 S   s   t d| j› �ƒ‚d S )NzInvalid character at col )Ú
ValueErrorÚlexposr)   r   r   r   Út_error   s    z CDS._make_lexer.<locals>.t_errorZ
cds_lextabúastropy/units)ZlextabÚpackageZreflags)Ú_tokensr   Úlexr'   r#   ÚUNICODE)r   ÚtokensZ	t_PRODUCTZ
t_DIVISIONZt_OPEN_PARENZt_CLOSE_PARENZt_OPEN_BRACKETZt_CLOSE_BRACKETr+   r,   r.   r/   r2   r3   Zt_ignorer7   r   r   r   r   L   s(    	  ÿzCDS._make_lexerc                 C   st   | j }dd„ }dd„ }dd„ }dd„ }d	d
„ }dd„ }dd„ }dd„ }	dd„ }
dd„ }dd„ }dd„ }tjddd�S )a]  
        The grammar here is based on the description in the `Standards
        for Astronomical Catalogues 2.0
        <http://vizier.u-strasbg.fr/vizier/doc/catstd-3.2.htx>`_, which is not
        terribly precise.  The exact grammar is here is based on the
        YACC grammar in the `unity library <https://purl.org/nxg/dist/unity/>`_.
        c                 S   sp   ddl m} ddlm} t| ƒdkr>|| d | d  ƒ| d< n.t| ƒdkr\|| d ƒ| d< n|| d ƒ| d< dS )	a  
            main : factor combined_units
                 | combined_units
                 | DIMENSIONLESS
                 | OPEN_BRACKET combined_units CLOSE_BRACKET
                 | OPEN_BRACKET DIMENSIONLESS CLOSE_BRACKET
                 | factor
            r   )Údex)ÚUnité   r   é   é   N)r   r>   Zastropy.units.corer?   Úlen)Úpr>   r?   r   r   r   Úp_main’   s    	z CDS._make_parser.<locals>.p_mainc                 S   s   | d | d< dS )zj
            combined_units : product_of_units
                           | division_of_units
            r   r   Nr   ©rD   r   r   r   Úp_combined_units¥   s    z*CDS._make_parser.<locals>.p_combined_unitsc                 S   s2   t | ƒdkr"| d | d  | d< n| d | d< dS )z‚
            product_of_units : unit_expression PRODUCT combined_units
                             | unit_expression
            rB   r   r@   r   N©rC   rF   r   r   r   Úp_product_of_units¬   s    z,CDS._make_parser.<locals>.p_product_of_unitsc                 S   s6   t | ƒdkr| d d | d< n| d | d  | d< dS )zŽ
            division_of_units : DIVISION unit_expression
                              | combined_units DIVISION unit_expression
            r@   rA   éÿÿÿÿr   r   NrH   rF   r   r   r   Úp_division_of_units¶   s    z-CDS._make_parser.<locals>.p_division_of_unitsc                 S   s*   t | ƒdkr| d | d< n| d | d< dS )z
            unit_expression : unit_with_power
                            | OPEN_PAREN combined_units CLOSE_PAREN
            rA   r   r   NrH   rF   r   r   r   Úp_unit_expressionÀ   s    z+CDS._make_parser.<locals>.p_unit_expressionc                 S   sˆ   t | ƒdkr:| d dkr tdƒ‚| d d| d   | d< nJt | ƒdkrl| d dkrZtdƒ‚d| d	  | d< nt | ƒd	kr„| d | d< d
S )zÎ
            factor : signed_float X UINT signed_int
                   | UINT X UINT signed_int
                   | UINT signed_int
                   | UINT
                   | signed_float
            é   r@   é
   z*Only base ten exponents are allowed in CDSr   g      $@rB   r   rA   N)rC   r5   rF   r   r   r   Úp_factorÊ   s    z"CDS._make_parser.<locals>.p_factorc                 S   s2   t | ƒdkr| d | d< n| d | d  | d< dS )za
            unit_with_power : UNIT numeric_power
                            | UNIT
            rA   r   r   NrH   rF   r   r   r   Úp_unit_with_powerÝ   s    z+CDS._make_parser.<locals>.p_unit_with_powerc                 S   s   | d | d  | d< dS )z3
            numeric_power : sign UINT
            r   rA   r   Nr   rF   r   r   r   Úp_numeric_powerç   s    z)CDS._make_parser.<locals>.p_numeric_powerc                 S   s&   t | ƒdkr| d | d< nd| d< dS )z8
            sign : SIGN
                 |
            rA   r   r   g      ð?NrH   rF   r   r   r   Úp_signí   s    z CDS._make_parser.<locals>.p_signc                 S   s   | d | d  | d< dS )z0
            signed_int : SIGN UINT
            r   rA   r   Nr   rF   r   r   r   Úp_signed_int÷   s    z&CDS._make_parser.<locals>.p_signed_intc                 S   s   | d | d  | d< dS )zY
            signed_float : sign UINT
                         | sign UFLOAT
            r   rA   r   Nr   rF   r   r   r   Úp_signed_floatý   s    z(CDS._make_parser.<locals>.p_signed_floatc                 S   s
   t ƒ ‚d S r   )r5   rF   r   r   r   Úp_error  s    z!CDS._make_parser.<locals>.p_errorZcds_parsetabr8   )Z	tabmoduler9   )r:   r   Zyacc)r   r=   rE   rG   rI   rK   rL   rO   rP   rQ   rR   rS   rT   rU   r   r   r   r   †   s    





zCDS._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, )Ú_parse_unitr%   r5   r   Zget_current_unit_registryÚaliasesr6   Ústr)r   r*   ÚeÚregistryr   r   r   r1   	  s    zCDS._get_unitc                 C   s8   || j kr.|r(td |t|| j ƒ¡ƒ‚ntƒ ‚| j | S )Nz3Unit '{}' not supported by the CDS SAC standard. {})r   r5   Úformatr   )r   ÚunitÚdetailed_exceptionr   r   r   rV     s    
 
ÿÿzCDS._parse_unitFc                 C   sª   d|krt dƒ‚t|tƒs$| d¡}z| j|dd�W S  t k
r¤   z| jj|| j|d�W  Y S  t k
rž } z"t|ƒr†t t|ƒƒ‚nt dƒ‚W 5 d }~X Y nX Y nX d S )Nú z$CDS unit must not contain whitespaceÚasciiF)r]   )ÚlexerÚdebugzSyntax error)r5   r   rX   ÚdecoderV   r   Úparser   )r   Úsra   rY   r   r   r   rc   "  s    

z	CDS.parsec                 C   s
   |   d¡S )Nr   )Zget_format_name)r\   r   r   r   Ú_get_unit_name7  s    zCDS._get_unit_namec                 C   sR   g }|D ]>\}}|dkr*|  |  |¡¡ q|  |  |¡› t|ƒ› �¡ qd |¡S )Nr   Ú.)Úappendre   r'   Újoin)r   r   ÚoutÚbaseÚpowerr   r   r   Ú_format_unit_list;  s    zCDS._format_unit_listc                 C   sü   t  || j¡}t|tjƒrâ|tjkr(dS t|jd ƒr:dS |jdkrJd}nVt  	|j¡\}}g }|dkrp| 
|¡ |r–| d¡s†d| }| 
d	|› �¡ d
 |¡}tt|j|jƒƒ}t|ƒdkrø|jt d¡dd� ||  |¡7 }nt|tjƒrø|  |¡}|S )Nz---g      Y@ú%r   r4   )r4   r-   ú-ú+Ú10Úxr   T)r    Úreverse)r   Zdecompose_to_known_unitsre   r   r   ZCompositeUnitZdimensionless_unscaledr   ÚscaleZsplit_mantissa_exponentrg   Ú
startswithrh   ÚlistÚzipÚbasesZpowersrC   ÚsortÚoperatorÚ
itemgetterrl   Z	NamedUnit)r   r\   rd   ÚmrY   ÚpartsÚpairsr   r   r   Ú	to_stringE  s0    





zCDS.to_stringN)T)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r:   r   r   r   r   Ústaticmethodr   Úclassmethodr   r   r1   rV   rc   re   rl   r~   r   r   r   r   r
      s6   	




9
 



	r
   )r‚   ry   r#   Zastropy.units.utilsr   Zastropy.utilsr   r   Zastropy.utils.miscr   r4   r   r   rj   r	   r
   r   r   r   r   Ú<module>   s   