
    BPc3                         d Z ddlZddlZddlZddlmZmZmZ g dZg dZg dZ	d Z
d Zd	 Zd
 Zd Zd Zd Z G d dej                  Zedk    r e                                             dS dS )a:  
Version 0.6 - DPI Switcher

This extension scales a document to fit different SVG DPI -90/96-

Changes since v0.5:
    - transform all top-level containers and graphics elements
    - support scientific notation in SVG lengths
    - fix scaling with existing matrix()
    - support different units for document width, height attributes
    - improve viewBox support (syntax, offset)
    - support common cases of text-put-on-path in SVG root
    - support common cases of <use> references in SVG root
    - examples from http://tavmjong.free.fr/INKSCAPE/UNITS/ tested

TODO:
    - check grids/guides created with 0.91:
      http://tavmjong.free.fr/INKSCAPE/UNITS/units_mm_nv_90dpi.svg
    - check <symbol> instances
    - check more <use> and text-on-path cases (reverse scaling needed?)
    - scale perspective of 3dboxes

    N)UseTextElement
transforms)defsglyphmarkermaskzmissing-glyphpatternsymbol)agswitch)
circleellipseimagelinepathpolygonpolylinerecttextusec                 4    |                      d          dk    S )z0Check whether element is an Inkscape 3dbox type.zsodipodi:typezinkscape:box3d)get)elements    -/usr/share/inkscape/extensions/dpiswitcher.pyis_3dboxr   O   s    ;;''+;;;    c                     t          | t                    r(|                     d          }|t          |          rdS dS )z,Check whether text element is put on a path.zsvg:textPathNTF)
isinstancer   findlen)r   	text_paths     r   is_text_on_pathr$   T   s@    ';'' LL00	 S^^ 45r   c                 .    ||                                  v S )z@Check whether element1 and element2 are siblings of same parent.)	getparent)element1element2s     r   
is_siblingr)   ]   s    x))++++r   c                 d    |-|                      d          }|||                                v S dS )z!Check whether element is in defs.Nr   F)r!   iterdescendants)docr   r   s      r   
is_in_defsr-   b   s;    xxd2244445r   c                     d}|r	 |S )z'Check transformation for 3dbox element.F )svgr   scale_xscale_yskips        r   check_3dboxr4   k   s    D  	Kr   c           	         d}|                     d          j        }t          | |          s&t          ||          rd}d|j        v r|j                            ||           t          j        d	                    ||                    j
        }t          |d         d         |d         d         z  |d         d         |d         d         z  z
            }t          j        t          |                    }d}	t          t          j                            |                    d	                              }
|	|
v rPt%          |
|	                   |z  |
|	<   |                    d	t)          t          j        |
                               |                                D ]}t-          |t          j                  rt          t          j                            |                    d	                              }
|	|
v rPt%          |
|	                   |z  |
|	<   |                    d	t)          t          j        |
                               |S )
z3Check whether to skip scaling a text put on a path.FtextPathT	transformzscale({},{})r      z	font-sizestyle)r!   hrefr-   r)   attribr7   	add_scaleinkex	TransformformatmatrixabsmathsqrtdictStyle	parse_strr   floatsetstrr+   r    Tspan)r0   r   r1   r2   r3   r   matdetdescrimpropsdictchilds               r   check_text_on_pathrQ   u   s    D<<
##(Dc4   Dgt$$ 	DDgn,,!++GW===/."7"7"I"IJJQCc!fQi#a&)+c!fQi#a&).CCDDCiC))GD..w{{7/C/CDDEEEu}}#E$K007:dGSU););%<%<=== 0022 D Dgu{33 D !6!6uyy7I7I!J!JKKEu}}&+E$K&8&87&Bd		'3u{5/A/A+B+BCCCKr   c                     d}|j         }t          | |          s6t          ||          r&d}d|j        v r|j                            ||           |S )z>Check whether to skip scaling an instantiated element (<use>).FTr7   )r:   r-   r)   r;   r7   r<   )r0   r   r1   r2   r3   r   s         r   	check_userS      sb    D<Dc4   >gt$$ 	>Dgn,,!++GW===Kr   c                       e Zd ZdZdZdZdZd Zdddd	d
dddddd
Zddddddddddd
Z	d%dZ
d Zd Zd Zd&dZd  Zd! Zd" Zd# Zd$S )'DPISwitcherT      ??pxc                 B    |                     dt          dd           d S )Nz
--switcher0zSelect the DPI switch you want)typedefaulthelp)add_argumentrI   )selfparss     r   add_argumentszDPISwitcher.add_arguments   s3    sC6V 	 	
 	
 	
 	
 	
r   g     V@g      ?      ?gkbX@g)nA@gpt:@gtKAg      .@g     P@g     @)
inptrX   mmcmmkmpcydftg      X@gUUUU?g:Zx<@gd/B@g:@gdLAg      0@g      @g      @Fc                    | j         j        dk    rt          | j                  }nt          | j                  }|r/t          j        dd                    |dgz             z            }n*t          j        dd                    |          z            }t          j        d          }|                    |          }|	                    |          }d}d}	|r@t          |j        |                                |                                                   }|r3|j        |                                |                                         }	||	fS )zParse SVG length.rZ   z(%s)$|%z:(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)d   rX   )optionsswitcherlist_DPISwitcher__uuconvLegacy_DPISwitcher__uuconvrecompilejoinmatchsearchrG   stringstartend)
r_   lengthpercentknown_units	unitmatchparampuvalunits
             r   parse_lengthzDPISwitcher.parse_length   s-   < C''t233KKt}--K 	D
7SXXkSE6I-J-J#JKKII
7SXXk-B-B#BCCI
I
 
 KKV$$ 	7QUUWW!4566C 	18AGGII/0DDyr   c                 
   | j         pd}||k    rq| j        j        dk    r1|| j        |         z  }|| j        |         | j        d         z  z  }|}n0|| j        |         z  }|| j        |         | j        d         z  z  }|}||fS )z-Convert length to self.units if unit differs.rX   rZ   )unitsrp   rq   rs   rt   )r_   r   r   doc_unitval_pxs        r   convert_lengthzDPISwitcher.convert_length   s    :%8|$++t2488'1D4G4MM  t}T22h 7$-:M MNDyr   c                     ||j         v r4|                     |                    |          d          d         }||v S dS )z=Check unit of attribute value, match to units in *unit_list*.Tr~   r8   N)r;   r   r   )r_   r   attr	unit_listr   s        r   check_attr_unitzDPISwitcher.check_attr_unit   sK    7>!!$$W[[%6%6$EEaHD9$$ "!r   c                     ||j         v r`|                     |                    |          d          \  }}||v r1|                    |d                    ||z  |                     dS dS dS )z9Scale attribute value if unit matches one in *unit_list*.Tr   z{}{}N)r;   r   r   rH   r?   )r_   r   r   r   factorr   r   s          r   scale_attr_valzDPISwitcher.scale_attr_val   s|    7>!!))'++d*;*;T)JJICy  D&--fd"C"CDDDDD "!  r   c           	                                 j                            d                    d         }  j                               j                            d                     d         }| j        z  |z  }| j        z  |z  } j        }|                    d          r#|                    dt          |                     |                    d          r#|                    dt          |                     |                    d          rt          j        dd|                    d                    }d |	                                
                    dd          D             }|                    d d	j         fd
|D                          j        j        dk    r(                                                                    |D ]}	|	j        }
 j        } j        }|
t"          v s	|
t$          v rt'          |	          rt)          ||	||          rLt+          |	          rt-          ||	||          rnt/          |	t0                    rt3          ||	||          rdD ]#}                     |	|dgd j        z             $dD ]#}                     |	|dgd j        z             $|dk    r,|dk    r&t7          j        ||f          }||	j        z  |	_        dS )z)Scale all top-level elements in SVG root.widthr   heightviewBoxz +|, +|, c                 ,    g | ]}t          |          S r/   )rG   ).0is     r   
<listcomp>z*DPISwitcher.scale_root.<locals>.<listcomp>  s    QQQ588QQQr      z{} {} {} {}c                 $    g | ]}|j         z  S r/   )factor_a)r   r   r_   s     r   r   z*DPISwitcher.scale_root.<locals>.<listcomp>  s     &T&T&Tdm(;&T&T&Tr   1)r   r   rn   rb   )xy)scaleN)r   r0   r   r   r   rH   rI   ru   substripsplitr?   rp   rq   scale_guides
scale_gridTAGGRAPHICS_ELEMENTSCONTAINER_ELEMENTSr   r4   r$   rQ   r    r   rS   r   r   r>   r7   )r_   unit_exponent	width_num
height_num	width_doc
height_docr0   viewboxstringviewboxlistr   tagwidth_scaleheight_scaler   	scale_mats   `              r   
scale_rootzDPISwitcher.scale_root   s.    %%dhll7&;&;<<Q?	(T($*;*;DHLL<R<R*S*STUVW
-=	$-/-?
h778 	/GGHc*oo...777 	-GGGS^^,,, 779 	F:sCGGI4F4FGGMQQ]-@-@-B-B-H-Ha-P-PQQQKGG$$&T&T&T&T&T&T&TU   < C''OO 	F 	FG +C-K=L'''32D+D+D G$$ !"3lKK ! "7++ !)#w\RR ! gs++ ! g{LII !  0 S SD''ucDM>QRRRR& S SD''ucDM>QRRRR #%%,#*=*= * 4K;V W W WI(1G4E(EG%;	F 	Fr   c                     d S )Nr/   )r_   elems     r   scale_elementzDPISwitcher.scale_element7  s    r   c                    | j         j                                        D ]}|                    d                              d          }|                    dt          t          |d                                                   | j	        z            dz   t          t          |d                                                   | j	        z            z              dS )zScale the guidelinesposition,r   r8   N)
r0   	namedview
get_guidesr   r   rH   rI   rG   r   r   )r_   guidepoints      r   r   zDPISwitcher.scale_guides:  s    X'2244 	 	EIIj))//44EIIE%(..**++dm;<<eE!HNN,,--=>>?   	 	r   c                    | j                             d          }|D ]1}|                    dd           |                    d          rqt	          t          t          j        dd|                    d                              | j        z            dz   }|                    dt	          |                     |                    d          rqt	          t          t          j        dd|                    d                              | j        z            dz   }|                    dt	          |                     |                    d          rqt	          t          t          j        dd|                    d                              | j        z            dz   }|                    dt	          |                     |                    d	          rqt	          t          t          j        dd|                    d	                              | j        z            dz   }|                    d	t	          |                     3d
S )zScale the inkscape gridz//inkscape:gridr   rX   spacingxz[a-zA-Z] spacingyoriginxoriginyN)	r0   xpathrH   r   rI   rG   ru   r   r   )r_   gridsgridr   r   r   r   s          r   r   zDPISwitcher.scale_gridE  s1   011 %	2 %	2DHHWd###xx
## 4bfZTXXj5I5IJJKK-(  	  S]]333xx
## 4bfZTXXj5I5IJJKK-(  	  S]]333xx	"" 2bfZTXXi5H5HIIJJ-(  	  CLL111xx	"" 2bfZTXXi5H5HIIJJ-(  	  CLL111K%	2 %	2r   c                     | j         }| j        j        dk    rd| _        d| _        |j                            dd           |                     |                    d                    d         | _	        d}| j	        rl| j	        dk    ra| j	        d	k    rV| j	        d
k    rK| j        j        dk    rd| j        | j
        | j	                 z  z  }nd| j        | j        | j	                 z  z  }|                     |           d S )NrZ   rW   rV   zinkscape:document-unitsrX   r   r8   rb   r   rn   )r0   rp   rq   r   factor_br   rH   r   r   r   rt   rs   r   )r_   r0   r   s      r   effectzDPISwitcher.effecto  s    h< C'''DM'DM3T:::&&swww'7'788;
: 	X$*,,r1A1AdjTWFWFW|$++ #t}t}TZ7P'P Q #t}t7J4:7V'V W&&&&&r   N)F)rb   )__name__
__module____qualname__	multi_inxr   r   r   ra   rs   rt   r   r   r   r   r   r   r   r   r   r/   r   r   rU   rU      s)       IHHE
 
 
  N  H   .   % % %E E E;F ;F ;F ;Fz  	 	 	(2 (2 (2T' ' ' ' 'r   rU   __main__)__doc__ru   rB   r=   r   r   r   SKIP_CONTAINERSr   r   r   r$   r)   r-   r4   rQ   rS   EffectExtensionrU   r   runr/   r   r   <module>r      sQ  * 0 
			   . . . . . . . . . .     
   < < <
  , , ,
      >
 
 
[' [' [' [' ['%' [' [' ['| zKMM r   