3
ybW&                 @   s   d Z ddlmZmZmZmZmZ ddlmZ ddl	m
Z
 y
ejZW n ek
rZ   eZY nX G dd deZdd	 Zd
d Zdd Zd+ddZd,ddZdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Z dS )-z
Surface helpers.

    )cossintanatan2radians   )cairo)sizec               @   s   e Zd ZdZdS )
PointErrorz,Exception raised when parsing a point fails.N)__name__
__module____qualname____doc__ r   r   X/var/www/html/enquirykeeper_venv/lib/python3.6/site-packages/cairosvg/surface/helpers.pyr
   %   s   r
   c             C   s   ||  d || d  d S )z$Get the distance between two points.   g      ?r   )x1y1x2y2r   r   r   distance)   s    r   c             C   sj   | sdS | j  } | jdrRt| jdd d dd }| jddd j  pNd}nd}| j  p`d}||fS )zlExtract from value an uri and a color.

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

    Nurl)r   r   )NN)strip
startswithurlssplit)valuesourceZcolorr   r   r   paint.   s    
r    c             C   s   t | |jdd}t | |jdd}|jd}|r|jdd}xd|krV|jdd}q@W td	d
 |j D }|px|d }|p|d }|||fS )z0Return ``(width, height, viewbox)`` of ``node``.widthxheightyZviewBox, z  c             s   s   | ]}t |V  qd S )N)float).0positionr   r   r   	<genexpr>L   s    znode_format.<locals>.<genexpr>r      )r	   getreplacetupler   )surfacenoder!   r#   Zviewboxr   r   r   node_formatC   s    

r1   Nc             C   s   | j dd} | j dd} xd| kr0| j dd} qW | j dd} | j dd	} | jd}d
} x`|D ]X}|jddkr|jd}| d|jd|jdf 7 } | ddj| 7 } q^| |d 7 } q^W | j S )z?Normalize a string corresponding to an array of various values.-z -r%   r&   z  ze -ze-zE -zE- .r   z%s.%s r   z.%s z .)r-   r   countpopjoinr   )stringvaluesr   numbersr   r   r   	normalizeR   s    



r;   c             C   sb   |sdS y|j  d jdd\}}}W n  tk
rF   td| Y nX t| |dt| |d|fS )	z1Return ``(x, y, trailing_text)`` from ``string``.r   r3   r&   r   z&The point cannot be found in string %sr"   r$   )r   r   r3   )r   r   
ValueErrorr
   r	   )r/   r8   r"   r$   r   r   r   pointj   s    r=   c             C   s   t || ||  S )z;Return angle between x axis and point knowing given center.)r   )ZcxcyZpxpyr   r   r   point_anglew   s    r@   c             C   s  |j dkrbt| |jddd}t| |jddd}d}d}t| |jd }t| |jd	 }nL|j dkrt| |\}}}||j }||j }|jddjdd }	|	dkr||ddfS |jddj }
t|
dkr|
d nd}|dkrt||}n
t	||}| }}|	dd j
 }|	dd j
 }|dkr8d}|dkrFd}|dkrb|| |j d }|dkr~|| |j d }|dkr|| |j }|dkr|| |j }||||fS )zManage the ratio preservation.markerZmarkerWidth3r"   ZmarkerHeightr$   r   ZrefXZrefYsvgimageZpreserveAspectRatioZxMidYMidr&   r   Znoner3   Nslice      minZmidg       @max)rC   rD   )tagr	   r,   r1   Zimage_widthZimage_heightr   lenrI   rH   lower)r/   r0   r!   r#   Zscale_xZscale_yZtranslate_xZtranslate_y_ZalignZmos_propertiesZmeet_or_sliceZscale_valueZ
x_positionZ
y_positionr   r   r   preserve_ratio|   sF    









rN   c       
      C   s`   |d d | d  }|d d |d  }|d d |d  }|d d |d  }	||||	||fS )z7Return the quadratic points to create quadratic curves.r   r+   r   )
r   r   r   r   Zx3Zy3Zxq1Zyq1Zxq2Zyq2r   r   r   quadratic_points   s
    rO   c             C   s0   | t | |t|  |t | | t|  fS )z3Rotate a point of an angle around the origin point.)r   r   )r"   r$   angler   r   r   rotate   s    rQ   c          	   C   s  |sdS |j d}tj }x|D ]}xdD ]}||kr0|j|d	}|jd
d	}t|j d }g }x(|r|j dd\}}|jt| | qlW |dkrtj| j|}q0|dk rt	t
|jd}|pd\}	}
|j|	|
 |j| |j|	 |
  q0|dkr8tt	t
|d }tjdd|dddj|}q0|dkrrtt	t
|d }tjd|ddddj|}q0|dkrt|dkr|d7 }|j|  q0|dkr0t|dkrd| }|j|  q0W q"W t| | dS )zAUpdate ``surface`` matrix according to transformation ``string``.Nr   scale	translatematrixrQ   skewXskewYr3   (r&   r   r   r   )rR   rS   rT   rQ   rU   rV   )r   r   )r   )r   r   ZMatrixr-   r;   r   appendr	   Zmultiplyr   r'   r6   rS   rQ   r   rK   rR   apply_matrix_transform)r/   r8   ZtransformationsrT   ZtransformationZttyper9   r   rP   r"   r$   Ztangentr   r   r   	transform   sL    






rZ   c             C   sd   y|j   W n> tk
rJ   | jj }| jj  | jj  | jj| Y nX |j   | jj| d S )N)invertErrorcontextZ	copy_pathnew_pathZclipZappend_pathrZ   )r/   rT   Zactive_pathr   r   r   rY      s    


rY   c             C   sD   | sg S | j  } | jdr&| dd } dd | jdd jdD S )	z.Parse a comma-separated list of url() strings.r   r+   Nc             S   s    g | ]}|j d r|j d qS )z() '")r   )r(   linkr   r   r   
<listcomp>  s    zurls.<locals>.<listcomp>r   r   r%   )r   r   rsplitr   )r8   r   r   r   r      s    
r   c             C   s:   | sg S | j  } | jdr2| dd j djdS g S dS )zParse the rect value of a clip.rectrF   Nz() r%   )r   r   r   )r8   r   r   r   rb     s    
rb   c             C   s0   d| kr,dd t | d j jdD }|S g S )z=Retrieves the original rotations of a `text` or `tspan` node.rQ   c             S   s   g | ]}t |qS r   )r'   )r(   ir   r   r   r`     s    zrotations.<locals>.<listcomp>r&   )r;   r   r   )r0   original_rotater   r   r   	rotations  s     re   c                s,   dj  fddtt| jD | d< dS )z6Removes the rotations of a node that are already used.r&   c             3   s(   | ] }t rjd n d V  qdS )r   r   Nr   )strr6   )r(   rc   )rd   rQ   r   r   r*     s   zpop_rotation.<locals>.<genexpr>rQ   N)r7   rangerK   text)r0   rd   rQ   r   )rd   rQ   r   pop_rotation  s    ri   c                s    fdd|D S )aG  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   s*   | ]"}d d  fD |fV  qdS )c             S   s   g | ]}|r|j d ndqS )r   N)r6   )r(   plr   r   r   r`   *  s    z)zip_letters.<locals>.<genexpr>.<listcomp>Nr   )r(   char)dxldylrlxlylr   r   r*   *  s   zzip_letters.<locals>.<genexpr>r   )ro   rp   rl   rm   rn   wordr   )rl   rm   rn   ro   rp   r   zip_letters!  s    	rr   c             C   sP   | j pdg}x8t| D ],}|jt| |j|jp4d | j| qW dj|S )Nr3   )rh   listrX   flattentailremover7   )r0   Zflattened_textchildr   r   r   rt   .  s    rt   )N)N)!r   mathr   r   r   r   r   r3   r   unitsr	   r\   AttributeErrorSystemError	Exceptionr
   r   r    r1   r;   r=   r@   rN   rO   rQ   rZ   rY   r   rb   re   ri   rr   rt   r   r   r   r   <module>   s2   



3	.	