
    BPc=                        d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZmZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZ dd	lmZmZmZmZmZ dd
l m!Z! ddlm"Z"m#Z# dZ$ej%        Z% G d deee          Z& G d dee          Z' G d de          Z( G d dee          Z) G d dee)          Z* G d de&          Z+ G d de&          Z, G d de&          Z- G d de&          Z.dS )z
A helper module for creating Inkscape effect extensions

This provides the basic generic types of extensions which most writers should
use in their code. See below for the different types.
    N)ABC   )errormsgBoolean)Color
ColorError)
load_svgBaseElementShapeElementGroupLayerGridTextElementFlowParaFlowDivPattern)
CloningVat)InkscapeExtensionSvgThroughMixinSvgInputMixinSvgOutputMixinTempDirMixin)	Transform)LinearGradientRadialGradient)	EffectExtensionGenerateExtensionInputExtensionOutputExtensionRasterOutputExtensionCallExtensionTemplateExtensionColorExtensionTextExtensionc                       e Zd ZdZdS )r   zq
    Takes the SVG from Inkscape, modifies the selection or the document
    and returns an SVG to Inkscape.
    N)__name__
__module____qualname____doc__     2/usr/share/inkscape/extensions/inkex/extensions.pyr   r   I   s           r+   r   c                       e Zd ZdZd Zd ZdS )r   zy
    Takes the SVG from Inkscape and outputs it to something that's not an SVG.

    Used in functions for `Save As`
    c                     dS )z2Effect isn't needed for a lot of Output extensionsNr*   selfs    r,   effectzOutputExtension.effectW         r+   c                      t          d          )z8But save certainly is, we give a more exact message herez0Output extensions require a save(stream) method!NotImplementedErrorr0   streams     r,   savezOutputExtension.saveZ   s    !"TUUUr+   N)r&   r'   r(   r)   r1   r8   r*   r+   r,   r   r   P   sD         A A AV V V V Vr+   r   c                   4     e Zd ZdZ fdZd Zd Zd Z xZS )r    zg
    Takes a PNG from Inkscape and outputs it to another rather format.

    .. versionadded:: 1.1
    c                 V    t                                                       d | _        d S N)super__init__imgr0   	__class__s    r,   r=   zRasterOutputExtension.__init__f   s$    r+   c                 T    ddl m} d |_        |                    |          | _        d S )Nr   )Image)PILrB   MAX_IMAGE_PIXELSopenr>   )r0   r7   rB   s      r,   loadzRasterOutputExtension.loadj   s5     "&::f%%r+   c                     dS )z*Not needed since image isn't being changedNr*   r/   s    r,   r1   zRasterOutputExtension.effectr   r2   r+   c                      t          d          )z+Implement raster image saving here from PILz/Raster Output extension requires a save method!r4   r6   s     r,   r8   zRasterOutputExtension.saveu       !"STTTr+   )	r&   r'   r(   r)   r=   rF   r1   r8   __classcell__r@   s   @r,   r    r    _   sv             & & &9 9 9U U U U U U Ur+   r    c                       e Zd ZdZd Zd ZdS )r   zt
    Takes any type of file as input and outputs SVG which Inkscape can read.

    Used in functions for `Open`
    c                     dS )z1Effect isn't needed for a lot of Input extensionsNr*   r/   s    r,   r1   zInputExtension.effect   r2   r+   c                      t          d          )z8But load certainly is, we give a more exact message herez/Input extensions require a load(stream) method!r4   r6   s     r,   rF   zInputExtension.load   rI   r+   N)r&   r'   r(   r)   r1   rF   r*   r+   r,   r   r   z   sD         @ @ @U U U U Ur+   r   c                   ,    e Zd ZdZdZdZd Zd Zd ZdS )r!   z*Call an external program to get the outputsvgc                     d S r;   r*   r6   s     r,   rF   zCallExtension.load   s    r+   c                    t          j        |            | j        j        }t	          |t
                    s~|                                }t          j        	                    | j
        d| j        z             }t          |d          5 }|                    |           d d d            n# 1 swxY w Y   t          j        	                    | j
        d| j        z             }|                     ||          p|}t	          |t
                    rt          j                            |          st#          d|           | j        dk    ret          |dd          5 }|                                }d d d            n# 1 swxY w Y   d	|v r"t%          |                    d                    }n<t          |d
          5 }|                                }d d d            n# 1 swxY w Y   || _        d S )Nzinput.wbzoutput.zCan't find generated document: rP   rzutf-8)encoding<rb)r   load_rawoptions
input_file
isinstancestrreadospathjointempdir	input_extrE   write
output_extcallisfileIOErrorr	   encodedocument)r0   rZ   datafhloutput_fileri   s         r,   rX   zCallExtension.load_raw   se   d###\,
*c** 	 ??$$DdlHt~4MNNJj$''  3		$                              gll4<T_1LMM99Z55Dh$$ 	*7>>(++ LJJJKKK%''(C'::: *c"xxzzH* * * * * * * * * * * * * * *(??'(@(@AAH(D)) *S"xxzzH* * * * * * * * * * * * * * * !s6   B))B-0B-E==FF?G  G$'G$c                      t          d          )z<Call whatever programs are needed to get the desired result.z/Call extensions require a call(in, out) method!r4   )r0   rZ   rl   s      r,   re   zCallExtension.call   rI   r+   N)	r&   r'   r(   r)   rb   rd   rF   rX   re   r*   r+   r,   r!   r!      sV        44IJ  ! ! !8U U U U Ur+   r!   c                   2    e Zd ZdZdZdZd Zd Zd Zd Z	dS )	r   z
    Does not need any SVG, but instead just outputs an SVG fragment which is
    inserted into Inkscape, centered on the selection.
     Fc                      t          d          )z
        Return an SVG fragment to be inserted into the selected layer of the document
        OR yield multiple elements which will be grouped into a container group
        element which will be given an automatic label and transformation.
        z+Generate extensions must provide generate()r4   r/   s    r,   generatezGenerateExtension.generate   s     ""OPPPr+   c                 ^    | j         j        j        \  }}|d}|d}t          ||f          S )z
        Generate the transformation for the container group, the default is
        to return the center position of the svg document or view port.
        Nr   )	translate)rP   	namedviewcenterr   )r0   pos_xpos_ys      r,   container_transformz%GenerateExtension.container_transform   s>    
 +2=E=EE5>2222r+   c                    | j         rt          nt                              | j                  }| j         r| j                            |           n}|                                 |_        | j        	                                }	 |
                                }| |j        z  |_        n# t          $ r Y nw xY w|                    |           |S )z
        Return the container the generated elements will go into.

        Default is a new layer or current layer depending on the :attr:`container_layer`
        flag.

        .. versionadded:: 1.1
        )container_layerr   r   newcontainer_labelrP   appendrx   	transformget_current_layercomposed_transformAttributeError)r0   	containerparentparent_transforms       r,   create_containerz"GenerateExtension.create_container   s     #2=UUBB4CWXX	 	%HOOI&&&&"&":":"<"<IX//11FN#)#<#<#>#>  (8&7):M&M	## "    MM)$$$s   B( (
B54B5c                    | j                                         }|                                 }t          |t          j                  rE|                                 }|D ],}t          |t                    r|                    |           -d S t          |t                    r|                    |           d S t          d           d S )NzNothing was generated
)
rP   r   rq   r[   typesGeneratorTyper   r
   r}   r   )r0   layerfragmentr   childs        r,   r1   zGenerateExtension.effect   s    **,,==??h 344 	0--//I! , ,e[11 ,$$U+++, , +.. 	0LL"""""./////r+   N)
r&   r'   r(   r)   r|   rz   rq   rx   r   r1   r*   r+   r,   r   r      si         
 OOQ Q Q
3 
3 
3  00 0 0 0 0r+   r   c                   f     e Zd ZdZ ej        d          ZdZ fdZd Z	ddZ
d Zd	 Zd
 Z xZS )r"   z7
    Provide a standard way of creating templates.
    z([\d.]*)(\w\w)?x([\d.]*)(\w\w)?SVGRootc                    d | _         t                                                       | j                            d|                                 d           | j                            dt          d           | j                            dt          d           | j                            d	d 
           | j                            dd
           | j                            dt                     d S )Nz--sizesize)typedestz--widthi   )r   defaultz--heightiX  z--orientation)r   z--unitpxz--gridr   )rP   r<   r=   
arg_parseradd_argumentarg_sizeintr   r?   s    r,   r=   zTemplateExtension.__init__   s    $$XDMMOO&$QQQ$$YS#$FFF$$Zc3$GGG$$_d$CCC$$Xt$<<<$$XG$<<<<<r+   c                     | j         S )z/Can be over-ridden with custom svg loading here)ri   )r0   kwargss     r,   get_templatezTemplateExtension.get_template
  s
    }r+   r   c                       fd}|S )zZArgument is a string of the form X[unit]xY[unit], default units apply
        when missingc                 F   	 t          |           } | | fS # t          $ r Y nw xY wj                            t	          |                     }|P|                                }t          |d                   |d         pt          |d                   |d         pfS d S )Nr   r         )float
ValueErrorsize_rexmatchr\   groups)valuer   r   r0   units      r,   _innerz*TemplateExtension.arg_size.<locals>._inner  s    etUD11   M''E

33E ||~~$q'NNGOt$q'NNGOt	  4s    
%%r*   )r0   r   r   s   `` r,   r   zTemplateExtension.arg_size  s)    	 	 	 	 	 	" r+   c                 D   | j         j        }| j         j        .| j         j        | j         j        | j         j        | j         j        f}| j         j        dk    r|d         |d         k     s"| j         j        dk    r'|d         |d         k    r|dd         |dd         z   }|S )z;Get the size of the new template (defaults to size options)N
horizontalr   r   vertical   )rY   r   widthr   heightorientation)r0   r   s     r,   get_sizezTemplateExtension.get_size%  s    | <$"!#!	D L$44Q$q'!!|':55Q$q'!!!9tAaCy(Dr+   c                    |                                  \  }}}}t          | j                            |d                    }t          | j                            |d                    }|                                 | _        | j                                        | _        | j                            d| j                   | j                            dt          |          |z              | j                            dt          |          |z              | j                            dd| d|            | 
                    |||           dS )	z$Creates a template, do not over-rider   idr   r   viewBoxz0 0  N)r   r   rP   uutounitr   ri   getrootsettemplate_idr\   set_namedview)r0   r   
width_unitr   height_unitwidth_px	height_pxs          r,   r1   zTemplateExtension.effect8  s   37==??0
FKtx((5566))&$7788	))++=((**T4+,,,Wc%jj:5666Xs6{{[8999Y 7u 7 7v 7 78888Y
;;;;;r+   c                    | j         j                            d|           | j         j                            dd           | j         j                            dt          |dz                       | j         j                            dt          |dz                       | j        j        rO| j         j                            dd           | j         j                            t          d	
                     dS dS )zSetup the document namedviewzinkscape:document-unitszinkscape:zoomz0.25zinkscape:cxg       @zinkscape:cyshowgridtruexygridr   N)rP   rt   r   r\   rY   gridaddr   )r0   r   r   r   s       r,   r   zTemplateExtension.set_namedviewF  s    8$???777}c%#+.>.>???}c&3,.?.?@@@< 	8H"":v666H""4X#6#6#677777	8 	8r+   )r   )r&   r'   r(   r)   recompiler   r   r=   r   r   r   r1   r   rJ   rK   s   @r,   r"   r"      s          rz<==HK	= 	= 	= 	= 	=     .  &< < <8 8 8 8 8 8 8r+   r"   c                   d     e Zd ZdZdZefZdZ	  fdZd Z	d Z
ddZd Zd	 Zd
 Zd Zd Z xZS )r#   z>
    A standard way to modify colours in an svg document.
    Fc                 V    t                                                       i | _        d S r;   )r<   r=   _renamedr?   s    r,   r=   zColorExtension.__init__c  s$    r+   c                     i | _         t          | j                  }| j        j                            t
                    D ]}|                     ||           |                    | j        t
          f           d S )N)r   )	r   r   rP   	selectiongetr   process_elementprocessprocess_elements)r0   	gradientselems      r,   r1   zColorExtension.effectg  sy     tx((	H&**<88 	2 	2D  y1111$/GGGGGr+   c                 ^    |                                 D ]}|                     |           dS )z%Process multiple elements (gradients)N)descendantsr   )r0   r   r   s      r,   r   zColorExtension.process_elementsp  s>    %%'' 	( 	(E  ''''	( 	(r+   Nc                 L   |                                 }| j        r|j        j        n|j        j        D ]%}||vr	  ||          }n# t
          $ r Y !w xY wt          |t                    rt          |          }| j        r9|                    |                    |j        j        |                             }| 	                    ||          }|j        
                    ||           t          |t          t          t          f          rI|                    ||| j        ||           |j        #|                    |j        || j        |           '| j        rdS |j        j        D ]3} ||          }|                     ||          }||dfvr
||j        |<   4dS )z$Process one of the selected elements)alpha)stylenameN)linkerr   )specified_style	pass_rgbar   associated_propscolor_propsr   r[   r   to_rgba_modify_color	set_colorr   r   r   track_ref_clonedhref_xlink_clonedopacity_propsmodify_opacity)	r0   r   r   r   r   r   colrgba_resultresults	            r,   r   zColorExtension.process_elementu  s   $$&& ,0>UDJ''tz?U	X 	XD 5  d   %'' 8Ell> ++"jj)DT)JKK &  C #00s;;
$$[$777%..'!JKK XtT-=UQUVVV:)OOEJd6HQVOWWW> 	FJ, 	* 	*DE$KKE((u55FeQZ''#)
4 		* 	*s   A		
AAc                 ,    || j         |<   d| d||<   d S )Nzurl(#))r   )r0   old_idnew_idr   r   s        r,   r   zColorExtension._ref_cloned  s&     &f'f'''dr+   c                     |                     d          }| j                            | j                             ||                    }|                    dd|z              d S )Nr   z
xlink:href#)r   rP   getElementByIdr   r   )r0   r   r   r   lids        r,   r   zColorExtension._xlink_cloned  sX    jj(():):3)D)DEE

<v.....r+   c                 D    |s| j         r|                     ||          S |S )z0Pre-process color value to filter out bad colors)process_nonemodify_colorr0   r   colors      r,   r   zColorExtension._modify_color  s/     	2D% 	2$$T5111r+   c                      t          d          )z4Replace this method with your colour modifier methodzProvide a modify_color method.r4   r   s      r,   r   zColorExtension.modify_color  s    !"BCCCr+   c                     |S )zOptional opacity modificationr*   )r0   r   opacitys      r,   r   zColorExtension.modify_opacity  s	     r+   r;   )r&   r'   r(   r)   r   r   
select_allr   r=   r1   r   r   r   r   r   r   r   rJ   rK   s   @r,   r#   r#   Q  s          LJI    H H H( ( (
!* !* !* !*F( ( (/ / /
  D D D      r+   r#   c                   B    e Zd ZdZdZdZd Zd Zd Ze	d             Z
dS )r$   z8
    A base effect for changing text in a document.
    Tc                     | j         j        pd | j                                        i}|                                D ]}|                     |           d S r;   )rP   r   ri   r   valuesr   )r0   nodesr   s      r,   r1   zTextExtension.effect  s\    "EtT]-B-B-D-D&ELLNN 	' 	'D  &&&&	' 	'r+   c                    |                     d          dk    rd| _        n0t          |t          t          t
          f          rd| _        d| _        |j        -|                     |j                  |_        d| _        d| _        |D ]}| 	                    |           |j
        !|                     |j
                  |_
        dS dS )zReverse the node textzsodipodi:rolelineTNF)r   newliner[   r   r   r   newpartextprocess_chardatar   tail)r0   noder   s      r,   r   zTextExtension.process_element  s    88O$$..DLL{Hg>?? 	DLDK9 --di88DI DLDK 	( 	(E  ''''9 --di88DIII ! r+   c                 R    d                     t          | j        |                    S )z3Replaceable chardata method for processing the textro   )r`   mapmap_char)r0   r   s     r,   r  zTextExtension.process_chardata  s     wws4=$//000r+   c                      t          d          )z6Replaceable map_char method for processing each letterz<Please provide a process_chardata or map_char static method.r4   )chars    r,   r  zTextExtension.map_char  s     "J
 
 	
r+   N)r&   r'   r(   r)   r   r   r1   r   r  staticmethodr  r*   r+   r,   r$   r$     sr          GF' ' '
9 9 9&1 1 1 
 
 \
 
 
r+   r$   )/r)   r^   r   sysr   abcr   utilsr   r   colorsr   r   elementsr	   r
   r   r   r   r   r   r   r   r   elements._utilsr   baser   r   r   r   r   
transformsr   r   r   __all__stdoutr   r   r    r   r!   r   r"   r#   r$   r*   r+   r,   <module>r     sS  &  
			 				 



        $ $ $ $ $ $ $ $ % % % % % % % %                        ( ' ' ' ' '              " ! ! ! ! ! 4 4 4 4 4 4 4 4
 
    o'8#   V V V V Vm%6 V V VU U U U U- U U U6U U U U U^%6 U U U'U 'U 'U 'U 'UL. 'U 'U 'UT@0 @0 @0 @0 @0 @0 @0 @0FX8 X8 X8 X8 X8 X8 X8 X8v^ ^ ^ ^ ^_ ^ ^ ^B)
 )
 )
 )
 )
O )
 )
 )
 )
 )
r+   