o
    ”¼Ójùu  ã                   @   s>  d Z ddlZddlZddlZddlZddlZddlm  mZ	 dZ
dZdZdd„ Zdd	„ Zd
Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdZi Zdd„ Zdd„ ZdAdd„Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Z dBd,d-„Z!dCd0d1„Z"		5dDd6d7„Z#		+dEd8d9„Z$d:d;„ Z%d<d=„ Z&d>d?„ Z'e(d@kr�e'ƒ  dS dS )Fa¬  
svg2pgf.py -- convert SVG drawings into ornament files for pgfornament.

Output format (the short macros defined by \pgfornament@shortcuts):
    \m x y            moveto            \l x y         lineto
    \c x1 y1 x2 y2 x y  curveto           \o             closepath
    \s                fill and stroke   \k             stroke only
    \pgfusepathqfill  fill only (svg elements without stroke: thin gaps stay open)
    \r 0 0 W H + \ubb  exact bounding box (first lines of each file)
Coordinates are in bp, origin at the lower left corner of the drawing.

Usage
-----
  A sheet with several ornaments (eps, pdf or svg):
      python3 svg2pgf.py --family celtic --split pack.eps
      -> look at build/test-celtic.pdf, then e.g. --skip 1,2 to drop texts
  One file:
      python3 svg2pgf.py ornament.svg -o pgfornament-myfam1.pgf --height 60
  A whole family (all SVG files of a folder, in alphabetical order):
      python3 svg2pgf.py --family myfam --out-dir build svgs/*.svg --height 60
    -> build/generic/myfam/pgfornament-myfam1.pgf, pgfornament-myfam2.pgf, ...
       build/latex/pgfornament-lib-myfam.code.tex(table \@pgfornamentDim)
       build/test-myfam.tex                   (catalogue to check the result)

Options
-------
  --width W / --height H   scale the drawing to this width / height (bp)
  --scale S                otherwise: 1 SVG unit = S bp (default 0.75 : 1px = 0.75bp,
                           1 for eps/pdf files)
  --digits N               decimals in the output (default 2)
  --source TEXT            text written in the header (origin, licence)
  --split                  the svg is a sheet with several ornaments (needs --family):
                           one file per group of overlapping shapes, in reading
                           order; small groups (texts, logos) are dropped
  --min-size F             with --split: minimal size relative to the largest
                           ornament (default 0.25)
  --skip 1,2               leave out these parts (numbers shown by a first run)
  --keep-white             keep white elements (by default they are ignored:
                           pgfornament draws with only one colour, so a white
                           background would become a black rectangle)

Input: .svg files, or .eps / .ps / .pdf files (first page) if ghostscript
and pdftocairo are installed (TeX Live provides neither; MacTeX includes gs,
pdftocairo comes with poppler: brew install poppler).

Supported: <path> (all commands, arcs included), <rect> (rounded corners),
<circle>, <ellipse>, <line>, <polyline>, <polygon>, <g>, <use>, nested
transform attributes, fill-rule evenodd, fill="none" (stroke only).
CSS: style attribute and simple <style> rules (.class, #id, tag) are read.
Ignored: <defs> content (except through <use>), <clipPath>, <mask>, text,
images, gradients (a gradient fill is treated as a plain fill),
display:none / visibility:hidden elements.

Licence: LPPL 1.3c -- Alain Matthes (pgfornament).
é    Nz{http://www.w3.org/2000/svg}z"{http://www.w3.org/1999/xlink}href)ç      ð?ç        r   r   r   r   c                 C   s€   | \}}}}}}|\}}	}
}}}|| ||	  || ||	  ||
 ||  ||
 ||  || ||  | || ||  | fS )zm o n (apply n first, then m)© )ÚmÚnÚaÚbÚcÚdÚeÚfÚAÚBÚCÚDÚEÚFr   r   ú
svg2pgf.pyÚmulM   s   $þr   c           
      C   s@   | \}}}}}}|\}}	|| ||	  | || ||	  | fS ©Nr   )
r   Úpr   r   r	   r
   r   r   ÚxÚyr   r   r   ÚapplyV   s   (r   z)[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?c                 C   s°  t }| s|S t d| ¡D ]É\}}dd„ t t|¡D ƒ}|dkr*t|ƒdkr*t|ƒ}n¦|dkrCdddd|d t|ƒdkr?|d ndf}n�|d	kr`|d }t|ƒdkrU|d n|}|dd|ddf}np|d
kr¥t |d ¡}t |¡t 	|¡}	}
|	|
|
 |	ddf}t|ƒdkr¤|d |d }}t
dddd||ft
|dddd| | fƒƒ}n+|dkrºddt t |d ¡¡dddf}n|dkrÏdt t |d ¡¡ddddf}nqt
||ƒ}q|S )Nz(\w+)\s*\(([^)]*)\)c                 S   ó   g | ]}t |ƒ‘qS r   ©Úfloat©Ú.0r   r   r   r   Ú
<listcomp>d   ó    z#parse_transform.<locals>.<listcomp>Úmatrixé   Ú	translateé   r   ÚscaleÚrotateé   é   ÚskewXÚskewY)ÚIDENTÚreÚfindallÚNUMÚlenÚtupleÚmathÚradiansÚcosÚsinr   Útan)Úsr   ÚnameÚargsÚvÚtÚsxÚsyÚrÚcoÚsiÚcxÚcyr   r   r   Úparse_transform_   s8   
*,€""rB   c           *         sˆ  | \}}|\}	}
||f|	|
fkrg S t ˆƒt ˆƒ‰‰ˆdks#ˆdkr(d|fgS t |¡}t |¡t |¡‰ ‰||	 d ||
 d }}ˆ | ˆ|  }ˆ | ˆ |  }|d ˆd  |d ˆd   }|dkrxt |¡}ˆ| ˆ| ‰‰ˆd ˆd  ˆd |d   ˆd |d   }ˆd |d  ˆd |d   }|r¬t td|| ƒ¡nd}||krµ| }|ˆ | ˆ }| ˆ | ˆ }ˆ | ˆ|  ||	 d  ‰ˆ| ˆ |  ||
 d  ‰dd„ }|dd|| ˆ || ˆ ƒ}||| ˆ || ˆ | | ˆ | | ˆ ƒ}|�s|dk�r|dtj 8 }n|�r-|dk �r-|dtj 7 }tdtt 	t |ƒtjd  d ¡ƒƒ}|| }d	t 
|d
 ¡ }g }‡ ‡‡‡‡‡fdd„}‡ ‡‡‡fdd„}|} t|ƒD ]X}!| | | }"}#||"ƒ||#ƒ}$}%||"ƒ||#ƒ}&}'|$d ||&d   |$d ||&d   f}(|%d ||'d   |%d ||'d   f})|!|d k�rµ|}%| d|(|)|%f¡ |#} �qi|S )z?SVG elliptical arc -> list of ('C', c1, c2, end)  (SVG 1.1 F.6)r   ÚLr(   r$   r   c                 S   s(   t  | | ||  | | ||  ¡}|S r   )r1   Úatan2)ÚuxÚuyÚvxÚvyr   r   r   r   Úangž   s   $zarc_to_cubics.<locals>.angg•Ö&è.>gUUUUUUõ?é   c                    sP   ˆˆt  | ¡ ˆ   ˆt  | ¡ ˆ  ˆˆt  | ¡ ˆ  ˆt  | ¡ ˆ   fS r   )r1   r3   r4   ©r:   ©Úcpr@   rA   ÚrxÚryÚspr   r   Úpt­   s   &&ÿzarc_to_cubics.<locals>.ptc                    sL   ˆ t  | ¡ ˆ  ˆt  | ¡ ˆ  ˆ t  | ¡ ˆ ˆt  | ¡ ˆ   fS r   )r1   r4   r3   rK   )rM   rN   rO   rP   r   r   Úder±   s   $$ÿzarc_to_cubics.<locals>.derr   )Úabsr1   r2   r3   r4   ÚsqrtÚmaxÚpiÚintÚceilr5   ÚrangeÚappend)*Úp0rN   rO   ÚphiÚlargeÚsweepr   Úx1Úy1Úx2Úy2ÚphÚdxÚdyÚx1pÚy1pÚlamr6   ÚnumÚdenr>   ÚcxpÚcyprI   Út1Údtr   r
   ÚkÚoutrQ   rR   r:   Úir   r   ÚpaÚpbÚdaÚdbÚc1Úc2r   rL   r   Úarc_to_cubics‚   sh   

 
0 ÿ&((rx   c              
      sh  t  dt | ¡‰d‰ g }d}d}d }d }d }d }‡ ‡fdd„}‡ ‡fdd„}	ˆ tˆƒk �r2ˆˆ  }
t  d|
¡rS|
}ˆ d	7 ‰ |d
v rR|d urMd|d< |}d }d  }}q&n|d u r[tdƒ‚| ¡ }| ¡ }|rg|nd\}}|dkr’|ƒ | |ƒ | f}|g dg}| |¡ | }}|r‹dnd}d  }}q&|d u r¢|g dg}| |¡ |}|dkr¿|ƒ | |ƒ | f}|d	  d|f¡ d  }}�nk|dkrÛ|ƒ | |d	 f}|d	  d|f¡ d  }}�nO|dkr÷|d |ƒ | f}|d	  d|f¡ d  }}�n3|dk�r+|ƒ | |ƒ | f}|ƒ | |ƒ | f}|ƒ | |ƒ | f}|d	  d|||f¡ |d }}nÿ|dk�rn|�rGd|d  |d  d|d	  |d	  fn|}|ƒ | |ƒ | f}|ƒ | |ƒ | f}|d	  d|||f¡ |d }}n¼|dv �rï|dk�rƒ|ƒ | |ƒ | f}n|�ršd|d  |d  d|d	  |d	  fn|}|ƒ | |ƒ | f}|d d|d |d    |d	 d|d	 |d	    f}|d d|d |d    |d	 d|d	 |d	    f}|d	  d|||f¡ d |}}n;|dk�r$|ƒ |ƒ |ƒ }}}|	ƒ |	ƒ }}|ƒ | |ƒ | f}|d	  	t
|||||||ƒ¡ d  }}ntd| ƒ‚|}ˆ tˆƒk s-|S )Nz[MmZzLlHhVvCcSsQqTtAa]|r   )r   r   c                     s   t ˆˆ  ƒ} ˆ d7 ‰ | S ©Nr$   r   ©r9   ©rq   Útoksr   r   ri   Í   s   zparse_path.<locals>.numc                     s<   ˆˆ  } | dv rˆ d7 ‰ t | ƒS | dd … ˆˆ < t | d ƒS )N)Ú0Ú1r$   r   ©rW   rK   r{   r   r   ÚflagÓ   s   zparse_path.<locals>.flagz[A-Za-z]r$   ÚZzTr(   z'path data does not start with a commandÚMFÚlrC   ÚHÚVr   ÚSÚQTÚQgUUUUUUå?r   zunknown command )r,   r-   r.   r/   ÚmatchÚ
ValueErrorÚislowerÚupperrZ   Úextendrx   )r
   ÚsubsÚcurÚstartÚsubÚcmdÚlast_cÚlast_qri   r€   r:   Úrelr   ÚoxÚoyr   rv   rw   ÚqrN   rO   r\   ÚlaÚswr   r{   r   Ú
parse_pathÂ   s¨   ú





2

288

¹Hr›   c              
   C   sà   d}| | |fd| | |||  f| ||  || f| || ffd| ||  || f| | |||  f| | |ffd| | |||  f| ||  || f| || ffd| ||  || f| | |||  f| | |ffgdggS )Ng¯OQ¬á?r   Tr   )r@   rA   rN   rO   ro   r   r   r   Úellipse_path)  s   
2222üûrœ   c                 C   s®   |dkr'|dkr'| |fd| | |ffd| | || ffd| || ffgdggS t ||d ƒ}t ||d ƒ}d | | || | | ||| | || || | || | ¡
}t|ƒS )Nr   rC   Tr(   zzM{0},{1} H{2} A{3},{4} 0 0 1 {5},{6} V{7} A{3},{4} 0 0 1 {2},{8} H{0} A{3},{4} 0 0 1 {9},{7} V{6} A{3},{4} 0 0 1 {0},{1} Z)ÚminÚformatr›   )r   r   ÚwÚhrN   rO   r
   r   r   r   Ú	rect_path3  s   &ÿÿ4ÿÿr¡   )ÚfillÚstrokeú	fill-ruleÚdisplayÚ
visibilityc           
      C   s²   t  ¡  |  td ¡D ]K}tjdd|jpdtjd�}t d|¡D ]5\}}i }| 	d¡D ]}d|v rA| 	dd¡\}}| 
¡ || 
¡ < q+| 	d	¡D ]}	t  |	 
¡ i ¡ |¡ qGq qd S )
NÚstylez	/\*.*?\*/Ú )Úflagsz([^{}]+)\{([^}]*)\}ú;ú:r$   ú,)ÚCSSÚclearÚiterÚSVGNSr,   r‘   Útextr†   r-   ÚsplitÚstripÚ
setdefaultÚupdate)
ÚrootÚelÚtxtÚselsÚbodyÚdeclr
   ro   r9   Úselr   r   r   Úread_cssH  s   €ÿúþr½   c           	      C   s  t |ƒ}tD ]}|  |¡d ur|  |¡ ¡ ||< q| j td¡}|gdd„ |  d¡p+d ¡ D ƒ }|  d¡r@| d|  d¡ ¡ |D ]}t	 |i ¡ 
¡ D ]\}}|tv rX|||< qLqB|  d¡p`d d¡D ]}d	|v r€| d	d
¡\}}| ¡ }|tv r€| ¡ ||< qd|S )Nr¨   c                 S   s   g | ]}d | ‘qS )Ú.r   ©r   r	   r   r   r   r   \  r    zstyle_of.<locals>.<listcomp>ÚclassÚidú#r§   rª   r«   r$   )ÚdictÚ	INHERITEDÚgetr³   ÚtagÚreplacer°   r²   rZ   r­   Úitems)	r·   ÚparentÚstro   rÆ   r¹   r¼   r9   r»   r   r   r   Ústyle_ofV  s.   €"
€þ€rË   r   c                 C   s2   | d u r|S t  t|  ¡ ¡}|rt| d¡ƒS |S ©Nr   )r,   r‰   r.   r³   r   Úgroup)r6   Údefaultr   r   r   r   Úflenl  s   rÏ   c                    sd   i ‰ |   ¡ D ]}| d¡r|ˆ | d¡< qg ‰tƒ ‰d	‡ ‡‡‡fdd„	‰ˆ| tddddœƒ ˆˆfS )
NrÁ   r   c                    sz  |dkrd S | j  td¡}|dv rd S |dv rˆ |¡ d S t| |ƒ}| d¡dks1| d¡dkr3d S tˆ t|  d	¡ƒƒ‰ d }|d
krP|  d¡}|rNt|ƒ}�n3|dkrˆt	t
|  d¡ƒt
|  d¡ƒt
|  d¡ƒt
|  d¡ƒt
|  d¡t
|  d¡ƒƒt
|  d¡t
|  d¡ƒƒƒ}nû|dkr¥t
|  d¡ƒ}tt
|  d¡ƒt
|  d¡ƒ||ƒ}nÞ|dkrÅtt
|  d¡ƒt
|  d¡ƒt
|  d¡ƒt
|  d¡ƒƒ}n¾|dkrët
|  d¡ƒt
|  d¡ƒfdt
|  d¡ƒt
|  d¡ƒffgdgg}n˜|dv �r(d d!„ t t|  d"¡püd¡D ƒ}tt|d#d d$… |d%d d$… ƒƒ}	|	�r'|	d# d&d!„ |	d%d … D ƒ|d'kgg}n[|d(k�rƒ|  t¡�p:|  d)¡�p:d d*¡}
ˆ |
¡}|d u�r�tˆ d%d#d#d%t
|  d¡ƒt
|  d¡ƒfƒ}|j  td¡d+k�rx|D ]}ˆ||||d% ƒ �qid S ˆ||||d% ƒ d S |�r¬g }|D ]\}}}‡ fd,d!„|D ƒ}| tˆ |ƒ||g¡ �qŠˆ ||f¡ | D ]}ˆ|ˆ ||d% ƒ �q®d S )-Né2   r¨   )ÚdefsÚclipPathÚmaskÚsymbolÚmetadataÚtitleÚdescr§   ÚlinearGradientÚradialGradientÚpatternÚmarkerÚfilter)r±   ÚimageÚforeignObjectr¥   Únoner¦   ÚhiddenÚ	transformÚpathr
   Úrectr   r   ÚwidthÚheightrN   rO   Úcircler=   r@   rA   ÚellipseÚliner_   r`   rC   ra   rb   F)ÚpolylineÚpolygonc                 S   r   r   r   r   r   r   r   r   ¡  r    z)collect.<locals>.walk.<locals>.<listcomp>Úpointsr   r(   r$   c                 S   s   g | ]}d |f‘qS )rC   r   ©r   r˜   r   r   r   r   ¤  r    rê   ÚuseÚhrefrÂ   rÔ   c                    s4   g | ]}|d  ft ‡ fdd„|dd… D ƒƒ ‘qS )r   c                 3   s   � | ]}t ˆ |ƒV  qd S r   )r   rì   ©r   r   r   Ú	<genexpr>³  s   € z3collect.<locals>.walk.<locals>.<listcomp>.<genexpr>r$   N)r0   )r   Úsgrï   r   r   r   ³  s   4 )rÆ   rÇ   r°   ÚaddrË   rÅ   r   rB   r›   r¡   rÏ   rœ   r,   r-   r.   ÚlistÚzipÚXLINKÚlstriprZ   r   )r·   r   rÊ   ÚdepthrÆ   rŽ   r
   r=   r9   ÚptsÚrefÚtargetÚmmÚchÚtsubsÚs0ÚsegsÚclosedÚtsegs©ÚidsÚshapesÚwalkÚwarnrï   r   r  ~  sz   


€ý$ÿ"ÿ
 "&€
"

*ÿÿzcollect.<locals>.walkÚblackrß   Únonzero)r¢   r£   r¤   )r   )r¯   rÅ   Úsetr+   )r¶   r·   r   r  r   Úcollectv  s   
€;r
  c                 C   s*  |  d|  d|  | }d| d|  |  }||  }g }t |ƒdk r2t |ƒdkr1| | | ¡ n'|| d| |  }|dkrYt |¡}	|| |	 d|  | |	 d|  g7 }g }
|D ]5}d|  k ridk r’n q]d| }|
 |d |  d| | | |  d| | | |  |d |  ¡ q]|
S )Nr'   r(   gê-�™—q=rJ   r   r$   )rS   rZ   r1   rT   )r   r   r	   r
   r   r   r   ÚtsÚdiscr=   Úvalsr:   Úur   r   r   Úcubic_extremaÀ  s&   €
(F€r  c              
   C   sö   g g }}| D ]e\}}|D ]^\}}}|}|  |d ¡ |  |d ¡ |D ]F}	|	d }
|  |
d ¡ |  |
d ¡ |	d dkrh|t|d |	d d |	d d |
d ƒ7 }|t|d |	d d |	d d |
d ƒ7 }|
}q$qqt|ƒt|ƒt|ƒt|ƒfS )Nr   r$   éÿÿÿÿr   r(   )rZ   r  r�   rU   )r  ÚxsÚysrŽ   rÊ   rþ   rÿ   r   r�   rñ   r   r   r   r   ÚbboxÖ  s"   
**ùür  c                 C   s<   dt |ƒ d |  }d|v r| d¡ d¡}|dv rd}|S )Nz%.r   r¾   r}   )z-0r¨   )ÚstrÚrstrip)r9   Údigitsr6   r   r   r   Úfmtë  s   r  c                 C   s(   | d u rdS |   ¡  ¡  dd¡} | dv S )NFú r¨   )Úwhitez#fffz#ffffffzrgb(255,255,255)zrgb(100%,100%,100%))r³   ÚlowerrÇ   rz   r   r   r   Úis_whiteô  s   r  c                 C   s   | d u p|   ¡  ¡ dv S )N)rß   Útransparent)r³   r  rz   r   r   r   Úis_noneû  s   r  c              
   C   sâ   ddl }ddl}ddl}tj | ¡d  ¡ }|dvr| S |jdd�}| }|dkrM| d¡s4t	 
d	|  ¡ tj |d
¡}|jdddddddd| | g	dd� | d¡sYt	 
d|  ¡ tj |d¡}|jdddddd||gdd� |S )zE.eps / .ps / .pdf -> temporary svg (needs ghostscript and pdftocairo)r   Nr$   ©z.epsz.psú.pdfÚsvg2pgf)Úprefixr  Úgsz#ghostscript (gs) is needed to read zin.pdfz-qz	-dNOPAUSEz-dBATCHz-dSAFERz	-dEPSCropz-sDEVICE=pdfwritez-sOutputFile=T)ÚcheckÚ
pdftocairoz'pdftocairo (poppler) is needed to read zin.svgz-svgz-fr~   z-l)ÚshutilÚ
subprocessÚtempfileÚosrâ   Úsplitextr  ÚmkdtempÚwhichÚsysÚexitÚjoinÚrun)râ   r%  r&  r'  ÚextÚtmpÚpdfÚsvgr   r   r   Úto_svgÿ  s,   

ÿÿ
r4  Fc                 C   s¬   t  t| ƒ¡ ¡ }t|ƒ t|ƒ\}}t|ƒD ]}tj 	d| |f ¡ qdd„ |D ƒ}|sLt
|ƒ}dd„ |D ƒ}t
|ƒ|k rLtj 	d| |t
|ƒ f ¡ |sTtd|  ƒ‚|S )Nzwarning: %s: <%s> ignored
c                 S   s4   g | ]\}}t | d ¡ƒrt | d¡ƒs||f‘qS ©r¢   r£   )r  rÅ   ©r   r6   rÊ   r   r   r   r     s
    ÿÿzload_shapes.<locals>.<listcomp>c                 S   sB   g | ]\}}t | d ¡ƒst| d ¡ƒrt | d¡ƒs||f‘qS r5  )r  rÅ   r  r6  r   r   r   r      s    ÿþþz<warning: %s: %d white element(s) ignored (use --keep-white)
zno drawable element in )ÚETÚparser4  Úgetrootr½   r
  Úsortedr,  ÚstderrÚwriter/   rŠ   )ÚsvgfileÚ
keep_whiter¶   r  r  r:   Únwr   r   r   Úload_shapes  s    ÿr@  ç      Ð?r   c                    sä  dd„ ˆD ƒ‰t ˆƒ}tt|ƒƒ‰‡fdd„}tt|ƒ‡fdd„d�}t|ƒD ]?\}}ˆ| }||d d	… D ].}	ˆ|	 }
|
d
 |d | krI n|
d |d | kre|d |
d | kre||	ƒˆ||ƒ< q7q'i }t|ƒD ]}| ||ƒg ¡ |¡ qm‡fdd„| ¡ D ƒ}d}|rîd}dd„ |D ƒ}tt |ƒƒD ]R}t|d t |ƒƒD ]B}	|| ||	 }}|d
 |d | kræ|d
 |d | kræ|d |d | kræ|d |d | kræ||  | |	¡7  < d} nq¤|rë nq™|sŠdd„ |D ƒ}t	dd„ |D ƒƒ‰ ‡ ‡fdd„t
||ƒD ƒ}|jdd„ d� g g }}|D ]6\}}|�rH|d t	dd„ |D ƒƒd|d
 d d |d
 d d    k�rH| |¡ g }| ||f¡ �q|�rY| |¡ g }|D ]}|dd„ t|dd„ d�D ƒ7 }�q]|S )zýSplit a sheet into separate ornaments : groups of shapes whose
    bounding boxes overlap (or are closer than gap). Groups smaller than
    min_size x (largest group) are dropped (texts, logos...).
    Result sorted by rows (top to bottom) then columns.c                 S   s   g | ]}t |gƒ‘qS r   ©r  )r   Úshr   r   r   r   0  s    z split_shapes.<locals>.<listcomp>c                    s4   ˆ |  | krˆ ˆ |   ˆ | < ˆ |  } ˆ |  | ks| S r   r   ©rq   )rÉ   r   r   Úfind4  s
   þzsplit_shapes.<locals>.findc                    s   ˆ |  d S rÌ   r   rD  )Úboxesr   r   Ú<lambda>9  ó    zsplit_shapes.<locals>.<lambda>)Úkeyr$   Nr   r(   r'   c                    s"   g | ]}‡ fd d„t |ƒD ƒ‘qS )c                    s   g | ]}ˆ | ‘qS r   r   )r   rq   ©r  r   r   r   E  r    z+split_shapes.<locals>.<listcomp>.<listcomp>)r:  ©r   ÚgrJ  r   r   r   E  s   " TFc                 S   r   r   rB  rK  r   r   r   r   J  r    c                 S   r   r   rB  rK  r   r   r   r   U  r    c                 s   s2   � | ]}t |d  |d  |d |d  ƒV  qdS )r(   r   r'   r$   N©rU   )r   r   r   r   r   rð   V  s   €0 zsplit_shapes.<locals>.<genexpr>c                    sB   g | ]\}}t |d  |d  |d |d  ƒˆˆ  kr||f‘qS )r(   r   r'   r$   rM  ©r   rL  r   )ÚbigÚmin_sizer   r   r   W  s    *ÿc                 S   s   | d d S ry   r   ©Úgb_r   r   r   rG  Z  rH  c                 s   s   � | ]	}|d  d V  qdS )r$   r'   Nr   r¿   r   r   r   rð   ]  s   € g      à?c                 S   s   g | ]\}}|‘qS r   r   rN  r   r   r   r   e  r    c                 S   s   | d d S )Nr$   r   r   rQ  r   r   r   rG  e  rH  )r/   ró   rY   r:  Ú	enumerater´   rZ   ÚvaluesÚpoprU   rô   Úsort)r  rP  Úgapr   rE  ÚorderÚiirq   ÚbiÚjÚbjÚgroupsÚchangedÚgbr   r   ÚkeepÚrowsr�   rL  rp   r=   r   )rO  rF  rP  rÉ   r  r   Úsplit_shapes+  sf   (€((€ÿõ
F

"rb  ç      è?r(   úornament.pgfr¨   c              	      s6  t | ƒ\‰}}	‰|	ˆ ˆ| }
}|r||
 ‰n	|r|| ‰n|‰|
ˆ |ˆ }}‡ ‡‡‡fdd„}d| g}| d| ¡ |rO| ¡ D ]	}| d| ¡ qE| dt|dƒt|dƒf ¡ | dt|ˆ ƒt|ˆ ƒf ¡ | d	¡ d
}| D ]�\}}t| d¡ƒ }| d¡dk}|rš||krš| |r•dnd¡ |}|D ]G\}}}| d||ƒ ¡ |D ]/}|d dkrÀ| d||d ƒ ¡ q¬| d||d ƒ d ||d ƒ d ||d ƒ ¡ q¬|rã| d¡ qœt| d¡ƒ }|rö|rö| d¡ qv|rþ| d¡ qv| d¡ qv|�r| d¡ | d¡ d |¡d ||fS )Nc                    s0   t | d ˆ ˆ ˆ ƒd t ˆ| d  ˆ ˆ ƒ S )Nr   r  r$   )r  )r   ©r  ro   Úx0r`   r   r   ÚPu  s   0zrender.<locals>.Pz%% %sz"%% converted by svg2pgf.py from %sz% z%% size: %s x %s bpr$   z\r 0 0 %s %sz\ubbFr¢   r¤   Úevenoddz\pgfseteorulez\pgfsetnonzerorulez\m r   rC   z\l z\c r  r(   r'   z\or£   z\sz\pgfusepathqfillz\kú	\endinputÚ
)r  rZ   Ú
splitlinesr  r  rÅ   r.  )r  rä   rå   r%   r  Úsourcer7   ÚoriginÚy0r_   rŸ   r    ÚWr„   rg  rp   rè   ÚrulerŽ   rÊ   ÚfilledÚeorþ   rÿ   r   rñ   Ústrokedr   re  r   Úrenderi  sV   



8
€

rt  c           	      C   sD   t | |ƒ}t|||||||ptj tj | ¡¡d d tj | ¡ƒS )Nr   ú.pgf)r@  rt  r(  râ   r)  Úbasename)	r=  rä   rå   r%   r  rl  r7   r>  r  r   r   r   Úconvertž  s
   

þrw  c                 C   sª   d|  ddddd|  ddd	d
dg}t |dƒD ]\}\}}| dt|dƒt|dƒ|f ¡ q|g d¢7 }t|ddd��}| d |¡¡ W d   ƒ d S 1 sNw   Y  d S )Nz.%% pgfornament-lib-%s.code.tex (utf8 encoding)z% generated by svg2pgf.pyz8% This work may be distributed and/or modified under thezE% conditions of the LaTeX Project Public License, either version 1.3cz8% of this license or (at your option) any later version.z'\typeout{pgfornament-lib-%s.code.tex}%%ze\expandafter\edef\csname pgfornament@restoreat\endcsname{\catcode`\noexpand\@=\the\catcode`\@\relax}%z\catcode`\@=11\relaxz% dimensions des motifs (en bp)z\def\@pgfornamentDim#1{%z\ifcase#1\relax%r$   z4\or\def\@pgfornamentX{%s}\def\@pgfornamentY{%s}%% %d)z\fi%z}%z\pgfornament@restoreatri  r¨   rŸ   úutf-8©Úencodingrj  )rS  rZ   r  Úopenr<  r.  )ÚfamilyÚdimsrâ   Úlinesrq   ro  r„   r   r   r   r   Úwrite_library¦  s(   õÿ"ÿr  c              
   C   s˜   g }t |dƒD ]\}}| d||| dd¡f ¡ qd|  }| dd¡}|d |¡d	 7 }t|d
dd��}| |¡ W d   ƒ d S 1 sEw   Y  d S )Nr$   zI\fbox{\pgfornament[height=1.5cm]{%d}}\ \textbf{%d} {\tiny %s}\par\medskipÚ_z\_zž\documentclass{article}
\usepackage[margin=1.5cm]{geometry}
\usepackage[object=%s]{pgfornament}
\setlength\fboxsep{0pt}
\begin{document}
\begin{multicols}{3}
z\begin{document}z&\usepackage{multicol}
\begin{document}rj  z 
\end{multicols}
\end{document}
rŸ   rx  ry  )rS  rZ   rÇ   r.  r{  r<  )r|  Únamesrâ   ra  rq   r   Údocr   r   r   r   Ú
write_test»  s   ÿþ"ÿrƒ  c               
      sö  t jdd�} | jddd� | jdddd	� | jd
dd	� | jdddd� | jdtd� | jdtd� | jdtd d� | jdtdd� | jddd	� | jdddd� | jdtddd � | jd!d"d	� | jd#dd$d� |  ¡ }|jd u r†tj 	|j
d% ¡d&  ¡ d'v rƒd(nd)|_|j�r˜t d*|j¡s–t d+¡ tj |jd,|j¡}tj |jd-¡}tj|d.d/� tj|d.d/� g }t|j
ƒD ]5‰ tˆ |jƒ}|jrçt||jƒ}td0ˆ t|ƒf ƒ |‡ fd1d2„t|d&ƒD ƒ7 }q½| |tj ˆ ¡f¡ q½|j�rt d3d4„ |j d5¡D ƒƒ‰‡fd6d2„t|d&ƒD ƒ}g }t|d&ƒD ]Z\}\}}	d7|j|f }
t!||j"|j#|j|j$|j%|
|	ƒ\}}}t&tj ||
¡d8d9d:��}| '|¡ W d   ƒ n	1 �sTw   Y  | ||f¡ td;|
|	t(|d&ƒt(|d&ƒf ƒ �qt)|j|tj |d<|j ¡ƒ t*|jd=d2„ |D ƒtj |jd>|j ¡ƒ d S |j
D ]]‰ t+ˆ |j"|j#|j|j$|j%d |jƒ\}}}|j,�rÀt|j
ƒd&k�rÀ|j,n	tj 	ˆ ¡d% d? }t&|d8d9d:��}| '|¡ W d   ƒ n	1 �sâw   Y  td@ˆ |t(|d&ƒt(|d&ƒf ƒ �q›d S )ANzSVG -> pgfornament .pgf)Údescriptionr3  ú+)Únargsz-oz--outputzoutput file (one svg only))Úhelpz--familyz#build a whole family with this namez	--out-dirÚbuildz*output folder for --family (default build))rÎ   r‡  z--width)Útypez--heightz--scale)r‰  rÎ   z--digitsr(   z--sourcez&origin / licence written in the headerz--splitÚ
store_truez@the svg is a sheet with several ornaments: one file per ornament)Úactionr‡  z
--min-sizerA  zdwith --split: drop groups smaller than this fraction of the largest one (texts, logos), default 0.25)r‰  rÎ   r‡  z--skipz+numbers of the parts to leave out, e.g. 1,2z--keep-whitez@keep white elements (ignored by default: background, highlights)r   r$   r  r   rc  z	[a-zA-Z]+z)the family name must contain only lettersÚgenericÚlatexT)Úexist_okz%s : %d ornament(s) foundc                    s(   g | ]\}}|d t j ˆ ¡|f f‘qS )z%s (part %d))r(  râ   rv  )r   r[  r   )r   r   r   r   í  s    ÿzmain.<locals>.<listcomp>c                 s   s   � | ]}t |ƒV  qd S r   r   r   r   r   r   rð   ò  s   € zmain.<locals>.<genexpr>r¬   c                    s   g | ]
\}}|ˆ vr|‘qS r   r   )r   r[  Úit)Úskr   r   r   ó  s    zpgfornament-%s%d.pgfrŸ   rx  ry  z%s  <-  %s   (%s x %s bp)zpgfornament-lib-%s.code.texc                 S   s   g | ]\}}|‘qS r   r   )r   rC  Úor   r   r   r   ÿ  r    ztest-%s.texru  z%s  ->  %s   (%s x %s bp))-ÚargparseÚArgumentParserÚadd_argumentr   rW   Ú
parse_argsr%   r(  râ   r)  r3  r  r|  r,   Ú	fullmatchr,  r-  r.  Úout_dirÚmakedirsr:  r@  r>  r²   rb  rP  Úprintr/   rS  rZ   rv  Úskipr	  rt  rä   rå   r  rl  r{  r<  r  r  rƒ  rw  Úoutput)Úapr   ÚgdirÚldirrÈ   r  Úpartsr}  rq   rm  r7   r¸   ro  r„   rL  rp   r   )r   r�  r   ÚmainÉ  s”   ÿ
ÿÿ
"ÿ

ÿ
ÿÿ$ÿÿ

ÿÿÿ$ùr   Ú__main__)r   )F)rA  r   )NNrc  r(   Nrd  r¨   )NNrc  r(   NNF))Ú__doc__r’  r1   r(  r,   r,  Úxml.etree.ElementTreeÚetreeÚElementTreer7  r°   rõ   r+   r   r   r.   rB   rx   r›   rœ   r¡   rÄ   r­   r½   rË   rÏ   r
  r  r  r  r  r  r4  r@  rb  rt  rw  r  rƒ  r   Ú__name__r   r   r   r   Ú<module>   sX   7	#@g


J	

>
ÿ5
ÿC
ÿ