
    ju1                     *   d Z ddlZddlmZmZmZmZmZmZ ddl	m
Z
 ddlmZ dddd	d
ddZ ej        d          ZdZ ej        d          Z G d de          Zd Zd Zd$dZd Zd Zd Zd%dZd Zd Zd Zd%dZd Zd Z d Z!d  Z"d! Z#d&d#Z$dS )'z
Surface helpers.

    N)atan2coshypotradianssintan   )cairo)	parse_urlg
BP(?gL&d2?gqq?gUUUUUU?)mmcminptpcpxz(url\(.+\)) *(.*)achlmqstvzACHLMQSTVZzrect\( ?(.+?) ?\)c                       e Zd ZdZdS )
PointErrorz,Exception raised when parsing a point fails.N)__name__
__module____qualname____doc__     W/home/ubuntu/budget-transfer-bot/.venv/lib/python3.11/site-packages/cairosvg/helpers.pyr   r      s        6666r   r   c                 .    t          || z
  ||z
            S )z$Get the distance between two points.)r   )x1y1x2y2s       r   distancer!          b"r'"""r   c                     | sdS |                                  } t                              |           }|r?t          |                    d                    j        }|                    d          pd}nd}| pd}||fS )zlExtract from value an uri and a color.

    See http://www.w3.org/TR/SVG/painting.html#SpecifyingPaint

    NNr	      N)strip	PAINT_URLsearchr   groupfragment)valuematchsourcecolors       r   paintr/   #   s      zKKMMEU##E 5;;q>>**3A&$E?r   Tc                    |rdnd}t          | |                    dd          |d                   }t          | |                    dd          |d                   }|                    d          }|rUt          j        d	d
|          }t	          d |                                D                       }|p|d         }|p|d         }|||fS )zReturn ``(width, height, viewbox)`` of ``node``.

    If ``reference`` is ``True``, we can rely on surface size to resolve
    percentages.

    xyr   r   widthz100%r   heightr	   viewBox[ 
	,]+ c              3   4   K   | ]}t          |          V  d S )Nfloat).0positions     r   	<genexpr>znode_format.<locals>.<genexpr>E   s(      HHHhHHHHHHr   r%      )sizegetresubtuplesplit)surfacenode	referencereference_sizer3   r4   viewboxs          r   node_formatrJ   8   s     '2TTFN$((7F33^A5FGGE'488Hf55~a7HIIFhhy!!G &&W55HHHHHHH#%71:&'!!r   c                     |                      dd          } t          j        dd|           } t          j        dd|           } t          j        dd|           } |                                 S )	z?Normalize a string corresponding to an array of various values.Eez(?<!e)-z -r6   r7   z(\.[0-9-]+)(?=\.)z\1 )replacerA   rB   r&   )strings    r   	normalizerP   K   s]    ^^C%%FVItV,,FVM3//FV(&&99F<<>>r   c                     t          j        d|          }|rX|                    dd          \  }}||                                d         }t	          | |d          t	          | |d          |fS t
          )z1Return ``(x, y, trailing_text)`` from ``string``.z(.*?) (.*?)(?: |$)r	   r%   Nxy)rA   r,   r)   endr?   r   )rE   rO   r,   rR   rS   s        r   pointrU   T   st    H)622E {{1a  1		%Wa%%tGQ'<'<fEEr   c                 .    t          ||z
  || z
            S )z;Return angle between x axis and point knowing given center.)r   )cxcyr   pys       r   point_anglerZ   _   r"   r   c                    |j         dk    rp|p$t          | |                    dd          d          }|p$t          | |                    dd          d          }t          | |          \  }}}|dd         \  }}nL|j         d	v r+t          | |          \  }}	}|p|}|p|	}|j        |j        }}nt          d
|j          d          d}
d}|dk    r||z  nd}|dk    r||z  nd}|                    dd                                          }|d         }|dk    rd}d}nt          |          dk    r|d         nd}|dk    rt          ||          }nt          ||          }|x}}|dd                                         }|dd                                         }|j         dk    rMt          | |                    dd          d           }
t          | |                    dd          d           }nJd}
|dk    r||z  |z
  dz  }
n|dk    r||z  |z
  }
d}|dk    r|||z  |z
  dz  z  }n|dk    r|||z  |z
  z  }|||
|fS )zManage the ratio preservation.markermarkerWidth3rR   markerHeightrS   r%   N)svgimagegzRoot node is z,. Should be one of marker, svg, image, or g.r   r	   preserveAspectRatioxMidYMidnoneminslice      refX0refYmidmax)tagr?   r@   rJ   image_widthimage_height	TypeErrorrD   lenrn   rf   lower)rE   rF   r3   r4   _rI   viewbox_widthviewbox_height
node_widthnode_heighttranslate_xtranslate_yscale_xscale_yaspect_ratioalign
x_position
y_positionmeet_or_slicescale_values                       r   preserve_ratior   d   s   x8Igtxxs'C'CSIIL4.#)F)FLL#GT221g(/%~~	*	*	*%0$%?%?"
K#&;(,(8$:K~(DH ( ( (
 
 	

 KK'4q'8'8em##aG)7!););f~%%G881:>>DDFFLOE


+.|+<+<q+@+@QdG##gw//KKgw//K'''1Q3Z%%''
122Y__&&
x8GTXXfc%:%:C@@@GTXXfc%:%:C@@@ 7?]:a?KK5  '/M9KFW,~=BBKK5  6G+n<<KG[+55r   c                    t          | |                    dd          d          }t          | |                    dd          d          }t          | |          \  }}}|dd         \  }}	|                    dd	                              d
          d         }
|
dk    rdn|
dd                                         }|
dk    rdn|
dd                                         }|d         }|dk    r||||z  z
  dz  z  }n|dk    r||||z  z
  z  }|d         }|dk    r||	||z  z
  dz  z  }n|dk    r||	||z  z
  z  }||||z  ||z  fS )z9Get the clip ``(x, y, width, height)`` of the marker box.r]   r^   rR   r_   rS   r%   Nrc   rd   r7   r   re   rf   r	   rh   ri   rm   g       @rn   )r?   r@   rJ   rD   rt   )rE   rF   r|   r}   r3   r4   ru   rI   rv   rw   r   r   r   clip_xclip_ys                  r   clip_marker_boxr      s   $((=#66<<E'488NC88#>>F..MAq'$+ABBK!M>HH*J77==cBB1EE6//uQqSz/?/?/A/AJ6//uQRRy/@/@JQZFU=57?2b88	u		-%'/11QZFU>FW$44::	u		.6G#333657?FW,<<<r   c                     |dz  dz  | dz  z   }|dz  dz  |dz  z   }|dz  dz  |dz  z   }|dz  dz  |dz  z   }	||||	||fS )z7Return the quadratic points to create quadratic curves.r%   r>   r   )
r   r   r   r    x3y3xq1yq1xq2yq2s
             r   quadratic_pointsr      sm    
q&1*rAv
C
q&1*rAv
C
q&1*rAv
C
q&1*rAv
CS#r2%%r   c                     | t          |          z  |t          |          z  z
  |t          |          z  | t          |          z  z   fS )z3Rotate a point of an angle around the origin point.)r   r   )rR   rS   angles      r   rotater      s?    s5zz>AE

N*AE

NQU^,KKKr   c           	      	    |sdS t          j        dt          |                    }t          j                    }|r|                    d          }|d         }t          |          dk    r|dv r|} j        dz  }n8 j        dz  }n-t          |          dk    r|dv r|}|d         }n|d         }ndS |dk    r j        dz  }n(|d	k    rd}n|d
k    r j        }nt           |d          }|dk    r j        dz  }n(|dk    rd}n|dk    r j        }nt           |d          }|
                    t          |          t          |                     |D ]\  }	}
 fd|
                    d          D             }|	dk    r"t          j        |                     |          }O|	dk    rzt          t          |                    d                              }|pd\  }}|
                    ||           |                    |           |
                    | |            |	dk    r]t!          t          t          |d                                       }t          j        dd|ddd                              |          }2|	dk    r]t!          t          t          |d                                       }t          j        d|dddd                              |          }|	dk    r,t          |          dk    r|dz  } |j
        |dd           |	dk    r*t          |          dk    rd|z  } |j        |dd           |r2|
                    t          |           t          |                      	 |                                 |r>|                                }|                    |                    |                     dS |                                  j                            |           dS # t          j        $ ri  j                                        } j                                          j                                          j                            |           Y dS w xY w)zTransform ``surface`` or ``gradient`` if supplied using ``string``.

    See http://www.w3.org/TR/SVG/coords.html#TransformAttribute

    Nz(\w+) ?\( ?(.*?) ?\)r7   r   r	   )topbottomr%   centerleftrightrR   r   r   rS   c                 0    g | ]}t          |          S r   )r?   )r;   r+   rE   s     r   
<listcomp>ztransform.<locals>.<listcomp>   s#    NNN5$w&&NNNr   matrixr   r2   skewXskewY	translate)r   scale)rA   findallrP   r
   MatrixrD   rs   r3   r4   r?   r   r:   multiplyr   popr   r   r   invert
get_matrix
set_matrixcontext	transformError	copy_pathnew_pathclipappend_path)rE   transform_stringgradienttransform_origintransformationsr   originorigin_xorigin_ytransformation_typetransformationvaluesr   rR   rS   tangent
matrix_nowactive_paths   `                 r   r   r      s     j+;!<!<> >O\^^F $;!'',,!9v;;!,,,#"=1,">A-[[1__,,,#!!9!!9Fx}q(HHHH  }HHGXs33Hx~)HHHH!!~HHGXs33Hx%//:::/> & &+^NNNNN4H4H4M4MNNN(**\6*33F;;FF H,,E&**Q--0011E#VDAqQ"""MM%   aR!$$$$ G++'%q	"2"23344G\!QAq99BB6JJFF G++'%q	"2"23344G\!WaAq99BB6JJFF K//6{{a$FfRaRj))) G++6{{aVFL&!*%% =%//)E(OO+;<<<.  	. ",,..J
 3 3F ; ;<<<<<MMOOOO%%f----- ; 1 1 1o//11  """##K0000001s   	P A4RRc                     t                               t          | pd                    }|r(|                    d                              d          ng S )zParse the rect value of a clip. r	   r7   )RECTr(   rP   r)   rD   )rO   r,   s     r   	clip_rectr   '  sG    KK	&,B//00E(-55;;q>>$$$25r   c                     d| v rFd t          | d                                                                       d          D             }|S g S )z=Retrieves the original rotations of a `text` or `tspan` node.r   c                 ,    g | ]}t          |          S r   r9   )r;   is     r   r   zrotations.<locals>.<listcomp>0  s1     L L LE!HHL L Lr   r7   )rP   r&   rD   )rF   original_rotates     r   	rotationsr   -  sa    4L L'X77==??EEcJJL L LIr   c                     d                     fdt          t          | j                            D                       | d<   dS )z6Removes the rotations of a node that are already used.r7   c              3   p   K   | ]0}t          r                    d           nd                   V  1dS )r   N)strr   )r;   r   r   r   s     r   r=   zpop_rotation.<locals>.<genexpr>8  sW       ( ( 	V<FJJqMMM)<==( ( ( ( ( (r   r   N)joinrangers   text)rF   r   r   s    ``r   pop_rotationr   6  sZ    XX ( ( ( ( (s49~~&&( ( ( ( (DNNNr   c                 0      fd|D             S )aI  Returns a list with the current letter's positions (x, y and rotation).

    E.g.: for letter 'L' with positions x = 10, y = 20 and rotation = 30:
    >>> [[10, 20, 30], 'L']

    Store the last value of each position and pop the first one in order to
    avoid setting an x,y or rotation value that have already been used.

    c              3   >   K   | ]}d  fD             |fV  dS )c                 @    g | ]}|r|                     d           ndS )r   N)r   )r;   pls     r   r   z)zip_letters.<locals>.<genexpr>.<listcomp>H  s+    	E	E	Er
#"&&)))t	E	E	Er   Nr   )r;   chardxldylrlxlyls     r   r=   zzip_letters.<locals>.<genexpr>G  sV         
F	Er2sC.D	E	E	EtL     r   r   )r   r   r   r   r   words   ````` r   zip_lettersr   =  sF              r   c                 
   | j         pdg}t          |           D ]U}|                    t          |                     |                    |j        pd           |                     |           Vd                    |          S )z,Flatten the text of a node and its children.r   )r   listappendflattentailremover   )rF   flattened_textchilds      r   r   r   L  s    io2&Nd  genn---ej.B///E77>"""r   r1   c                    |sdS 	 t          |          S # t          $ r Y nw xY w| dS t          |                              dd          d         }|                    d          r`|dk    r
| j        pd}n3|dk    r
| j        pd}n#|dk    rt          | j        | j                  d	z  }t          |dd
                   |z  dz  S |                    d          r| j        t          |dd                   z  S |                    d          r"| j        t          |dd                   z  dz  S |                    d          r"| j        t          |dd                   z  dz  S t          
                                D ]R\  }}|                    |          r8t          |dt          |                              }||r
| j        |z  ndz  c S SdS )a`  Replace a ``string`` with units by a float value.

    If ``reference`` is a float, it is used as reference for percentages. If it
    is ``'x'``, we use the viewport width as reference. If it is ``'y'``, we
    use the viewport height as reference. If it is ``'xy'``, we use
    ``hypot(viewport_width, viewport_height) / 2 ** .5`` as reference.

    r   Nr7   r	   %rR   rS   r1   g;f?r   d   emexr%   ch)r:   
ValueErrorrP   rD   endswithcontext_widthcontext_heightr   	font_sizeUNITSitemsrs   dpi)rE   rO   rG   unitcoefficientnumbers         r   r?   r?   V  s"     qV}}   
 qv$$S!,,Q/Fs :-2II#.3!II$g+W-CDDwN  VCRC[!!I-33			 : 5#5#555			 : 5#5#5599			 : 5#5#5599"[[]] N Nk??4   	N6+CII:+.//F+LW[;661MMMM	N
 1s    
"")Tr$   )r1   )%r   rA   mathr   r   r   r   r   r   rE   r
   urlr   r   compiler'   PATH_LETTERSr   	Exceptionr   r!   r/   rJ   rP   rU   rZ   r   r   r   r   r   r   r   r   r   r   r?   r   r   r   <module>r      s	   
 
			 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5             




	 	 BJ+,,	%rz&''7 7 7 7 7 7 7 7# # #
  *" " " "&    # # #
66 66 66 66r= = =4& & &L L L
_. _. _. _.D6 6 6  ( ( (  # # #0 0 0 0 0 0r   