o
    /li=                     @   sb   d dl T d dlmZmZmZ ddlmZ ddlZejdkZG dd dZ	d	d
 e
e	 D ZdS )   )*)DelimitedListany_open_tagany_close_tag    )datetimeN)   
   c                   @   s  e Zd ZdZedd Zedd Zee	d
erendd Z	 ee	d	
eed
Z	 ed	d
er<endd Z	 e 
erIendd d e 
erVendd  	dZ	 edd  eeeed e  B 	dZ	 ee ed	d
erendd Z	 ed	d
erendd Z	 eeB eB 	d Z	 ed	d
erendd Z	 ed	d 
erend!d Z	 eee 	d"Z!	 ed#	d$Z"	 ed%	d&Z#e#d'e# d(  	d)Z$ee#d'e# d*  d+ ee#d'e# d*   	d,Z%e%&d-d  d.e" 	d/Z'e(e$e'B e%B 	d0	d0Z)	 ed1	d2Z*	 edZd4e+fd5d6Z,ed[d4e+fd8d9Z-ed:	d;Z.	 ed<	d=Z/	 ed>	d?Z0	 e1 e2 B Z3ed@e+dAedBe4fdCdDZ5e(e6e7dE e8   ee9dEdF ee:dGe;e8 dEB     	dHZ<e=ee>? e<B dIdJ	dKZ@	 edLdM ZAedNdO ZBedP	dQZC	 eeDdReZEeeDdSeZFeeDdTe,ZGeeDdUe-ZHeeDdVe5ZIeeDdWeAZJeeDdXeBZKdYS )\pyparsing_commona  Here are some common low-level expressions that may be useful in
    jump-starting parser development:

    - numeric forms (:class:`integers<integer>`, :class:`reals<real>`,
      :class:`scientific notation<sci_real>`)
    - common :class:`programming identifiers<identifier>`
    - network addresses (:class:`MAC<mac_address>`,
      :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`)
    - ISO8601 :class:`dates<iso8601_date>` and
      :class:`datetime<iso8601_datetime>`
    - :class:`UUID<uuid>`
    - :class:`comma-separated list<comma_separated_list>`
    - :class:`url`

    Parse actions:

    - :class:`convert_to_integer`
    - :class:`convert_to_float`
    - :class:`convert_to_date`
    - :class:`convert_to_datetime`
    - :class:`strip_html_tags`
    - :class:`upcase_tokens`
    - :class:`downcase_tokens`

    Examples:

    .. testcode::

        pyparsing_common.number.run_tests('''
            # any int or real number, returned as the appropriate type
            100
            -100
            +100
            3.14159
            6.02e23
            1e-12
            ''')

    .. testoutput::
        :options: +NORMALIZE_WHITESPACE


        # any int or real number, returned as the appropriate type
        100
        [100]

        -100
        [-100]

        +100
        [100]

        3.14159
        [3.14159]

        6.02e23
        [6.02e+23]

        1e-12
        [1e-12]

    .. testcode::

        pyparsing_common.fnumber.run_tests('''
            # any int or real number, returned as float
            100
            -100
            +100
            3.14159
            6.02e23
            1e-12
            ''')

    .. testoutput::
        :options: +NORMALIZE_WHITESPACE


        # any int or real number, returned as float
        100
        [100.0]

        -100
        [-100.0]

        +100
        [100.0]

        3.14159
        [3.14159]

        6.02e23
        [6.02e+23]

        1e-12
        [1e-12]

    .. testcode::

        pyparsing_common.hex_integer.run_tests('''
            # hex numbers
            100
            FF
            ''')

    .. testoutput::
        :options: +NORMALIZE_WHITESPACE


        # hex numbers
        100
        [256]

        FF
        [255]

    .. testcode::

        pyparsing_common.fraction.run_tests('''
            # fractions
            1/2
            -3/4
            ''')

    .. testoutput::
        :options: +NORMALIZE_WHITESPACE


        # fractions
        1/2
        [0.5]

        -3/4
        [-0.75]

    .. testcode::

        pyparsing_common.mixed_integer.run_tests('''
            # mixed fractions
            1
            1/2
            -3/4
            1-3/4
            ''')

    .. testoutput::
        :options: +NORMALIZE_WHITESPACE


        # mixed fractions
        1
        [1]

        1/2
        [0.5]

        -3/4
        [-0.75]

        1-3/4
        [1.75]
    .. testcode::

        import uuid
        pyparsing_common.uuid.set_parse_action(token_map(uuid.UUID))
        pyparsing_common.uuid.run_tests('''
            # uuid
            12345678-1234-5678-1234-567812345678
            ''')

    .. testoutput::
        :options: +NORMALIZE_WHITESPACE


        # uuid
        12345678-1234-5678-1234-567812345678
        [UUID('12345678-1234-5678-1234-567812345678')]
    c                 C      dd |D S )zK
        Parse action for converting parsed integers to Python int
        c                 S      g | ]}t |qS  int.0ttr   r   `/var/www/html/tatsat2dev/dashboard-backend/venv/lib/python3.10/site-packages/pyparsing/common.py
<listcomp>       z7pyparsing_common.convert_to_integer.<locals>.<listcomp>r   ___tr   r   r   convert_to_integer      z#pyparsing_common.convert_to_integerc                 C   r   )zL
        Parse action for converting parsed numbers to Python float
        c                 S   r   r   floatr   r   r   r   r      r   z5pyparsing_common.convert_to_float.<locals>.<listcomp>r   r   r   r   r   convert_to_float   r   z!pyparsing_common.convert_to_floatintegerc                 C      dd | D S )Nc                 S   r   r   r   r   r   r   r   r      r   -pyparsing_common.<lambda>.<locals>.<listcomp>r   r   r   r   r   <lambda>       zpyparsing_common.<lambda>zhex integer   z[+-]?\d+zsigned integerc                 C   r    )Nc                 S   r   r   r   r   r   r   r   r      r   r!   r   r"   r   r   r   r#      r$   c                 C   r    )Nc                 S   r   r   r   r   r   r   r   r      r   r!   r   r"   r   r   r   r#      r$   /c                 C   r    )Nc                 S   r   r   r   r   r   r   r   r      r   r!   r   r"   r   r   r   r#      r$   fractionc                 C   s   | d | d  S )Nr   r   )r   r   r   r   r#      s    -z"fraction or mixed integer-fractionz[+-]?(?:\d+\.\d*|\.\d+)zreal numberc                 C   r    )Nc                 S   r   r   r   r   r   r   r   r     r   r!   r   r"   r   r   r   r#     r$   z@[+-]?(?:\d+(?:[eE][+-]?\d+)|(?:\d+\.\d*|\.\d+)(?:[eE][+-]?\d+)?)z$real number with scientific notationc                 C   r    )Nc                 S   r   r   r   r   r   r   r   r     r   r!   r   r"   r   r   r   r#     r$   numberz[+-]?\d+\.?\d*(?:[eE][+-]?\d+)?fnumberc                 C   r    )Nc                 S   r   r   r   r   r   r   r   r     r   r!   r   r"   r   r   r   r#     r$   z;(?i:[+-]?(?:(?:\d+\.?\d*(?:e[+-]?\d+)?)|nan|inf(?:inity)?))
ieee_floatc                 C   r    )Nc                 S   r   r   r   r   r   r   r   r   )  r   r!   r   r"   r   r   r   r#   )  r$   
identifierzK(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}zIPv4 addressz[0-9a-fA-F]{1,4}hex_integer:   zfull IPv6 address)r      z::zshort IPv6 addressc                 C   s   t dd | D dk S )Nc                 s   s     | ]}t j|rd V  qdS )r   N)r
   
_ipv6_partmatchesr   r   r   r   	<genexpr>@  s    z,pyparsing_common.<lambda>.<locals>.<genexpr>   )sumr"   r   r   r   r#   @  s    z::ffff:zmixed IPv6 addresszIPv6 addressz:[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}zMAC address%Y-%m-%dfmtc                        fdd}|S )a  
        Helper to create a parse action for converting parsed date string to Python datetime.date

        Params -
        - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%d"``)

        Example:

        .. testcode::

            date_expr = pyparsing_common.iso8601_date.copy()
            date_expr.set_parse_action(pyparsing_common.convert_to_date())
            print(date_expr.parse_string("1999-12-31"))

        prints:

        .. testoutput::

            [datetime.date(1999, 12, 31)]
        c              
      s@   zt |d   W S  ty } zt| |t|d }~ww Nr   )r   strptimedate
ValueErrorParseExceptionstr)ssllr   ver8   r   r   cvt_fnf  s   z0pyparsing_common.convert_to_date.<locals>.cvt_fnr   r8   rD   r   rC   r   convert_to_dateO     z pyparsing_common.convert_to_date%Y-%m-%dT%H:%M:%S.%fc                    r9   )aI  Helper to create a parse action for converting parsed
        datetime string to Python datetime.datetime

        Params -
        - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%dT%H:%M:%S.%f"``)

        Example:

        .. testcode::

            dt_expr = pyparsing_common.iso8601_datetime.copy()
            dt_expr.set_parse_action(pyparsing_common.convert_to_datetime())
            print(dt_expr.parse_string("1999-12-31T23:59:59.999"))

        prints:

        .. testoutput::

            [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)]
        c              
      s<   z	t |d  W S  ty } zt| |t|d }~ww r:   )r   r;   r=   r>   r?   )slr   rB   rC   r   r   rD     s   z4pyparsing_common.convert_to_datetime.<locals>.cvt_fnr   rE   r   rC   r   convert_to_datetimen  rG   z$pyparsing_common.convert_to_datetimez7(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?zISO8601 datez(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?zISO8601 datetimez2[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}UUIDrI   rJ   tokensc                 C   s   t j|d S )a\  Parse action to remove HTML tags from web page HTML source

        Example:

        .. testcode::

            # strip HTML links from normal text
            text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>'
            td, td_end = make_html_tags("TD")
            table_text = td + SkipTo(td_end).set_parse_action(
                pyparsing_common.strip_html_tags)("body") + td_end
            print(table_text.parse_string(text).body)

        Prints:

        .. testoutput::

            More info at the pyparsing wiki page
        r   )r
   _html_strippertransform_string)rI   rJ   rM   r   r   r   strip_html_tags  s   z pyparsing_common.strip_html_tags,)exclude_charsz 		commaItem )defaultzcomma separated listc                 C   r   )z-Parse action to convert tokens to upper case.c                 S      g | ]}|  qS r   )upperr   r   r   r   r     r   z2pyparsing_common.upcase_tokens.<locals>.<listcomp>r   rI   rJ   r   r   r   r   upcase_tokens     zpyparsing_common.upcase_tokensc                 C   r   )z-Parse action to convert tokens to lower case.c                 S   rV   r   )lowerr   r   r   r   r     r   z4pyparsing_common.downcase_tokens.<locals>.<listcomp>r   rX   r   r   r   downcase_tokens  rZ   z pyparsing_common.downcase_tokensa  (?P<url>(?:(?:(?P<scheme>https?|ftp):)?\/\/)(?:(?P<auth>\S+(?::\S*)?)@)?(?P<host>(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(:(?P<port>\d{2,5}))?(?P<path>\/[^?# ]*)?(\?(?P<query>[^#]*))?(#(?P<fragment>\S*))?)urlconvertToIntegerconvertToFloatconvertToDateconvertToDatetimestripHTMLTagsupcaseTokensdowncaseTokensN)r7   )rH   )L__name__
__module____qualname____doc__staticmethodr   r   Wordnumsset_nameset_parse_actionPY_310r   hexnums	token_mapr   r.   Regexsigned_integerr'   add_parse_actionOptsuppressmixed_integerr6   realsci_real
streamliner*   r+   r,   
identcharsidentbodycharsr-   ipv4_addressr2   _full_ipv6_address_short_ipv6_addressadd_condition_mixed_ipv6_addressCombineipv6_addressmac_addressr?   rF   rK   iso8601_dateiso8601_datetimeuuidr   r   rN   ParseResultsrP   	OneOrMoreLiteralLineEnd
printablesWhite
FollowedBy_commasepitemr   quoted_stringcopycomma_separated_listrY   r\   r]   replaced_by_pep8r^   r_   r`   ra   rb   rc   rd   r   r   r   r   r
      sn    3

		
				


./
r
   c                 C   s   g | ]	}t |tr|qS r   )
isinstanceParserElement)r   vr   r   r   r     s
    
r   )corehelpersr   r   r   r   sysversion_inforn   r
   varsvalues_builtin_exprsr   r   r   r   <module>   s   
    

