
    "d                          d Z ddlmZmZ ddlZ G d de      Z G d de      Z G d d	e      Z G d
 de      Z	ej                         D  cg c]  } | eus |         c} Zd Zd Zyc c} w )z3Conform qss to compliant scss and css to valid qss.    )absolute_importprint_functionNc                       e Zd ZdZd Zd Zy)	Conformerz(Base class for all text transformations.c                     t         S )z!Transform some qss to valid scss.NotImplementedselfqsss     3/usr/lib/python3/dist-packages/qtsass/conformers.pyto_scsszConformer.to_scss           c                     t         S )z Transform some css to valid qss.r   r   csss     r   to_qsszConformer.to_qss   r   r   N__name__
__module____qualname____doc__r   r    r   r   r   r      s    2r   r   c                       e Zd ZdZd Zd Zy)NotConformerzConform QSS "!" in selectors.c                 &    |j                  dd      S )z'Replace "!" in selectors with "_qnot_".:!:_qnot_replacer
   s     r   r   zNotConformer.to_scss%   s    {{4++r   c                 &    |j                  dd      S )z'Replace "_qnot_" in selectors with "!".r   r   r    r   s     r   r   zNotConformer.to_qss)   s    {{9d++r   Nr   r   r   r   r   r   "   s    ',,r   r   c                   f    e Zd ZdZdZ ej                  dej                        Zd Z	d Z
d Zd Zy)	QLinearGradientConformerz%Conform QSS qlineargradient function.)x1y1x2y2znqlineargradient\(((?:(?:\s+)?(?:x1|y1|x2|y2):(?:\s+)?[0-9A-Za-z$_\.-]+,?)+)((?:(?:\s+)?stop:.*,?)+(?:\s+)?)?\)c                 t   g d}|j                  d      D cg c]  }|j                  dd       c}D ]^  }	 |\  }}|j                         }|| j                  v r8| j                  j                  |      }|dk\  r|dk  r|j                         ||<   ` dj                  |      S c c}w # t        $ r Y w xY w)z
        Take a qss str with xy coords and returns the values.

          'x1: 0, y1: 0, x2: 0, y2: 0' => '0, 0, 0, 0'
          'y1: 1' => '0, 1, 0, 0'
        )0r*   r*   r*   ,:   r      , splitstrip_DEFAULT_COORDSindex
ValueErrorjoinr   groupvaluespart
key_valueskeyvalueposs           r   _conform_coords_to_scssz0QLinearGradientConformer._conform_coords_to_scss;   s     &:?++c:JK$4::c1-K 		J'
Uiik$.....44S9CaxC1H&+kkms		 yy   L  s   B&AB++	B76B7c                 2   g }dg}d}|D ]=  }|s|dk(  r|j                  d       |dk(  r|dz  }n
|dk(  r|dz  }|dxx   |z  cc<   ? |D ]9  }|s|j                  dd      \  }}|j                  |j                                ; d	j                  |      S 
z}
        Take a qss str with stops and returns the values.

          'stop: 0 red, stop: 1 blue' => '0 red, 1 blue'
         r   r+   (r-   )r,   r/   appendr1   r2   r6   	r   r8   	new_groupr1   bracket_levelcharr:   _r=   s	            r   _conform_stops_to_scssz/QLinearGradientConformer._conform_stops_to_scssO        	 	D TS[R """II	  	0D::c1-5  /	0 yy##r   c                    |}| j                   j                  |      D ]_  \  }}| j                  |      }|j                  ||d      }|s-dj	                  | j                  |            }|j                  ||d      }a |S )a%  
        Conform qss qlineargradient to scss qlineargradient form.

        Normalize all whitespace including the removal of newline chars.

        qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0, stop: 0 red, stop: 1 blue)
        =>
        qlineargradient(0, 0, 0, 0, (0 red, 1 blue))
        r-   , ({}))qss_patternfindallr?   r!   formatrM   )r   r   	conformedcoordsstops
new_coords	new_stopss          r   r   z QLinearGradientConformer.to_scssh   s     	!--55c: 	?MFE55f=J!))&*a@I (C(CE(JKI!))%A>I	? r   c                     |S zTransform to qss from css.r   r   s     r   r   zQLinearGradientConformer.to_qss       
r   N)r   r   r   r   r3   recompile	MULTILINErQ   r?   rM   r   r   r   r   r   r$   r$   .   s<    /.O"**	 	K!($20r   r$   c                   l    e Zd ZdZdZ ej                  dej                        Zd Z	d Z
d Zd Zd Zy	)
QRadialGradientConformerz%Conform QSS qradialgradient function.)cxcyradiusfxfyzqradialgradient\(((?:(?:\s+)?(?:spread):(?:\s+)?[0-9A-Za-z$_\.-]+,?)+)?((?:(?:\s+)?(?:cx|cy|radius|fx|fy):(?:\s+)?[0-9A-Za-z$_\.-]+,?)+)((?:(?:\s+)?stop:.*,?)+(?:\s+)?)?\)c                     d}|j                  d      D cg c]  }|j                  dd       c}D ]-  }	 |\  }}|j                         }|dk(  r|j                         }/ |S c c}w # t        $ r Y Bw xY w)zo
        Take a qss str with xy coords and returns the values.

          'spread: pad|repeat|reflect'
        padr+   r,   r-   spread)r1   r2   r5   )r   r8   r=   r:   r;   r<   s         r   _conform_spread_to_scssz0QRadialGradientConformer._conform_spread_to_scss   s     :?++c:JK$4::c1-K 	J'
Uiik(?!KKME	  L  s   A$*A))	A54A5c                 j   g d}|j                  d      D cg c]  }|j                  dd       c}D ]Y  }	 |\  }}|j                         }|| j                  v r3| j                  j                  |      }|dk\  r|j                         ||<   [ dj                  |      S c c}w # t        $ r Y }w xY w)z
        Take a qss str with xy coords and returns the values.

          'cx: 0, cy: 0, radius: 0, fx: 0, fy: 0' => '0, 0, 0, 0, 0'
          'cy: 1' => '0, 1, 0, 0, 0'
        )r*   r*   r*   r*   r*   r+   r,   r-   r   r/   r0   r7   s           r   r?   z0QRadialGradientConformer._conform_coords_to_scss   s     +:?++c:JK$4::c1-K 		J'
Uiik$.....44S9Cax&+kkms		 yy   L  s   B!AB&&	B21B2c                 2   g }dg}d}|D ]=  }|s|dk(  r|j                  d       |dk(  r|dz  }n
|dk(  r|dz  }|dxx   |z  cc<   ? |D ]9  }|s|j                  dd      \  }}|j                  |j                                ; d	j                  |      S rA   rF   rH   s	            r   rM   z/QRadialGradientConformer._conform_stops_to_scss   rN   r   c                 Z   |}| j                   j                  |      D ]  \  }}}d| j                  |      z   dz   }|j                  ||d      }| j	                  |      }|j                  ||d      }|sXdj                  | j                  |            }|j                  ||d      } |S )aK  
        Conform qss qradialgradient to scss qradialgradient form.

        Normalize all whitespace including the removal of newline chars.

        qradialgradient(cx: 0, cy: 0, radius: 0,
                        fx: 0, fy: 0, stop: 0 red, stop: 1 blue)
        =>
        qradialgradient(0, 0, 0, 0, 0, (0 red, 1 blue))
        'z', r-   rP   )rQ   rR   ri   r!   r?   rS   rM   )	r   r   rT   rh   rU   rV   
new_spreadrW   rX   s	            r   r   z QRadialGradientConformer.to_scss   s     	%)%5%5%=%=c%B 		?!FFEt;;FCCeKJ!))&*a@I55f=J!))&*a@I (C(CE(JKI!))%A>I		? r   c                     |S rZ   r   r   s     r   r   zQRadialGradientConformer.to_qss   r[   r   N)r   r   r   r   r3   r\   r]   r^   rQ   ri   r?   rM   r   r   r   r   r   r`   r`      sA    /8O"**	 	
K"!($24r   r`   c                 B    | }t         D ]  }|j                  |      } |S )z
    Conform qss to valid scss.

    Runs the to_scss method of all Conformer subclasses on the input_str.
    Conformers are run in order of definition.

    :param input_str: QSS string
    :returns: Valid SCSS string
    )
conformersr   	input_strrT   	conformers      r   scss_conformru      s0     I 1	%%i0	1 r   c                 N    | }t         ddd   D ]  }|j                  |      } |S )z
    Conform css to valid qss.

    Runs the to_qss method of all Conformer subclasses on the input_str.
    Conformers are run in reverse order.

    :param input_str: CSS string
    :returns: Valid QSS string
    NrE   )rq   r   rr   s      r   
qt_conformrw     s9     I"% 0	$$Y/	0 r   )r   
__future__r   r   r\   objectr   r   r$   r`   __subclasses__rq   ru   rw   )cs   0r   <module>r|      s~    : 7 
	 		,9 	,Ty Tnky k\ %335La)9KacL
") Ms   	A*	A*