
    Kwg                       d Z dZdZddlmZ ddlmZ ddlmZ ddl	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mZmZmZmZ ddlmZ ddlmZmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z'm(Z(m)Z)m*Z* ddl+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1Z1ddl2m3Z3 	 ddl4Z4djk                  d      Z6 e1jn                  d e1jp                  e6      z        jr                  Z: e1jn                  d e1jp                  e6      z        jv                  Z<ddZ=ddZ9d Z>d Z?d Z@ G d d e%      ZA G d! d"e%      ZBd# ZCdd$ZDd% ZEd& ZFdd'ZGdd(ZHdd)ZIdd*ZJdd+ZKd, ZLd- ZMd. ZNd/ZOd0ZPd1 ZQdd2ZRdd3ZSdd4ZTdd5ZUdd6ZVdd7ZWd8 ZX G d9 d:eY      ZZ G d; d<eY      Z[ G d= d>eY      Z\ G d? d@e\      Z] G dA dBe]      Z^ G dC dDe\eZ      Z_ G dE dFe_      Z` G dG dHea      ZbddIZc G dJ dKeY      Zd G dL dMede^      Ze G dN dOede_      ZfdP ZgdZhdQZidRZjdSZkdT ZldU ZmddVZndW ZodX Zp e1jn                  dYe1j                        ZrdZ Zsd[ Ztd\Zud]Zvd^Zw e1jn                  d_      Zx e1jn                  d`      Zy e1jn                  djk                  daeudbf            Zz e1jn                  djk                  daeweudbf            Z{ e1jn                  djk                  dcewddf            Z|de Z}df Z~dg Zdh Ze*fdiZ G dj dkea      Z G dl dme      Z G dn doe      Z G dp dqe      Z G dr dsea      Z G dt duea      Z G dv dwee      Z G dx dyee      Ze*fdzZdd{Zd| Zd} Zd~ Zd Zd Zd Zd Zd Zd Z e1jn                  d      Zd Zd Zd Zd Z G d dea      Zd ZddZd Z G d de      Zedk(  rd Zd Zd ZddZddl mZm!Z! ddlmZ ddlZejP                  dQd Zeg k(  rdgZefdZ e       Zed   Z e!de      Zde_         edQ      rldZ eee      Z ee       d\  ZZejg                  ee      \  ZZ ee       ejs                  ee      ZeD ]  Zejg                  ee        ee       dZ!  edR      r2 eded         Z ee       ejg                  dd      \  ZZ ee        edS      r4dZ eeed         Z ee       ejg                  dd      \  ZZ ee        ed      rdZdZdZ eee      Z ee       ejg                  ee      \  ZZ edee        ee       ejs                  ee      Z eed          ed   jg                  ee      \  ZZ edee        eed           ed      rGd ed      d ed      dZ eeed         Z ee       ejg                  dd      \  ZZ ee        ed      r;dD ]6  Z eeed   d      Z ee       ejg                  dd      \  ZZ ee       8  ed      r4dZ eeed         Z ee       ejg                  dd      \  ZZ ee        ed      rdZ eeed         Z ee       ejg                  dd      \  ZZ ee       ejs                  dedz        Z e ee              eed           eed          edQ   jg                  dd        eedQ           eedQ           ed      rCdZ ee e!ded   e            Z ee       ejg                  dez  dz
  d      \  ZZ ee        ed      rCdZ ee e!ded   e            Z ee       ejg                  dez  dz
  d      \  ZZ ee        edë      r<dZ ee e!dddǫ      ȫ      Z ee       ejg                  ddʫ      \  ZZ ee       yyy#  dZ4Y 1xY w))	ParagraphcleanBlockQuotedText	ParaLinesFragLinez3.5.20z%The standard paragraph implementation    )
whitespace)truth)category)stringWidthgetAscentDescent)
ParaParser_PCT_num_re_us_value)Flowable)Color)TA_LEFTTA_RIGHT	TA_CENTER
TA_JUSTIFY)normalizeTRBL)	wordSplitALL_CANNOT_START)ParagraphStyle)deepcopy)ABag)decimalSymbol_FUZZparaFontSizeHeightOffsethyphenationMinWordLength)
_classNameisBytesisStr)sameFragN)
MethodType )	
    u    u    u    u    u    u    u    u    u    u    u    u    u   ​u    u    u    u    u   　z[%s]+z[%s]+$c                     t        |       ri| j                         } | rSt        j                  |       }|r/t	        |j                  d            ||j                  d         z  S t        | d      S |r|S | S )z/convert a strike/underline distance to a number      F)allowRelative)r"   stripr   matchfloatgroup_parser_num)svMapdefaultms       S/var/www/horilla/myenv/lib/python3.12/site-packages/reportlab/platypus/paragraph.py_usConvr?   J   si    QxGGI""1%AQWWQZ(aggaj)999"1599NH    c                     t        |       r| j                  d      } |t        |      r|j                  d      }|d| v rt        |       n| j                  |      D cg c]  }| c}S c c}w )Nutf8    )r!   decode_wsc_re_splitsplit)textdelimuwords      r>   rF   rF   X   sb    t}T[[0dWU^U\\&5IU7<}TXd 3^b^h^hin^oqeEqqqs   	A+c                 d    t        |       r| j                  d      } | j                  t              S NrB   )r!   rD   r5   _wscrG   s    r>   r5   r5   ]   s%    t}T[[0d::dr@   c                 d    t        |       r| j                  d      } | j                  t              S rK   )r!   rD   lstriprL   rM   s    r>   rO   rO   a   %    t}T[[0d;;tr@   c                 d    t        |       r| j                  d      } | j                  t              S rK   )r!   rD   rstriprL   rM   s    r>   rR   rR   e   rP   r@   c                       e Zd ZdZy)r   a/  
    class ParaLines contains the broken into lines representation of Paragraphs
        kind=0  Simple
        fontName, fontSize, textColor apply to whole Paragraph
        lines   [(extraSpace1,words1),....,(extraspaceN,wordsN)]

        kind==1 Complex
        lines   [FragLine1,...,FragLineN]
    N__name__
__module____qualname____doc__ r@   r>   r   r   i       r@   r   c                       e Zd ZdZy)r   a  
    class FragLine contains a styled line (ie a line with more than one style)::

        extraSpace  unused space for justification only
        wordCount   1+spaces in line for justification purposes
        words       [ParaFrags] style text lumps to be concatenated together
        fontSize    maximum fontSize seen on the line; not used at present,
                    but could be used for line spacing.
    NrT   rY   r@   r>   r   r   t   rZ   r@   r   c                 v    dj                  t        t        t        t	        t        |                               S )Nr/   )joinlistfilterr   rF   r5   Ls    r>   
_lineCleanrb      s%    88DeE!Ho6788r@   c                     t        t        t        t        t        t        t        | d                              }|j                  |      S )zThis is an internal utility which takes triple-
    quoted text form within the document and returns
    (hopefully) the paragraph the user intended originally.r'   )r^   r_   r   maprb   rF   r]   )rG   joinerra   s      r>   r   r      s6     6%SU4->?@ABA;;q>r@   c                 <    |dkD  s|dk  r| j                  |       y y )Ngư>gư)setXPos)txdxs     r>   rg   rg      s    	$w"U(


2 r@   c                 \    t        |       r| j                  d      S | j                  d      S )Ns    rC   )r!   count)ws    r>   
_nbspCountrm      s'    qzww{##wwwr@   c                 n   |dkD  xs t        | dd      }dj                  |      }t        | |       |st        |      t	        |      z   dz
  }|dk  }|r| j                  |d       n@| j                  |t              z         | j                  |d       | j                  d       t        | |        |S N:0yEpreformattedFr/   r2   r   )getattrr]   rg   lenrm   _textOutsetWordSpacer7   )rh   offset
extraspacewordslastsimplerG   nSpacess           r>   _leftDrawParaLiner|      s    AN5!AF88E?DBve*Z--a/!
D

U7^34
D
BwMr@   c                    |dkD  xs t        | dd      }dj                  |      }|st        |      t        |      z   dz
  }|dk  }|r'|d|z  z   }t	        | |       | j                  |d       nN|}| j                  |t              z         t	        | |       | j                  |d       | j                  d       t	        | |        |S )Nrp   rq   Fr/   r2   r         ?rr   r]   rs   rm   rg   rt   ru   r7   	rh   rv   rw   rx   ry   rz   rG   r{   r=   s	            r>   _centerDrawParaLiner      s    AN5!AF88E?De*Z--a/!S:%%1
D

U7^341
D
BrNHr@   c                    |dkD  xs t        | dd      }dj                  |      }|st        |      t        |      z   dz
  }|dk  }|r3||z   }t	        | |       | j                  dj                  |      d       nN|}| j                  |t              z         t	        | |       | j                  |d       | j                  d       t	        | |        |S ro   r   r   s	            r>   _rightDrawParaLiner      s    AN5!AF88E?De*Z--a/!Z1
CHHUOA&

U7^341
D
BrNHr@   c                    t        | |       dj                  |      }t        | dd      xs d|cxk  xr dk  nc xs	 |xr |dkD  }|st        |      t	        |      z   dz
  }|dk  }|r| j                  |d       n@| j                  |t              z         | j                  |d       | j                  d       t        | |        |S )Nr/   rq   Frp   :0yE>r2   r   )rg   r]   rr   rs   rm   rt   ru   r7   )rh   rv   rw   rx   ry   rG   rz   r{   s           r>   _justifyDrawParaLiner      s    BvHHUODb.i53IT3IitOhXbchXhFe*Z--a/!
D

U7^34
D
BwMr@   c                 2     |rt         nt        | ||||      S N)r   r   )rh   rv   rw   rx   ry   s        r>   _justifyDrawParaLineRTLr      s    @$,@"fjZ_aeffr@   c                     |dk(  rd}na|dv r|| z
  }nW|dk(  r|d|z  | z   dz  z
  }nC|dv r	|d|z  z
  }n6|dk(  rd|z  }n+|d	k(  rd
|z  }n t        |d      r|j                  |      }n|}||| z   fS )z1return bottom,top offsets relative to baseline(0)baseliner   )ztext-toptopmiddle333333?r~   )ztext-bottombottomsupersubg      normalizedValuehasattrr   )hvafontSizeiyos       r>   	imgVRanger      s    	:~	!	!qj	X#h,q.#--	'	'X%	W(l	U8m	%	&  *s1u9r@   c                 @    t        | d      r| j                  |      S | S )Nr   r   )vnvs     r>   imgNormVr      s#    q"#  $$r@   c                    | j                   }t        |      r5|}| j                  }| j                  }| j                  }| j
                  }d}nvt        |dd      }t        |d| j                        }t        |d| j                        }t        |d| j                        }t        |d| j
                        }t        |dd      }||||||fS )	Nr   rG   .fontNamer   	textColor	backColordy)endDotsr"   r   r   r   r   rr   )styledotsrG   r   r   r   r   r   s           r>   _getDotsInfor      s    ==DT{>>>>OO	OO	tF3'4
5>>:4
5>>:DU__=	DU__=	T$q!)Ib88r@   g?gUUUUUU?c           
         t        |dd       }|j                  }|j                  }|j                  }|j                  }	|j
                  }
|j                  }| |j                  z  } |
dv }|r_|
dk(  r<t        t        |z  |j                        }t        t        |z  |j                         }n|j                  }|j                   }||z   }|j                  |k7  r|j                  |       |rq|j                  }|R|z
  }|j                   |k7  r|||j                   z
  z  }t#        ||z
        dkD  r|}|j%                  |	|       ||_        |z
  |_        ||_        t        |dd      }d}|j&                  }g }g }|j(                  }|j*                  }t-        |      D ]  \  }}t/        |d      r |j0                  }|j2                  }|d	k(  r|j4                  }||j6                  j8                  }t;        |j<                  |j>                        }t;        |j@                  |      }tC        ||jD                  |      \  }} | ||z  z   }!|jF                  jI                  |jJ                  |!||z   ||d
       | |z  } |!|z  }!tM        ||!|j                  z
         n|jN                  }"|dk(  r!|jF                  jQ                  |"| ||z          nt        |jF                  |"d       }#|#stS        d|d|"d      tU        || |||j                        |jF                  _+        	  |#|jF                  |t        |dd              |jF                  `+||d   u s|jX                  s:|j[                  |j6                  j\                  |j6                  j8                         |j_                  dd       | ||z  z   }!|!}$|j8                  }%|j`                  }&|jb                  }'|dkD  r#|!|rdnte        ||dz
     jf                  |      z
  }$|jX                  |j4                  f|j\                  |%fk7  r|ji                  |j\                  |%       |j`                  |&k7  r|&|_0        |jk                  |&       |jb                  |'k7  r|'|_1        |jm                  |'       ||j(                  k7  r;to        |      }(to        |j(                        })|)|(z
  }*|(|)z
  }+|+D ]  },||,   |$f||,<    ||jp                  k7  rDto        |      }(to        |jp                        })|)|(z
  }-|(|)z
  }.|.D ]  },||,   |$f||,<    ||,d        |jf                  }/|j_                  |/||d   u        ||j(                  k7  r*D ]  },|,|%|&|!f|%f||,<    |j(                  }|r|D ]  },||,   \  }0}1|%|1kD  s|0|%f||,<    |'d|%z  z
  }2|'|%z   }3||jp                  k7  r&-D ]  },|,| f|2|3f||,<    ||,d        |jp                  }|r7|D ]2  },||,   \  }0}4}5|2|4k  s|3|5kD  s|0ts        |2|4      t        |3|5      f||,<   4 t        |dd       }6|6r|jt                  s|6|_:        |!|_;        n|jt                  r|6s:|jx                  j{                  |jv                  |$|jt                  f       d |_:        nr|jt                  |jt                  k7  s|j`                  |jt                  k7  r@|jx                  j{                  |jv                  |$|jt                  f       |6|_:        |!|_;        |jF                  j}                  |/|jX                  |j4                        }7| |7z  } ||/j                  d      t        |/      z   z  } | |dz
  |z  z   }!|rs|j6                  j                  r]|j6                  j                  dk7  r|dk7  r?t        | |!|j                  ||       n%|dk7  r |j                  }8t        |8|8|	|8z
  ||d       |r|D ]  },||,   |!f||,<    |r|D ]  },||,   |!f||,<    ||,d        |jt                  r2|jx                  j{                  |jv                  |!|jt                  f       |j                  |	k7  rtM        ||	|j                  z
         y y # |jF                  `+w xY w)N_linkRecordc                       y r   rY   )argskwdss     r>   <lambda>z_putFragLine.<locals>.<lambda>  s    r@   )minmaxr   r   
_wordSpacer   cbDefnimgauto)maskanchorzMissing z callback attribute '')rh   cur_xcur_yleadingxslabelr%   r2   endg?startr   r/   RTLrightleftF)r   )Frr   rq   	XtraStater   _x0autoLeadingr   
leftIndentr   _56ascent_16descent_leading
setLeading_olb	_oleadingabssetTextOriginrx   us_lineslinks	enumerater   r   kind	_fontsizer   r   r   width	paraWidthheightr   valign_canvas	drawImageimagerg   namebookmarkHorizontalAttributeErrordict_curr_tx_info	_fontnamesetFontr   rt   r   rise_trailingSpaceLengthrG   _setFontsetFillColorsetRisesetlinkr   r   backColor_x
backColorsappendr
   rk   rm   r   wordWrap_do_dots_fragmaxWidth	_x_offset)9r   rh   linery   pKind
linkRecordrq   r   r   x0r   r   dalr   r   olbxcywsr{   rx   ALLLr   r   ifr   r   txfsrl   r   iy0iy1cur_x_sr   funcend_xr   r   r   SNSnLLeLLlnALeALrG   l0fsmaxnlonhilohibgtxtlenr   s9                                                            r>   _putFragLiner    s   M*DEJ??L	BHHE	B..KjjG	R]]E

&C
WT[[1F#g+t||m4G[[F||mG.	{{G
g
gg?f*C||W$2<<//3u9~d"  E* '/	L	#BGJJE	B	B{{HHHE%  k811XXXF;;DU{||<88,,DV\\",,7V]]40#AfmmD9C'"*,

$$V\\'%)AaV$T
17266>*{{>JJ11$uU7]K"2::d48D,UYZ^-_``-1Re%X_cecoco-pBJJ,5RZZWVGD-IJJJ4E"I~||JJrxx001B1BCBq!gbj(GEzzHI66D1u1:NuUVWXUXz`b:cdR\\*QZZ,AAAJJ1||Y&(	*ww}

4  QZZG_1f"f 4A"*1+e"3HQK4QVV|G[1f"f (A$Qx~E!Hq'( 66DKKQ%)^,QZZ JA#$Xi"@"IHQKJZZ 3A (IB~&((l3
 X%C/CQVV| *A !%yS0E!Hq)* VV >A!&qJBB2vR#%c#bk#c"+#=a>
 ;t,B",,!!(MM((2>>5",,*OQ#'BL[[",,.",,2LMM((2>>5",,*OQ#%BL%,BNZZ++D",,MFVOEtzz#z$'777GWk8Z WQYN"G  88e#g~eGDMM"R@F]LLE%U
BG	 	/A"1+w.HQK	/ 
 	 AQx(E!Hq	  
||
r~~wEG	vvrz2bff9 I JJ4s   &a55bc                    t        |j                        \  }}}}	}
}|j                  j                  |||      }||z   |k  r|j                  |k7  s|j
                  |k7  r|j                  ||       |r|t        |d|j                        z  }|j                  d|j                  |z          t        ||| z
         t        ||z
  |z        }t        ||||z  z
         |j                  |	k7  r|j                  |	       |
r|j                  j!                  | ||
f       |j#                  ||z  d       |r*|j                  |j                  |j                  |z
         y y y )N_dotsOffsetXr   r2   )r   r   r   r
   r   r   r   rr   r   r   r   rg   intr   r   r   r   rt   )r   r   r   r   rh   r   rG   r   r   r   r   r   r  ns                 r>   r   r     s6   4@4J1D(9YrZZ##D(H=Fv~x<<!R\\8%;JJx)WRrvv>>
288B;'75=!'!6)*8fQh&'<<"OOI&bmm**E(9+EF
AdF1rrxx{32  r@   c           
         || _         t        | |       |j                  }|dkD  xs t        |dd      }|sX|j                  t        |j                  D cg c]$  }t        |d      rt        |j                        & c}      z   dz
  }|dk  }|rt        || ||d       n=| j                  |t              z         t        || ||d       | j                  d       t        | |        y c c}w )Nrp   rq   Fr   r2   r   r   )r   rg   
extraSpacerr   	wordCountsumrx   r   rm   rG   r  ru   r7   rh   rv   r   ry   r  rz   rl   r{   s           r>   _leftDrawParaLineXr    s    BLBvJCnU!CF..$**%hQT[\]^fTgj&8%h!iijkk!VRtV4

U7^34VRtV4
Bw &is   C+
&C+
c           
      D   || _         || j                  z   | _        	 |j                  }|dkD  xs t	        |dd      }|sX|j
                  t        |j                  D cg c]$  }t        |d      rt        |j                        & c}      z   dz
  }|dk  }|r.|d|j                  z  z   }t        | |       t        || ||d       n?|}| j                  |t              z         t        || ||d       | j                  d       t        | |        | `y c c}w # | `w xY w)	Nrp   rq   Fr   r2   r   r~   center)r   r   r  r  rr   r  r  rx   r   rm   rG   rg   r  ru   r7   	rh   rv   r   ry   r  rz   rl   r{   r=   s	            r>   _centerDrawParaLineXr     s   BLrvvoBO__
E!GWT.%GnnSdjj)lX_`abjXk*QVV*<)l%mmnooGaZFs4??**ABqMBd84AOOJw78BdH5OOAA2O *m Os%   A D D
/D
BD D Dc           
         || _         |j                  }|dkD  xs t        |dd      }|sX|j                  t	        |j
                  D cg c]$  }t        |d      rt        |j                        & c}      z   dz
  }|dk  }|r+||j                  z   }t        | |       t        || ||d       n?|}| j                  |t              z         t        || ||d       | j                  d       t        | |        y c c}w )Nrp   rq   Fr   r2   r   r   )r   r  rr   r  r  rx   r   rm   rG   rg   r  ru   r7   r  s	            r>   _rightDrawParaLineXr"    s    BLJCnU!CF..$**%hQT[\]^fTgj&8%h!iijkk!4??"1Qr4w/

U7^34QD$0
BrN &is   C<
C<
c           
      
   || _         t        | |       |j                  }|j                  xs d|cxk  xr dk  nc xs	 |xr |dkD  }|sX|j                  t        |j                  D cg c]$  }t        |d      rt        |j                        & c}      z   dz
  }|dk  }|s>| j                  |t              z         t        || ||d       | j                  d       nt        || ||d       t        | |        y c c}w )Nrp   r   r   r2   r   justify)r   rg   r  	lineBreakr  r  rx   r   rm   rG   ru   r7   r  r  s           r>   _justifyDrawParaLineXr&    s    BLBvJ^^Vj 6$ 6VD<UZPUEUF..$**%hQT[\]^fTgj&8%h!iijkk!

U7^34VRtY7
VRtY7Bw &is   )D 
;D 
c                 0     |rt         nt        | |||      S r   )r"  r&  )rh   rv   r   ry   s       r>   _justifyDrawParaLineXRTLr(    s    B4-BRQUW[\\r@   c                     t        |       }|r?|j                  j                  |j                         |j                  |j
                        S dS Nr   )_wsc_end_searchr   r
   r8   r   r   )rG   rh   r   s      r>   r   r     s;    		BMO2::!!"((*bllBLLIVUVVr@   c                       e Zd ZdZy)_HSFragz!a frag that's followed by a spaceNrT   rY   r@   r>   r-  r-    s    +r@   r-  c                       e Zd ZdZy)_InjectedFragzHa frag that's injected in breaklines and must be removed on reprocessingNrT   rY   r@   r>   r/  r/    s    Rr@   r/  c                       e Zd ZdZy)
_SplitFragza split fragNrT   rY   r@   r>   r1  r1    s    r@   r1  c                       e Zd ZdZy)_SplitFragHz.a split frag that's the head part of the splitNrT   rY   r@   r>   r3  r3  "  s    8r@   r3  c                       e Zd ZdZy)_SplitFragHYz:a head split frag that needs '-' removing before rejoiningNrT   rY   r@   r>   r5  r5  '  s    Dr@   r5  c                       e Zd ZdZy)_SplitFragHSz'a split frag that's followed by a spaceNrT   rY   r@   r>   r7  r7  +  s    1r@   r7  c                       e Zd ZdZy)_SplitFragLLz<a frag that is forced to end in - because of paragraph splitNrT   rY   r@   r>   r9  r9  /  s    Fr@   r9  c                       e Zd ZddZy)_SHYIndexedStrNc                     |sX|j                  t              }g }|j                  }d}|D ]  }|t        |      z  } ||        dj	                  |      }|d d }t
        j                  | |      }||_        |S )Nr   r%   r   )rF   _shyr   rs   r]   str__new___shyIndices)clsuXaxr:   selfs          r>   r?  z_SHYIndexedStr.__new__4  s    AAAA SV! A#2A{{3q!r@   r   )rU   rV   rW   r?  rY   r@   r>   r;  r;  3  s    r@   r;  c                    | j                  d      }t        | t              r_| j                  dd }|d   }|r=t	        |d      r,|j                  |j                  D cg c]  }||z   	 c}       ||z  }t        ||      S |rI||z  }t	        |d      r8j                  |j                  D cg c]  }|z   	 c}       t        ||      S |S c c}w c c}w )zDrejoin two parts of an original _SHYIndexedStr or str that was split-Nr   r@  )rR   
isinstancer;  r@  r   extend)r:   ssrB  rC  rE  _s         r>   _shyUnsplitrM  C  s    	A!N#MM!bEr-(r~~6!!A#67GAa""		R2m$HH2>>2aac23!!A&&H 7 3s   C-Cc                       e Zd ZdZd Zy)_SHYWordzIa fragword containing soft hyphens some of its strings are _SHYIndexedStrc           
          | d   }d| _         |dk(  rg S d }d}||z
  x}}d }t        | dd        D ]  \  }	\  }
fd}t        |
t              ra |d      }||z   }t        |
j                        D ]0  \  }}|
d | |
|d  }}| ||      z   }||}||kD  }|r n|	||||||f}2 | ||
      z  }n| ||
      z  }||kD  }|s| n |||z
  nd| _         |sg S |\  }	}}}}}}|	dz   }| |   \  }
|
j                  }t        |dz   |d |dz          }| d | |fgz   }||z
  |d<   ||d   z
  |z   g|sg n%t        |||dz   d  D cg c]  }||z
  	 c}      fgz   | |dz   d  z   }t        |      t        |      fS c c}w )Nr   Fr2   c                 F    t        | j                  j                        S r   r
   r   r   )r:   r   s    r>   r   z%_SHYWord.shyphenate.<locals>.<lambda>`  s    ;q!**ajjA r@   rH  )_fswwr   rI  r;  r@  _SplitFragSHY
_SHYWordHS)rF  newWidthr   wwpossibleexceeded	baseWidth
baseWidth0fswwr   tsWshyLenbwjrE  r   r   leftwi1rC  leftsra   rL  Rr   s                            @r>   
shyphenatez_SHYWord.shyphenateW  s%   !W
q5)!)B.	J ab* 	4GAeqAB!N+D'%amm4 CDAq"#BQ%12%Dr$xKE|ET$x/H !QtUFBHC RU"	RU"	$x/D,e#	4$ )-(8T*_j
.6+1aeVqSBx1MMtDy4AaC1"I!E#z!!!WV^bQ~eZ[\]^_\_\`ZaLbUVQqSLb7c4d3efimnpqrnrnsittQA.. Mcs   E;N)rU   rV   rW   rX   rg  rY   r@   r>   rO  rO  U  s
    S$/r@   rO  c                       e Zd ZdZy)rU  zOa head split frag that requires removal of a hyphen at the end before rejoiningNrT   rY   r@   r>   rU  rU  }  s    Yr@   rU  c                       e Zd ZdZy)rV  z=a fragword containing soft hyphens that's followed by a spaceNrT   rY   r@   r>   rV  rV        Gr@   rV  c                 J    	 t        | d   d   t        t        f      S #  Y yxY w)Nr   F)rI  r7   r  )fragss    r>   _processed_fragsrm    s*    %(1+uSk22s    "r2   r3      c                 |   dg}|j                   }d}d}| D ]  }||d   z  }t        |t              }|dd D ]m  }|\  }}	|r<||d   u r5|t        |	d   |j                  |j
                        dz   z  }t        |	      }	||u r|t        |d   d   |	      f|d<   b |||	f       |}o  ||d<    t              |      S )z!F should be a list of _SplitFragsr   Nr2   r   r   )r   rI  r5  r
   r   r   rM  _reconstructSplitFrags)
Frf  aRwLenpstyr   rmhyffstyr^  s
             r>   _rejoinSplitFragWordsrx    s    	
A	
BDD !!L)AB% 		BFCaeAbE#,,s||DtKKNs{k!B%(156"C7		 AaD$!!$Q''r@   c                     t        | t              rt        | t              rt        S t        S t        | t              rt        | t              rt        S t        S t
        S r   )rI  rO  r-  rV  r9  r^   )r   s    r>   rp  rp    sU    CMaPXCY:a0Z qh qOYZ[\cOd:a#=<qCJqjnqr@   c                    fd}g }|j                   }g }t        |       r|j                   }	 | D ]{  }t        |t              r ||       t        |t              r0 ||       t        |t
              sE |t        |             |dd= \|r |t        |             |dd=  ||       } |r |t        |             nmd}d}d}d}| D ]&  }|j                  }|dk7  rt        |_        |rt!        |      }|s1d}t#        |      }|d   t$        v s|sc|r2|j'                  d|        ||rt)        |      n|       |}g }d}d}d}n|xr t        |d   t
              }|s|j'                  dd       n|s|dd D ]  }t*        |v rt-        |      }d}|j                  ||f       |t        ||j                  |j                        z  }|j'                  d|        ||st        |t(              rt/        |      n
t        |             g }d}d} d}|d   }t*        |v rt-        |      }d}|j                  ||f       |t        ||j                  |j                        z  }|s|d   t$        v s|j'                  d|        ||st        |t(              rt)        |      n
t        |             g }d}d}t1        |d      r|j2                  }t5        |d	d      }|rpt1        |d
      r|_        |j9                        }|r/|j'                  d|        ||rt        |      n|       g }d}d}d}t:        |_         |||dfg       d}t<        |_        |s-|r+t        |d   t
              r|d   j                  |df       |j                  |df       t1        |d      s|r"|j'                  d|        ||       g }d}d}d}t>        |_         |d|dfg       d}) |r7|j'                  d|        ||st        |t(              rt)        |      n|       |s| r| d   }t        |_        d|dfgg}|S )z given a Parafrag list return a list of fragwords
        [[size, (f00,w00), ..., (f0n,w0n)],....,[size, (fm0,wm0), ..., (f0n,wmn)]]
        each pair f,w represents a style and some string
        each sublist represents a word
    c                     | d   }t        |t              r.|j                  k7  r|_        |j                        }|| d<   y y y r*  )rI  r   _normalizerr   )r   rl   r   s     r>   _rescaleFragz#_getFragWords.<locals>._rescaleFrag  sL    aDa}}h& (%%h/! ' r@   TNr   r   Fr%   r   r   r   r%  ) r   rm  rI  r/  r1  r-  rx  r5  r
   r   r   rM  rp  rG   _FK_TEXT_fkindrO   rF   r   insertrO  r=  r;  rV  r   r   rr   r|  r   _FK_IMG
_FK_APPEND	_FK_BREAK)rl  r   r}  rf  rr  WaWr   f0Wlenrw  lfr^  tshangingSpacer  hangingStrip
shyIndicesrG   r  whsrl   cbs    `                     r>   _getFragWordsr    s-    	A	
B
AXX  a.Qa
+qE!!W-034aD034aDqE (+,d 
 T	$A66DRx#!$<D#(L$K7j(1*8A;!<*%*
',=JquW$=2 3B 
Aqy*1-%)
HHaUOQ

AJJ??AHHQqM
j86Lz!}RYZ[R\]A!&JA
  %bE19&q)A!%J!A[AJJ

;;DH
2HHQqMjJq4Jx{PWXYPZ[A!&JA8$XXBwq)q!23(0--h7171:1=%*
',&AH1R&zN#(L)AHz!B%'@"aV,!B(K(HHQqMqEAA!&J#(L$Aqf:#iT	$l HHQqMjJq,Bx{JaAAHQsGA
 Hr@   c              #     K   | dd  D ]  \  }}t        |d      r|t        |j                  dd      |f /|rJt        |      r|j	                  d      }|D ](  }|t        ||j                  |j                        |f * {|d|f  y w)Nr2   r   r   r   rB   )r   rr   r   r!   rD   r
   r   r   )rl   r   r:   cs       r>   _fragWordIterr  g  s     !" 	11XWQXXga0!33qzHHV$ BQqzz1::>AAB Q'M	s   BBc                 &   g }t        |      dz
  }g }d}d}d}	| d   d   }
t        |       D ]  \  }}}||z   }||kD  }||
us|rv|
j                         }
t        |
d      r||
_        |j                  |
|f       |r:t        |	g|z         }|j                  |       |dz  }|t        ||         }g }|}d}	d}|}
|	|z  }	||z  }|} |j                  |
|f        t        | t              rt        nt        |	g|z         }|j                  |       |S )aD  given a frag word, w, as returned by getFragWords
    split it into frag words that fit in lines of length
    maxWidth
    maxWidths[lineno+1]
    .....
    maxWidths[lineno+n]

    return the new word list which is either 
    _SplitFrag....._SPlitFrag or
    _SplitFrag....._SplitFragHS if the word is hanging space.
    r2   r   r%   rG   )rs   r  cloner   rG   r   r1  r   rI  r-  r7  r3  )rl   r   	maxWidthslinenorf  	maxlinenor  	lineWidthfragText	wordWidthr   gcwr  newLineWidthtooLongs                   r>   _splitFragWordr  s  sA    	AIq I
AIHI	!QA" !"Q |x'A:	Aq !HHa\"	{1}-!$S6%:;!	HAR	A 	)!* HHa\	?Ag.K)QOAHHQKHr@   uK  (^(?:[a-z0-9\.\-\+]*)://)(?:\S+(?::\S*)?@)?(?:(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}|\[[0-9a-f:\.]+\]|([a-z¡-￿0-9](?:[a-z¡-￿0-9-]{0,61}[a-z¡-￿0-9])?(?:\.(?!-)[a-z¡-￿0-9-]{1,63}(?<!-))*\.(?!-)(?:[a-z¡-￿-]{2,63}|xn--[a-z0-9]{1,59})(?<!-)\.?|localhost))(?::\d{2,5})?(?:[/?#][^\s]*)?\Zc              #      K   d}| j                  |      r||z  }| d d } | j                  |      rd}	 | j                  ||      }|dk  ry |dz  }|| d | z   | |d  |z   f 0w)Nr%   r   r3   r   r2   )endswithfind)urischemeslashtailr   s        r>   _slash_partsr    s     D
,,u
#2h ,,u
 	
A
HHU1Q3	QS!WnSWT\))	 s
   /A%3A%c                 $   t        |       r| j                  d      } t        j                  |       }|sy |j	                  d      }| t        |      d  } |sd| vrdnd}|r| r|| fgng t        t        | ||            z   }|j                          |S )NrB   r2   /\)	r!   rD   uri_patr6   r8   rs   r^   r  reverse)r  r=   r  r  rf  s        r>   _uri_split_pairsr    s    s|3::f-ScATWWQZF
c&kl
C T_U 
"s63-d<FSX;Y6ZZAIIKHr@   u[   A-Za-zÀ-ÖØ-öø-ɏẀ-ẅḀ-ỿА-яḂḃḊḋḞḟṀṁṖṗṠṡṪṫẛỲỳ   ­u   -­u   ^['"([{¿‘‚“„]+u   []'")}?!.,;:’‛”‟]+$z^[z]+$([z])c
                    t        |      r|j                  d      }t        j                  |      }
|
r |
j	                  d      }|t        |      d  }nd}t        |t              r|d   dk(  rd}|d d }n:t        j                  |      }
|
r!|
j	                  d      }|d t        |        }nd}t        |      |	k  ry ||z
  }t        |      }|K||kD  s|rC|d|z
  |z  k  r8|D ]3  \  }}||z   }||z   }t        |||      }||z   }||k  s(dd|||z
  ||fc S  y t        j                  |      }| rt        j                  |      st        j                  |      rsd|vrot        d||      } | |      D ]W  \  }}||z   }t        j                  |d         sd}|}nd}d}||z   }t        |||      }||z   |z   }||k  sL|||||z
  ||fc S  t        |      }|dk\  r|rd|vrt        j                  |      rnt!        t#        d|d            D ]T  }|dj%                  |d |       z   }dj%                  ||d        |z   }t        |||      }||z   }||k  sIdd|||z
  ||fc S  y y y y y )	NrB   r   r%   r   rH  r2   rn  r3   )r!   rD   _hy_pfx_patr6   r8   rs   rI  _SplitWordLL_hy_sfx_patsearchr  r
   _hy_shy_patrF   _hy_letters_pat_hy_shy_letters_patreversedranger]   )
hyphenatorr:   rX  rW  r   r   r   uriWasteReduceembeddedHyphenationhymwlr=   pfxsfxw0rf  r   r^  hwtwHhylenjcjclenr  r   s                            r>   
_hyGenPairr    s   qzqxx'1!Aggajc#hiL!L!aeSjcrFq!''!*C*CH9AC
1v~v	BBA}h;>bQ~5Ex4O.O .1EG 8H5"Wx<qBrE!A--. 	!A--a05H5N5Nq5QVYabVbD(3a= 	-CAaaA$$QrU+CAQx1BBB8|%2b51,,	-  	AA!t#19L9R9RST9U%!A,' 	*Abggaen$A!"$AQx1BBB8|1R2a))	* :V#tr@   c                    dx}}g }|j                   }g }|j                  }t        dt        |             D ]  }| |   \  }}	|j                  dk7  r yt        |d      rt        |j                  dd      r y|	sDt        |	      r|	j                  d      }	 ||	        |t        |	      ||fgz         |t        |	      z  } dj                  |      t        |      fS )ztakes a frag word and assembles a unicode word from it
    if a rise is seen or a non-zerowidth cbdefn then we return
    None. Otherwise we return (uword,([i1,c1],[i2,c2],...])
    where each ii is the index of the word fragment in the word
    r   r2   Nr   r   rB   r%   )rJ  r   r  rs   r   r   rr   r   r!   rD   r]   tuple)
FWccplenrC  eXUaUr   r   r^  s
             r>   _fragWordSplitRepr    s     MB
A	
B
A	
B1SW !u16619T1X7188GA#>(1:188F+q
1
3q6Ab6(?
c!f 88A;uQxr@   c                 .    t        d | D              g| z   S )zF are the fragsc              3   d   K   | ](  \  }}t        ||j                  |j                         * y wr   rS  ).0r:   rB  s      r>   	<genexpr>z#_rebuildFragWord.<locals>.<genexpr>%  s%     C#!AQqzz!**5Cs   .0)r  )rq  s    r>   _rebuildFragWordr  #  s    CCDEaGGr@   c           	         t        |      }|sy |\  }}t        |      r|j                  d      }t        j	                  |      }	|	r |	j                  d      }
|t        |
      d  }nd}
t        |t              r|d   d   d   dk(  rd}|d d }n:t        j                  |      }	|	r!|	j                  d      }|d t        |        }nd}t        |      |k  ry |d   }||z
  }t        |      }|||kD  s|r|d|z
  |z  k  r|D ]  \  }}|
|z   }t        |      }||   \  }}|d| }||   \  }}|d ||z
   }|r|j                  ||f       |||z
  d  }||dz   d  }|r|j                  d||f       t        |      }||d   z   |k  sd|t        |      fc S  y t        j!                  |      }| rt"        j	                  |      st$        j	                  |      rd|vr | |      D ]  \  }}|
|z   }t        |      }||   \  }}|d| }||   \  }}|d ||z
   }t        j	                  |d         sd}nd}|s|r|j                  |||z   f       |||z
  d  }||dz   d  }|r|j                  d||f       t        |      }||d   z   |k  s||t        |      fc S  t        |      }|dk\  r|rd|vrt$        j	                  |      rt'        t)        d|d            D ]  }t        |
dj+                  |d |       z         }||   \  }}|d| }||   \  }}|d ||z
   }|r|j                  ||f       |||z
  d  }||dz   d  }|r|j                  d||f       t        |      }||d   z   |k  sd|t        |      fc S  y y y y y )	NrB   r   r%   r   r2   rH  rn  r3   )r  r!   rD   r  r6   r8   rs   rI  r9  r  r  r  r   r  r  r  rF   r  r  r  r  r]   )r  r  rW  r   r  r  r  rC  r:   r=   r  r  rX  r  rf  r   r^  posfxr  FLffxsfxlsfxrFRr  r  r  r   s                                r>   _hyGenFragsPairr  '  s   "AfDAqqzqxx'1!Aggajc#hiL"\"r"vay}c'9crFq!''!*C*CH9AC
1v~v	AB	BB 	A}h;>bQ~5Ex4O.O 61E!f3B"Xb6S7CF|C:.3r67|1Y1c$Z0$R(ad7H$q!1"!5556 	!A,,Q/4G4M4Ma4PUX`aUaa= 	1CAaAAa&CsVFBAbB"vHCwB<D$$QrU+r		3tBw-(s2vw<DBqDEBRYYq#d, $A!A$w !,R000'	1. 	AA!t#19L9R9RST9U%!A,' 	2AcCHHQrUO+,CsVFBAbB"vHCwB<DRYYDz*s2vw<DBqDEBRYYq#d, $A!A$w 1-b111	2 :V#tr@   c                    |d   }|dk(  rg S t        |      dk(  r|d   \  }}	t        |t              rt        |	      }	t	        | |	||||j
                  |j                  |||
      }
|
rM|
\  }}}}}} |rt        nt        ||z   |||z   fg       t        |t              rt        nt        |||fg      gS y t        | ||||||      }
|
rB|
\  }}} |rt        nt        |       t        |t              rt        |      gS t        |      gS y )Nr   r3   r2   )rs   rI  r9  r  r  r   r   r5  r3  r-  r7  r1  r  )r  r  rW  r   r  r  r  rX  r   r:   rf  r  r  r  r  r   r^  s                    r>   _hyphenateFragWordr    sX   	AB	1uRi
2wz!u1b&QAz1b(Hajj!**Ucdwy~&'#Br2q!8R\[2e8QqtH:MN  QG`jkmnu`vP\  }G  JL  NO  PQ  MR  IS  PT  U  U  JHh~NachiHB18R\[!<>tjY[\cNdlvw=xyyjtvw=xyyr@   c                       e Zd Zy)
_SplitWordNrU   rV   rW   rY   r@   r>   r  r        r@   r  c                       e Zd Zy)_SplitWordEndNr  rY   r@   r>   r  r    r  r@   r  c                       e Zd Zy)_SplitWordHNr  rY   r@   r>   r  r    r  r@   r  c                       e Zd ZdZy)_SplitWordHYz$head part of a hyphenation word pairNrT   rY   r@   r>   r  r    s    .r@   r  c                       e Zd ZdZy)r  z=a word that's forced to end with - because of paragraph splitNrT   rY   r@   r>   r  r    rj  r@   r  c                       e Zd ZdZd ZddZy)_SHYStrz for simple soft hyphenated wordsc                 B   |j                  t              }t        |      dkD  r^t        j	                  | dj                  |            }dg}|j                  }|D ]  } ||d   t        |      z           |dd |_        |S t        j	                  | |      }g |_        |S )Nr2   r%   r   r   )rF   r=  rs   r>  r?  r]   r   __sp__)rA  r:   r  rF  spasprK  s          r>   r?  z_SHYStr.__new__  s    GGDMq6!8;;sCHHQK0DB))C $BrF3r7N#$Qr(DK  ;;sA&DDKr@   c           	         d| _         t        t        t        | j                                    D ]  \  }}| d| }t        ||||      }	|s|	| _         ||	z   }
|
|k  s-| j                  |d t        |       gz   }t        t        |      dz
        D cg c]  }| ||   ||dz        }}t        |dz         }| j                  d| |_        |t        t        j                  |            gc S  yc c}w )z{
            baseWidth = currentWidth + spaceWidth + hyphenWidth
            limWidth = maxWidth + spaceShrink
            rQ  Nr2   rH  )rT  r  r^   r   r  r
   rs   r  r  r=  r]   )rF  r   r   r[  limWidthencodingr   r  swswwswnwTrb  r  s                 r>   __shysplit__z_SHYStr.__shysplit__  s    
 $DJ!$y'=">? 62 #2Y!"h(Cs$* 38#AB3t9+5A49#a&(ODqad1QqS6*DAD D)B $BQBIwtyy|4556 Es   C.NrB   )rU   rV   rW   rX   r?  r  rY   r@   r>   r  r    s    *6r@   r  c                       e Zd Zy)_SHYSplitHYNr  rY   r@   r>   r  r    r  r@   r  c                       e Zd Zy)	_SHYSplitNr  rY   r@   r>   r  r    r  r@   r  c
                     |dk(  rg S t        | |||||||||	
      }
|
r+|
\  }}}}}} |rt        nt        ||z         t        |      gS y r*  )r  r  r  r  )r  r   r   rl   rX  rW  r   r  r  r  rf  hyr  r  r  r   r^  s                    r>   _hyphenateWordr    sd    	1uRi:q"h(Hn]prwxA"#E2r1a4ad;M!<LMM 	r@   c                 X   g }|j                   }t        |      dz
  }	d}
|t        |	|         }t        |       r| j	                  |      } | D ]J  }t        ||||      }||z   }||kD  r) |t        |
             |dz  }|t        |	|         }|}d}
|
|z  }
|}L  |t        |
             |S )z
    split w into words that fit in lines of length
    maxWidth
    maxWidths[lineno+1]
    .....
    maxWidths[lineno+n]

    then push those new words onto words
    r2   r%   )r   rs   r   r!   rD   r
   r  r  )rl   r  r  r  r   r   r  rf  rr  r  wordTextr   r  r  r  s                  r>   
_splitWordr    s     	A	
BIq IHYv./HqzHHX 
!8HX6 | z(#$aKF Yv!67HLHA 	
! }XHr@   c                 ^   t        | d   t              r| d   }| dd D ]  }t        ||      } |S t        | d   t              rZt        | d   t              rt
        nt        }dj                  d | D              }t        | d   t              r|S t        |dz         S dj                  |       S )z-R can be a list of pure _SplitWord or _SHYStrr   Nr   r%   c              3   J   K   | ]  }t        |t              r|d d n|  y wNr   )rI  r  r  rL  s     r>   r  z$_rejoinSplitWords.<locals>.<genexpr>  s$     Ma
1\ :afAMs   !#rH  )rI  r  rM  r  r  r>  r]   )rf  rrL  cfr:   s        r>   _rejoinSplitWordsr    s    !A$waD1 	!AAa A	!	AaD	&qum4S,HHM1MNqum4qN,qv:NNwwqzr@   c              #   *  K   g }|j                   }| j                  || D ]_  }|d   D ]U  }t        |t              r+ ||       t        |t              rt        |       |d d = >|rt        |       |d d = | W a |rt        |       y y w)Nr2   )r   linesrI  r  r  r  )blParar   stoprf  rr  r  rl   s          r>   _yieldBLParaWordsr    s     
A	
B\\%% 1 	A!J'1a.+A..!+A..!G	 	"" 	s   BBc                 N   | j                         }dD ]  }t        ||      st        ||        t        t	        | ||            |_        t        |j
                  d   t              r;t        |j
                  d   t              rt        nt        |j
                  d   _        |gS )N)r  r   rG   r   )r  r   delattrr^   r  rx   rI  r  r  r  r  	__class__)r  r   r  r   rD  s        r>   _split_blParaSimpler    s    A& &1Q<1&$VE$78AG!''"+l+-7G-L	R^3Jr@   c                    g }| j                   || }|D ]  }|j                  D ]  }|j                  |        ||d   us-t        |      dz
  }|dk\  r]t	        ||   d      rNt        ||   j                  dd      s4|dz  }|dk\  r*t	        ||   d      rt        ||   j                  dd      s4|dk\  s||   }|j                  sd|_        |j                  d   dk7  s|xj                  dz  c_         |S )Nr   r2   r   r   r   r/   )r  rx   r   rs   r   rr   r   rG   )	r  r   r  r   r  r  rl   r   r  s	            r>   _split_blParaHardr  $  s    
ALLt$E 	4 	AHHQK	E"IAqAQ$71Q41'!A$++gVW:XZ[_`Z`Z[!Q$71Q41'!A$++gVW:X!taDvvqvVVBZ_affmf	4 Hr@   c                    |j                   }|s|j                   dk7  r|dk(  }t        |      rw|}|xr t        |v }	|	r|d|j                  t               }t	        ||j
                  |j                        }
|	r|
dt	        t        |j
                  |j                        z  z  }
nd}
|D ]  }|j                  }|xr t        |v }	|	rC|d|j                  t               }|
dt	        t        |j                  |j                        z  z  }
|
t	        ||j                  |j                        z  }
|	s n nd}
|dk(  r|
dz  }
|t        |dd      z  }|s | j                  |j                  |
z
  |      }n6|d   }||j                  z   |j                  |
z   z
  }| j                  ||      }|j                  |j
                  |j                         |j                  t        |d|j                                t        |      r|j#                  |       nc|D ]^  }|j                  |j                  |j                         |j                  |j                          |j#                  |j                         ` | j%                  |       |s9|j'                         |j                  d	z  z   }t)        |||j*                  z
        }|S )
z:draw a bullet text could be a simple string or a frag listr   numericNr~   r   r   bulletOffsetYbulletColor333333?)bulletAnchorr"   r   indexr
   bulletFontNamebulletFontSizerG   r   r   rr   	beginTextbulletIndentrightIndentr   r   r   textOutdrawTextgetXr   r   )canvasrv   r   
bulletTextr   rtlr  r  r^  qbulletWidthr   tx2r   bulletStart	bulletEnds                   r>   _drawBulletr.  3  s   %%L
e  ')	)A.MQ.Aa//0!%a)=)=u?S?STK+{=%BVBVX]XlXl'm!mm+ K FF2 21177=12A3]AJJPQPZPZ)[#[[K{1ajj!**EE X{c1{	WU?1--Eu11+=eDAE---u/A/A+/MN{E2KK$$e&:&:;WU=ABZJ 	 AKK

AJJ/Q[[)KK	 
 OOC HHJ!5!5!;;	VI(8(889Mr@   c                    | rt        |       r"t        | |j                  |j                        }n7d}| D ]0  }|t        |j                  |j
                  |j                        z  }2 |j                  |z   d|j                  z  z   }|j                  dk(  r|j                  |j                  z   }n|j                  |j                  z   }||kD  r|dxx   ||z
  z  cc<   yyy)z@work out bullet width and adjust maxWidths[0] if neccessary
    r   r  r   N)r"   r
   r  r  rG   r   r   r!  r   r"  firstLineIndentr   )r'  r   r  r*  r   	bulletLenindents          r>   _handleBulletWidthr3  f  s     %z53G3GI]I]^K K K{1661::qzzJJK&&4sU=Q=Q7QQ	>>5 &&u'<'<<F%%e&;&;;FvaLY/0L  r@   c                    g }d}||   }d}t        |       }dx}}	 ||k  rV||k  r	|   dk(  r|dz  }||k  r	|	|   dk(  r||k(  r*|dz  }||k(  rn&d}| |   }
|
j                  }	t        |	      }nn||k  rV||k(  ryd}g }d}d}||k  r	j                  d|      }|dk  r||k(   t        |	|| 
j                  |
j
                        }||z  }||kD  r:|g k7  r5||z
  }|j                  |   dk(  r|dz
  }|dz
  }|j                  |   dk(  rn:|dk  r|}|d   |
u r||d<   n|
||f}|j                  |       ||k(  r|dz  }||k  r.)z
    given a list of ParaFrags we return a list of ParaLines

    each ParaLine has
    1)  ExtraSpace
    2)  blankCount
    3)  [textDefns....]
    each text definition is a (ParaFrag, start, limit) triplet
    r   r   r2   r/   )NNNr3   N)rs   rG   r  r
   r   r   r   )rl  widthsr  lineNummaxWr   r  limr   rG   r   r  r   cLenr{   rb  rl   s                    r>   splitLines0r:  z  s    EGWoDA%jACe
c)US 0%1*%%)US 0czQa4!Hvv$i c #:u #4i		#e$AsAsFDqM!**QZZ@AAIDDyT2XAvffSk3&'C%aiG ffSk3& sAtqy!A$uQKA#vQ% 4i+ r@   c                     | j                   }|j                  }||k7  r|j                  |       |j                  }	||	k7  r|j	                  |       |j                  ||||       y r   )r   
_lineWidthsetLineWidth_strokeColorObjsetStrokeColorr   )
rh   x1y1x2y2nlwnsccanvolwoscs
             r>   _do_linerI    s[    ::D
//C
Cx#


C
CxC IIb"b"r@   c           	         |j                   }|j                  }|j                  | |j                  z  z
  }|j                  }|j
                  }	|j                  }
t        |	|	|	      }|j                  }||j                  j                  dj                  |j                   j                  |    d         |j                  |	      z   |z   }|D ]  \  }}}}}}}}|dk(  }t        |||j                        }t        ||d      }||z   }|s| }||z   t        |dk(  r|rdndn||      z   }|s|
}|d	kD  sh|j                  ||||||       ||z  }|dz  }|d	kD  r& y )
N)ra   rq  r   r/   r2   	underliner<   r%   -0.125*L0.25*Lr   )r   r   r   r   r   r   r   r   _defaultLineWidthr   r
   r]   r  r   r?   rI  )r   r@  r   rh   r   r   r   y0r   fstcvaluesdwrB  r  kr  rl   or	  r=   r  rK  lwlgr   ys                              r>   _do_under_linerZ    sa   	BHHE	AemmO	#B
A	
B	
BBb!F			B	bjj$$SXXbll.@.@.CA.F%GWYZ	Z]_	_B# !Aa!Aa{N	Qvb&:&:;Qva(Us"FW2Ij8STU[\\b!cKKAr1b!,GAFA cr@   z^[a-zA-Z][-+a-zA-Z0-9]+$c                 &   |sy |j                  d      r#| j                  j                  d|dd  |d       y |j                  dd      }t	        |      dk(  xr |d   j                         xs d}|dk(  r#| j                  j                  d|d   |d       y t        j                  |      rE|j                         d	k(  xr d
xs d}|d
k(  r|d   }| j                  j                  ||d|       y | j                  j                  ||dd       y )N#r%   r2   )relative:r3   r   documentpdfGoToRURI)r]  r   )	
startswithr   linkRectrF   rs   lower
_scheme_rer6   linkURL)rh   r   rectpartsr  r   s         r>   _doLinkrj    s    s


BQR$;

3q!UQ358>>#39r:JJE!HdQ?f%&27;eDW}U1XdJJtTADAJJtTAEBr@   c           
         |j                   }|j                  j                  }|j                  | |z  z
  |j                  j
                  dz  z
  }dj                  |j                  |    d         }|j                  j                  ||j                  |j                        }|j                  D ]  \  }	}
t        ||
||||z   ||z   f        y )Ng       @r/   r2   )r   r   r   r   r   r   r]   r  r   r
   r   r   r   rj  )r   t_offr   rh   r   r   rY  rG   textlenr  r   s              r>   _do_link_linern    s    	BhhG
1W9rtt}}S00A88BHHQKN#Djj$$T2<<FG77 @4D5!U7]AgI>?@r@   c                    | j                   }|j                  }|j                  }|j                  j                  }|j
                  }|j                  }|dk(  rt        |d|z        }n
|dk(  rd|z  }|j                  rl||z   }||z
  }|j                  D ]E  \  }	}
}| j                  j                  |       | j                  j                  |	||
|	z
  |dd       G g |_        d |_        t        |j                  j                               D ]&  \  \  \  \  }}}	}}}
t!        | ||	||z   |
||z   f       ( i |_        |j"                  r| j$                  }t'        |      }t        |j"                  j                               D ]  \  \  \  \  }}}}}}}}}}}	}}
|dk(  }||d	<   ||d
<   t)        ||| j$                        }t)        ||d      }||z   }|s| }||z   t)        |dk7  r|n|rdnd|      z   }|s|}|dkD  s}| j+                  |	||
|||       ||z  }|dz  }|dkD  r& i |_        |xj                  |z  c_        y )Nr   r   r   r   r2   )strokefillr`   rK  r   rq  rL  r%   rM  rN  )r   r   r   r   r   r   r   r   r   r   r   rh  r   sortedr   rS  rj  r   rO  r   r?   rI  ) rh   r   rP  r   r   r   r   ylydescr@  rB  r  r  r   r  r  rT  rS  rU  rl   rV  r	  r=   r  rQ  rR  r  rK  rW  rX  r   rY  s                                    r>   _do_post_textru    s\   	B	B
AhhG..KzzHEgc(l+	e	h,	}}(]W}} 	DGBr!JJ##A&JJOOBuRU7!OC	D $*288??+<$= 2 (1T2r"bD2r"ub"R%012BH	{{!!!7=bkk>P>P>R7S 	30)q1Qq1Q2b%;IF3KF3K6"*>*>?B6!,BBBB3bQae	*xY_``A"aA#B2q"a0RQ A#	 HHHr@   c                    |j                   }|rH|j                         }|dk(  rt        j                  }nJ|dk(  rt        j                  }n4|dk(  rt        j                  }n|dk(  ry t        d|j                   z        t        |       }|dk(  r || d   j                        | d   _        y |t        j                  u rtd}| D ]l  }|j                  }|s|j                  d	      s|r	 ||      }n'|j                  d	      }|dk\  r|d |  |||d        z   }|j                  d	      }||_        n y | D ]  }|j                  }|s ||      |_          y y )
N	lowercase	uppercase
capitalizenonez+ParaStyle.textTransform value %r is invalidr2   r   Tr/   )textTransformre  r>  uppertitle
ValueErrorrs   rG   rc  r  r  )rl  r   ttr  pbr   rB  r   s           r>   textTransformFragsr     sJ   			B	88:{?B_B,BZJUM`M``aaJa4uQx}}-E!HM399_B 
FF(<<%1AtA!tbqE"QqrU)OZZ%
  FF(A= 
r@   c                   :    e Zd ZdZd Z ed       Z ed       Zy)cjkUz4simple class to hold the frag corresponding to a strc                     t         j                  | |      }||_        t        |d      r t	        |j
                  dd      }||_        |S t        ||j                  |j                        |_        |S )Nr   r   r   )
r>  r?  _fragr   rr   r   _widthr
   r   r   )rA  valuefragr  rF  rl   s         r>   r?  zcjkU.__new__G  sb    {{3u%
4!GA.ADK  &eDMM$--HDKr@   c                     | j                   S r   )r  rF  s    r>   r   zcjkU.<lambda>P  s
     r@   c                     | j                   S r   )r  r  s    r>   r   zcjkU.<lambda>Q  s
    $++ r@   N)rU   rV   rW   rX   r?  propertyr  r   rY   r@   r>   r  r  E  s"    > +,D-.Er@   r  c                    g }g }t               }dx}	x}
}| D ]  }|j                  }|j                  }|rct        |dd       }t        |dd      r/t	        t        |j                  |      |j                  |      \  }}n3t        |j                  |      \  }}nt        |j                  |      \  }}t        |	|      }	t        |
|      }
t        ||      }t        ||      s;|j                         }dj                  |      |_        |j!                  |       g }|}|j!                  |        |r7|j                         }dj                  |      |_        |j!                  |       t        d|d|dd  |	|
||||
      S )Nr   r   r   r%   r2   )
r   r  r  rx   r   r   r   r   currentWidthr%  )r   r  r   rr   r   r   r   r   r   r   r   r   r#   r  r]   rG   r   )r  r   	widthUsedr  r%  
calcBoundsrx   CWr  maxSize	maxAscent
minDescentrB  r   r   r   r   r   s                     r>   makeCJKParaLiner  S  s|   E	B	B'((G(i* FF::Qx-Fvga("+HV]]8,LV]][c"d"21::h"G.qzz(COFGgh'	&)	G,
1~xxzBhhrlBGLLBB
		!)* 
88:((2,Rj159V]en  xB  LT  bk  v  @  @r@   c                    g | D ]s  }|j                   }t        |      r|j                  |      }|r+j                  |D cg c]  }t	        |||       c}       Xj                  t	        |||             u g }dx}x}	}
|d   }t              }||k  rb|   }|dz  }|j                  }t        |d      r||_	        |j                  |      }|	|z  }	t        |j                  d      }|	|t        z   kD  xr |	dkD  xs |}|r||	z
  }|st        |      dk  r|
|z   dz	  }t        |dz
  |d      D ]n  }|   }|rt        |      dk(  st        |      dk\  s'|dz   }||k  s2|dz   }|t!        fdt        ||      D              z  }|   j                  }|   }|} n |t"        vr||
dz   kD  r
|dz  }||z  }|j                  t%        |
| ||	|||             	 |t        |         }|}
d}	||k  rb|	dkD  r%|j                  t%        |
d	 ||	||	z
  d
|             t)        d|      S c c}w # t&        $ r |d   }Y Ww xY w)z@This attempts to be wordSplit for frags using the dumb algorithmr   r2   r   r%  i 0  r   Zsc              3   <   K   | ]  }|   j                     y wr   )r   )r  iir  s     r>   r  zcjkFragSplit.<locals>.<genexpr>  s     1S"!B%++1Ss   NFr   r  )rG   r!   rD   rJ  r  r   rs   r   r   r|  r   r  r   ordr  r	   r  r   r  
IndexErrorr   )rl  r  r  r  r   rG   r^  r  r   r  lineStartPosr   nUrB  rl   r%  endLiner  
limitCheckrb  ujrU  r  s                         @r>   cjkFragSplitr  s  s   
A ,vv4=;;x(DHH$7Qd1Qx(78HHT$q*+, E#$$A$	L|H	QB
B$aD	QGG1&'$AM!!(+AQ	AFF;/	X--=)A+K)!I-Jq6&= #/q.1!4J"1Q3z"5 
&qT(2,"4B !!A s$%aC *c1SaPQ
1S.S S
$%aDJJ$%aD$% %
&& ,,<>1A FA!OJLL<):8IjYbcmno)$SZ0 LIu B$z 1}_Q|}%5hyR[I[\ablmn!%((O 8z  )$R=)s   H3
#H8 8I	I	c                    |j                   | _        t        |dd      | _        t        |dd      | _        t        |dd      xs d| _        t        |dd      | _        t        |dd      | _        t        |dd      xs d	| _        y )
NunderlineColorr%   underlineWidthunderlineOffsetz-0.125fstrikeColorstrikeWidthstrikeOffsetz0.25f)	r<  rO  rr   _underlineColor_underlineWidth_underlineOffset_strikeColor_strikeWidth_strikeOffset)rh   r&  r   s      r>   _setTXLinePropsr    s    !,,B '7;B '7;B!%(9"=JBeM"5BOeM"5BOu^B7B7B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 ZddZddZd Zedd       Zy)r   a   Paragraph(text, style, bulletText=None, caseSensitive=1)
        text a string of stuff to go into the paragraph.
        style is a style definition as in reportlab.lib.styles.
        bulletText is an optional bullet defintion.
        caseSensitive set this to 0 if you want the markup tags and their attributes to be case-insensitive.

        This class is a flowable that can format a block of text
        into a paragraph with a given style.

        The paragraph Text can contain XML-like markup including the tags:
        <b> ... </b> - bold
        < u [color="red"] [width="pts"] [offset="pts"]> < /u > - underline
            width and offset can be empty meaning use existing canvas line width
            or with an f/F suffix regarded as a fraction of the font size
        < strike > < /strike > - strike through has the same parameters as underline
        <i> ... </i> - italics
        <u> ... </u> - underline
        <strike> ... </strike> - strike through
        <super> ... </super> - superscript
        <sub> ... </sub> - subscript
        <font name=fontfamily/fontname color=colorname size=float>
        <span name=fontfamily/fontname color=colorname backcolor=colorname size=float style=stylename>
        <onDraw name=callable label="a label"/>
        <index [name="callablecanvasattribute"] label="a label"/>
        <link>link text</link>
            attributes of links
                size/fontSize/uwidth/uoffset=num
                name/face/fontName=name
                fg/textColor/color/ucolor=color
                backcolor/backColor/bgcolor=color
                dest/destination/target/href/link=target
                underline=bool turn on underline
        <a>anchor text</a>
            attributes of anchors
                size/fontSize/uwidth/uoffset=num
                fontName=name
                fg/textColor/color/ucolor=color
                backcolor/backColor/bgcolor=color
                href=href
                underline="yes|no"
        <a name="anchorpoint"/>
        <unichar name="unicode character name"/>
        <unichar value="unicode code point"/>
        <img src="path" width="1in" height="1in" valign="bottom"/>
                width="w%" --> fontSize*w/100   idea from Roberto Alsina
                height="h%" --> linewidth*h/100 <ralsina@netmanagers.com.ar>

        The whole may be surrounded by <para> </para> tags

        The <b> and <i> tags will work for the built-in fonts (Helvetica
        /Times / Courier).  For other fonts you need to register a family
        of 4 fonts using reportlab.pdfbase.pdfmetrics.registerFont; then
        use the addMapping function to tell the library that these 4 fonts
        form a family e.g.
        from reportlab.lib.fonts import addMapping
        addMapping('Vera', 0, 0, 'Vera')    #normal
        addMapping('Vera', 0, 1, 'Vera-Italic')    #italic
        addMapping('Vera', 1, 0, 'Vera-Bold')    #bold
        addMapping('Vera', 1, 1, 'Vera-BoldItalic')    #italic and bold

        It will also be able to handle any MathML specified Greek characters.
    Nc           	          |t        d      }|| _        || _        | j                  |||xs t	        |dd       |t
               y )NparagraphImplicitDefaultStyle)r   r'  )r   caseSensitiver  _setuprr   r   )rF  rG   r   r'  rl  r  r  s          r>   __init__zParagraph.__init__  sE    ="(GHE* D%!Owu\$/OQVXlmr@   c                    | j                   j                  }|dz   g}t        | j                  j	                               }|D ]t  }|j                  t        |      j                  dd      j                  dd      dt        t        | |            j                  dd      j                  dd             v |j                  d|z          dj                  |      S )N(r'   r/     z: z) #)
r  rU   r^   __dict__keysr   reprreplacerr   r]   )rF  r  ra   r  rU  s        r>   __repr__zParagraph.__repr__  s    NN##sUGDMM&&() 	LAHHas!;!C!CD!MdSZ[_abScNdNlNlmqsvNwNN  AE  FI  OJ  K  L	L	qyy|r@   c                 N   | ||      }t               }| j                  |_        |j                  ||      \  }}}|5t        d|j                  d   d|d t        dt        |             d      t        ||       |r|}|| _        || _	        || _
        || _        d| _        y )Nzxml parser error (r   z) in paragraph beginning
'   r   )r   r  parser~  errorsr   rs   r  rG   rl  r   r'  debug)rF  rG   r   r'  rl  cleaner_parserbulletTextFragss           r>   r  zParagraph._setup  s    
 =4=D lG$($6$6G!,3MM$u,E)E5/} ~~a(.@s2c$i/@)A"C D DuU+_
 	

$
r@   c           	         |t         k  ry|| _        | j                  }|j                  }|||j                  z   z
  |j
                  z
  }||z
  |j
                  z
  }||g| _        |j                  dk(  r| j                  | j                        }n| j                  | j                        }|| _
        t        | dt        |dd            }|j                  }	|j                  dk(  r|dvrd}
|dk(  r8|j                  D ](  }|
t        |j                   |j"                  z
  |	      z  }
* n|d	k(  r.|j                  D ]  }|
|j                   |j"                  z
  z  }
  nt%        d
|z        t'        |j                        |	z  }
n_|dk(  r$t        |	|j                   |j"                  z
        }	n|d	k(  r|j                   |j"                  z
  }	t'        |j                        |	z  }
|
| _        | j                  |
fS )N)r   rQ  CJKr   r%   r2   r%   offr   r   r   invalid autoLeading value %r)r   r   r   r   r0  r"  _wrapWidthsr   breakLinesCJK
breakLinesr  rr   r   r   r  r   r   r   r~  rs   r   )rF  
availWidthavailHeightr   r   first_line_widthlater_widthsr  r   r   r   r  s               r>   wrapzParagraph.wrap4  s   e 


%%
%E4I4I)IJUM^M^^!J.1B1BB,l;>>U"''(8(89F__T%5%56Fd=}R1PQ--;;>*,%#\\ B#ahhqyy&8"AAB %'#\\ 7!((QYY"667 %%Ck%QRRV\\*W4E!gfmmFNN&BCe# --6&0Fzz6!!r@   c                 ^   | j                   }t        |      }|sy|dk(  rrt        |      sg|d   }|j                  |j                  t        fdt        |d      rt        |j                  d      D              S |j                  D              S t        d t        |      D              S )z-Attempt to determine a minimum sensible widthr   r2   c              3   8   K   | ]  }t        |        y wr   )r
   )r  rl   fNfSs     r>   r  z%Paragraph.minWidth.<locals>.<genexpr>f  s     l{1R+ls   rG   r/   c              3   &   K   | ]	  }|d      yw)r   NrY   )r  rl   s     r>   r  z%Paragraph.minWidth.<locals>.<genexpr>h  s     :qt:   )rl  rs   rm  r   r   r   r   rF   rG   rx   r  )rF  rl  nFragsr   r  r  s       @@r>   minWidthzParagraph.minWidth]  s    

E
a19-e4aABBlGTUV\L]eAFFC6Hlllcdcjcjlll:]5%9:::r@   c                    |sg S |j                   }||   j                  }|t        |      k7  r||   j                  nt        | j                        }| j                  || }|r,t	        |d   t
              r|d= |rt	        |d   t
              rt	        |d   t              r't	        |d   t              rt        nt        |d   _
        |S r  )r  sFWrs   rl  rI  r/  r5  rO  rV  r9  r  )rF  r  r   r  r  r  sFWNrq  s           r>   _split_blParaProcessedz Paragraph._split_blParaProcessedj  s    BYEl"&E
"2uT{DJJJJs4 Jqu]32aJqu]3aeL),6quX,FjLAbEOr@   c                     | j                   j                  dk(  rt        S t        | j                        st
        S | j                  S r*  )r  r   r  rm  rl  r  r  r  s    r>   _get_split_blParaFunczParagraph._get_split_blParaFuncu  s>    '+{{'7'7':# 	;3CDJJ3O+	;!88	;r@   c           
      8   t        | j                        dk  s|t        k  s	|t        k  rg S t        | d      s| j	                  ||       | j
                  }| j                  }t        | dt        |dd            }|j                  }|j                  }|j                  dk(  r|dvrdx}}	|dk(  rWt        |j                        D ]>  \  }
}t        |j                  |j                  z
  |      }|	|z   }||dz   kD  r n|}	|
dz   }@ n|d	k(  rKt        |j                        D ]2  \  }
}|	|j                  z   |j                  z
  }||dz   kD  r ni|}	|
dz   }4 n_t        d
|z        |}|dk(  rt        |d|j                   z        }n|d	k(  rd|j                   z  }t#        |t%        |      z        }||z  }	t        | dt        |dd            }|s|dk  s|dk(  r| `g S t        |      }t        | dt        |dd            }||k  r| gS |s||dz   k(  r|r|dk(  s|dkD  r|dz  }n| `g S | j'                         }|j(                  rt+        |      }d |_        n|}| j-                  d || j.                   ||d|            }t1        d|j                  d| ||      |_        t3        |j                  |dz
     t4              xr: t        |j                  |dz
     d      xr |j                  |dz
     j6                   |_        d|_        |	|_        ||_        |j@                  dk7  rt+        |      }d|_         | j-                  d |d  ||||            }dD ]=  }t        | |      stC        ||t        | |             tC        ||t        | |             ? ||gS )Nr   r  r   r%   r2   r  r   r   r   r  r   allowOrphansallowWidowsrn  )r'  rl  )r   r  aHr  r%  )r   )"rs   rl  r   r   r  r  r   rr   r   r  r   r   r   r   r   r~  r   r  r7   r  r   r   r  r'  r   rI  r   r%  _JustifyLast
_splitparar   r   r0  setattr)rF  r  r  r  r   r   r   r  r:   r   r   r  r   r  r  r  r  style1P1P2rD  s                        r>   rF   zParagraph.splitz  s   tzz?AE!1[5Fr	 tH%IIj-

d=}R1PQ--;;>k;NAE!$V\\2 CAaAHHQYY.w7AqAT))F!A e#$V\\2 CAaqxx		1AT))F!A !!?+!MNNAE!ENN 23e#&Ka()AqSFtN75PQ3RSA!Q$IJd=}Q1OPa46M!A#v QTacFAI))+==e_F!FNF>>$vtFSTUVGW>X16<<!+<zZ	  *&,,qs*;HE  @$+FLL1,={$K @$*LL1$5$?$?A 	  A%UOE$%E!>>$u4q;K>L 	.AtA1WT!_-1WT!_-		. 2wr@   c                 :    | j                  | j                         y r   )drawParar  r  s    r>   drawzParagraph.draw  s     	djj!r@   c                    d| _         t        |t        t        f      s|g}n|}g }dx| _        }t        |      dz
  }| j                  }t        |dd      }|r`t        |      r<|j                         }|r't        r!t        j                  |      j                  }nd}nt        |      st        d|z        d}|j                  }|j                   }	|	dkD  }
|j"                  }|j$                  }|xs |xs |	}|rt        |dt&              }dx| _        | _        t-        | j.                  ||       |d   }t        | d	t        |d	d            }|d
v}| j0                  }t        |      }|dk(  r_|j2                  sRt5        |d   d      sBt5        |d   d      s2t7        |      s&|d   }|j8                  }|j:                  }t=        ||      \  }}t5        |d      r9t        |j>                        }|s|jA                  dg |||      S tC        |      }n9|jD                  dd }|D ]  }t        |      s n |jA                  dg |||      S tG        d||| jH                        }||z  }g }| }tG        d||| jH                        } d}!|r|jK                  d      }"|"st        |"tL              rd}!ntN        |"v rtQ        |"      }"tG        |"||| jH                        }#||z   |#z   }$||t        |      z  z   }%|$|%kD  rt        |"tR              s|!st        |"tP              r|"jU                  ||||z   | z   dz
  |%| jH                        }&|&r|&|dd | xj*                  dz  c_        d}!t        |      r|tW        ||         }'|
s|"jX                  | z   dz   |'k  r|"jU                  ||d| z   dz
  |'| jH                        }&|&r|"g|dd d}!d}"|}$n|rt        |dd       }(t[        |(r|nd|||"|#|$|%|(r|nd|	xr |(
      }&|&r|&|dd | xj*                  dz  c_        d}!|
r9t        |      r.t[        |(r|nd|||"|#|#||(r|nd|	xr |(|
      }&|&r|"g|dd d}!|}$d}"|rlt        |"tL              s\|!sZtW        ||      })|#t]        ||)|)dz          kD  r:t_        |"||z   ||||| jH                        |dd | xj(                  dz  c_        d}!>|$|%k  st        |      r|!r`|"r|ja                  |"       |!rHd}!|$| j                   kD  r|$| _         |ja                  ||$z
  |f       g }| }|dz  }|tW        ||         }nH|$}nE|| j                   kD  r|| _         |ja                  ||z
  |f       |"g}|#}|dz  }|tW        ||         }|r|g k7  r,|| j                   kD  r|| _         |ja                  ||z
  |f       |jA                  d||||      S |dk  rGtc        d|j8                  |j:                  |jd                  |j8                  d|j8                  z  g       S |jf                   }*g }g }+|+j`                  },ti        ||      }-d}.|-	rc|-jK                  d      } |,|       |d   d   }|j:                  }|j8                  }|sdx}/x}}|}0t=        ||      \  }1}2|d   }#|d   d   }|#dkD  r	z   |#z   }$n}$|jj                  tl        k(  }3|}%|rl}4|D ][  }5|5jj                  tn        k(  s|5j>                  jq                  d      }6|6s5|4|6tG        d|5j:                  |5j8                        z  z  }4] |4|z  }4|%|4z  }%|3s|$|%kD  rt        |tr              st5        |d      st        |tt              r|jw                  |$|%      }&|&ra|&|-dd |-jy                  dt{        d|jA                  tl        d      dfg             |+jK                  d       | xj*                  dz  c_        t        |+      dkD  rp|tW        ||         }'|
s|jX                  dz   |'k  rL|jw                  |#|'      }&|&r7t{        d|jA                  tl        d      dfg      |g|-dd |+jK                  d       %|rt        |dd       }(t}        |(r|nd||$|%|(r|nd|	xr |(      }&|&ra|&|-dd |-jy                  dt{        d|jA                  tl        d      dfg             |+jK                  d       | xj*                  dz  c_        |
rit        |+      dkD  r[t}        |(r|nd||#||(r|nd|	xr |(|      }&|&r<t{        d|jA                  tl        d      dfg      |g|-dd |+jK                  d        |rt        |t~              stW        ||      })|#t]        ||)|)dz          kD  rst        ||z
  |z
  ||      |-dd |-jy                  dt{        d|jA                  tl        d      dfg             |+jK                  d       | xj(                  dz  c_        |$|%kD  xr /dkD  xs |3}7|7s|3r|d   d   }8|8r/dz  }/|j8                  }|rp|jj                  t        k(  rCt        t        |j                  j                  |      |j                  j                  |      \  }}n3t=        |j:                  |      \  }}nt=        |j:                  |      \  }}t]        0|      }0t]        1|      }1tW        2|      }2|s|jA                         }9|9g}|8|9_        nt        9|      srgt        |      dz
  }:|:dk\  rT||:   }5|:dz  }:|5jj                  tn        k(  r1|5j>                  j                  d      s|5xj>                  dz  c_        n|:dk\  rT|jA                         }9|ja                  |9       |8|9_        narJ|9j>                  j                  d      s|9xj>                  d|8z   z  c_        n+|9xj>                  |8z  c_        n|9xj>                  |8z  c_        t        |t              rtG        d||      nd}d};|dd D ]  }:|:d   jA                         }9|:d   |9_        |9j>                  rd};|ja                  |9       |9j8                  }|rp|9jj                  t        k(  rCt        t        |9j                  j                  |      |9j                  j                  |      \  }}n3t=        |9j:                  |      \  }}nt=        |9j:                  |      \  }}t]        |0|      }0t]        |1|      }1tW        |2|      }2 |8s|;r/dz  }/|$}nq|3r7|jA                         }9|ja                  |9       |*xr t        |tz               }<nd}<|| j                   kD  r|| _         |ja                  t        ||z
  /|<|012||.	             t        |+      dz
  }.|dz  }|tW        ||         }|3rg }t        |t              rtG        d||      nd}||z  }|#}d}/|jA                         }9|9j8                  }0|rp|9jj                  t        k(  rCt        t        |9j                  j                  |      |9j                  j                  |      \  }}n3t=        |9j:                  |0      \  }1}2nt=        |9j:                  |0      \  }1}2|9g}|d   d   |9_        |dd D ]  }:|:d   jA                         }9|:d   |9_        |ja                  |9       |9j8                  }|rp|9jj                  t        k(  rCt        t        |9j                  j                  |      |9j                  j                  |      \  }}n3t=        |9j:                  |      \  }}nt=        |9j:                  |      \  }}t]        |0|      }0t]        |1|      }1tW        |2|      }2 |-r	c|r<| j                   kD  r|| _         |ja                  tc        ||z
  /d|012||.	             |+| _        tc        d|      S )a^  
        Returns a broken line structure. There are two cases

        A) For the simple case of a single formatting input fragment the output is
            A fragment specifier with
                - kind = 0
                - fontName, fontSize, leading, textColor
                - lines=  A list of lines

                        Each line has two items.

                        1. unused width in points
                        2. word list

        B) When there is more than one input formatting fragment the output is
            A fragment specifier with
               - kind = 1
               - lines=  A list of fragments each having fields
                            - extraspace (needed for justified)
                            - fontSize
                            - words=word list
                                each word is itself a fragment with
                                various settings
            in addition frags becomes a frag word list

        This structure can be used to easily draw paragraphs with the various alignments.
        You can supply either a single width or a list of widths; the latter will have its
        last item repeated until necessary. A 2-element list is useful when there is a
        different first line indent; a longer list could be created to facilitate custom wraps
        around irregular objects.r   r2   hyphenationLangr%   )langNzLhyphenator should be a language spec or a callable unicode -->  pairs not %rr   r   r  r   r   rG   )r   r  r   r   r   r/   rH  r   )r  nobrF皙ɿ)r   r   r   r   r   r   r  r   )r  rG   r3   )	r  r  r%  rx   r   r   r   r   r  r  )J
_width_maxrI  r  r^   r   rs   r   rr   r"   r5   pyphenPypheniteratecallabler~  r  r  spaceShrinkagesplitLongWordsr   _splitLongWordCount_hyphenationsr3  r'  rl  r   r   rm  r   r   r   rG   r  rF   rx   r
   r  popr  r=  r  r  r  r   rT  r  r   r  r   r   r   justifyBreaksr  r  r  r~  rk   r3  rO  rg  r  r/  r  r1  r  r  r   r   r   r   r#   r  r-  r   )=rF  r   r  r  r  r  r   r  r  r  hyphenation2r  r  attemptHyphenationr  r   r   r  rl  r  r   r   r   r   r   rG   rx   rl   
spaceWidthdSpaceShrinkcLiner  hywforcedSplitwordr  rW  r  hswnMWhyOknmwnjlbvr  aFW_wordsr  r  r  r  r  r%  spaceShrinkwinsr  nTextr  r   nillbs=                                                                r>   r  zParagraph.breakLines  s   @ %t-E7yi  f	N1$	

U#4R8
Z '--/
&!'J!?!G!GJ!%Jj) !or|!|}}J--#77*1,----'P>P=PE"<=UVE899 4#5 	4??5;Q<d=}R1PQ 
2


E
AI'%(8*DPUVWPXYdHe/6aAzzHzzH.xAOFGq QVV}776'[c7dd!$KE
 eAQxe 776'[c7dd$S(HdmmLJ)*4LE&;Lc8Xt}}ECKyy|
4
 ;"#KT\"4=D'h$--P	'*4y@#l3u:&==H$jk.Jk!$w/"// (( ,z 9C ?$ F (+/==	 0 " ),E!AJ ..!3.*+K$ Z"+C	&,A"BC+

3t0Cc/I&*&7&7$,h$%GdN$'/3}}	 '8 '& $'26E!AJ23K+/D/;H+#*1VE#::,4ZT ((D)Xx6:N$7$@D%I ),E!AJ ..!3.*+K$)c%j"0t ((D)YPX6:N$7$@D%#IC  #.2Va
./+7'+%z$z/Jk!&3$S3s1u)=%>>)3Dj9PQZ[abjkstx  uB  uB  *CE!AJ 4494*+K$X%SZ;U\\$/"&'#doo5th&95%AB "(2{!#,S6-B#C'/#doo5tLL(\"95!AB!FE#,LaKF(Yv)>?Hq v by/<h5u=>77fWV^7__QY!ennu~~&+ooennUYZ_ZhZhUh"$& & +++EEB))C"52FCJJqMAbE!H::::455A5
\&G,<Xh,O)IzaD	aDGQ;+j89DH+H HHi/	#!",K# [99h.!#s!3B! +r+c"++bkk2Z/Z Z	[
  >1K+H Xh%6z!K?Xahijksat!!H-ll8X>*-F1QK"MM!M1aggY\^g>_`b=c:d,efFF2J ..!3.$ WQY"+C	&,A"BC+qwwt|S/@&'ll9c&B#&3@!QWWT]ceWEfgiDjAk3lmn2oF1QK$&FF2J$,+#*1VE#::0t$%hx6:N$7$@D%I *-F1QK"MM!M1aggY\^g>_`b=c:d,efFF2J ..!3.$)c"gai"44ZT())H:>E(;(De#MC  #/<aPY_aAbce@f=g/hij.kq "r
 (%j:.F!&3$S3s1u)=%>>*88J;N|;[\efl*mF1QK"MM!M1aggY\^g>_`b=c:d,efFF2J 4494$#H,41B (aDGEa1fa zzH!88W,-6xPX7YZ[ZbZbZiZijr-sNGF.>qzz(.SOFG*:1::h*O!'(3G #If 5I!$Z!8J GGI!"!&%a]% #E
1A"#Q$%*1X !Q#%99h#6+-77+;+;C+@(*3$) #$Q$ GGIQ!&# vvs3FFcEk1FFFeOF%GQRST[G\S(!CbcJBqrU =aDJJL t662Q#$::% xx01:8AHHOOT\;]^_^f^f^m^mnv1w2B1::h2W.>qzz(.SOFG"%gh"7$'	&$9	%(G%<
=  !R1#+L GGIQ#GJq,G(G##DOO3|T_LLXl5JVW25UW]fpz  FN,/"1 2 b'!)C aKF(Yv)>?H  " GQRST[G\S(!CbcJ#-n#<L#,LA	AjjG!88W,-6xPX7YZ[ZbZbZiZijr-sNGF4DQZZPW4X1Iz0@G0T-	:CEqT!WAFqrU =aDJJL tQ#$::% xx01:8AHHOOT\;]^_^f^f^m^mnv1w2B1::h2W.>qzz(.SOFG"%gh"7$'	&$9	%(G%<
=y Z /<Y8l3JVWbg*/'[eow|A BDJ!511r@   c           
         t        |t        t        f      s|g}| j                  }d| _        t        | j                  ||       | j                  }t        |      }|dk(  rt        |d   d      s|j                  s|d   }t        | d      r4t        | dd      r'|j                  d| j                  j                        S g }d}t        |d      r|j                  }ndj!                  t        |d	g             }t#        |||j$                  |j&                        }|D 	
cg c]
  \  }	}
|	|
gf }}	}
|j                  d||j&                  d
|j&                  z        S |dk  rGt)        d|j&                  |j$                  |j*                  g |j&                  d
|j&                  z        S t        | d      rt        | dd      r| j                  S t        | dt        |dd            }|dv}t-        |||      S c c}
}	w )zZInitially, the dumbest possible wrapping algorithm.
        Cannot handle font variations.r   r2   r   r  r  r  rG   r%   rx   r  )r   r  r   r   )r   r   r   r   r  r   r   r   r  )rI  r^   r  r   r   r3  r'  rl  rs   r   r   rr   r  r  r  rG   r]   r   r   r   r   r   r  )rF  r  r   rl  r  r   r  r  rG   r  r   wrappedLinesr   r  s                 r>   r  zParagraph.breakLinesCJKs	  s    )T%L1	{9

 	4??E9=

U19WU1Xh7aAtH%'$|A*FwwAT[[->->w??EFq vvwwwq45dIqzz1::FE
 <AAZb$R$LALA77ajjRVWXWaWaRa7bbQY!ennu~~&+ooRu~~^bchcqcq^qs s 4!gd<&B;;d=}R1PQ 
2
E9j99 Bs    G8c                 :    | j                   j                  ||      S r   )rF  r   )rF  rE  rY  s      r>   r   zParagraph.beginText	  s    yy""1a((r@   c           	      N   | j                   }| j                  }| j                  }|j                  }|j                  }t        | dt        |dd            }|j                  }|}	|rd}
t        ddd      }t        ddd      }n&t        |dd      }
t        |d	d      }|j                  }|s|r|
r|j                          |j                  }t        dd
      }|rK|
rI|j                  |       |j                  |
       d|d<   t        |dd      }|r|s|j                  }||d<   |r|j                  |       d|d<   t        |dd      }t!        |      \  }}}} |||z
  | | j"                  ||j$                  z   z
  |z   |z   | j&                  |z   |z   fi | |j)                          t+        |      }| j,                  }|dkD  rt        | ddg      }||t+        |      z
  |d   gz  z  }|j                          |j.                  }|j0                  |d   z   }|dz
  }t        | dd       }|j2                  }|j4                  dk(  }|xr | j6                  xs d}|j8                  dk(  r|t:        k(  rt<        }n7|t>        k(  rt@        }n'|tB        k(  rtD        }n|tF        k(  r|rtH        ntJ        }|} tL        r| j&                  | jN                  z
  }!n$| j&                  t        | d| jN                        z
  }!|rtQ        |||!|||      }|j                  | jR                         | jU                  |	|!      }"d| jV                  jX                  j[                         v |"_.        |dk(  r$t_        ||j`                  |jb                  z
        }n|dk(  r|j`                  |jb                  z
  }| j                  j4                  |"_2        |"jg                  | jh                  | jN                  |       |d   d   }#|d   d   }$|xr |dk(  }%|%r|rt+        |$      |kD  rd}% |"||#|$|%      }&| jj                  s| jl                  rqto        tp        |"      |"_8        ts               x|"_:        x}'|"_;        ty        |"||       |!|'_=        | |'_>        ||'_        ||'_        | jl                  |'_6        | jR                  |'_)        g |'_?        |&|z   }(|tF        k7  s|%rd}#| jj                  rt        d|(|#|"| jj                         | jl                  rt        d|(|#|"       t        d|      D ]  })||)   d   }#||)   d   }$|xr |)|k(  }%|%r|rt+        |$      |kD  rd}% ||"||)   |#|$|%      }&|&|z   }(|tF        k7  s|%rd}#| jj                  rt        |)|&|#|"| jj                         | jl                  st        |)|(|#|"        nt        d|      D ]<  })||)   d   }$|xr |)|k(  }%|%r|rt+        |$      |kD  rd}% ||"||)   ||)   d   |$|%       > n|r|D ]  }*|*j                  ddd   |*_C         |d   } tL        r| j&                  | jN                  z
  }!n$| j&                  t        | d| jN                        z
  }!t        }|r|}+tQ        |||!|||      }|t:        k(  rt        }nO|t>        k(  rt        }n?|tB        k(  rt        }n/|tF        k(  r|rt        nt        }nt        dt        |      z        | jU                  |	|!      }"d| jV                  jX                  j[                         v |"_.        ty        |"||       to        tp        |"      |"_8        | j                  j4                  |"_2        ts               x}'|"_;        d|'_)        d|'_        d|'_K        g |'_?        i |'_5        i |'_L        i |'_6        |j                  |'_        ||'_        d|"_M        d|"_N        |!|'_=        | |'_>        ||'_        ||'_O        | j"                  |'_P        d\  |"_Q        |"_R        |d   }*|xr |dk(  }%|%r|r|*j                  |kD  rd}% ||"||*|%       t        |"       t        d|      D ]>  })||)   }*|xr |)|k(  }%|%r|r|*j                  |kD  rd}% ||"||)   |*|%       t        |"       @ |j                  |"       |j)                          yy)zDraws a paragraph according to the given style.
        Returns the final y position at the bottom. Not safe for
        paragraphs without spaces e.g. Japanese; wrapping
        algorithm will go infinite.r   r%   r~   r2   r   g?borderWidthNborderColor)rq  rp  rp  borderRadiusradiusrq  borderPadding_offsetsr   r  Fr   r   )r(  rq   r   r   zbad align %s)NN)VrF  r   r  r  r   rr   r   r   r   	saveStaterh  r   r?  r=  	roundRectr   r   r   r"  r   restoreStaters   r'  	alignmentr0  justifyLastLiner   r  r   r   r|   r   r   r   r   r   r   r   r   r   r.  r   r   r  rU   re  rq   r   r   r   	directionr   r   r   r   r$   rI  r   r   r   r  r   r   r   rZ  rn  r  rx   r  r   r"  r(  r&  r~  r  r   r   r   r   r   r   r   r   r  ru  r$  ),rF  r  r&  r   r  r  r   r   r   r   ra  bcr  opr   brbptbprbpbbplbpnLinesr'  r  r!  rv   r8  noJustifyLastjllwcisRTLbRTLdplr   r   rh   r   rx   lastLinerl  r   ri   r   r   oos,                                               r>   r  zParagraph.drawPara	  sQ    

--d=}R1PQ %%
Bq1Bs3s#B}T2B}T2BB "BQa(Db%%b)##B'!"XU>!4e))B%'DN##B' Vq1B!.r!2Cc3zC

j1B1B&BCcI#Mc)#-  	 
 !U__
A:tJs3HH-~==HI**8A;6F(C '^E BBM))ENNE)E-T--6D{{A~'+C)+-C(*,C*,5:1@TC+ KK!**4E KK'!HQZZ*HHE(uZRVWF ##AKK0^^E51"0DNN4K4K4Q4Q4S"S%!'&--*FGG %'$mmFNN:G  $zz22 

1::qzz7;1Xa[a(6VQY#e*U*:"HRUH=::",Xb"9BK046BE6B#B6$BHBD$BH$BHFFBG#$;;BL$&BMz)B *,q"zz&q"b"ajjAvv}QB; #1f- @"1Xa[ %a#0#;QV##e*U2B%*H #R!b% J":-$j0H1b::*1eRQZZH66=BB#?@ #1f- L %a#0#;QV##e*U2B%*HR!eAhqk5(KL  % 6%)ZZ"%5
6!H+ KK!**4E KK'!HQZZ*HHE(B(uZSWXF',C)+.C(*-C*,6;2AVC$^d9o%EFF ^^E51"0DNN4K4K4Q4Q4S"SFE2("5#zz22"&&(R\!!  "]]
 *"  !,#zz,6)R\Qx(6VQY$..*>"HRx0b! q&) &A 8D,7CHEdnnU.B!&Xa[$9!"%& OOB! r@   c                 j   t        | dd      }|rg }|j                  }t        |      r6|D ]0  }|dd D ]  \  }} ||        t        |t              s) |d       2 n&|D ]!  }t        |d      s ||j                         # dj                  |      S |rt        | dd      }|t        |       }|S y)z`Convenience function for templates which want access
        to the raw text, without XML tags. rl  Nr2   r/   rG   r%   )	rr   r   rm  rI  r-  r   rG   r]   r  )	rF  identifyrl  plainsplains_appendr  r   rG   r  s	            r>   getPlainTextzParagraph.getPlainTextw
  s     WT*F"MMM&! +D&*12h ,
d%d+,!$w/%c*	+ " 1DtV,%dii01 776?"4t,D|DJTKr@   c                     t        | d      sJ d       | j                  j                  r| j                  fd}n| j                  fd}t	        t        || j                  j                              S )zConvenience function; tells you how wide each line
        actually is.  For justified styles, this will be
        the same as the wrap width; for others it might be
        useful for seeing if paragraphs will fit in spaces.r   z%Cannot call this method before wrap()c                      || j                   z
  S r   )r  r  rl   s     r>   r   z0Paragraph.getActualLineWidths0.<locals>.<lambda>
  s    a$//.A r@   c                     || d   z
  S r*  rY   r;  s     r>   r   z0Paragraph.getActualLineWidths0.<locals>.<lambda>
  s    a$q'k r@   )r   r  r   r   r^   rd   r  )rF  r  s     r>   getActualLineWidths0zParagraph.getActualLineWidths0
  s[    
 tW%N'NN%;;"&**AD"&**9DCT[[../00r@   c                    dg}|j                   }t        |       D ]  \  }}|rg |d|d   z         |dd  D ]H  } |dt        |d         z          |d|d   z          |d||j                  j                  fz         J  |d       o |d	|d   d
j                  d |dd  D              ||j                  j                  fz          |dz  }|d|z   j                  |      z   S )N[z    [%r,r   r2   z        (%s,)z        %r),z    ], #%d %sz    ]z[%r, %s], #%d %s, c              3   b   K   | ]'  }d |d   j                   j                  d|d   d ) yw)r  r   ,r2   )N)r  rU   )r  r  s     r>   r  z&Paragraph.dumpFrags.<locals>.<genexpr>
  s+     8vjlbeooF^F^_abc_d9e8vs   -/r/   r'   )r   r   r  r  rU   r]   )rl  r2  fullrf  rr  r   r   r  s           r>   	dumpFragszParagraph.dumpFrags
  s    EXXU# 		QCAa:!$%AB% CBbe45~1-.!AKK,@,@)AABC 7%1dii8vpqrsrtpu8v.wxyz{  {F  {F  {O  {O  )P  P  Q		Q 3JDF==###r@   )NNNr2   rB   r   r   )   F)rU   rV   rW   rX   r  r  r  r  r  r  r  rF   r  r  r  r   r  r8  r=  staticmethodrE  rY   r@   r>   r   r     sp    =|n.'"R;	;
Sj"\2|(:T)U"n2
1 $ $r@   r   __main__c                    t        dt        |       z         | j                  j                  }t        j
                  j                  }t        |      D ]  \  }}||   }t        |d      r|j                  }n|d   }t        |      } |d||t        t        |dd            fz         t        |      D ]   } |d|t        ||   d||         fz         " t                 y )	Nz$dumpParagraphLines(<Paragraph @ %d>)rx   r2   zline%d: %d(%s)
  r  Unknownz %d:'%s'rG   )printidr  r  sysstdoutwriter   r   rx   rs   r>  rr   r  )Pr  outwr  r   rx   nwordsrl   s           r>   dumpParagraphLinesrT  
  s    4r!u<=zz& 
	FAd8DtG$

QZF%6#gd;y6Y2Z([[\6] GZ758F58#D EEFGG
	r@   c           	          d| d   z  g}dD ]5  }t        | d   |      s|j                  |dt        | d   |             7 dj                  |      S )Nz'%s'r2   )	r   r   r   r   rK  striker   r   r%  r   =r@  )r   r   rr   r]   )rl   rf  rD  s      r>   fragDumprX  
  sX    QqTM?s 	8AqtAAgad1o67	8 yy|r@   c                 \   t        dt        |       | j                         fz         | j                  }t	        |      }t        |      D ]f  }t        d|||   j                  dj                  ||   j                  D cg c]   }|t        k7  s|dt        ||   |      " c}      fz         h t        j                  j                  }d}d}t        |d      D ]H  }||d   z  } |d|||d   fz         |dd  D ]  } |d	t        |      z          t                |dz  }J y c c}w )
Nz6dumpParagraphFrags(<Paragraph @ %d>) minWidth() = %.2fzfrag%d: '%s' %sr/   rW  r   ih  zfragword%d: cum=%3d size=%dr2   z (%s))rL  rM  r  rl  rs   r  rG   r]   r  rr   rN  rO  rP  r  rX  )	rQ  rl  r  r  rU  rR  cumr  rl   s	            r>   dumpParagraphFragsr[  
  sW   F"Q%QRQ[Q[Q]I^^_u:q 	NA#q%(--mrstmum~m~  BKhi  CD  FJ  CJQwW\]^W_`aObBc  BK  9L  'M  M  N	N zzuS) 	A1Q4KC.!S!A$?@qrU ,Wx{*+,GFA	 BKs   >D)D)c           	         t        t        j                  d   t              ri g j                  }fd}t        j                  D ]  } | ||              t        d       t        dj                  d t        j                               D                     t        t        ddj                  |j                        d       t        d       y y )	Nr   c                 "   g j                   }| dd  D ]?  }t        |d         }|vrt              |d   f|<    |d|   d   d|d   d       A d| j                  j                  d| d   ddj                  |j                        d	S )
Nr2   r   z(__frag_z__, rC  r  r  r@  z]),)r   rM  rs   r  rU   r]   __self__)rl   r^  rL  fid_Fs       r>   	_showWordz%dumpProcessedFrags.<locals>._showWord
  s    II12 ?AQqT(C"}#&r71Q4.3RWQZ!=>	?
 34++2F2F!diiXYXbXbNcddr@   zfrom reportlab.platypus.paragraph import _HSFrag, _SplitFragHS, _SplitFragHY, _SplitFrag, _getFragWords
from reportlab.platypus.paraparser import ParaFrag
from reportlab.lib.colors import Colorr'   c              3   &   K   | ]	  }d |z    yw)z__frag_%s__ = %rNrY   r  s     r>   r  z%dumpProcessedFrags.<locals>.<genexpr>
  s     Q/!3Qr  z=[
z  ]z%print(_getFragWords(processed_frags)))rI  r  rl  r^   r   rL  r]   rr  rS  processed_fragsr^  )rQ  r   _Sra  rL  r`  s        @r>   dumpProcessedFragsre  
  s    bhhqk$'BBe XX !9Q< !  X  Y$))QVBIIK=PQRS2;;9OPQ9:! (r@   )getSampleStyleSheetr   )cm4c                 4    d|v xs d|v xs t        |       |v S )Nall*)r>  )r   TESTSs     r>   flaggedrm  
  s"    ~@@Q5@r@   BodyTextdiscussiontext)parent	Helveticaa8  The <font name=courier color=green>CMYK</font> or subtractive method follows the way a printer
mixes three pigments (cyan, magenta, and yellow) to form colors.
Because mixing chemicals is more difficult than combining light there
is a fourth parameter for darkness.  For example a chemical
combination of the <font name=courier color=green>CMY</font> pigments generally never makes a perfect
black -- instead producing a muddy color -- so, to get black printers
don't use the <font name=courier color=green>CMY</font> pigments but use a direct black ink.  Because
<font name=courier color=green>CMYK</font> maps more directly to the way printer hardware works it may
be the case that &amp;| &amp; | colors specified in <font name=courier color=green>CMYK</font> will provide better fidelity
and better control when printed.
)g     |@gffffffE@i  z.Price<super><font color="red">*</font></super>Normal      ah  Dieses Kapitel bietet eine schnelle <b><font color=red>Programme :: starten</font></b>
<onDraw name=myIndex label="Programme :: starten">
<b><font color=red>Eingabeaufforderung :: (&gt;&gt;&gt;)</font></b>
<onDraw name=myIndex label="Eingabeaufforderung :: (&gt;&gt;&gt;)">
<b><font color=red>&gt;&gt;&gt; (Eingabeaufforderung)</font></b>
<onDraw name=myIndex label="&gt;&gt;&gt; (Eingabeaufforderung)">
Einf&#xfc;hrung in Python <b><font color=red>Python :: Einf&#xfc;hrung</font></b>
<onDraw name=myIndex label="Python :: Einf&#xfc;hrung">.
Das Ziel ist, die grundlegenden Eigenschaften von Python darzustellen, ohne
sich zu sehr in speziellen Regeln oder Details zu verstricken. Dazu behandelt
dieses Kapitel kurz die wesentlichen Konzepte wie Variablen, Ausdr&#xfc;cke,
Kontrollfluss, Funktionen sowie Ein- und Ausgabe. Es erhebt nicht den Anspruch,
umfassend zu sein.Codei  g33333Ӆ@rG  aD  Die eingebaute Funktion <font name=Courier>range(i, j [, stride])</font><onDraw name=myIndex label="eingebaute Funktionen::range()"><onDraw name=myIndex label="range() (Funktion)"><onDraw name=myIndex label="Funktionen::range()"> erzeugt eine Liste von Ganzzahlen und f&#xfc;llt sie mit Werten <font name=Courier>k</font>, f&#xfc;r die gilt: <font name=Courier>i &lt;= k &lt; j</font>. Man kann auch eine optionale Schrittweite angeben. Die eingebaute Funktion <font name=Courier>range()</font><onDraw name=myIndex label="eingebaute Funktionen::range()"><onDraw name=myIndex label="range() (Funktion)"><onDraw name=myIndex label="Funktionen::range()"> erf&#xfc;llt einen &#xe4;hnlichen Zweck, gibt aber eine unver&#xe4;nderliche Sequenz vom Typ <font name=Courier>RangeType</font><onDraw name=myIndex label="RangeType"> zur&#xfc;ck. Anstatt alle Werte in der Liste abzuspeichern, berechnet diese Liste ihre Werte, wann immer sie angefordert werden. Das ist sehr viel speicherschonender, wenn mit sehr langen Listen von Ganzzahlen gearbeitet wird. <font name=Courier>RangeType</font> kennt eine einzige Methode, <font name=Courier>s.tolist()</font><onDraw name=myIndex label="RangeType::tolist() (Methode)"><onDraw name=myIndex label="s.tolist() (Methode)"><onDraw name=myIndex label="Methoden::s.tolist()">, die seine Werte in eine Liste umwandelt.i  gP@zAfter initial wrapzAfter split wrap   z<para>    z <![CDATA[</font></b>& z < >]]></para>   )zqHere comes <FONT FACE="Helvetica" SIZE="14pt">Helvetica 14</FONT> with <STRONG>strong</STRONG> <EM>emphasis</EM>.zqHere comes <font face="Helvetica" size="14pt">Helvetica 14</font> with <Strong>strong</Strong> <em>emphasis</em>.zOHere comes <font face="Courier" size="3cm">Courier 3cm</font> and normal again.)r     zR<para align="CENTER" fontSize="24" leading="30"><b>Generated by:</b>Dilbert</para>   zU- bullet 0<br/>- bullet 1<br/>- bullet 2<br/>- bullet 3<br/>- bullet 4<br/>- bullet 5g       @	   a  Furthermore, the fundamental error of
regarding <img src="../docs/images/testimg.gif" width="3" height="7"/> functional notions as
categorial delimits a general
convention regarding the forms of the<br/>
grammar. I suggested that these results
would follow from the assumption thataaa)rp  align   
   u   a b cÂ d e f   a  This page tests out a number of attributes of the <b>paraStyle</b><onDraw name="_indexAdd" label="paraStyle"/> tag.
This paragraph is in a style we have called "style1". It should be a normal <onDraw name="_indexAdd" label="normal"/> paragraph, set in Courier 12 pt.
It should be a normal<onDraw name="_indexAdd" label="normal"/> paragraph, set in Courier (not bold).
It should be a normal<onDraw name="_indexAdd" label="normal"/> paragraph, set in Courier 12 pt.r  Courier)r   r   )r   g֣p=
w{@i'  r   )r/   rF  )Tr  )rc  )__all____version__rX   stringr   operatorr   unicodedatar	   reportlab.pdfbase.pdfmetricsr
   r   reportlab.platypus.paraparserr   r   r   r9   r   reportlab.platypus.flowablesr   reportlab.lib.colorsr   reportlab.lib.enumsr   r   r   r   reportlab.lib.geomutilsr   reportlab.lib.textsplitr   r   reportlab.lib.stylesr   copyr   reportlab.lib.abagr   reportlab.rl_configr   r   r   r   reportlab.lib.utilsr    r!   r"   reportlab.lib.rl_accelr#   retypesr$   r  r]   rL   compileescaperF   rE   r  r+  r?   r5   rO   rR   r   r   rb   r   rg   rm   r|   r   r   r   r   r   r   r   r   r   r  r   r  r   r"  r&  r(  r   r^   r-  r/  r1  r3  r5  r7  r9  r>  r;  rM  rO  rU  rV  rm  r~  r  r  r  rx  rp  r  r  r  Ir  r  r  _hy_lettersr=  _hy_shyr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r.  r3  r:  rI  rZ  rf  rj  rn  ru  r  r  r  r  r  r   rU   rT  rX  r[  re  rf  reportlab.lib.unitsrg  rN  argvrl  rm  
styleSheetBr   r   rG   rQ  r  r  r  rl   r   r  r:   rL  r  h0chrrs   rY   r@   r>   <module>r     s  	
 3     F ] ] 1 & H H 1 ? /  #  : : + 	  
ww  @ bjj)"))D/1288

8YRYYt_45<<r
	 		t 	9  &&"g(9$ 	iV4" ,$ ]W	d 		D 		 		* 	
	; 		:g 		< 	S  $&/t &/PZHl Z	, 	 

	(,q||
,b "**  R  TV  TX  TX  Y* @
bjjBCbjjDE

388U;v$>?@BJJsxxw{5(IJK bjj5"789>*@ ,HY2x 7(	 		J 		* 		; 		3 	#6c #6J	', 		
 	 3N@#&1f1(8t. RZZ23
C @/b#J/3 /@@O)bC^$ ^$@ Z $;( I&HHQRLEby% A %&J:A+A6EENqz
 D
1BffRn!1GGBrN 	AFF2bMq!B	
 qz
H*U]J^
_1ffRo!1qz D*V,
-1ffT6"!1qz X
D!
1ffRm!"1Q'1GGBrN1Q4 !		"R 2 B'1Q4 qzEHXcRUhW
D*V,
-1ffT6"!1qz 	"D j2!DAq!&&v&CAaq!	" qzg
D*V,
-1ffT6"!1qzi
D*X.
/1ffT6"!1GGD3c!f1Q4 1Q4 	!		$1Q4 1Q4  qz) DZ5IPZ[
\1ffQrT"Wf%!1r{%
DZ5IPZ[
\1ffQrT"Wf%!1r{c D~h	SUV
W1ffZ&!1 G YTFs   ^: :_