
    w9h~                        d Z dZddlmZmZmZmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZmZmZ ddlmZmZmZmZ ddlmZ dd	lmZ 	 dd
lZej<                  Z G d de      Z d Z! G d de"      Z#d Z$d Z%ddlm&Z& ddl'm(Z(  e&       Z)d(dZ*d Z+d Z, G d d      Z-dd
l.Z. e.j^                  de.j`                        Z1[.d)dZ2d*dZ3d+dZ4dZ5 G d$ d%      Z8 G d& d'e8      Z9y
#  dd
l6Z6dZ7d  Zd! xZ!Z$eZ e"Z#d" Z%d*d#Z3e%xZ2xZ+xZ,xZ4xZ*Z-dZ5Y AxY w),z3.3.0z
PDFTextObject is an efficient way to add text to a Canvas. Do not
instantiate directly, obtain one from the Canvas instead.

Progress Reports:
8.83, 2000-01-13, gmcm: created from pdfgen.py
    )Color	CMYKColorCMYKColorSeptoColor)isBytesisStr	asUnicode)fp_str)getFontstringWidth
unicode2T1)	ShapedStr	ShapeData	_sdGuardLshapeStr)groupby)
itemgetterNc                   $     e Zd ZdZd fd	Z xZS )BidiStrz6A str with indices visual __bidiV__, logical __bidiL__c                 D    t         |   | |      }||_        ||_        |S N)super__new__	__bidiV__	__bidiL__)clssbidiVbidiLself	__class__s        U/var/www/kjolmonster/venv/lib/python3.12/site-packages/reportlab/pdfgen/textobject.pyr   zBidiStr.__new__   s&    7?3q)D"DN"DNK    r%   )__name__
__module____qualname____doc__r   __classcell__r!   s   @r"   r   r      s    D	 	r#   r   c                 "    t        | t              S r   )
isinstancer   _s    r"   <lambda>r0      s    *Qw/ r#   c                   .     e Zd ZdZd fd	Z fdZ xZS )BidiListz7A list with indices visual __bidiV__, logical __bidiL__c                 @    t         |   |       || _        || _        y r   )r   __init__r   r   )r    Lr   r   r!   s       r"   r4   zBidiList.__init__"   s    GQ"DN"DNr#   c                     | j                   j                   dt        |           d| j                   d| j
                   dS )N(,))r!   r&   r   __repr__r   r   )r    r!   s    r"   r:   zBidiList.__repr__&   sE    nn--.a0@0B/C1T^^DTTUVZVdVdUeefggr#   r$   )r&   r'   r(   r)   r4   r:   r*   r+   s   @r"   r2   r2       s    E	#	h 	hr#   r2   c                 "    t        | t              S r   )r-   r2   r.   s    r"   r0   r0   (   s    :a1 r#   c                 N    |r|j                         }|dv rt        | |d      S | S )NLTRRTLT)clean)upperlog2vis)text	directions     r"   bidiTextrE   )   s,    )//"3i6?=6PwtYT2ZVZZr#   )
KlassStore)deepcopyc                 X   t        | t              r| S t        |       t        u rt        }nv| j                  j
                  }d| }|t        vrJt        t        || j                  t              }t        d| d|       t        j                  |||          t        |   } || ||      S )NBidiIndexed)r   	klassNameklassrG   class z(klass,BidiStr):
	def __new__(cls,s,bidiV=-1,bidiL=-1):
		self = super(cls,cls).__new__(cls,s)
		if hasattr(s,'__dict__'): self.__dict__=deepcopy(s.__dict__)
		self.__bidiV__ = bidiV
		self.__bidiL__ = bidiL
		return self
)r   r   )r-   r   typestrr!   r&   _bidiKSdictrG   execadd)r   r   r   rK   
sklassNamerJ   NSs          r"   innerBidiStrWraprU   /   s    a (7c>E--J%j\2I')!++W_`F9+ .0 0  Ibm4I&EQU//r#   c                 h    t        |t              s| S t        | |j                  |j                        S r   )r-   r   rU   r   r   )r   origs     r"   bidiStrWraprX   C   s'    $w'$..@@r#   c                    t        |t        t        f      rt        | t              r| S t        |       t        u rt        }nv| j
                  j                  }d| }|t        vrJt        t        || j
                  t              }t        d| d|       t        j                  |||          t        |   } || |j                  |j                        S )NrI   )r2   rJ   rK   rG   rL   z(klass,BidiList):
	def __init__(self,L,bidiV=-1,bidiL=-1):
		klass.__init__(self,L)
		if hasattr(L,'__dict__'): self.__dict__=deepcopy(L.__dict__)
		self.__bidiV__ = bidiV
		self.__bidiL__ = bidiL
)r-   r2   	BidiIndexrM   listr!   r&   rO   rP   rG   rQ   rR   r   r   )r5   rW   rK   
lklassNamerJ   rT   s         r"   bidiListWrapr]   F   s    $34
1X8NWXPX7d?E--J%j\2I'IAKKYabF9+ .; ;  Ibm4I&EQt~~dnn55r#   c                       e Zd ZddZy)rZ   c                      || _         || _        y r   )r   r   )r    r   r   s      r"   r4   zBidiIndex.__init__[   s    "DN"DNr#   Nr$   )r&   r'   r(   r4    r#   r"   rZ   rZ   Z   s    	#r#   rZ   z[^ ]+TFc           	         |r|j                         }|dvr| S t        | t        t        f      st	        d      dj                  |       }g }t        ||||      }i }t        t        j                  |            D ]D  \  }}	|	j                  d      |f}
|	j                         \  }}t        ||      D ]
  }|
|||   <    F g j                  }t        t        j                  |            D ]E  \  }}	t        |	j                          D ]'  }||v s||   \  }} ||r|nt        |||              E G |j                  S )z~takes words (list of strings) returns bidi associated lists
        if wx is True then the V2L index only is returned
        r=   z@bidiWordList argument words should be a list or tuple of strings base_directionr@   positions_V_to_Lr   )rA   r-   r[   tuple
ValueErrorjoinrB   	enumeratewordpatfinditergroupspanrangeappendr   __self__)wordsrD   r@   wxrawV2LbidiVMAPimtstartendjreswr   s                    r"   bidiWordListr   a   sJ    )//"3iM)%<%e-_``hhuos9ETWXg..t45 	!DAqQAJE35% ! SV!	! iig..s34 	DAqAFFH% 97DAqRWQq^4	 	 ||r#   c                    t        |       } |rt        |      }|j                  sd}|r|j                         }|dv rI|r7| j	                         }t        |       t        |      z
  }|j                         } t        |      t        |       z
  }	t        j                  |       D 
cg c]  }
| t        |
j                              }}
t        ||d      }|D cg c]  }t        ||   ||       }}t        |      dkD  r|d   |d   kD  r|	|}	}t        |dz  ||d	      } |D ];  }t        |d
      st        |||d	      }||d   ur| t        d||d	      z  } | |z  } = |	r2| t        |	dz  ||      z  } nt        | ||      } n|rt        | ||      } t        | t               r"t#        d | j$                  D              |z  dz  nt'        | ||      }| |fS c c}
w c c}w )zIreturn shaped/bidi text and width; assumes text is aways in logical orderFr?   r>   T)rD   rr      r   r%   rb   )force__shapeData__)rd   r@   c              3   4   K   | ]  }|j                     y wr   )	x_advance).0r/   s     r"   	<genexpr>z!bidiShapedText.<locals>.<genexpr>   s     >aakk>s     )r	   pdfmetrics_getFontshapablerA   lstriplenrstriprj   rk   slicerm   r   r   hasattrrB   r-   r   sumr   pdfmetrics_stringWidth)rC   rD   r@   fontNamefontSizeshapingfontr~   bLbRrx   LWVXrw   SWwidths                   r"   bidiShapedTextr      s   %h/D==E')//"3i%KKMYQ'xxzVc$i'6=6F6Ft6LMd5!&&(+,MM!"yDAACDAhr!uXh7DDr719Ar"vB3xE A"1_58Ahx^b;cq1~txHXUY/Z'ZtAID HRVHX>>Dt95Ih9Q[\`ajQk>4+=+=>?HM/hI 	U{' NDs   & GGc           	         |dvr| S d}g j                   }g j                   t        | dd        D ]1  \  }\  }}	t        |d      r	 ||       |	D ]  }
 |       ||
z  } 3 t        |      dk  r| S j                  g t        |||      }t        fdt        |      D        t        d            D cg c](  \  }}| d|z      d   dj                  d	 |D              f* }}}t        d
 |D              g|z   }|j                  }|rd   d   kD  rOt        |      D ]@  }| |dz      }|j                  t        |       |z
  |       |dxx   t        |dd      z  cc<   B nNt        t        |            D ]7  }| |dz      }|j                  |dz   |       |dxx   t        |dd      z  cc<   9 | j                  |      }t        |t!        ||            S c c}}w )Nr    r   cbDefnrc   c              3   8   K   | ]  \  }}|      |f  y wr   r`   )r   rw   vrt   fLs      r"   r   zbidiFragWord.<locals>.<genexpr>   s(     Lw`c`abcbQTUVQWjYZ^Lws   r   )keyc              3   &   K   | ]	  }|d      yw)r   Nr`   )r   kss     r"   r   zbidiFragWord.<locals>.<genexpr>   s     "5R2a5"5s   c              3   d   K   | ](  \  }}t        ||j                  |j                         * y wr   )r   r   r   )r   fr   s      r"   r   zbidiFragWord.<locals>.<genexpr>   s&     S!*1QZZ

CSs   .0r%   r   )ro   ri   r   r   rp   rB   r   r   rh   r   sortedinsertgetattrreversedr!   r]   rZ   )r~   rD   r   r   r@   rC   cbdrw   r   r   uru   kgfsLbfwfsrt   r   s                    @@r"   bidiFragWordr      s   M)!8iiYY"1QR5) 	IAv1q"A AqEAID		 t9a<[[tIUUXYDKLwgpqugvLw  }G  HI  }J  EK  LDAq!A#q	"''"51"567  L  LSsSTUX[[ll1vc"g~ 4A1Q3BJJs1vax+Fgb33F4
 "&+. 4A1Q3BJJqs2&Fgb33F4 kk#C5!788! Ls   >-G!z/rlbidi is not installed - RTL/LTR not supportedc                       t        t              r   )rg   
_rlbidiMsg)argskwdss     r"   rB   rB      s    $$r#   c                      y)NFr`   r.   s    r"   r0   r0          r#   c                      |j                  dd       }|r|j                         }|dv rt        j                  t        d       | d   S )NrD   r=   r   )
stacklevel)poprA   warningswarnr   )r   r   rD   s      r"   rE   rE      s?    HH[.	)//"3i%MM*2Awr#   c                 4    t        | |      t        | ||      fS r   )rE   r   )rC   rD   r@   r   r   r   s         r"   r   r      s    Y')?Xh)WWWr#   c                   x    e Zd ZdZd Z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 Zd Zd Zd Zd Zy)_PDFColorSetterziAbstracts the color setting operations; used in Canvas and Textobject
    asseumes we have a _code objectc                     t        |t              r=| j                  j                  |      \  }}|| j                  vr|| j                  |<   |S y r   )r-   r   _docaddColor_colorsUsed)r    cmyknamesnames       r"   _checkSeparationz _PDFColorSetter._checkSeparation   sL    d<(++D1JD4+++).  &K	 )r#   Nc                 2    | j                  ||||f|       y)zset the fill color useing negative color values
         (cyan, magenta, yellow and darkness value).
         Takes 4 arguments between 0.0 and 1.0alphaNsetFillColorr    crx   yr   r   s         r"   setFillColorCMYKz _PDFColorSetter.setFillColorCMYK   s     
		Aa!95		1r#   c                 2    | j                  ||||f|       y)zset the stroke color useing negative color values
            (cyan, magenta, yellow and darkness value).
            Takes 4 arguments between 0.0 and 1.0r   NsetStrokeColorr   s         r"   setStrokeColorCMYKz"_PDFColorSetter.setStrokeColorCMYK   s     
		a!AYU		3r#   c                 0    | j                  |||f|       y)zwSet the fill color using positive color description
           (Red,Green,Blue).  Takes 3 arguments between 0.0 and 1.0r   Nr   r    rr   br   s        r"   setFillColorRGBz_PDFColorSetter.setFillColorRGB   s     	1Qq'.r#   c                 0    | j                  |||f|       y)zySet the stroke color using positive color description
           (Red,Green,Blue).  Takes 3 arguments between 0.0 and 1.0r   Nr   r   s        r"   setStrokeColorRGBz!_PDFColorSetter.setStrokeColorRGB   s     	QqG%0r#   c           	         | j                   r| j                  |      }t        |t              r|j                  }||j                  z  ||j
                  z  ||j                  z  ||j                  z  f\  }}}}|| _        | j                  |      }|r-| j                  j                  d|dt        |      d       nY| j                  j                  dt        ||||      z         n-t        |t              rR|j                  |j                  |j                   f}	|| _        | j                  j                  dt        |	      z         nt        |t"        t$        f      rt'        |      }
|
dk(  r/|| _        | j                  j                  dt        |      z         nv|
dk(  r/|| _        | j                  j                  dt        |      z         nBt)        d|z        t+        |      r| j-                  t/        |             nt)        d|z        || j1                  |       y	t3        |d
d	      | j1                  |j4                         y	y	)?Takes a color object, allowing colors to be referred to by name/z cs z scnz%s kz%s rg      Unknown color %rNr   )_enforceColorSpacer-   r   densitycyanmagentayellowblack_fillColorObjr   _codero   r
   r   redgreenbluerf   r[   r   rg   r   r   r   setFillAlphar   r   r    aColorr   dr   rx   r   r   r   rgbls              r"   r   z_PDFColorSetter.setFillColor   s   "",,V4Ffi(A}a&6&--6<<XGAa!!'D((0D

!!T&)"DE

!!&6!Q1+="=>&::v||V[[9C!'DJJgs35d|,FA!t%+"

!!'F6N":<A%+"

!!&6&>"9: !3f!<==6]gfo./&899e$VWd+7fll+ 8r#   c           	         | j                   r| j                  |      }t        |t              r|j                  }||j                  z  ||j
                  z  ||j                  z  ||j                  z  f\  }}}}|| _        | j                  |      }|r-| j                  j                  d|dt        |      d       nY| j                  j                  dt        ||||      z         n-t        |t              rR|j                  |j                  |j                   f}	|| _        | j                  j                  dt        |	      z         nt        |t"        t$        f      rt'        |      }
|
dk(  r/|| _        | j                  j                  dt        |      z         nv|
dk(  r/|| _        | j                  j                  dt        |      z         nBt)        d|z        t+        |      r| j-                  t/        |             nt)        d|z        || j1                  |       y	t3        |d
d	      | j1                  |j4                         y	y	)r   r   z CS z SCNz%s Kz%s RGr   r   r   Nr   )r   r-   r   r   r   r   r   r   _strokeColorObjr   r   ro   r
   r   r   r   r   rf   r[   r   rg   r   r   r   setStrokeAlphar   r   r   s              r"   r   z_PDFColorSetter.setStrokeColor  s   "",,V4Ffi(A}a&6&--6<<XGAa!#)D ((0D

!!T&)"DE

!!&6!Q1+="=>&::v||V[[9C#)D JJgs35d|,FA!t'-$

!!'F6N":<A'-$

!!&6&>"9: !3f!<==6]0/&899&VWd+7- 8r#   c                     |||f| _         | j                  j                  dt        |      z         || j	                  |       yy))Sets the gray level; 0.0=black, 1.0=whitez%s gN)r   r   ro   r
   r   r    grayr   s      r"   setFillGrayz_PDFColorSetter.setFillGrayB  sE    "D$/

&6$</0e$ r#   c                     |||f| _         | j                  j                  dt        |      z         || j	                  |       yy)r   z%s GN)r   r   ro   r
   r   r   s      r"   setStrokeGrayz_PDFColorSetter.setStrokeGrayI  sE     $dD1

&6$</0e$ r#   c                     t        |t        t        f      rd|cxk  rdk  sn t        d|z         t	        | dd       |       y )Nr   r   zsetStrokeAlpha invalid value %r_setStrokeAlphac                      y r   r`   xs    r"   r0   z0_PDFColorSetter.setStrokeAlpha.<locals>.<lambda>S  r   r#   r-   floatintrg   r   r    as     r"   r   z_PDFColorSetter.setStrokeAlphaP  s?    1eC[)agAg>BCC6&~6q9r#   c                     t        |t        t        f      rd|cxk  rdk  sn t        d|z         t	        | dd       |       y )Nr   r   zsetFillAlpha invalid value %r_setFillAlphac                      y r   r`   r  s    r"   r0   z._PDFColorSetter.setFillAlpha.<locals>.<lambda>X  r   r#   r  r  s     r"   r   z_PDFColorSetter.setFillAlphaU  s>    1eC[)agAg<q@AA4_^4Q7r#   c                 ,     t        | dd       |       y )N_setStrokeOverprintc                      y r   r`   r  s    r"   r0   z4_PDFColorSetter.setStrokeOverprint.<locals>.<lambda>[  r   r#   r   r  s     r"   setStrokeOverprintz"_PDFColorSetter.setStrokeOverprintZ  s    :*>:1=r#   c                 ,     t        | dd       |       y )N_setFillOverprintc                      y r   r`   r  s    r"   r0   z2_PDFColorSetter.setFillOverprint.<locals>.<lambda>^  r   r#   r  r  s     r"   setFillOverprintz _PDFColorSetter.setFillOverprint]      8(8;r#   c                 ,     t        | dd       |       y )N_setOverprintMaskc                      y r   r`   r  s    r"   r0   z2_PDFColorSetter.setOverprintMask.<locals>.<lambda>a  r   r#   r  r  s     r"   setOverprintMaskz _PDFColorSetter.setOverprintMask`  r  r#   r   )r&   r'   r(   r)   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r`   r#   r"   r   r      sW    ' 24/
1
",H".H%%:
8
><<r#   r   c                       e Zd ZdZd dZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd!dZd Zd Zd Zd Zd Zd Zd Zd Zd"dZd Zd#dZd$dZd Zd Zd Zd Zd Z y)%PDFTextObjecta  PDF logically separates text and graphics drawing; text
    operations need to be bracketed between BT (Begin text) and
    ET operators. This class ensures text operations are
    properly encapusalted. Ask the canvas for a text object
    with beginText(x, y).  Do not construct one directly.
    Do not use multiple text objects in parallel; PDF is
    not multi-threaded!

    It keeps track of x and y coordinates relative to its origin.Nc                    dg| _         || _        | j                  j                  | _        | j                  j                  | _        | j                  j                  | _        | j                  j
                  | _        | j                  j                  | _        t        |dd       | _        t        | j                        }d| _
        || _        | j                  ||       d| _        d| _        d| _        y )NBTr   r%   r   )r   _canvas	_fontname	_fontsize_leadingr   r   r   r   r   
_curSubsetrD   setTextOrigin_textRenderMode	_clipping_rise)r    canvasr  r   rD   r   s         r"   r4   zPDFTextObject.__init__n  s    V
////--LL%%	<<33")&1Ed"K!$..1"1a  
r#   c                     | j                   j                  d       | j                  r+| j                   j                  d| j                  dz  z         dj	                  | j                         S )z#pack onto one line; used internallyET%d Trr   rb   )r   ro   r&  r%  rh   r    s    r"   getCodezPDFTextObject.getCode  sP    

$>>JJg)=)=a)?@Axx

##r#   c                 
   | j                   j                  r)| j                  j                  dt	        ||      z         n(| j                  j                  dt	        ||      z         |x| _        | _        |x| _        | _        y )Nz1 0 0 1 %s Tmz1 0 0 -1 %s Tm	r  bottomupr   ro   r
   _x0_x_y0_y)r    r  r   s      r"   r$  zPDFTextObject.setTextOrigin  sh    <<  JJoq!<=JJ.1=> 4747r#   c                     | j                   j                  s| }| }| j                  j                  dt	        ||||||      z         |x| _        | _        |x| _        | _        y)z3Like setTextOrigin, but does rotation, scaling etc.z%s TmNr/  )r    r	  r   r   r   er   s          r"   setTextTransformzPDFTextObject.setTextTransform  sa    ||$$AA

'F1aAq!$<<= 4747r#   c                    | j                   r| j                   d   j                  d      r| j                   d   j                         }t        |      dk(  r| j                   d= n!dj	                  |dd       | j                   d<   t        |d         }t        |d         }||z  }||z  }| xj                  |z  c_        | xj                  |z  c_        | j                   j                  d	t        ||       z         | xj                  |z  c_        | xj                  |z  c_        | j                  | _
        | j                  | _        y)
ax  Starts a new line at an offset dx,dy from the start of the
        current line. This does not move the cursor relative to the
        current position, and it changes the current offset of every
        future line drawn (i.e. if you next do a textLine() call, it
        will move the cursor to a position one line lower than the
        position specificied in this call.  r%   z Tdr   r   Nz%s Td)r   endswithsplitr   rh   r  r1  r3  ro   r
   r2  r4  )r    dxdyr5   lastDxlastDys         r"   
moveCursorzPDFTextObject.moveCursor  s    ::$**R.11%8

2$$&A1vqyJJrN!#3B

2 1R5\F1R5\F &LB&LB
 HHHHHH 	

'F2sO34 	BB((((r#   c                 (    | j                  |d       y)zStarts a new line dx away from the start of the
        current line - NOT from the current point! So if
        you call it in mid-sentence, watch out.r   N)rB  )r    r>  s     r"   setXPoszPDFTextObject.setXPos  s     	1r#   c                 2    | j                   | j                  fS )z:Returns current text position relative to the last origin.)r2  r4  r,  s    r"   	getCursorzPDFTextObject.getCursor  s    !!r#   c                 2    | j                   | j                  fS )zRReturns a tuple giving the text position of the start of the
        current line.)r1  r3  r,  s    r"   getStartOfLinezPDFTextObject.getStartOfLine  s     $((##r#   c                     | j                   S )z7Returns current x position relative to the last origin.)r2  r,  s    r"   getXzPDFTextObject.getX      wwr#   c                     | j                   S )z7Returns current y position relative to the last origin.)r4  r,  s    r"   getYzPDFTextObject.getY  rK  r#   c                    || _         || _        t        | j                         }|j                  rd| _        y| j
                  j                  j                  |      }| j                  j                  |dt        |      d       y)zSets the font and fontSize
        Raises a readable exception if an illegal font
        is supplied.  Font names are case-sensitive! Keeps track
        of font anme and size for metrics.r%   rb   z TfN)r   r!  r   _dynamicFontr#  r  r   getInternalFontNamer   ro   r
   )r    
psfontnamesizer   pdffontnames        r"   _setFontzPDFTextObject._setFont  se    
 $!$..1 DO,,++??
KKJJKFGr#   c           	      D   || _         || _        ||dz  }|| _        t        | j                         }|j                  rd| _        y| j                  j                  j                  |      }| j                  j                  |dt        |      dt        |      d       y)zSets the font.  If leading not specified, defaults to 1.2 x
        font size. Raises a readable exception if an illegal font
        is supplied.  Font names are case-sensitive! Keeps track
        of font anme and size for metrics.Ng333333?r%   rb    Tf  TL)r   r!  r"  r   rO  r#  r  r   rP  r   ro   r
   )r    rQ  rR  leadingr   rS  s         r"   setFontzPDFTextObject.setFont  s    
 $?SjG!$..1 DO,,++??
KKJJ+vd|VT[_]^r#   c                 `    || _         | j                  j                  dt        |      z         y)zAdjusts inter-character spacingz%s TcN)
_charSpacer   ro   r
   )r    	charSpaces     r"   setCharSpacezPDFTextObject.setCharSpace  s%    $			7VI%66	7r#   c                 `    || _         | j                  j                  dt        |      z         y)zAdjust inter-word spacing.  This can be used
        to flush-justify text - you get the width of the
        words, and add some space between them.z%s TwN)
_wordSpacer   ro   r
   )r    	wordSpaces     r"   setWordSpacezPDFTextObject.setWordSpace  s'     $

'F9$556r#   c                 f    d|z   | _         | j                  j                  dt        |      z         y)zStretches text out horizontallyd   z%s TzN)_horizScaler   ro   r
   )r    
horizScales     r"   setHorizScalezPDFTextObject.setHorizScale	  s+    +

'F:$667r#   c                 `    || _         | j                  j                  dt        |      z         y)z*How far to move down at the end of a line.z%s TLN)r"  r   ro   r
   )r    rX  s     r"   
setLeadingzPDFTextObject.setLeading  s$    

'F7O34r#   c                     |dv sJ d       |dz  | j                   k7  r|dz  }|dz  | _         | j                  |k7  r&|| _        | j                  j                  d|z         yy)a  Set the text rendering mode.

        0 = Fill text
        1 = Stroke text
        2 = Fill then stroke
        3 = Invisible
        4 = Fill text and add to clipping path
        5 = Stroke text and add to clipping path
        6 = Fill then stroke and add to clipping path
        7 = Add to clipping path

        after we start clipping we mustn't change the mode back until after the ET
        )r   r      r   r            z!mode must be in (0,1,2,3,4,5,6,7)r   r+  N)r&  r%  r   ro   )r    modes     r"   setTextRenderModezPDFTextObject.setTextRenderMode  sn     ((M*MM(1Ht~~%AID!AXDN%#'D JJgn- &r#   c                 (   t        |       d}| j                  d   j                  d      r/| xj                  | j                  z  c_        || j                  d<   y|| _        | xj                  |z  c_        | j                  j                  |       y)z=Move text baseline up or down to allow superscript/subscripts Tsr%   N)r
   r   r<  r4  r'  ro   )r    riser   s      r"   setRisezPDFTextObject.setRise*  sm    d|nC ::b>""5)GGtzz!GDJJrNDJGGtOGJJa r#   c                    | j                   }t        | j                        }| j                  | j                  | j
                  f}	 g | _        | j                  j                  }|j                  rv|j                  d}| j                  }|j                  rt        |t              rd}| j                  }|j                  }	| j                  }
|j                  ||j                         D ]0  \  }}d}|| j"                  k7  rT|s$t%        |
       dt%        | j&                         d} ||j)                  ||j                          d|        || _        |t+        |      z   }|	|| t,        z   }|}t/        |      D ]  \  }}||
|j0                  z  dz  z   }||j2                  dk  s|| j                  k7  r|fdt5        t7        dj8                        d       D        D cg c]	  }|d	k7  r| }}t+        |      d
k(  r#|d   j;                  d      r ||d    d       n |ddj=                  |       d       | j                  |k7  r| j?                  |       |j2                  dk  r || j                  k7  r| j?                  |       |j2                  }g j                  } |j@                           |tC        tE        ||         jG                  d                    ||jH                  |jJ                  z
  |j@                  z           3 | j                  |k7  rY| j?                  |       nF|j                  ||j                         D ]  \  }}|| j"                  k7  r^|s.t%        | j                         dt%        | j&                         d} ||j)                  ||j                          d|        || _         |d |       d        n|jL                  rv ||j                   jO                  |jP                        dt%        | j                        dt%        | j&                        d        |d|jS                  |      z         n|}tU        |      r	 |jW                  d      }|j                  t_        ||g|j`                  z         D ]x  \  }}||k7  r\ ||j                   jO                  |jP                        dt%        | j                        dt%        | j&                        d       |} |d |       d       z ||k7  rZ ||j                   jO                  | j                        dt%        | j                        dt%        | j&                        d       |\  | _        | _        | _        dj=                  |j8                        S c c}w # tX        $ ra}|jZ                  dd \  }}tY        |jZ                  dd |jZ                  d   d|t]        |dz
  d      | d||| d|||dz    fz    d}~ww xY w# |\  | _        | _        | _        w xY w)z%Generates PDF text output operator(s)Nr   rV  rW  rb   r   c              3      K   | ]7  \  }}|rd  dj                  |            z  nt        t        |             9 yw)z(%s)r#   N)rh   r
   r   )r   r   r   canv_escapes      r"   r   z,PDFTextObject._formatText.<locals>.<genexpr>Z  sH      5|48Aq ^_vCHHUVK@X7Xdjknopkqdr6r 5|s   =A c                 "    t        | t              S r   )r-   bytesr  s    r"   r0   z+PDFTextObject._formatText.<locals>.<lambda>[  s    fpqrsxfy r#   0r   r7   z Tj[z] TJlatin1z) Tjz(%s) Tjutf8rj  r   

   z-->z<--)1r  r   r   r   r2  r4  ro   rO  _escaper'  r   r-   r   r   r!  splitStringr   r#  r
   r"  getSubsetInternalNamer   r   ri   y_offsetclusterr   filterrp   
startswithrh   rs  x_offsetrx  chrencoder   r   
_multiByterP  r   formatForPdfr   decodeUnicodeDecodeErrorr   maxpdfmetrics_unicode2T1substitutionFonts)r    rC   canvr   stateRtmplr0sd0	shapeDatafontsizesubsetry   r  sd1SDrw   sdr   Ar   fcr6  r|   r   rv  s                            @r"   _formatTextzPDFTextObject._formatText6  s   
 ||!$..1TWWdgg.\	1DJ

!!A  "llZZ==ZY%?CB $ 2 2I#~~H%)%5%5dDII%F *E	"&!4??2#'*0*:);4t}}@U?VVY'Z!;!;FDII!N OqQUPVWX.4DO!CFl&s3/);!%.r]  EEAr "Xbkk%9$%> >A&"**Q,!TZZ-#*#65|<CF4PQPZPZD[\y<z5| )Gq @A  CF  @F *+ )GA )G'*1vqyQqT__S5I()QqTF#,()Achhqk]$*?(@'+zz2~t||B7G')zz!|U $%djj=$,,q/*,**$&II r{{lOeC!I$4$4X$>?@ bhh5CDA E*EV zz2~t||B'7%)%5%5dDII%F 4	!4??2#'*0*@)AfT]]F[E\\_'`!;!;FDII!N OqQUPVWX.4DOAk!n-T234 II11$--@4>>*4==) 
 )d//556 4=O#{{62
 #ll1$vd>T>T7TU 0DAq"udii.K.KAJJ.WY_`d`n`nYoqwx|  yF  yF  rG  H  I+a.)./	0
 8$))*G*G*WY_`d`n`nYoqwx|  yF  yF  rG  H  I+0(DJxx

##C)Gf . OffQqk!0166"1:UVU[U[\]U^_cdghijlhlmndopq_rswxyz{s|  ~B  CD  EF  GI  EI  ~J  @K  ?M  4M  O  OO ,1(DJsF   F!X* (V86J X* 7V= D X* 8X* =	X'AX""X''X* *Yc           
         | j                   j                  }| j                  }t        | j                        }|j
                  }|j                  ||j                        D ]  \  }}	|| j                  k7  rg|j                  ||j                        }
t        j                  |
dt        | j                        dt        | j                        d       || _        |rVt        | dd       ||j                  j                   z  | j                  z  }t        |         |t        |       d       |r- |dt        |j#                  |             d	 ||	       d
       |s |t        |        d        y )Nrb   rV  rW  z -->r   )r{   rq  rz  z (z)] TJ)r   ro   r  r   r   r  r  r   r#  r  r  r
   r!  r"  printface
unitsPerEmpdfScale)r    rC   r>  r?  rR   r  r   rv  r  ry   rS  s              r"   _shapedTextOutzPDFTextObject._shapedTextOut  s9   jj||!$..1ll))$		: 	)IFAt&"88K[&:PRXY]YfYfRghi"(Dkb)499///4>>Avbzl#&'at}}R012"[^4DEJKvrc{m3'(	)r#   c                 p    | j                   j                  | j                  |      |xr dxs d       y)z3prints string at current point, ignores text cursorz T*r   N)r   ro   r  )r    rC   TStars      r"   _textOutzPDFTextObject._textOut  s1    

D$4$4T$:U_u=RPR=RTUr#   c                     | j                   | j                  j                  || j                  | j                        z   | _         | j
                  j                  | j                  |             y)z9prints string at current point, text cursor moves across.N)r2  r  r   r   r!  r   ro   r  r    rC   s     r"   textOutzPDFTextObject.textOut  sJ    ''DLL44T4>>4>>ZZ

$**401r#   c                 H   | j                   | _        | j                  j                  r| j                  | j
                  z
  | _        n| j                  | j
                  z   | _        | j                  | _        | j                  j                  d| j                  |      z         y)zyprints string at current point, text cursor moves down.
        Can work with no argument to simply move the cursor down.z%s T*N)
r1  r2  r  r0  r4  r"  r3  r   ro   r  r  s     r"   textLinezPDFTextObject.textLine  su     ((<<  gg-DGgg-DG 77 	

'D$4$4T$::;r#   c                 4   t        |      rKt        |      j                         j                  d      }|dk(  rC|D cg c]  }|j                          }}n%t	        |t
        t        f      r|}nddk(  sJ d       D ]  }| j                  |        yc c}w )a  prints multi-line or newlined strings, moving down.  One
        comon use is to quote a multi-line block in your Python code;
        since this may be indented, by default it trims whitespace
        off each line and from the beginning; set trim=0 to preserve
        whitespace.r}  r   r   z4argument to textlines must be string,, list or tupleN)r   r	   stripr=  r-   rf   r[   r  )r    stufftrimlinesr   lines         r"   	textLineszPDFTextObject.textLines  s     <e$**,2259EQw,12q22uTl+Ea4OOO4  	 DMM$	  3s   Bc                 "    | j                   dgk7  S )z=PDFTextObject is true if it has something done after the initr  )r   r,  s    r"   __nonzero__zPDFTextObject.__nonzero__  s    zzdV##r#   c                     | j                   j                  j                  d       | j                   j                  j	                  | d|       y )Ntransparencyca)r  r   ensureMinPdfVersion
_extgstatesetr    r   s     r"   r  zPDFTextObject._setFillAlpha  s6    --n=##Da0r#   c                 R    | j                   j                  j                  | d|       y )NOPr  r  r  r  s     r"   r  z!PDFTextObject._setStrokeOverprint      ##Da0r#   c                 R    | j                   j                  j                  | d|       y )Nopr  r  s     r"   r  zPDFTextObject._setFillOverprint  r  r#   c                 b    | j                   j                  j                  | d|xr dxs d       y )NOPMr   r   r  r  s     r"   r  zPDFTextObject._setOverprintMask  s&    ##DqwQ|!<r#   )r   r   Nr   )r   )r   )r   )!r&   r'   r(   r)   r4   r-  r$  r7  rB  rD  rF  rH  rJ  rM  rT  rY  r]  ra  rf  rh  ro  rs  r  r  r  r  r  r  r  r  r  r  r  r`   r#   r"   r  r  c  s    E"$&P"$
H_"8
78
5
..
!e$N)*V2
<" ($111=r#   r  r$   )r?   TF)r?   T	Helveticar~  F)Nr%   r%   T):__version__r)   reportlab.lib.colorsr   r   r   r   reportlab.lib.utilsr   r   r	   reportlab.lib.rl_accelr
   reportlab.pdfbase.pdfmetricsr   r   r   r   r   r  reportlab.pdfbase.ttfontsr   r   r   r   	itertoolsr   operatorr   rlbidirB   rN   r   	isBidiStrr[   r2   
isBidiListrE   rF   copyrG   rO   rU   rX   r]   rZ   recompileMrj   r   r   r   
rtlSupportr   r   r   r  r`   r#   r"   <module>r     sP   	 I H 9 9 ) S  S O O  nnG#  0Ih4 h 2J[ /lG0(A6(# # bjj"$$'G
> B 9B J(K< K<ZL=O L=ABJ%,,I
GHX^ffLf;fff?OR[Js   BC   )D