Ë
    |D™jî  ã                   ó¶   — d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	  G d„ de
«      Z e«       Zg d	¢Z G d
„ de
«      Z ee«      Z G d„ de
«      Z e«       Zy)a3   Small recursive descent parser for SVG transform="" data.


In [1]: from svg_transform import svg_transform_parser

In [3]: svg_transform_parser.parse('translate(50, 50)')
Out[3]: [('translate', [50.0, 50.0])]

In [4]: svg_transform_parser.parse('translate(50)')
Out[4]: [('translate', [50.0])]

In [5]: svg_transform_parser.parse('rotate(36 50,50)')
Out[5]: [('rotate', [36.0, 50.0, 50.0])]

In [6]: svg_transform_parser.parse('rotate(36)')
Out[6]: [('rotate', [36.0])]

In [7]: svg_transform_parser.parse('skewX(20)')
Out[7]: [('skewX', [20.0])]

In [8]: svg_transform_parser.parse('skewY(40)')
Out[8]: [('skewX', [20.0])]

In [9]: svg_transform_parser.parse('scale(2 .5)')
Out[9]: [('scale', [2.0, 0.5])]

In [10]: svg_transform_parser.parse('scale(.5)')
Out[10]: [('scale', [0.5])]

In [11]: svg_transform_parser.parse('matrix(1 0 50 0 1 80)')
Out[11]: [('matrix', [1.0, 0.0, 50.0, 0.0, 1.0, 80.0])]

Multiple transformations are supported:

In [12]: svg_transform_parser.parse('translate(30 -30) rotate(36)')
Out[12]: [('translate', [30.0, -30.0]), ('rotate', [36.0])]
é    )Úabsolute_importN)ÚDecimal)Úpartial)Úrangec                   ó   — e Zd Zd„ Zy)Ú_EOFc                  ó   — y)NÚEOF© )Úselfs    ú_/var/www/html/Astrologybackend/backend/venv/lib/python3.12/site-packages/scour/svg_transform.pyÚ__repr__z_EOF.__repr__G   s   € Øó    N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   E   s   „ ór   r   ))Úfloatz=[-+]?(?:(?:[0-9]*\.[0-9]+)|(?:[0-9]+\.?))(?:[Ee][-+]?[0-9]+)?)Úintz[-+]?[0-9]+)Úcommandz*(?:matrix|translate|scale|rotate|skew[XY]))Ú
coordstartz\()Úcoordendz\)c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚLexera   Break SVG path data into tokens.

    The SVG spec requires that tokens are greedy. This lexer relies on Python's
    regexes defaulting to greediness.

    This style of implementation was inspired by this article:

        http://www.gooli.org/blog/a-simple-lexer-in-python/
    c                 óÎ   — || _         g }|D ]  \  }}|j                  d|›d|›d�«       Œ dj                  |«      | _        t	        j
                  | j                  «      | _        y )Nz(?P<ú>ú)ú|)ÚlexiconÚappendÚjoinÚregex_stringÚreÚcompileÚregex)r   r   ÚpartsÚnamer$   s        r   Ú__init__zLexer.__init__a   sX   € ØˆŒØˆØ"ò 	7‰KˆD�%Ø�LŠLªªuÐ5Õ6ð	7àŸH™H U›OˆÔÜ—Z‘Z × 1Ñ 1Ó2ˆ�
r   c              #   ó¾   K  — | j                   j                  |«      D ]1  }| j                  D ]   \  }}|j                  |«      }|€Œ||f–—  Œ1 Œ3 t        df–— y­w)zœ Yield (token_type, str_data) tokens.

        The last token will be (EOF, None) where EOF is the singleton object
        defined in this module.
        N)r$   Úfinditerr   Úgroupr
   )r   ÚtextÚmatchr&   Ú_Úms         r   Úlexz	Lexer.lexi   sh   è ø€ ð —Z‘Z×(Ñ(¨Ó.ò 	ˆEØŸ<™<ò ‘��aØ—K‘K Ó%�Ø‘=Ø ˜)’OÙñ	ð	ô �DˆkÓùs   ‚AAÁAN)r   r   r   Ú__doc__r'   r/   r   r   r   r   r   V   s   „ ñò3ór   r   c                   óJ   — e Zd ZdZefd„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zy)ÚSVGTransformationParseras   Parse SVG transform="" data into a list of commands.

    Each distinct command will take the form of a tuple (type, data). The
    `type` is the character string that defines the type of transformation in the
    transform data, so either of "translate", "rotate", "scale", "matrix",
    "skewX" and "skewY". Data is always a list of numbers contained within the
    transformation's parentheses.

    See the SVG documentation for the interpretation of the individual elements
    for each transformation.

    The main method is `parse(text)`. It can only consume actual strings, not
    filelike objects or iterators.
    c                 óÊ   — || _         | j                  | j                  | j                  | j                  | j                  | j                  dœ| _        t        ddg«      | _        y )N)Ú	translateÚscaleÚskewXÚskewYÚrotateÚmatrixr   r   )ÚlexerÚrule_1or2numbersÚrule_1numberÚrule_1or3numbersÚrule_6numbersÚcommand_dispatchÚlistÚnumber_tokens)r   r:   s     r   r'   z SVGTransformationParser.__init__‹   s_   € ØˆŒ
ð ×.Ñ.Ø×*Ñ*Ø×&Ñ&Ø×&Ñ&Ø×+Ñ+Ø×(Ñ(ñ!
ˆÔô " 5¨'Ð"2Ó3ˆÕr   c                 óê   — | j                   j                  |«      }t        t        g|f¢­Ž }g } |«       }|d   t        ur2| j                  ||«      \  }}|j                  |«       |d   t        urŒ2|S )z2 Parse a string of SVG transform="" data.
        r   )r:   r/   r   Únextr
   Úrule_svg_transformr   )r   r+   ÚgenÚnext_val_fnÚcommandsÚtokenr   s          r   ÚparsezSVGTransformationParser.parseš   sv   € ð �j‰j�n‰n˜TÓ"ˆÜœdÐ, c VÒ,ˆàˆÙ“ˆØ�A‰hœcÑ!Ø!×4Ñ4°[À%ÓH‰NˆG�UØ�O‰O˜GÔ$ð �A‰hœcÒ!ð ˆr   c                 óî   — |d   dk7  rt        d|›�«      ‚|d   }| j                  |   } |«       }|d   dk7  rt        d|›�«      ‚ |||«      \  }}|d   dk7  rt        d|›�«      ‚ |«       }||f|fS )	Nr   r   z%expecting a transformation type; got é   r   zexpecting '('; got r   zexpecting ')'; got )ÚSyntaxErrorr?   )r   rF   rH   r   ÚruleÚnumberss         r   rD   z*SVGTransformationParser.rule_svg_transform§   s—   € Ø�‰8�yÒ ÝÉ5ÐRÓSÐSØ˜‘(ˆØ×$Ñ$ WÑ-ˆÙ“ˆØ�‰8�|Ò#Ý¹Ð@ÓAÐAÙ˜k¨5Ó1‰ˆ�Ø�‰8�zÒ!Ý¹Ð@ÓAÐAÙ“ˆØ˜Ð! 5Ð(Ð(r   c                 ó¸   — g } |«       }| j                  ||«      \  }}|j                  |«       | j                  ||«      \  }}|�|j                  |«       ||fS ©N©Úrule_numberr   Úrule_optional_number©r   rF   rH   rN   Únumbers        r   r;   z(SVGTransformationParser.rule_1or2numbersµ   sb   € Øˆá“ˆØ×(Ñ(¨°eÓ<‰ˆ�Ø�‰�vÔà×1Ñ1°+¸uÓE‰ˆ�ØÐØ�N‰N˜6Ô"à˜ˆ~Ðr   c                 óH   —  |«       }| j                  ||«      \  }}|g}||fS rP   )rR   )r   rF   rH   rU   rN   s        r   r<   z$SVGTransformationParser.rule_1numberÂ   s0   € á“ˆØ×(Ñ(¨°eÓ<‰ˆ�Ø�(ˆØ˜ˆ~Ðr   c                 ó  — g } |«       }| j                  ||«      \  }}|j                  |«       | j                  ||«      \  }}|�7|j                  |«       | j                  ||«      \  }}|j                  |«       ||fS rP   rQ   rT   s        r   r=   z(SVGTransformationParser.rule_1or3numbersÉ   s†   € Øˆá“ˆØ×(Ñ(¨°eÓ<‰ˆ�Ø�‰�vÔà×1Ñ1°+¸uÓE‰ˆ�ØÐð �N‰N˜6Ô"à ×,Ñ,¨[¸%Ó@‰MˆF�EØ�N‰N˜6Ô"à˜ˆ~Ðr   c                 óˆ   — g } |«       }t        d«      D ](  }| j                  ||«      \  }}|j                  |«       Œ* ||fS )Né   )r   rR   r   )r   rF   rH   rN   ÚirU   s         r   r>   z%SVGTransformationParser.rule_6numbersÛ   sO   € ØˆÙ“ˆä�q“ò 	#ˆAØ ×,Ñ,¨[¸%Ó@‰MˆF�EØ�N‰N˜6Õ"ð	#ð ˜ˆ~Ðr   c                 óx   — |d   | j                   vrt        d|›�«      ‚t        |d   «      dz  } |«       }||fS )Nr   zexpecting a number; got rK   )rA   rL   r   ©r   rF   rH   Úxs       r   rR   z#SVGTransformationParser.rule_numberä   sE   € Ø�‰8˜4×-Ñ-Ñ-Ý¹eÐEÓFÐFÜ�E˜!‘HÓ Ñ!ˆÙ“ˆØ�%ˆxˆr   c                 ód   — |d   | j                   vrd |fS t        |d   «      dz  } |«       }||fS )Nr   rK   )rA   r   r\   s       r   rS   z,SVGTransformationParser.rule_optional_numberë   sA   € Ø�‰8˜4×-Ñ-Ñ-Ø˜�;Ðä˜˜a™Ó! AÑ%ˆAÙ“MˆEØ�e�8ˆOr   N)r   r   r   r0   Ú	svg_lexerr'   rI   rD   r;   r<   r=   r>   rR   rS   r   r   r   r2   r2   {   s9   „ ñð 'ó 4òò)òòòò$òór   r2   )r0   Ú
__future__r   r"   Údecimalr   Ú	functoolsr   Ú	six.movesr   Úobjectr   r
   r   r   r_   r2   Úsvg_transform_parserr   r   r   ú<module>rf      sj   ðñ,$õJ 'ã 	Ý Ý å ôˆ6ô ñ ƒf€ò€ôˆFô ñD �'‹N€	ôv˜fô vñr /Ó0Ñ r   