
    Q?h             	          S r SrSrSSKJr  SSKJr  SSKJr  SSK	J
r
JrJr  SSKJrJrJrJrJrJrJrJrJrJrJr  SS	KJr  SS
KJrJrJrJ r   SSK!J"r"  SSK#J$r$  SSK%J&r&J'r'J(r(J)r)  SSK*J+r+  SSK,J-r-J.r.  SSK/J0r0  SSK1J2r2  SSK3J4r4  SSK5J6r6J7r7J8r8J9r9  SSK:J;r;J<r<J=r=  SSK>J?r?  SSK@r@SSKAJBrB   SSKCrCSR                  S5      rE\@R                  " S\@R                  " \E5      -  5      R                  rI\@R                  " S\@R                  " \E5      -  5      R                  rKSS jrLSS jrHS rMS rNS  rO " S! S"\45      rP " S# S$\45      rQS% rRSS& jrSS' rTS( rUSS) jrVSS* jrWSS+ jrXSS, jrYSS- jrZS. r[S/ r\S0 r]S1r^S2r_S3 r`SS4 jraSS5 jrbSS6 jrcSS7 jrdSS8 jreSS9 jrfS: rg " S; S<\h5      ri " S= S>\h5      rj " S? S@\h5      rk " SA SB\k5      rl " SC SD\l5      rm " SE SF\k\i5      rn " SG SH\n5      ro " SI SJ\p5      rqSSK jrr " SL SM\h5      rs " SN SO\s\m5      rt " SP SQ\s\n5      ruSR rvSrwSSrxSTrySUrzSV r{SW r|SSX jr}SY r~SZ r\@R                  " S[\@GR                   5      rS\ rS] rS^rS_rS`r\@R                  " Sa5      r\@R                  " Sb5      r\@R                  " SR                  Sc\Sd45      5      r\@R                  " SR                  Sc\\Sd45      5      r\@R                  " SR                  Se\Sf45      5      rSg rSh rSi rSj r\94Sk jr " Sl Sm\p5      r " Sn So\5      r " Sp Sq\5      r " Sr Ss\5      r " St Su\p5      r " Sv Sw\p5      r " Sx Sy\\5      r " Sz S{\\5      r " S| S}\h5      r\94S~ jrSS jrS rS rS rS rS rS rS rS rS rS r\@R                  " S5      rS rS rS rS r " S S\p5      rS rSS jrS rSS jrS r " S S\"5      r\S:X  Ga  S rS rS rSS jrSSK/JrJ0r0  SSKJr  SSKr\GRt                  SSS r\/ :X  a  S/r\4S jr\" 5       r\S   r\0" S\S9rS\l        \" SS5      (       an  Sr\" \\5      r\" \5        Su  rr\GR                  \\5      u  rr\" \5        \R                  \\5      r\ H   r\GR                  \\5        \" \5        SrM"     \" ST5      (       a2  \" S\S   5      r\" \5        \GR                  SS5      u  rr\" \5        \" SU5      (       a4  Sr\" \\S   5      r\" \5        \GR                  SS5      u  rr\" \5        \" S5      (       a  SrSrSr\" \\5      r\" \5        \GR                  \\5      u  rr\" S\\5        \" \5        \R                  \\5      r\" \S   5        \S   GR                  \\5      u  rr\" S\\5        \" \S   5        \" S5      (       aI  S\" S5      < S\" S5      < S3r\" \\S   5      r\" \5        \GR                  SS5      u  rr\" \5        \" S5      (       a:  S H4  r\" \\S   SS9r\" \5        \GR                  SS5      u  rr\" \5        M6     \" S5      (       a4  Sr\" \\S   5      r\" \5        \GR                  SS5      u  rr\" \5        \" S5      (       a  Sr\" \\S   5      r\" \5        \GR                  SS5      u  rr\" \5        \R                  S\S-  5      r\" \" \5      5        \" \S   5        \" \S   5        \SS   GR                  SS5        \" \SS   5        \" \SS   5        \" S5      (       a@  Sr\" \\0" S\S   \)S95      r\" \5        \GR                  S\-  S-
  S5      u  rr\" \5        \" S5      (       a@  Sr\" \\0" S\S   \)S95      r\" \5        \GR                  S\-  S-
  S5      u  rr\" \5        \" S5      (       a5  Sr\" \\0" SSSS9S9r\" \5        \GR                  SS5      u  rr\" \5        \" S5      (       aB  SSKJr  SSK	Jr  \" \" SS5      5        \" \" SS5      5        Sr\" \\0" SSSS9S9r\" \5        ggg!   SrC GN= f))	ParagraphcleanBlockQuotedText	ParaLinesFragLinez3.5.20z%The standard paragraph implementation    )
whitespace)truth)category)stringWidthgetAscentDescentgetFont)
rtlSupportbidiTextbidiWordList	isBidiStrbidiStrWrap
isBidiListBidiListbidiListWrap	BidiIndexbidiFragWordinnerBidiStrWrap)shapeFragWord)
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                    [        U 5      (       au  U R                  5       n U (       aU  [        R                  " U 5      nU(       a.  [	        UR                  S5      5      XR                  S5         -  $ [        U SS9$ U(       a  U$ U $ )z/convert a strike/underline distance to a number      F)allowRelative)r/   stripr   matchfloatgroup_parser_num)svMapdefaultms       N/var/www/html/env/lib/python3.13/site-packages/reportlab/platypus/paragraph.py_usConvrL   O   si    QxxGGI""1%AQWWQZ(ggaj)999"1599NH    c                     [        U 5      (       a  U R                  S5      n Ub!  [        U5      (       a  UR                  S5      nUc  SU ;   a  [        U 5      OU R                  U5       Vs/ s H  o"PM     sn$ s  snf )Nutf8    )r.   decode_wsc_re_splitsplit)textdelimuwords      rK   rS   rS   ]   so    t}}T[[0dWU^^U\\&5IU7<}SWd 3]a]g]ghm]n np neE nppps   -A;c                 n    [        U 5      (       a  U R                  S5      n U R                  [        5      $ NrO   )r.   rQ   rB   _wscrT   s    rK   rB   rB   b   s'    t}}T[[0d::drM   c                 n    [        U 5      (       a  U R                  S5      n U R                  [        5      $ rX   )r.   rQ   lstriprY   rZ   s    rK   r\   r\   f   '    t}}T[[0d;;trM   c                 n    [        U 5      (       a  U R                  S5      n U R                  [        5      $ rX   )r.   rQ   rstriprY   rZ   s    rK   r_   r_   j   r]   rM   c                       \ rS rSrSrSrg)r   n   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____firstlineno____doc____static_attributes__rb   rM   rK   r   r   n       rM   r   c                       \ rS rSrSrSrg)r   y   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.
rb   Nrc   rb   rM   rK   r   r   y   rj   rM   r   c                 v    SR                  [        [        [        [	        [        U 5      5      5      5      5      $ )Nr<   )joinlistfilterr   rS   rB   Ls    rK   
_lineCleanrs      s%    88DeE!Ho6788rM   c                     [        [        [        [        [        [        [        U S5      5      5      5      5      nUR                  U5      $ )zThis is an internal utility which takes triple-
quoted text form within the document and returns
(hopefully) the paragraph the user intended originally.r4   )ro   rp   r   maprs   rS   rn   )rT   joinerrr   s      rK   r   r      s6     6%SU4->?@ABA;;q>rM   c                 @    US:  d  US:  a  U R                  U5        g g )Ngư>gư)setXPos)txdxs     rK   rx   rx      s    	$w"U(


2 rM   c                 f    [        U 5      (       a  U R                  S5      $ U R                  S5      $ )Ns    rP   )r.   count)ws    rK   
_nbspCountr~      s(    qzzww{##wwvrM   c                    US:  =(       d    [        U SS5      nSR                  U5      n[        X5        U(       d  [        U5      [	        U5      -   S-
  nUS:*  nU(       a  U R                  US5        O@U R                  U[        W5      -  5        U R                  US5        U R                  S5        [        X* 5        U$ N:0yEpreformattedFr<   r?   r   )getattrrn   rx   lenr~   _textOutsetWordSpacerD   )ry   offset
extraspacewordslastsimplerT   nSpacess           rK   _leftDrawParaLiner      s    AN5!AF88E?DBe*Z--a/!
D

U7^34
D
BwMrM   c                    US:  =(       d    [        U SS5      nSR                  U5      nU(       d  [        U5      [        U5      -   S-
  nUS:*  nU(       a&  USU-  -   n[	        X5        U R                  US5        OMUnU R                  U[        W5      -  5        [	        X5        U R                  US5        U R                  S5        [	        X* 5        U$ )Nr   r   Fr<   r?   r         ?r   rn   r   r~   rx   r   r   rD   	ry   r   r   r   r   r   rT   r   rJ   s	            rK   _centerDrawParaLiner      s    AN5!AF88E?De*Z--a/!S:%%
D

U7^34
D
BrNHrM   c                    US:  =(       d    [        U SS5      nSR                  U5      nU(       d  [        U5      [        U5      -   S-
  nUS:*  nU(       a1  X-   n[	        X5        U R                  SR                  U5      S5        OMUnU R                  U[        W5      -  5        [	        X5        U R                  US5        U R                  S5        [	        X* 5        U$ r   r   r   s	            rK   _rightDrawParaLiner      s    AN5!AF88E?De*Z--a/!
CHHUOA&

U7^34
D
BrNHrM   c                    [        X5        SR                  U5      n[        U SS5      =(       d*    SUs=:  =(       a    S:*  Os  =(       d    U=(       a    US:  nU(       d  [        U5      [	        U5      -   S-
  nUS:*  nU(       a  U R                  US5        O@U R                  U[        W5      -  5        U R                  US5        U R                  S5        [        X* 5        U$ )Nr<   r   Fr   :0yE>r?   r   )rx   rn   r   r   r~   r   r   rD   )ry   r   r   r   r   rT   r   r   s           rK   _justifyDrawParaLiner      s    BHHUODb.i53I3IT3IitOhXbchXhFe*Z--a/!
D

U7^34
D
BwMrM   c                 8    U(       a  [         O[        " XX#U5      $ N)r   r   )ry   r   r   r   r   s        rK   _justifyDrawParaLineRTLr      s    "&,@@"jaeffrM   c                     US:X  a  SnOlUS;   a  X -
  nOaUS:X  a  USU-  U -   S-  -
  nOLUS;   a	  USU-  -
  nO=US:X  a  SU-  nO1US	:X  a  S
U-  nO%[        US5      (       a  UR                  U5      nOUnX3U -   4$ )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       rK   	imgVRanger      s    	:~	!	!j	X#h,q.#--	'	'X%	W(l	U8m	%	&	&  *1u9rM   c                 J    [        U S5      (       a  U R                  U5      $ U $ )Nr   r   )vnvs     rK   imgNormVr      s&    q"##  $$rM   c                    U R                   n[        U5      (       a5  UnU R                  nU R                  nU R                  nU R
                  nSnOv[        USS5      n[        USU R                  5      n[        USU R                  5      n[        USU R                  5      n[        USU R
                  5      n[        USS5      nX#XEXg4$ )	Nr   rT   .fontNamer   	textColor	backColordy)endDotsr/   r   r   r   r   r   )styledotsrT   r   r   r   r   r   s           rK   _getDotsInfor      s    ==DT{{>>>>OO	OO	tF3'4
5>>:4
5>>:DU__=	DU__=	T$q!I88rM   g?gUUUUUU?c           
         [        USS 5      nUR                  nUR                  nUR                  nUR                  n	UR
                  n
UR                  nXR                  -  n U
S;   nU(       a_  U
S:X  a<  [        [        U-  UR                  5      n[        [        U-  UR                  * 5      nOUR                  nUR                  * nX-   nUR                  U:w  a  UR                  U5        U(       ap  UR                  nUbQ  UW-
  nUR                   U:w  a  XUR                   -
  -  n[#        UU-
  5      S:  a  UnUR%                  X5        Xl        UW-
  Ul        Xl        [        USS5      nSnUR&                  n/ n/ nUR(                  nUR*                  n[-        U5       GH  u  nn[/        US5      (       Ga	  UR0                  nUR2                  nUS	:X  a  UR4                  nUc  UR6                  R8                  n[;        UR<                  UR>                  5      n[;        UR@                  U5      n[C        UURD                  U5      u  nn U UU-  -   n!URF                  RI                  URJ                  U!UU-   UUS
S9  U U-  n U!U-  n![M        UU!UR                  -
  5        OURN                  n"US:X  a   URF                  RQ                  U"XU-   5        O[        URF                  U"S 5      n#U#(       d  [S        SU< SU"< S35      e[U        XXUR                  S9URF                  l+         U#" URF                  U[        USS 5      5        URF                  ?+UUS   L a`  URX                  (       d:  UR[                  UR6                  R\                  UR6                  R8                  5        UR_                  SS5        GM  GM"  U UU-  -   n!U!n$UR8                  n%UR`                  n&URb                  n'US:  a(  U!U(       a  SO[e        UUS-
     Rf                  U5      -
  n$URX                  UR4                  4UR\                  U%4:w  a  URi                  UR\                  U%5        UR`                  U&:w  a  U&Ul0        URk                  U&5        URb                  U':w  a  U'Ul1        URm                  U'5        UUR(                  :w  a=  [o        U5      n([o        UR(                  5      n)U)U(-
  n*U(U)-
  n+U+ H  n,UU,   U$4UU,'   M     UURp                  :w  aF  [o        U5      n([o        URp                  5      n)U)U(-
  n-U(U)-
  n.U. H  n,UU,   U$4UU,'   U" U,S5        M     URf                  n/UR_                  U/UUS   L 5        UUR(                  :w  a   W* H  n,U,U%U&U!4U%4UU,'   M     UR(                  nU(       a   U H  n,UU,   u  n0n1U%U1:  d  M  U0U%4UU,'   M     U'SU%-  -
  n2U'U%-   n3UURp                  :w  a(  W- H  n,U,U 4U2U34UU,'   U" U,S5        M     URp                  nU(       a<  U H6  n,UU,   u  n0n4n5U2U4:  d  U3U5:  d  M  U0[s        U2U45      [        U3U55      4UU,'   M8     [        USS 5      n6U6(       a   URt                  (       d  U6Ul:        U!Ul;        OURt                  (       a  U6(       d:  URx                  R{                  URv                  U$URt                  45        S Ul:        OtURt                  URt                  :w  d  UR`                  URt                  :w  a@  URx                  R{                  URv                  U$URt                  45        U6Ul:        U!Ul;        URF                  R}                  U/URX                  UR4                  5      n7U U7-  n UU/R                  S5      [        U/5      -   -  nGM
     U US-
  U-  -   n!U(       av  UR6                  R                  (       a[  UR6                  R                  S:w  a  US:w  a  [        U U!UR                  Xq5        O"US:w  a  UR                  n8[        U8U8U	U8-
  XqSS9  U(       a  U H  n,UU,   U!4UU,'   M     U(       a  U H  n,UU,   U!4UU,'   U" U,S5        M     URt                  (       a2  URx                  R{                  URv                  U!URt                  45        UR                  U	:w  a  [M        XUR                  -
  5        g g ! URF                  ?+f = f)N_linkRecordc                      g r   rb   )argskwdss     rK   <lambda>_putFragLine.<locals>.<lambda>  s    rM   )minmaxr   r   
_wordSpacer   cbDefnimgauto)maskanchorzMissing z callback attribute '')ry   cur_xcur_yleadingxslabelr2   r?   endg?startr   r<   RTLrightleftF)r   )Fr   r   	XtraStater   _x0autoLeadingr   
leftIndentr   _56ascent_16descent_leading
setLeading_olb	_oleadingabssetTextOriginr   us_lineslinks	enumerater   r   kind	_fontsizer   r   r   width	paraWidthheightr   valign_canvas	drawImageimagerx   namebookmarkHorizontalAttributeErrordict_curr_tx_info	_fontnamesetFontr   r   r   rise_trailingSpaceLengthrT   _setFontsetFillColorsetRisesetlinkr   r   backColor_x
backColorsappendr
   r|   r~   r   wordWrap_do_dots_fragmaxWidth	_x_offset)9r   ry   liner   pKind
linkRecordr   r   r   x0r   r   dalr   r   olbxcywsr   r   ALLLr   r   ifr   r   txfsr}   r   iy0iy1cur_x_sr   funcend_xr   r   r   SNSnLLeLLlnALeALrT   l0fsmaxnlonhilohibgtxtlenr   s9                                                            rK   _putFragLiner$    s   M*DEJ??L	BHHE	B..KjjG	]]E

&C
WT[[1F#g+t||m4G[[F||mG.	{{G
g
gg?f*C||W$2<<//3u9~d"  * '/	L	#BGJJE	B	B{{HHHE% 11XXXF;;DU{||<88,,DV\\",,7V]]40#AfmmD9C'"*,

$$V\\'%)AaV$T
17266>*{{>JJ11$u7]K"2::d48D,UYZ^-_``-1R%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A"*1+e"3HQK QVV|G[1f"fA$Qx~E!Hq'  66DKKQ%)^,QZZA#$Xi"@"IHQK ZZA (IB~&((l 
 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 !Z WQYN"G  88e#g~eGDMM"@F]LLE%U
BG	A"1+w.HQK  
AQx(E!Hq  
||
r~~wEG	vvrzbff9 I JJ4s   6c((c6c                    [        UR                  5      u  pgppUR                  R                  XgU5      nX-   U::  Ga*  UR                  U:w  d  UR
                  U:w  a  UR                  Xx5        U(       a  U[        USUR                  5      -  nUR                  SUR                  U-   5        [        XAU -
  5        [        X!-
  U-  5      n[        XBX-  -
  5        UR                  U	:w  a  UR                  U	5        U
(       a  UR                  R!                  XU
45        UR#                  X-  S5        U(       a*  UR                  UR                  UR                  U-
  5        g g g )N_dotsOffsetXr   r?   )r   r   r   r
   r   r   r   r   r   r   r   rx   intr   r   r   r   r   )r   r  r  r   ry   r   rT   r   r   r   r   r   r#  ns                 rK   r   r     s   4@4J1D(YZZ##DH=F~x<<!R\\8%;JJx)WRrvv>>
288B;'5=!!6)*fh&'<<"OOI&bmm**E9+EF
AF1rrxx{32  rM   c           
         Xl         [        X5        UR                  nUS:  =(       d    [        USS5      nU(       da  UR                  [        UR                   Vs/ s H+  n[        US5      (       a  M  [        UR                  5      PM-     sn5      -   S-
  nUS:*  nU(       a  [        XX#S5        O;U R                  U[        W5      -  5        [        XX#S5        U R                  S5        [        X* 5        g s  snf )Nr   r   Fr   r?   r   r   )r  rx   
extraSpacer   	wordCountsumr   r   r~   rT   r$  r   rD   ry   r   r  r   r*  r   r}   r   s           rK   _leftDrawParaLineXr.    s    LBJCnU!CF..$**%h*QT[\]^fTg&8j&8*%h!iijkk!VV4

U7^34VV4
Bw &is   C<
5C<
c           
      d   Xl         XR                  -   U l         UR                  nUS:  =(       d    [	        USS5      nU(       da  UR
                  [        UR                   Vs/ s H+  n[        US5      (       a  M  [        UR                  5      PM-     sn5      -   S-
  nUS:*  nU(       a+  USUR                  -  -   n[        X5        [        XX#S5        O=UnU R                  U[        W5      -  5        [        XX#S5        U R                  S5        [        X* 5        U ?g s  snf ! U ?f = f)	Nr   r   Fr   r?   r   r   center)r  r   r&  r*  r   r+  r,  r   r   r~   rT   rx   r$  r   rD   	ry   r   r  r   r*  r   r}   r   rJ   s	            rK   _centerDrawParaLineXr2    s   LvvoBO__
E!GWT.%GnnSdjj)ljX_`abjXk*<*QVV*<j)l%mmnooGaZFs4??**ABM84AOOJw78H5OOA2O *m Os%   A
D+ %D&
>D&
BD+ &D+ +D/c           
      "   Xl         UR                  nUS:  =(       d    [        USS5      nU(       da  UR                  [	        UR
                   Vs/ s H+  n[        US5      (       a  M  [        UR                  5      PM-     sn5      -   S-
  nUS:*  nU(       a'  XR                  -   n[        X5        [        XX#S5        O=UnU R                  U[        W5      -  5        [        XX#S5        U R                  S5        [        X* 5        g s  snf )Nr   r   Fr   r?   r   r   )r  r*  r   r+  r,  r   r   r~   rT   rx   r$  r   rD   r1  s	            rK   _rightDrawParaLineXr4    s    LJCnU!CF..$**%h*QT[\]^fTg&8j&8*%h!iijkk!??"Q4w/

U7^34QD0
BrN &is   D
*D
c           
      J   Xl         [        X5        UR                  nUR                  =(       d*    SUs=:  =(       a    S:*  Os  =(       d    U=(       a    US:  nU(       da  UR                  [        UR                   Vs/ s H+  n[        US5      (       a  M  [        UR                  5      PM-     sn5      -   S-
  nUS:*  nU(       d<  U R                  U[        W5      -  5        [        XX#S5        U R                  S5        O[        XX#S5        [        X* 5        g s  snf )Nr   r   r   r?   r   justify)r  rx   r*  	lineBreakr+  r,  r   r   r~   rT   r   rD   r$  r-  s           rK   _justifyDrawParaLineXr8    s    LBJ^^Vj 6 6$ 6VD<UZPUEUF..$**%h*QT[\]^fTg&8j&8*%h!iijkk!

U7^34VY7
VY7Bw &is    D 
D 
c                 6    U(       a  [         O[        " XX#5      $ r   )r4  r8  )ry   r   r  r   s       rK   _justifyDrawParaLineXRTLr:    s    #'-BBRQU\\rM   c                     [        U 5      nU(       a?  UR                  R                  UR                  5       UR                  UR
                  5      $ S$ Nr   )_wsc_end_searchr   r
   rE   r   r   )rT   ry   r
  s      rK   r   r     s;    		BMO2::!!"((*bllBLLIVUVVrM   c                       \ rS rSrSrSrg)_HSFragi  z!a frag that's followed by a spacerb   Nrc   rb   rM   rK   r?  r?    s    +rM   r?  c                       \ rS rSrSrSrg)_InjectedFragi  zHa frag that's injected in breaklines and must be removed on reprocessingrb   Nrc   rb   rM   rK   rA  rA    s    RrM   rA  c                       \ rS rSrSrSrg)
_SplitFragi#  za split fragrb   Nrc   rb   rM   rK   rC  rC  #  s    rM   rC  c                       \ rS rSrSrSrg)_SplitFragHi'  z.a split frag that's the head part of the splitrb   Nrc   rb   rM   rK   rE  rE  '  s    8rM   rE  c                       \ rS rSrSrSrg)_SplitFragHYi,  z:a head split frag that needs '-' removing before rejoiningrb   Nrc   rb   rM   rK   rG  rG  ,  s    DrM   rG  c                       \ rS rSrSrSrg)_SplitFragHSi0  z'a split frag that's followed by a spacerb   Nrc   rb   rM   rK   rI  rI  0      1rM   rI  c                       \ rS rSrSrSrg)_SplitFragLLi4  z<a frag that is forced to end in - because of paragraph splitrb   Nrc   rb   rM   rK   rL  rL  4  s    FrM   rL  c                       \ rS rSrSS jrSrg)_SHYIndexedStri8  Nc                     U(       dZ  UR                  [        5      n/ nUR                  nSnU H  nU[        U5      -  nU" U5        M     SR	                  U5      nUS S n[
        R                  X5      nX&l        U$ )Nr   r2   r   )rS   _shyr   r   rn   str__new___shyIndices)clsuXaxrG   selfs          rK   rR  _SHYIndexedStr.__new__9  sv    AAAASV!  
A#2A{{3!rM   )rS  r   )rd   re   rf   rg   rR  ri   rb   rM   rK   rN  rN  8  s    rM   rN  c                    U R                  S5      n[        U [        5      (       ai  U R                  SS nUS   nU(       aC  [	        US5      (       a.  UR                  UR                   Vs/ s H  oUU-   PM	     sn5        X!-  n[        X#5      $ U(       aN  X!-  n[	        US5      (       a9  WR                  UR                   Vs/ s H  oUW-   PM	     sn5        [        X#5      $ U$ s  snf s  snf )zDrejoin two parts of an original _SHYIndexedStr or str that was split-Nr   rS  )r_   
isinstancerN  rS  r   extend)rG   ssrU  rV  rX  _s         rK   _shyUnsplitra  H  s    	A!N##MM!bEr-((r~~6~!A#~67GAa""		2m$$HH2>>2>ac>23!!&&H 7 3s   ,C'C,c                       \ rS rSrSrS rSrg)_SHYWordiZ  zIa fragword containing soft hyphens some of its strings are _SHYIndexedStrc           
      4  ^ U S   nSU l         US:X  a  / $ S nSnX-
  =pgS n[        U SS  5       H  u  n	u  mn
U4S jn[        U
[        5      (       ac  U" S5      nXl-   n[        U
R                  5       H3  u  pU
S U XS  nnX" U5      -   nUc  UnUU:  nU(       a    OXUUUUU4nM5     Xk" U
5      -  nOXk" U
5      -  nXb:  nU(       d  M  Uc  M    O   Ub  X-
  OSU l         U(       d  / $ Uu  pnnnnnU	S-   nU U   u  mn
U
R                  n[        US-   US US-    5      nU S U TU4/-   nUU-
  US'   UUS   -
  U-   /U(       d  / O(T[        UUUS-   S   Vs/ s H  nUU-
  PM
     sn5      4/-   U US-   S  -   n[        U5      [        U5      4$ s  snf )Nr   Fr?   c                 F   > [        U TR                  TR                  5      $ r   r
   r   r   )rG   r  s    rK   r   %_SHYWord.shyphenate.<locals>.<lambda>e  s    ;q!**ajjArM   r\  )_fswwr   r]  rN  rS  _SplitFragSHY
_SHYWordHS)rY  newWidthr  wwpossibleexceeded	baseWidth
baseWidth0fswwr  tsWshyLenbwjrX  r   r   leftwi1rV  leftsrr   r`  Rr  s                            @rK   
shyphenate_SHYWord.shyphenate\  s   !W
q5)!).	 ab*GAeqAB!N++C'%amm4DA"#BQ%2%Dr$xKE|ET$x/H QtUFBH 5 RU"	RU"	$/xD,e# +$ )-(8T_j
.6+aeVqSBx1MMtCx$1Q30"I!E#z!!!WV^bQ~eZ[\]^_\_\`ZaLbZaUVQqSZaLb7c4d3efimnpqrnrnsittQA.. Mcs   F)ri  N)rd   re   rf   rg   rh   r|  ri   rb   rM   rK   rc  rc  Z  s
    S$/rM   rc  c                       \ rS rSrSrSrg)rj  i  zOa head split frag that requires removal of a hyphen at the end before rejoiningrb   Nrc   rb   rM   rK   rj  rj    s    YrM   rj  c                       \ rS rSrSrSrg)rk  i  z=a fragword containing soft hyphens that's followed by a spacerb   Nrc   rb   rM   rK   rk  rk        GrM   rk  c                 J     [        U S   S   [        [        45      $ !    g= f)Nr   F)r]  rD   r'  )fragss    rK   _processed_fragsr    s*    %(1+uSk22s    "r?   r@      c                    S/nUR                   nSnSnU  H  nX5S   -  n[        U[        5      nUSS  Hr  nUu  pU(       a<  XuS   L a5  U[        U	S   UR                  UR
                  5      S-   -  n[        U	5      n	XHL a  U[        US   S   U	5      4US'   Mg  U" X45        UnMt     M     X1S'   [        W5      " U5      $ )z!F should be a list of _SplitFragsr   Nr?   r   r   )r   r]  rG  r
   r   r   ra  _reconstructSplitFrags)
Fr{  aRwLenpstyr  rmhyffstyrs  s
             rK   _rejoinSplitFragWordsr    s    	
A	
BDD!!L)AB%BFCeAbE#,,s||DtKKN{k!B%(156"C7   aD!!$Q''rM   c                     [        U [        5      (       a!  [        U [        5      (       a  [        $ [        $ [        U [        5      (       a"  [        U [        5      (       a  [        $ [         $ [
        $ r   )r]  rc  r?  rk  rL  ro   )r  s    rK   r  r    sa    CMaPXCYCY:a00Z qh qOYZ[\cOdOd:a#=#=<qCJqjnqrM   c                 *
  ^ U4S jn/ nUR                   n/ n[        U 5      (       a  UR                   n U  H  n[        U[        5      (       a  M  U" U5        [        U[        5      (       a7  U" U5        [        U[
        5      (       a  U" [        U5      5        USS2	 Ml  Mn  U(       a  U" [        U5      5        USS2	 U" U5        M     U(       a  U" [        U5      5        GOSnSnSnSnU  GH  nUR                  nUS:w  Ga0  [        Ul        U(       a  [!        U5      nU(       d  M=  Sn[#        U5      nUS   [$        ;   d  U(       d}  U(       a7  UR'                  SU5        U" U(       a  [)        U5      OU5        Un/ nSnSnSnOU=(       a    [        US   [
        5      nU(       d  UR'                  SS5        O	U(       d  M  USS  H  n[*        U;   a  [-        U5      nSnUR                  UU45        U[        UUR                  UR                  5      -  nUR'                  SU5        U" U(       d  [        U[(        5      (       a  [/        U5      O
[        U5      5        / nSnSnM     SnUS   n[*        U;   a  [-        U5      nSnUR                  UU45        U[        UUR                  UR                  5      -  nU(       ac  US   [$        ;   aS  UR'                  SU5        U" U(       d  [        U[(        5      (       a  [)        U5      O
[        U5      5        / nSnSnGMA  GMD  GMG  [1        US5      (       Ga   UR2                  n[5        US	S5      nU(       a  [1        US
5      (       a  TUl        UR9                  T5      nU(       a4  UR'                  SU5        U" U(       a  [        U5      OU5        / nSnSnSn[:        Ul        U" UUS4/5        SnGM  [<        Ul        U(       d8  U(       a1  [        US   [
        5      (       a  US   R                  US45        GMC  UR                  US45        GMY  [1        US5      (       d  GMm  U(       a"  UR'                  SU5        U" U5        / nSnSnSn[>        Ul        U" SUS4/5        SnGM     U(       aA  UR'                  SU5        U" U(       d  [        U[(        5      (       a  [)        U5      OU5        U(       d  U (       a  U S   n[        Ul        SUS4//nU$ )zgiven 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                    > U S   n[        U[        5      (       a.  UR                  T:w  a  TUl        UR                  T5      nXS'   g g g r<  )r]  r   _normalizerr   )r  r}   r  s     rK   _rescaleFrag#_getFragWords.<locals>._rescaleFrag  sM    aDa}}h& (%%h/! ' rM   TNr   r   Fr2   r   r   r   r7  ) r   r  r]  rA  rC  r?  r  rG  r
   r   r   ra  r  rT   _FK_TEXT_fkindr\   rS   r   insertrc  rP  rN  rk  r   r   r   r  r   _FK_IMG
_FK_APPEND	_FK_BREAK)r  r  r  r{  r  WaWr  f0Wlenr  lfrs  tshangingSpacer(  hangingStrip
shyIndicesrT   r  whsr}   cbs    `                     rK   _getFragWordsr    sN    	A	
B
AXX a..Qa
++qE!!W--034aD . 034aDqE  (+,d 
A66DRx#!$<D#(L$K7j(1*8A;!<*%*
',=JquW$=2 3BAqy*1-%)
HHaUOQ

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

;;DH
2HHQqMjJq4J4Jx{PWXYPZ[A!&JA 34 8$$XXBwq)q!23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 l HHQqMjJq,B,Bx{JaAAHQrFA
 HrM   c              #   D  #    U SS   H  u  p[        US5      (       a  U[        UR                  SS5      U4v   M4  U(       aQ  [        U5      (       a  UR	                  S5      nU H(  nU[        X1R                  UR                  5      U4v   M*     M  USU4v   M     g 7f)Nr?   r   r   r   rO   )r   r   r   r.   rQ   r
   r   r   )r}   r  rG   cs       rK   _fragWordIterr  l  s     !"1XWQXXga0!33qzzHHV$Qzz1::>AA  Q'M s   BB c                    / n[        U5      S-
  nU[        XSS-   5         n/ nSnSn	Sn
U S   S   n[        U 5       H  u  pnX-   nX:  =(       a$    [        U
=(       d    U
(       + =(       a    X:*  5      nXLd  U(       a  UR	                  5       n[        US5      (       a  Xl        UR                  X45        U(       a>  [        U
/U-   5      nUR                  U5        US-  nUnU[        XSS-   5         n/ nUnSn
Sn	UnX-  n
X-  n	UnM     UR                  X45        [        U [        5      (       a  [        O[        " U
/U-   5      nUR                  U5        U$ )ag  given a frag word, w, as returned by getFragWords
split it into frag words that fit in lines of length
maxWidth the available length on the currebt line
maxWidths[lineno+1] the maxWidth for the next line
.....
maxWidths[lineno+n]

return the new word list which is either
_SplitFrag....._SPlitFrag or
_SplitFrag....._SplitFragHS if the word is hanging space.
r?   r   r2   rT   )r   r   r  boolcloner   rT   r   rC  r]  r?  rI  rE  )r}   r  	maxWidthslinenor{  	maxlinenomaxWidthNextr  	lineWidthfragText	wordWidthr  gcwr  newLineWidthtooLongs                    rK   _splitFragWordr  x  se    	AIq IS!845L
AIHI	!QA"Q |'cD1b9}?aQSQa,c:	Aq  !HHa\"	{1}-!'(Yax)@A!	HA	 	+ #, HHa\#Ag..K	?)QOAHHQKHrM   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              #      #    SnU R                  U5      (       a!  X2-  nU S S n U R                  U5      (       a  M!  Sn U R                  X$5      nUS:  a  g US-  nXS U -   XS  U-   4v   M/  7f)Nr2   r   r@   r   r?   )endswithfind)urischemeslashtailr  s        rK   _slash_partsr    s     D
,,u

#2h ,,u

 	
A
HHUQ3	Q!WnSWT\))	 s
   8A.2A.c                 V   [        U 5      (       a  U R                  S5      n [        R                  U 5      nU(       d  g UR	                  S5      nU [        U5      S  n U(       d  SU ;  a  SOSnU(       a  U (       a  X 4/O/ [        [        XU5      5      -   nUR                  5         U$ )NrO   r?   /\)	r.   rQ   uri_patrC   rE   r   ro   r  reverse)r  rJ   r  r  r{  s        rK   _uri_split_pairsr    s    s||3::f-ScATWWQZF
c&kl
CCsNT 
"s6-d<SX;Y6ZZAIIKHrM   u[   A-Za-zÀ-ÖØ-öø-ɏẀ-ẅḀ-ỿА-яḂḃḊḋḞḟṀṁṖṗṠṡṪṫẛỲỳ   ­u   -­u   ^['"([{¿‘‚“„]+u   []'")}?!.,;:’‛”‟]+$z^[z]+$([z])c
                 ^   [        U5      (       a  UR                  S5      n[        R                  U5      n
U
(       a   U
R	                  S5      nU[        U5      S  nOSn[        U[        5      (       a  US   S:X  a  SnUS S nO?[        R                  U5      n
U
(       a!  U
R	                  S5      nUS [        U5      *  nOSn[        U5      U	:  a  g X2-
  n[        U5      nUbR  X$:  d  U(       aE  USU-
  U-  ::  a9  U H3  u  nnX-   nUU-   n[        XU5      nUU-   nUU::  d  M(  SSUUU-
  UU4s  $    g [        R                  U5      nU (       a  [        R                  U5      (       d   [        R                  U5      (       az  SU;  at  [        SXV5      nU " U5       H\  u  nnX-   n[        R                  US   5      (       d  SnUnOSnSnUU-   n[        XU5      nUU-   U-   nUU::  d  MQ  UUUUU-
  UU4s  $    [        U5      nUS:  a  U(       a  SU;  a  [        R                  U5      (       ap  [!        [#        SUS5      5       HU  nUSR%                  US U 5      -   nSR%                  UUS  5      U-   n[        XU5      nUU-   nUU::  d  MJ  SSUUU-
  UU4s  $    g g g g g )	NrO   r   r2   r   r\  r?   r  r@   )r.   rQ   _hy_pfx_patrC   rE   r   r]  _SplitWordLL_hy_sfx_patsearchr  r
   _hy_shy_patrS   _hy_letters_pat_hy_shy_letters_patreversedrangern   )
hyphenatorrG   rm  rl  r  r   r   uriWasteReduceembeddedHyphenationhymwlrJ   pfxsfxw0r{  r   rs  hwtwHhylenjcjclenr(  r  s                            rK   
_hyGenPairr    s   qzzqxx'1!Aggajc#hiL!L!!aeSjcrFq!''!*C*CH9AC
1v~v	BA};>bQ~5Ex4O.O1EG H5"Wx<a2b51,,  	!A--a005H5N5Nq5Q5QVX`aVaC2a=CAaA$$QrU++CAQ1BBB8|%2b51,, !  	AA!t#!8K8Q8QRS8T8T%!A,'Abggaen$A!"$AQ1BBB8|!Br"uQq(( ( 9U#trM   c                    S=p/ nUR                   n/ nUR                  n[        S[        U 5      5       H  nX   u  pUR                  S:w  a    g[        US5      (       a  [        UR                  SS5      (       a    gU	(       d  MS  [        U	5      (       a  U	R                  S5      n	U" U	5        U" [        U	5      Xq4/-  5        U[        U	5      -  nM     SR                  U5      [        U5      4$ )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   r?   Nr   r   rO   r2   )r^  r   r  r   r   r   r   r   r.   rQ   rn   tuple)
FWccplenrV  eXUaUr  r  rs  s
             rK   _fragWordSplitRepr    s     MB
A	
B
A	
B1SWu6619T1X7188GA#>#>(1::188F+q
1
3q6A6(?
c!f  771:eAhrM   c                 .    [        S U  5       5      /U -   $ )zF are the fragsc              3   f   #    U  H'  u  p[        X!R                  UR                  5      v   M)     g 7fr   rg  ).0rG   rU  s      rK   	<genexpr>#_rebuildFragWord.<locals>.<genexpr>,  s$     C#!Qzz!**55s   /1)r,  )r  s    rK   _rebuildFragWordr  *  s    CCDEaGGrM   c           	         [        U5      nU(       d  g Uu  p[        U5      (       a  UR                  S5      n[        R	                  U5      n	U	(       a   U	R                  S5      n
U[        U
5      S  nOSn
[        U[        5      (       a  US   S   S   S:X  a  SnUS S nO?[        R                  U5      n	U	(       a!  U	R                  S5      nUS [        U5      *  nOSn[        U5      U:  a  g US   nX,-
  n[        U5      nUb  X:  d  U(       a  USU-
  U-  ::  a  U H  u  nnX-   n[        U5      nUU   u  nnUSU nUU   u  nnUS UU-
   nU(       a  UR                  UU45        UUU-
  S  nUUS-   S  nU(       a  UR                  SUU45        [        U5      nXS   -   U::  d  M  SU[        U5      4s  $    g [        R!                  U5      nU (       Ga  ["        R	                  U5      (       d   [$        R	                  U5      (       a  SU;  a  U " U5       H  u  nnX-   n[        U5      nUU   u  nnUSU nUU   u  nnUS UU-
   n[        R	                  US   5      (       d  SnOSnU(       d  U(       a  UR                  UUU-   45        UUU-
  S  nUUS-   S  nU(       a  UR                  SUU45        [        U5      nXS   -   U::  d  M  UU[        U5      4s  $    [        U5      nUS:  a  U(       a  SU;  a  [$        R	                  U5      (       a  ['        [)        SUS5      5       H  n[        U
SR+                  US U 5      -   5      nUU   u  nnUSU nUU   u  nnUS UU-
   nU(       a  UR                  UU45        UUU-
  S  nUUS-   S  nU(       a  UR                  SUU45        [        U5      nXS   -   U::  d  M  SU[        U5      4s  $    g g g g g )	NrO   r   r2   r   r?   r\  r  r@   )r  r.   rQ   r  rC   rE   r   r]  rL  r  r  r  r   r  r  r  rS   r  r  r  r  rn   )r  r  rl  r  r  r  r  rV  rG   rJ   r  r  rm  r  r{  r   rs  posfxr  FLffxsfxlsfxrFRr  r  r(  r  s                                rK   _hyGenFragsPairr  .  s   "AfDAqzzqxx'1!Aggajc#hiL"\""r"vay}c'9crFq!''!*C*CH9AC
1v~v	AB	B 	A};>bQ~5Ex4O.O1E!f3B"Xb6S7CF|C:.3r67|1Y1c$Z0$R(d7H$a 0 444  	!A,,Q//4G4M4Ma4P4PUW_`U`a=CAa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' !. 	AA!t#!8K8Q8QRS8T8T%!A,'AcBGGAbqEN*+CsVFBAbB"vHCwB<DRYYDz*s2vw<DBqDEBRYYq#d, $AA$w !,R000 ( 9U#trM   c                 <   US   nUS:X  a  / $ [        U5      S:X  a  US   u  p[        U[        5      (       a  [        U	5      n	[	        X	XrX8R
                  UR                  XEU5
      n
U
(       aR  U
u  ppnnU(       a  [        O[        " X-   XU-   4/5      [        U[        5      (       a  [        O[        " XU4/5      /$  g [        XX#XEU5      n
U
(       aE  U
u  pnU(       a  [        O[        " U5      [        U[        5      (       a  [        O[        " U5      /$ g )Nr   r@   r?   )r   r]  rL  r  r  r   r   rG  rE  r?  rI  rC  r  )r  r  rl  r  r  r  r  rm  r  rG   r{  r  r  r  r  r   rs  s                    rK   _hyphenateFragWordr    s9   	AB	1uRi
2wz!ub&&QAzbHjj!**Ucy~&'#Brq!%'\[828QtH:MN`jkmnu`v`vP\  }G  QG  JL  PQ  MR  IS  PT  U  U   JH~chiHB1%'\[8!<jY[\cNdNdljt>tvw=xyyrM   c                       \ rS rSrSrSrg)
_SplitWordi  z[simple str word split into _SplitWord instances
the function _splitWord does the splitting
rb   Nrc   rb   rM   rK   r  r    s     	rM   r  c                       \ rS rSrSrSrg)_SplitWordEndi  z/the remainder of a str word that has been splitrb   Nrc   rb   rM   rK   r  r    s    9rM   r  c                       \ rS rSrSrSrg)_SplitWordHi  z'hyphenation head if no hyphen was addedrb   Nrc   rb   rM   rK   r   r     rJ  rM   r   c                       \ rS rSrSrSrg)_SplitWordHYi  z6head part of a hyphenation word pair with added hyphenrb   Nrc   rb   rM   rK   r  r    s    @rM   r  c                       \ rS rSrSrSrg)r  i  z=a word that's forced to end with - because of paragraph splitrb   Nrc   rb   rM   rK   r  r    r  rM   r  c                   (    \ rS rSrSrS rSS jrSrg)_SHYStri  z for simple soft hyphenated wordsc                 F   UR                  [        5      n[        U5      S:  a`  [        R	                  U SR                  U5      5      nS/nUR                  nU H  nU" US   [        U5      -   5        M     USS Ul        U$ [        R	                  X5      n/ Ul        U$ )Nr?   r2   r   r   )rS   rP  r   rQ  rR  rn   r   __sp__)rT  rG   r  rY  spaspr_  s          rK   rR  _SHYStr.__new__  s    GGDMq6!8;;sBGGAJ/DB))CBrF3r7N# Qr(DK  ;;s&DDKrM   c           	         SU l         [        [        [        U R                  5      5      5       H  u  pgU SU n[        XX%5      n	U(       d  Xl         X9-   n
X::  d  M.  U R                  US [        U 5      /-   n[        [        U5      S-
  5       Vs/ s H  oX   XS-       PM     nn[        US-   5      nU R                  SU Ul        U[        [        R                  U5      5      /s  $    gs  snf )zW
baseWidth = currentWidth + spaceWidth + hyphenWidth
limWidth = maxWidth + spaceShrink
re  Nr?   r\  )ri  r  ro   r   r  r
   r   r  r  rP  rn   )rY  r   r   rp  limWidthencodingr  r  swswwswnwTrw  r  s                 rK   __shysplit___SHYStr.__shysplit__  s    
 $DJ!$y'=">? #2Y!"Cs* #AB3t9+5A49#a&(ODOqad1qS6*OAD CB $BQBIwtyy|455 @ Es   C0)r  ri  NrO   )rd   re   rf   rg   rh   rR  r  ri   rb   rM   rK   r  r    s    *6rM   r  c                       \ rS rSrSrg)_SHYSplitHYi  rb   Nrd   re   rf   rg   ri   rb   rM   rK   r  r        rM   r  c                       \ rS rSrSrg)	_SHYSpliti  rb   Nr  rb   rM   rK   r  r    r  rM   r  c                       \ rS rSrSrSrg)r   i  z4lines/words value for a bidiSorted kind==0 paragraphrb   Nrc   rb   rM   rK   r   r     s    >rM   r   c
                 .   US:X  a  / $ [        XXEXaX'X5
      n
U
(       aw  U
u  ppnn[        U5      (       a:  [        U(       a  [        O[        " X-   5      U5      [        [        U5      U5      /$ U(       a  [        O[        " X-   5      [        U5      /$ g r<  )r  r   r   r  r   r  )r  r   r   r}   rm  rl  r  r  r  r  r{  hyr  r  r  r   rs  s                    rK   _hyphenateWordr    s    	1uRi:"H]pxA"#21aQ<<!Dad KANa 035 5 &(\[8!$?a@PQQ 	rM   c                 :   / nUR                   n[        U5      S-
  n	Sn
U[        X5         nU[        XS-   5         n[        U 5      (       a  U R	                  U5      n [        U 5      nU  Hx  n[        XXV5      nX-   nUU:  aY  U
(       d  U
(       dK  X::  aF  U" U(       a  [        [        U
5      U 5      O
[        U
5      5        US-  nUnU[        X5         nUnSn
X-  n
UnMz     U" U(       a  [        [        U
5      U 5      5        U$ [        U
5      5        U$ )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
r?   r2   )
r   r   r   r.   rQ   r   r
   r   r  r  )r}   r  r  r  r   r   r  r{  r  r  wordTextr  r  bidir  r  r  s                    rK   
_splitWordr"    s    	A	
BIq IHY./HS!845LqzzHHXQ<DH6 | hxBDTd{:h/2
8@TUaKF#H Y!67HLH 	  {=*1-SH <I;RSHrM   c                    [        U S   [        5      (       a  U S   nU SS  H  n[        X5      nM     U$ [        U S   [        5      (       ad  [        U S   [        5      (       a  [
        O[        nSR                  S U  5       5      n[        U S   [        5      (       a  U$ [        US-   5      $ SR                  U 5      $ )z-R can be a list of pure _SplitWord or _SHYStrr   Nr   r2   c              3   Z   #    U  H!  n[        U[        5      (       a  US S OUv   M#     g 7fNr   )r]  r  r  r`  s     rK   r  $_rejoinSplitWords.<locals>.<genexpr>  s'     L!Qz!L99QsVq@!s   )+r\  )r]  r  ra  r  r  rQ  rn   )r{  rr`  cfrG   s        rK   _rejoinSplitWordsr*    s    !A$waD1AA A 	AaD	&	&qum44S,GGL!LMqum44qM,qu:MMwwqzrM   c                 2    [        [        U 5      U S   5      $ r<  )r   r*  )r{  s    rK   _BidiStrWrapRejoinSplitWordsr,    s    (+AaD11rM   c              #   V  #    / nUR                   n [
        nU R                  X  Hl  nUS    H`  n[        U[        5      (       a.  U" U5        [        U[        5      (       a  U" U5      v   US S 2	 MF  U(       a  U" U5      v   US S 2	 Uv   Mb     Mn     U(       a  U" U5      v   g g 7f)Nr?   )r   r]  linesr   r,  r*  r  r  )blParar   stopr{  r  jfuncr  r}   s           rK   _yieldBLParaWordsr2  "  s     
A	
B "\\%%1A!J''1a..(N!(N!G  & 	Ah 	s   B'B)c                    U R                  5       nS H   n[        X45      (       d  M  [        X45        M"     [        [	        XU5      5      Ul        [        U R                  [        5      (       a4  UR
                  R                  S S9  [        UR
                  5      Ul        [        UR
                  S   [        5      (       a@  [        UR
                  S   [        5      (       a  [        O[        UR
                  S   l        U/$ )N)r.  r   rT   c                     U R                   $ r   )	__bidiL__r`  s    rK   r   %_split_blParaSimple.<locals>.<lambda>?  s    Q[[rM   keyr   )r  r   delattrro   r2  r   r]  r.  r   sortr  r  r  r  	__class__)r/  r   r0  r  rW  s        rK   _split_blParaSimpler=  9  s    A&1<< '$V$78AG&,,x((	01177#!''"+l++-7G-L-L	R^3JrM   c                 :   / nU R                   X nU GH  nUR                   H  nUR                  U5        M     XTS   Ld  M1  [        U5      S-
  nUS:  an  [	        X7   S5      (       a[  [        X7   R                  SS5      (       d=  US-  owS:  a3  [	        X7   S5      (       a   [        X7   R                  SS5      (       d  M=  US:  d  M  X7   nUR                  (       d	  SUl        M  UR                  S   S:w  d  M  U=R                  S-  sl        GM     U$ )Nr   r?   r   r   r   r<   )r.  r   r   r   r   r   r   rT   )	r/  r   r0  r  r.  r  r}   r  r  s	            rK   _split_blParaHardr?  E  s    
ALL$EAHHQK "IAqAQ$71411'!$++gVW:X:XZ[_`Z`Z[Q$71411'!$++gVW:X:X!tDvvqvVVBZ_affmff  HrM   c                    UR                   nU(       d  UR                   S:w  Ga;  US:H  n[        U5      (       a  UnU=(       a	    [        U;   n	U	(       a  USUR                  [        5       n[	        XR
                  UR                  5      n
U	(       a+  U
S[	        [        UR
                  UR                  5      -  -  n
OSn
U H  nUR                  nU=(       a	    [        U;   n	U	(       aC  USUR                  [        5       nU
S[	        [        UR                  UR                  5      -  -  n
U
[	        XR                  UR                  5      -  n
U	(       d  M    O   OSn
US:X  a  U
S-  n
U[        USS5      -  nU(       d   U R                  UR                  U
-
  U5      nO4US   nXR                  -   UR                  U
-   -
  nU R                  X5      nUR                  UR
                  UR                  5        UR                  [        USUR                   5      5        [        U5      (       a  UR#                  U5        OeU H_  nUR                  UR                  UR                  5        UR                  UR                   5        UR#                  UR                  5        Ma     U R%                  U5        U(       d8  UR'                  5       UR                  S	-  -   n[)        XUR*                  -
  5      nU$ )
z:draw a bullet text could be a simple string or a frag listr   numericNr   r   r   bulletOffsetYbulletColor333333?)bulletAnchorr/   r)   indexr
   bulletFontNamebulletFontSizerT   r   r   r   	beginTextbulletIndentrightIndentr   r   r   textOutdrawTextgetXr   r   )canvasr   r   
bulletTextr   rtlrE  rA  rs  qbulletWidthr  tx2r   bulletStart	bulletEnds                   rK   _drawBulletrW  T  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{1jj!**EE1   X{c1{	WU?1--Eu11+=eDA---u/A/A+/MN{2KK$$e&:&:;WU=ABZJAKK

AJJ/Q[[)KK 
 OOC HHJ!5!5!;;	V(8(889MrM   c                    U (       a  [        U 5      (       a!  [        XR                  UR                  5      nO9SnU  H1  nU[        UR                  UR
                  UR                  5      -  nM3     UR                  U-   SUR                  -  -   nUR                  S:X  a  UR                  UR                  -   nOUR                  UR                  -   nXV:  a  US==   XV-
  -  ss'   ggg)z@work out bullet width and adjust maxWidths[0] if neccessary
    r   rD  r   N)r/   r
   rG  rH  rT   r   r   rJ  r   rK  firstLineIndentr   )rP  r   r  rS  r  	bulletLenindents          rK   _handleBulletWidthr\    s     %z3G3GI]I]^K K{1661::qzzJJ  &&4sU=Q=Q7QQ	>>5 &&u'<'<<F%%e&;&;;FaLY/0L  rM   c                    / nSnX   nSn[        U 5      nS=px XV:  aX  X:  a  W	U   S:X  a  US-  oU:  a
  X   S:X  a  M  X:X  a)  US-  nXV:X  a  O&SnX   n
U
R                  n	[        U	5      nOOXV:  a  MX  X:X  a  gSn/ nSnSnX:  a  W	R                  SU5      nUS:  a  X:H    [        XU W
R                  U
R
                  5      nUU-  nX:  a>  U/ :w  a8  UU-
  nUR                  U   S:X  a  US-
  nUS-
  nUR                  U   S:X  a  M  O;US:  a  UnUS   U
L a  XS'   OXU4nUR                  U5        X:X  a  US-  nX:  a  M  GM5  )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   r?   r<   )NNNr@   N)r   rT   r  r
   r   r   r   )r  widthsr.  lineNummaxWr  r  limr   rT   r  r  r  cLenr   rw  r}   s                    rK   splitLines0rc    s    EGoDA%jAC
c)US 0%1*%)S 0zQ4Hvv$i c :u #i		#e$AsAFDqM!**QZZ@AAIDyT2XAvffSk3&'C%aiG ffSk3& sAtqyA$QKAvQ% i+ rM   c                     U R                   nUR                  nXX:w  a  UR                  U5        UR                  n	Xi:w  a  UR	                  U5        UR                  XX45        g r   )r   
_lineWidthsetLineWidth_strokeColorObjsetStrokeColorr  )
ry   x1y1x2y2nlwnsccanvolwoscs
             rK   _do_linerr    sS    ::D
//C
x#


C
xC IIbbrM   c           	         UR                   nUR                  nUR                  XR                  -  -
  nUR                  nUR
                  n	UR                  n
[        XU	S9nUR                  nXR                  R                  SR                  UR                   R                  U    S   5      UR                  U	5      -   U-   nU H  u  pnnnnnnUS:H  n[        UXR                  S9n[        UUSS9nUU-   nU(       d  U* nUU-   [        US:X  a  U(       a  SOSOUU5      -   nU(       d  U
nUS	:  d  Mr  UR                  UUUUUU5        UU-  nUS-  nUS	:  a  M(  M     g )
N)rr   r  r  r<   r?   	underlinerI   r2   -0.125*L0.25*Lr   )r   r   r   r   r  r   r   r   _defaultLineWidthr   r
   rn   r.  r   rL   rr  )r  ri  r
  ry   r   r   r   y0r  fstcvaluesdwrk  r(  kr  r}   or(  rJ   r  rt  lwlgr   ys                              rK   _do_under_liner    sR   	BHHE	AmmO	#B
A	
B	
BBb!F			B	jj$$SXXbll.@.@.CA.F%GWYZ	Z]_	_B#Aa!Aa{N	Qv&:&:;Qva(Us"FW2Ij8STU[\\b!cKKAr1b!,GAFA c $rM   z^[a-zA-Z][-+a-zA-Z0-9]+$c                 T   U(       d  g UR                  S5      (       a   U R                  R                  SUSS  USS9  g UR                  SS5      n[	        U5      S:H  =(       a    US   R                  5       =(       d    SnUS:X  a   U R                  R                  SUS   USS9  g [        R                  U5      (       aL  UR                  5       S	:H  =(       a    S
=(       d    SnUS
:X  a  US   nU R                  R                  XSUS9  g U R                  R                  XSSS9  g )N#r2   r?   )relative:r@   r   documentpdfGoToRURI)r  r   )	
startswithr   linkRectrS   r   lower
_scheme_rerC   linkURL)ry   r   rectpartsr  r   s         rK   _doLinkr    s    s


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

3q!UQ358>>#39r:JJE!HdQ?f%%&27;eDW}U1XdJJtADAJJtAEBrM   c           
         UR                   nUR                  R                  nUR                  X-  -
  UR                  R
                  S-  -
  nSR                  UR                  U    S   5      nUR                  R                  XsR                  UR                  5      nUR                   H  u  p[        X:XX-   Xe-   45        M     g )Ng       @r<   r?   )r   r   r   r   r  r   rn   r.  r   r
   r   r   r   r  )r  t_offr
  ry   r   r   r  rT   textlenr(  r   s              rK   _do_link_liner    s    	BhhG
19rtt}}S00A88BHHQKN#Djj$$T<<FG775U]AI>? rM   c                    U R                   nUR                  nUR                  nUR                  R                  nUR
                  nUR                  nUS:X  a  [        USU-  5      nOUS:X  a  SU-  nUR                  (       af  X&-   nXt-
  nUR                   H@  u  pnU R                  R                  U5        U R                  R                  XX-
  USSS9  MB     / Ul        S Ul        [        UR                  R                  5       5       H!  u  u  u  u  ppp[!        XXU-   XU-   45        M#     0 Ul        UR"                  (       a  U R$                  n['        US9n[        UR"                  R                  5       5       H  u  u  u  u  nnnnnnnnnnn	nn
US:H  nUUS	'   UUS
'   [)        UUU R$                  S9n[)        UUSS9nUU-   nU(       d  U* nUU-   [)        US:w  a  UO
U(       a  SOSU5      -   nU(       d  UnUS:  d  M  U R+                  U	UU
UUU5        UU-  nUS-  nUS:  a  M(  M     0 Ul        U=R                  U-  sl        g )Nr   r   r   r   r?   )strokefillrq   rt  r  r  ru  r2   rv  rw  )r   r   r  r   r   r   r   r   r   r   r   r  r   sortedr   r|  r  r   rx  r   rL   rr  ) ry   r   ry  r  r   r   r   ylydescri  rk  r  r(  r   r   r!  r}  r|  r~  r}   r  r(  rJ   r  rz  r{  r  rt  r  r  r   r  s                                    rK   _do_post_textr    s6   	B	B
AhhG..KzzHEgc(l+	e	h,	}}]}}GB!JJ##A&JJOOBRU7!OC % $*288??+<$= (12"2"ubR%01 %>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# 8T HHHrM   c                    UR                   nU(       Gag  UR                  5       nUS:X  a  [        R                  nOMUS:X  a  [        R                  nO6US:X  a  [        R                  nOUS:X  a  g [        SUR                   -  5      e[        U 5      nUS:X  a  U" U S   R                  5      U S   l        g U[        R                  L a  SnU  H|  nUR                  nU(       d  M  UR                  S	5      (       d  U(       a	  U" U5      nO'UR                  S	5      nUS:  a  US U U" XgS  5      -   nUR                  S	5      nXel        M~     g U  H%  nUR                  nU(       d  M  U" U5      Ul        M'     g g )
N	lowercase	uppercase
capitalizenonez+ParaStyle.textTransform value %r is invalidr?   r   Tr<   )textTransformr  rQ  uppertitle
ValueErrorr   rT   r  r  r  )r  r   ttr(  pbr  rU  r  s           rK   textTransformFragsr  A  s>   			B	88:{?B_B,BZJUM`M``aaJa4uQx}}-E!HM399_BFF(<<$$1AsA!tbqE"QrU)OZZ_  FF(A = 
rM   c                   B    \ rS rSrSrS r\" S 5      r\" S 5      rSr	g)cjkUif  z4simple class to hold the frag corresponding to a strc                     [         R                  X5      nX$l        [        US5      (       a  [	        UR
                  SS5      nXTl        U$ [        XR                  UR                  5      Ul        U$ )Nr   r   r   )
rQ  rR  _fragr   r   r   _widthr
   r   r   )rT  valuefragr  rY  r}   s         rK   rR  cjkU.__new__h  s]    {{3%
4!!GA.AK  &eMM$--HDKrM   c                     U R                   $ r   )r  rY  s    rK   r   cjkU.<lambda>q  s    rM   c                     U R                   $ r   )r  r  s    rK   r   r  r  s    $++rM   )r  r  N)
rd   re   rf   rg   rh   rR  propertyr  r   ri   rb   rM   rK   r  r  f  s"    > +,D-.ErM   r  c                    / n/ n[        5       nS=n	=pU  GH#  nUR                  nUR                  nU(       ah  [        USS 5      n[        USS5      (       a/  [	        [        UR                  U5      UR                  U5      u  nnO3[        UR                  U5      u  nnO[        UR                  U5      u  nn[        X5      n	[        U
U5      n
[        UU5      n[        X5      (       d;  UR                  5       nSR                  U5      Ul        UR!                  U5        / nUnUR!                  U5        GM&     U(       a7  UR                  5       nSR                  U5      Ul        UR!                  U5        [        SUSUSS  XXX$S9
$ )Nr   r   r   r2   r?   )
r   r*  r+  r   r   r   r   r  currentWidthr7  )r   r  r   r   r   r   r   r   r   r   r   r   r0   r  rn   rT   r   )r  r  	widthUsedr*  r7  
calcBoundsr   CWr  maxSize	maxAscent
minDescentrU  r  r   r   r   r   s                     rK   makeCJKParaLiner  t  se   E	B	B'((G(iFF::Qx-Fvga(("+HV]]8,LV]][c"d"21::h"G.qzz(COFGg'	&)	G,
~~xxzBggbkBGLLBB
		!) * 
88:''"+Rj159V]  xB  bk  @  @rM   c                   ^ / mU  H  nUR                   n[        U5      (       a  UR                  U5      nU(       a.  TR                  U Vs/ s H  n[	        XdU5      PM     sn5        Me  TR                  [	        XTU5      5        M     / nS=n=pUS   n[        T5      nX:  Ga  TU   nUS-  nUR                  n[        US5      (       a  Xl	        UR                  U5      nX-  n	[        UR                  S5      nX[        -   :  =(       a    U	S:  =(       d    UnU(       a  X-
  nU(       d  [        U5      S:  a  X-   S-	  n[        US-
  US5       Hy  nTU   nU(       a  [        U5      S:X  d  [        U5      S:  d  M/  US-   nUU:  d  M<  US-   nU[!        U4S j[        UU5       5       5      -  nTU   R                  nTU   nUn  O   U["        ;  a  XS-   :  a
  US-  nUU-  nUR                  [%        TX XUX5      5         U[        U5         nUn
Sn	X:  a  GM  U	S:  a#  UR                  [%        TU
S	 XX-
  S
U5      5        [)        SUS9$ s  snf ! [&         a    US   n NUf = f)z@This attempts to be wordSplit for frags using the dumb algorithmr   r?   r   r7  i 0  r   Zsc              3   B   >#    U  H  nTU   R                   v   M     g 7fr   )r   )r  iir  s     rK   r  cjkFragSplit.<locals>.<genexpr>  s     1S
"!B%++
s   NFr   r.  )rT   r.   rQ   r^  r  r   r   r   r   r  r   r  r*   ordr  r	   r,  r%   r  
IndexErrorr   )r  r  r  r  r  rT   rs  r.  r  r  lineStartPosr  nUrU  r}   r7  endLiner*  
limitCheckrw  ujr~  r  s                         @rK   cjkFragSplitr    s   
Avv4==;;x(DHH$7$Qd1x($78HHT$*+  E#$$A$	|H	QB
$aD	QGG1&''$M!!(+A	AFF;/	--=)A+K)!-Jq6&= #/.1!4J"1Q3z"5qT(2,"4B !!A s$%aC *c1SaPQ
1S.S S
$%aDJJ$%aD$% % 6& ,,>1A FA!OJLL<):8jYbno)$SZ0 LIu $z 1}_Q|}%5hI[\ablmn!%((O 8z  )$R=)s   I
I" "I43I4c                 "   UR                   U l        [        USS5      U l        [        USS5      U l        [        USS5      =(       d    SU l        [        USS5      U l        [        USS5      U l        [        USS5      =(       d    S	U l        g )
NunderlineColorr2   underlineWidthunderlineOffsetz-0.125fstrikeColorstrikeWidthstrikeOffsetz0.25f)	re  rx  r   _underlineColor_underlineWidth_underlineOffset_strikeColor_strikeWidth_strikeOffset)ry   rO  r   s      rK   _setTXLinePropsr    s    !,,B '7;B '7;B!%(9"=JBeM"5BOeM"5BOu^B7B7BrM   c                     [        S5      n/ R                  nU  H<  nSnUSS  H&  u  pg[        US5      (       a  UnO	U(       d  UnXW-  nM(     U" U5        M>     [        UR                  USS9$ )z0return the Visual order for a list of frag wordsi   r2   r?   Nr   T	directionwx)chrr   r   r   __self__)r   r  pur  r}   rT   r  rG   s           rK   fragWordsVisualOrderr    st    	VB
		AabEDAq""ID  	
$  

Y$??rM   c                     U R                   $ r   )	__bidiV__r6  s    rK   r   r     s    akkrM   c                       \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rSS jrSS jrS r\SS j5       rSrg)r   i  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           	          Uc	  [        SS9nXPl        X`l        U R                  XU=(       d    [	        USS 5      U[
        5        g )NparagraphImplicitDefaultStyle)r   rP  )r&   caseSensitiver  _setupr   r   )rY  rT   r   rP  r  r  r  s          rK   __init__Paragraph.__init__>  s?    ="(GHE* D!Owu\$/OQVXlmrM   c                    U R                   R                  nUS-   /n[        U R                  R	                  5       5      nU Hv  nUR                  [        U5      R                  SS5      R                  SS5      < S[        [        X5      5      R                  SS5      R                  SS5      < 35        Mx     UR                  SU-   5        SR                  U5      $ )N(r4   r<     z: z) #)
r<  rd   ro   __dict__keysr   reprreplacer   rn   )rY  r(  rr   r  r~  s        rK   __repr__Paragraph.__repr__F  s    NN##sUGDMM&&()AHHas!;!C!CD!MdSZ[_ScNdNlNlmqsvNwNN  AE  FI  OJ  K  L 	qyy|rM   c                 R   Uc  U" U5      n[        5       nU R                  Ul        UR                  X5      u  p$nUc7  [        SUR                  S   < SUS [        S[        U5      5       < S35      e[        XB5        U(       a  UnXl        X@l	        X l
        X0l        SU l        g )Nzxml parser error (r   z) in paragraph beginning
'   r   )r   r  parser  errorsr   r   r  rT   r  r   rP  debug)rY  rT   r   rP  r  cleaner_parserbulletTextFragss           rK   r  Paragraph._setupO  s    
 =4=D lG$($6$6G!,3MM$,E)E/} ~~a(.@s2c$i/@)A"C D Du+_
 	

$
rM   c           	         U[         :  a  gXl        U R                  nUR                  nXUR                  -   -
  UR
                  -
  nX-
  UR
                  -
  nXV/U l        UR                  S:X  a  U R                  U R                  5      nOU R                  U R                  5      nXpl
        [        U S[        USS5      5      nUR                  n	UR                  S:X  a  US;  a  Sn
US:X  a:  UR                   H)  nU
[        UR                   UR"                  -
  U	5      -  n
M+     OUS	:X  a/  UR                   H  nXR                   UR"                  -
  -  n
M      O[%        S
U-  5      e['        UR                  5      U	-  n
O`US:X  a#  [        XR                   UR"                  -
  5      n	OUS	:X  a  UR                   UR"                  -
  n	['        UR                  5      U	-  n
Xl        U R                  U
4$ )N)r   re  CJKr   r2   r?   r2   offr   r   r   invalid autoLeading value %r)r*   r   r   r   rY  rK  _wrapWidthsr   breakLinesCJK
breakLinesr/  r   r   r   r.  r   r   r   r  r   r   )rY  
availWidthavailHeightr   r   first_line_widthlater_widthsr/  r   r   r   r  s               rK   wrapParagraph.wrapf  s   e 


%%
%E4I4I)IJUM^M^^!.1B1BB,;>>U"''(8(89F__T%5%56Fd=}R1PQ--;;>*,%#\\#ahhqyy&8"AA * %'#\\((QYY"66 * %%Ck%QRRV\\*W4E!gmmFNN&BCe# --6&0Fzz6!!rM   c                   ^^ U R                   n[        U5      nU(       d  gUS:X  a}  [        U5      (       dm  US   nUR                  mUR                  m[        UU4S j[        US5      (       a  [        UR                  S5       5       5      $ UR                   5       5      $ [        S [        U5       5       5      $ )z-Attempt to determine a minimum sensible widthr   r?   c              3   >   >#    U  H  n[        UTT5      v   M     g 7fr   )r
   )r  r}   fNfSs     rK   r  %Paragraph.minWidth.<locals>.<genexpr>  s     l6j{1R++6js   rT   r<   c              3   *   #    U  H	  oS    v   M     g7f)r   Nrb   )r  r}   s     rK   r  r    s     :%9t%9s   )r  r   r  r   r   r   r   rS   rT   r   r  )rY  r  nFragsr  r  r  s       @@rK   minWidthParagraph.minWidth  s    

E
a19-e44aABBlGTUV\L]L]eAFFC6H6jlllcdcjcj6jlll:]5%9:::rM   c                    U(       d  / $ UR                   nXB   R                  nU[        U5      :w  a  XC   R                  O[        U R                  5      nU R                  XV nU(       a<  [	        US   [
        5      (       a$  US	 U(       a  [	        US   [
        5      (       a  M$  [	        US   [        5      (       a,  [	        US   [        5      (       a  [        O[        US   l
        U$ r%  )r.  sFWr   r  r]  rA  rG  rc  rk  rL  r<  )rY  r/  r   r0  r.  r  sFWNr  s           rK   _split_blParaProcessed Paragraph._split_blParaProcessed  s    BYl"&E
"2u{DJJJJs Jqu]332aJqu]33aeL)),6quX,F,FjLAbEOrM   c                     U R                   R                  S:X  a  [        $ [        U R                  5      (       d  [
        $ U R                  $ r<  )r/  r   r=  r  r  r?  r  r  s    rK   _get_split_blParaFuncParagraph._get_split_blParaFunc  sA    '+{{'7'7':# 	;3CDJJ3O3O+	;!88	;rM   c           
         [        U R                  5      S::  d  U[        :  d
  U[        :  a  / $ [        U S5      (       d  U R	                  X5        U R
                  nU R                  n[        U S[        USS5      5      nUR                  nUR                  nUR                  S:X  a  US;  a  S=pUS:X  aW  [        UR                  5       H=  u  p[        UR                  UR                  -
  U5      nX-   nXS-   :  a    OUn	U
S-   nM?     OUS	:X  aK  [        UR                  5       H1  u  pXR                  -   UR                  -
  nXS-   :  a    OlUn	U
S-   nM3     O`[        S
U-  5      eUnUS:X  a  [        USUR                   -  5      nOUS	:X  a  SUR                   -  n[#        U[%        U5      -  5      nX-  n	[        U S[        USS5      5      nU(       d  US::  d  US:X  a  U ?/ $ [        U5      n[        U S[        USS5      5      nX::  a  U /$ U(       d%  XS-   :X  a  U(       a  US:X  d  US:  a  US-  nOU ?/ $ U R'                  5       nUR(                  (       a  [+        U5      nS Ul        OUnU R-                  S UU R.                  U" USU5      S9n[1        SUR                  SU X!S9Ul        [3        UR                  US-
     [4        5      =(       a?    [        UR                  US-
     S5      =(       a    UR                  US-
     R6                  (       + Ul        SUl        U	Ul        UUl        UR@                  S:w  a  [+        U5      nSUl         U R-                  S US U" X8U5      S9nS HD  n[        U U5      (       d  M  [C        UU[        U U5      5        [C        UU[        U U5      5        MF     UU/$ )Nr   r/  r   r2   r?   r  r   r   r   r  r   allowOrphansallowWidowsr  )rP  r  )r   r.  aHr  r7  )r   )"r   r  r*   r   r  r/  r   r   r   r.  r   r   r   r   r   r  r   r'  rD   r  r   r'   r<  rP  r   r]  r   r7  _JustifyLast
_splitparar   r   rY  setattr)rY  r  r	  r/  r   r   r   r.  rG   r   r  r  r   r(  r   r!  r  style1P1P2rW  s                        rK   rS   Paragraph.split  s   tzz?AE!1[5Fr	 tH%%IIj-

d=}R1PQ--;;>k;NAE!$V\\2CAAHHQYY.w7AAT))F!A 3 e#$V\\2CAxx		1AT))F!A 3 !!?+!MNNAE!ENN 23e#&Ka()ASFtN75PQ3RSA!Q$IJd=}Q1OP46MA#v QTacFAI))+==e_F!FNF>>$vtFSTUVGW>X16<<!+<Z	  *&,,qs*;HE  @$+FLL1,={$K @$*LL1$5$?$?A 	  A%UOE$%E!>>$u4;K>LAtA1WT!_-1WT!_-	 2wrM   c                 :    U R                  U R                  5        g r   )drawParar  r  s    rK   drawParagraph.draw  s     	djj!rM   c                 (   SU l         [        U[        [        45      (       d  U/nOUn/ nS=U l        n[        U5      S-
  nU R                  nUR                  nU=(       a    UR                  5       S;   nU(       a  [        n[        (       d  [        S5        UR                  =(       a(    [        [        UR                  5      R                  5      n	[!        USS5      n
U
(       as  [#        U
5      (       aD  U
R%                  5       n
U
(       a*  [&        (       a  [&        R(                  " U
S9R*                  n
O$Sn
O![-        U
5      (       d  [/        SU
-  5      eOSn
UR0                  nUR2                  nUS:  nUR4                  nUR6                  nU
=(       d    U=(       d    UnU(       a  [!        US	[8        5      nS=U l        U l        [?        U R@                  Xb5        US   n[!        U S
[!        US
S5      5      nUS;  nU RB                  n[        U5      nUS:X  Ga  URD                  (       Gd  [G        US   S5      (       Gd  [G        US   S5      (       Gd  [I        U5      (       Gd  U	(       Gd  US   nURJ                  nUR                  n[M        UU5      u  nnSn[G        US5      (       a  [%        URN                  5      nU(       d  URQ                  S/ UUUS9$ [S        U5      nU(       aw  UnU	(       a_  [U        U[V        SS9n [Y        U5       V!V"s/ s H7  u  n!n"[[        []        U"UR                  [^        RJ                  S9U U!   U!5      PM9     nn!n"O
[U        UUS9nUU:g  nOW[        UR`                  [b        5      nUR`                  SS nU H  n#[%        U#5      (       d  M    O   URQ                  S/ UUUS9$ [e        SUUU Rf                  5      n$UU$-  n%/ n&U$* n'[e        SUUU Rf                  5      n(Sn)U(       Ga  URi                  S5      n*U*(       d  [        U*[j        5      (       a  Sn)O[l        U*;   a  [o        U*5      n*[e        U*UUU Rf                  5      n+U'U$-   U+-   n,UU%[        U&5      -  -   n-U,U-:  Ga5  [        U*[p        5      (       Gd  U)(       Gd  [        U*[n        5      (       a  U*Rs                  UUU'U$-   U(-   S-
  U-U Rf                  S9n.U.(       a  U.USS& U =R<                  S-  sl        Sn)GM  [        U&5      (       aa  U[u        XT5         n/U(       d  U*Rv                  U(-   S-   U/::  a6  U*Rs                  UUSU(-   S-
  U/U Rf                  S9n.U.(       a  U*/USS& Sn)Sn*U'n,OU(       a  [!        USS5      (       + n0[y        U0(       a  U
OSUUU*U+U,U-U0(       a  UOSU=(       a    U0W5
      n.U.(       a  U.USS& U =R<                  S-  sl        Sn)GM  U(       aR  [        U&5      (       aB  [y        U0(       a  U
OSUUU*U+U+UU0(       a  UOSU=(       a    U0U5
      n.U.(       a  U*/USS& Sn)U'n,Sn*U(       av  [        U*[j        5      (       da  U)(       dZ  [u        XE5      n1U+[{        UU1U1S-    5      :  a:  [}        U*U'U$-   X$UUU Rf                  5      USS& U =R:                  S-  sl        Sn)GM  U,U-::  d  [        U&5      (       a  U)(       aj  U*(       a  U&R                  U*5        U)(       aH  Sn)U,U R                   :  a  U,U l         UR                  UU,-
  U&45        / n&U$* n'US-  nU[u        XT5         nOHU,n'OEU'U R                   :  a  U'U l         UR                  UU'-
  U&45        U*/n&U+n'US-  nU[u        XT5         nU(       a  GM  U&/ :w  a-  U'U R                   :  a  U'U l         UR                  UU'-
  U&45        U(       a*  U H  n2U2S   R                  [        S9  M     [c        U5      nURQ                  SUUUUS9$ US::  aD  [        SURJ                  UR                  UR                  URJ                  SURJ                  -  / S9$ UR                  (       + n3/ n/ n4U4R~                  n5[        UU5      nSnU(       a  [        S U 5       5      (       d  [        UUS9n U	(       aA  [Y        U5       V!V"s/ s H(  u  n!n"[        [        U"5      [        U U!   U!5      5      PM*     nn!n"OP[Y        U5       V!V"s/ s H  u  n!n"[        U"UU U!   U!S9PM     nn!n"O"U	(       a  U V"s/ s H  n"[        U"5      PM     nn"Sn6U(       G
a_  URi                  S5      n#U5" U#5        U#S   S   nUR                  nURJ                  nU(       d  S=n7=n$n'Un8[M        UU5      u  n9n:U#S   n+U#S   S   nU+S:  a	  W'W$-   U+-   n,OW'n,UR                  [        :H  n;Un-U(       av  W$n<U Hd  n=U=R                  [        :X  d  M  U=RN                  R                  S5      n>U>(       d  M=  U<U>[e        SU=R                  U=RJ                  5      -  -  n<Mf     U<U-  n<U-U<-  n-U;(       Gd$  U,U-:  Ga  [        U#[        5      (       Gd  [G        US5      (       Gd  [        U#[        5      (       Ga  U#R                  U,U-5      n.U.(       a_  U.USS& UR                  S[        SURQ                  [        SS 9S4/5      5        U4Ri                  S5        U =R<                  S-  sl        GM  [        U45      S:  a{  U[u        XT5         n/U(       d  U#Rv                  S-   U/::  aS  U#R                  U+U/5      n.U.(       a:  [        SURQ                  [        SS 9S4/5      U#/USS& U4Ri                  S5        GM^  GO/U(       Ga'  [!        USS5      (       + n0[        U0(       a  U
OSU#U,U-U0(       a  UOSU=(       a    U0W5      n.U.(       a_  U.USS& UR                  S[        SURQ                  [        SS 9S4/5      5        U4Ri                  S5        U =R<                  S-  sl        GM  U(       a|  [        U45      S:  am  [        U0(       a  U
OSU#U+UU0(       a  UOSU=(       a    U0U5      n.U.(       a:  [        SURQ                  [        SS 9S4/5      U#/USS& U4Ri                  S5        GM  U(       a  [        U#[        5      (       d  [u        XE5      n1U+[{        UU1U1S-    5      :  ap  [        U#UW$-
  U'-
  X$5      USS& UR                  S[        SURQ                  [        SS 9S4/5      5        U4Ri                  S5        U =R:                  S-  sl        GM;  U,U-:  =(       a    W7S:  =(       d    U;n?U?(       Gdk  U;(       a  GMg  U#S   S   n@U@(       a  W7S-  n7URJ                  nU(       aq  UR                  [        :X  aC  [        [        UR                  R                  U5      UR                  R                  U5      u  nnO3[M        UR                  U5      u  nnO[M        UR                  U5      u  nn[{        W8U5      n8[{        W9U5      n9[u        W:U5      n:U(       d  URQ                  5       nAUA/nW@UAl'        GO[        WAU5      (       d  W$(       ap  [        U5      S-
  n!U!S:  a\  UU!   n=U!S-  n!U=R                  [        :X  a6  U=RN                  R                  S5      (       d  U==RN                  S-  sl'        OU!S:  a  M\  URQ                  5       nAUR                  UA5        W@UAl'        OkW$(       aO  WARN                  R                  S5      (       d  WA=RN                  SW@-   -  sl'        O+WA=RN                  W@-  sl'        OWA=RN                  W@-  sl'        [        U#[        5      (       a  [e        SUU5      OSn$SnBU#S!S  GH  n!U!S   RQ                  5       nAU!S   UAl'        UARN                  (       a  SnBUR                  WA5        UARJ                  nU(       aq  WAR                  [        :X  aC  [        [        WAR                  R                  U5      UAR                  R                  U5      u  nnO3[M        WAR                  U5      u  nnO[M        WAR                  U5      u  nn[{        U8U5      n8[{        U9U5      n9[u        U:U5      n:GM	     W@(       d  WB(       a  W7S-  n7U,n'GOU;(       a@  URQ                  5       nAUR                  UA5        U3=(       a    [        U#[        5      (       + nCOSnCU'U R                   :  a  U'U l         UR                  [        UU'-
  W7WCUW8W9W:UU6S"9	5        [        U45      S-
  n6US-  nU[u        XT5         nU;(       a  / nGMx  [        U#[        5      (       a  [e        SUU5      OSn$U$U-  n%U+n'Sn7URQ                  5       nAUARJ                  n8U(       aq  WAR                  [        :X  aC  [        [        WAR                  R                  U5      UAR                  R                  U5      u  nnO3[M        WAR                  U85      u  n9n:O[M        WAR                  U85      u  n9n:WA/nU#S   S   UAl'        U#S!S  H  n!U!S   RQ                  5       nAU!S   UAl'        UR                  UA5        UARJ                  nU(       aq  WAR                  [        :X  aC  [        [        WAR                  R                  U5      UAR                  R                  U5      u  nnO3[M        WAR                  U5      u  nnO[M        WAR                  U5      u  nn[{        U8U5      n8[{        U9U5      n9[u        U:U5      n:M     U(       a  G
M_  U(       a:  W'U R                   :  a  U'U l         UR                  [        UU'-
  W7SUW8W9W:UU6S"9	5        U(       a&  U H   n2U2R`                  R                  [        S9  M"     U4U l!        [        SUS#9$ s  sn"n!f s  sn"n!f s  sn"n!f s  sn"f )$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   r?   )r   LTRr2   hyphenationLang)langNzLhyphenator should be a language spec or a callable unicode -->  pairs not %rr,   r   r  r   r   FrT   )r   r.  r   r   r   Tr  r   r   )r  r<   r\  r   )r  nobrr8  皙ɿ)r   r   r   r   r   r   r.  c              3   8   #    U  H  n[        U5      v   M     g 7fr   )isBidiIndexListr&  s     rK   r  'Paragraph.breakLines.<locals>.<genexpr>  s     $HA_Q%7%7s   )r  bidiVbidiLr   )r  rT   r@   )	r*  r+  r7  r   r   r   r   r  r  r  )a
_width_maxr]  r  ro   r   r   r   r   r  r   r   shapingr  r   r   shapabler   r/   rB   pyphenPypheniteratecallabler  r  r  spaceShrinkagesplitLongWordsr,   _splitLongWordCount_hyphenationsr\  rP  r  r   r   r  r   r   rT   r  rS   r   r  r   r   shapeStrr   r   r   r
   r  popr  rP  r  r   r  r   ri  r  r   r"  r   r;  	sortBidiVr   r   justifyBreaksr  anyr  bidiIndexListWrapr   r   r   r  r  r  r|   rE  rc  r|  r  rA  r  rC  r  r  r   r   r   r   r0   r  r?  r   )DrY  r   r  r.  r  r  r   r   doBidir;  r  r  r  hyphenation2rA  rB  attemptHyphenationr  r  r   r  r  r  r  r   r   r   r   bidiSortrT   r   _wordsVXr  r`  r}   
spaceWidthdSpaceShrinkcLiner  hywforcedSplitwordr  rl  r  hswnMWhyOknmwr  njlbvr  aFWr  r(  r  r  r  r7  spaceShrinkwinsr  nTextr  nillbsD                                                                       rK   r  Paragraph.breakLines  s1   @ %t--E7yi  f	N1$	

>>?hnn.-?F:--JD)@)I)I$J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*DPUVWPXYdHeHe ''7aAzzHzzH.xAOFGHq  QVV}776'[c7dd "$KE!&"!-ei4!PB H  IN  O  %P  Owzwxyz%5hq!**^_^h^h6ijlmnjopq%r  OE  %PE$0($KE#(F?%aggh7
AQxx  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.J.Jk!$w//"// (( ,z 9C ?$ F (+/==	 0 " ),E!AJ ..!3.*+K$ ZZ"+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%jj"0t ((D)YPX6:N$7$@D%#IC  #.2Va
./+7'+%z$z/J/Jk!&3$S3s1u)=%>>)3Dj9PQZbjkstx  uB  uB  *CE!AJ 4494*+K$X%SZZ;U\\$/"&'#doo5th&95%AB "(2{!#,S-B#C'/#doo5tLL(\"95!AB!FE#,LaKF(Y)>?Hq %v by/<h5u=>AaDII)I,  77fWV^7__QY!ennu~~&+ooennUYZ_ZhZhUh"$& & +++EEB))C"52FH$H$H I I)&HE`ijp`qr`qY\YZ[\/a0@2a5QRAST`qFrF`ijp`qr`qY\YZ[\l1xbeRST`qFrF4:;Fq-*F;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 +r+c"++bkk2Z/Z Z	 $
  >1K+H Xh%6z!K?X?Xahijksatat!!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.F!&3$S3s1u)=%>>*88J;N|;[\e*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3FFcEk1FFFeOF%GQRST[G\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Xl5JVW25U18T^iq,/"1 2 b'!)C aKF(Y)>?H  " GQRST[G\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%<
 #{ &\ /<X(\2IUVaf*/'[eow|A BAGGLLYL/ DJ!511C %PH sr;s   >AP*?/AP0 AP6+AP<c           
      <   [        U[        [        45      (       d  U/nU R                  nSU l        [        U R                  X!5        U R                  n[        U5      nUS:X  Ga  [        US   S5      (       d  UR                  (       d  US   n[        U S5      (       a6  [        U SS5      (       a$  UR                  SU R                  R                  S9$ / nSn[        US5      (       a  UR                  nOSR!                  [        US	/ 5      5      n[#        XUR$                  UR&                  5      nU V	V
s/ s H	  u  pX/4PM     nn	n
UR                  SXR&                  S
UR&                  -  S9$ US::  aD  [)        SUR&                  UR$                  UR*                  / UR&                  S
UR&                  -  S9$ [        U S5      (       a  [        U SS5      (       a  U R                  $ [        U S[        USS5      5      nUS;  n[-        X1U5      $ s  sn
n	f )zRInitially, the dumbest possible wrapping algorithm.
Cannot handle font variations.r   r?   r   r/  r$  r  rT   r2   r   r4  )r   r.  r   r   )r   r   r   r   r.  r   r   r   r  )r]  ro   r  r   r   r\  rP  r  r   r   r   r   r  r/  r.  rT   rn   r$   r   r   r   r   r  )rY  r  r   r  r  r  r.  r  rT   r  r  wrappedLinesr   r  s                 rK   r  Paragraph.breakLinesCJK	  s    )T%L11	{9

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

U19WU1Xh77aAtH%%'$|A*F*FwwAT[[->->w??EFq  vvwwwq45dqzz1::FE
 <AA5ZbRL5LA77jjRVWXWaWaRa7bbQY!ennu~~&+ooRu~~^bchcqcq^qs s 4!!gd<&B&B;;d=}R1PQ 
2
Ej99 Bs   ;Hc                 8    U R                   R                  X5      $ r   )ro  rI  )rY  rX  r  s      rK   rI  Paragraph.beginText	  s    yy""1((rM   c           	         U R                   nU R                  nU R                  nUR                  nUR                  n[        U S[        USS5      5      nUR                  nUn	U(       a  Sn
[        SSS5      n[        SSS5      nO&[        USS5      n
[        US	S5      nUR                  nU(       d  U(       Ga  U
(       Ga  UR                  5         UR                  n[        SSS
9nU(       aY  U
(       aR  UR                  U5        UR                  U
5        SUS'   [        USS5      nU(       a  U(       d  UR                  nXS'   U(       a  UR                  U5        SUS'   [        USS5      n[!        U5      u  nnnnU" UU-
  U* U R"                  XR$                  -   -
  U-   U-   U R&                  U-   U-   40 UD6  UR)                  5         [+        U5      nU R,                  nUS:  Gat  [        U SS/5      nUU[+        U5      -
  US   /-  -  nUR                  5         UR.                  nUR0                  US   -   nUS-
  n[        U SS5      (       + nUR2                  nUR4                  nUS:H  nU=(       a    U R6                  nUR8                  S:X  Ga  U[:        :X  a  [<        n O?U[>        :X  a  [@        n O.U[B        :X  a  [D        n OU[F        :X  a  U(       a  [H        O[J        n Un![L        (       a  U R&                  U!RN                  -
  n"O$U R&                  [        U!SU!RN                  5      -
  n"U(       a  [Q        UUU"UUUS9nUR                  U!RR                  5        U RU                  U	U"5      n#SU RV                  RX                  R[                  5       ;   U#l.        US:X  a#  [_        XdR`                  URb                  -
  5      nOUS:X  a  UR`                  URb                  -
  nUS;   a  US-   OUU#l2        U#Rg                  U!Rh                  U!RN                  U5        US   S   n$US   S   n%U=(       a    US:H  n&U&(       a  U(       a  [+        U%5      U:  a  Sn&W " U#UU$U%U&5      n'U!Rj                  (       d  U!Rl                  (       Ga  [o        [p        U#5      U#l8        [s        5       =U#l:        =n(U#l;        [y        U#X#5        U"U(l=        U!U(l>        UU(l        UU(l        U!Rl                  U(l6        U!RR                  U(l)        / U(l?        U'U-   n)U[F        :w  d  U&(       a  Sn$U!Rj                  (       a  [        SU)U$U#U!Rj                  5        U!Rl                  (       a  [        SU)U$U#5        [        SU5       H  n*UU*   S   n$UU*   S   n%U=(       a    U*U:H  n&U&(       a  U(       a  [+        U%5      U:  a  Sn&U " U#UU*   U$U%U&5      n'U'U-   n)U[F        :w  d  U&(       a  Sn$U!Rj                  (       a  [        U*U'U$U#U!Rj                  5        U!Rl                  (       d  M  [        U*U)U$U#5        M     GO[        SU5       HM  n*UU*   S   n%U=(       a    U*U:H  n&U&(       a  U(       a  [+        U%5      U:  a  Sn&U " U#UU*   UU*   S   U%U&5        MO     GOU(       a   U H  n+U+R                  SSS2   U+lC        M     US   n![L        (       a  U R&                  U!RN                  -
  n"O$U R&                  [        U!SU!RN                  5      -
  n"[        n U(       a  Un,[Q        UUU"UUUS9nU[:        :X  a  [        n OWU[>        :X  a  [        n OFU[B        :X  a  [        n O5U[F        :X  a  U(       a  [        O[        n O[        S[        U5      -  5      eU RU                  U	U"5      n#SU RV                  RX                  R[                  5       ;   U#l.        [y        U#X#5        [o        [p        U#5      U#l8        UU#l2        [s        5       =n(U#l;        SU(l)        SU(l        SU(lK        / U(l?        0 U(l5        0 U(lL        0 U(l6        UR                  U(l        UU(l        SU#lM        SU#lN        U"U(l=        U!U(l>        UU(l        UU(lO        U R"                  U(lP        Su  U#lQ        U#lR        US   n+U=(       a    US:H  n&U&(       a  U(       a  U+R                  U:  a  Sn&U " U#UU+U&5        [        U#5        [        SU5       HO  n*UU*   n+U=(       a    U*U:H  n&U&(       a  U(       a  U+R                  U:  a  Sn&U " U#UU*   U+U&5        [        U#5        MQ     UR                  U#5        UR)                  5         gg)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   r2   r   r?   r   g?borderWidthNborderColor)r  r  r  borderRadiusradiusr  borderPadding_offsetsr   r#  Fr   r   )rQ  r   r   r   )r/  r   z-handledzbad align %s)NN)Vro  r   r/  r.  r   r   r   r   r   	saveStater  r   rh  rf  	roundRectr   r#   r   rK  r   restoreStater   rP  	alignmentrY  justifyLastLiner   r  r   r   r   r!   r   r    r   r"   r   r   r+   r   rW  r   rI  r<  rd   r  r   r   r   r   r  r   r   r   r   r1   rr  r(   r   r   r  r   r  r   r  r  r  r   r.  r2  r4  r:  r8  r  r  r   r   r   r   r   r   r   r   r+  r  rM  )-rY  r  rO  r   r/  r.  r   r   r   r   rv  bcr"  opr   brbptbprbpbbplbpnLinesrP  ro  rs  r   ra  noJustifyLastjllwcr   isRTLbRTLdplr  r   ry   r
  r   lastLiner  r   rz   r  r  oos-                                                rK   r+  Paragraph.drawPara	  s3    

--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%'N##B' Vq1B!.r!2Cc3zC

j1B1B&BCcI#Mc)#-  	 
 !U__
A:tJs3HH-~==HI**8A;6F(C '^E BBM))E~~HeOE-T--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 7?-6Ox
2U] 

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666=BB#? . #1f- %a#0#;QV##e*U2B%*HR!eAhqk5(K .  %%)ZZ"%5
 !&!H++ KK!**4E KK'!HQZZ*HHE(B(uZSWXF',C)+.C(*-C*,6;2AVC$^d9o%EFF ^^E51"0DNN4K4K4Q4Q4S"SF2("5'"&&(R\!!  "]]
 *"  !,#zz,6)R\Qx(6VQY$..*>"HRx0b! q&)A 8D,7CHEdnnU.B!&Xa[$9!"% * OOB!A rM   c                    [        U SS5      nU(       a  / nUR                  n[        U5      (       a?  U H8  nUSS  H  u  pgU" U5        M     [        U[        5      (       d  M0  U" S5        M:     O.U H(  n[        US5      (       d  M  U" UR                  5        M*     SR                  U5      $ U(       a  [        U SS5      nUc  [        U 5      nU$ g)zXConvenience function for templates which want access
to the raw text, without XML tags. r  Nr?   r<   rT   r2   )	r   r   r  r]  r?  r   rT   rn   r  )	rY  identifyr  plainsplains_appendrV  r   rT   r  s	            rK   getPlainTextParagraph.getPlainText
  s     WT*F"MMM&&!D&*12h
%d+ '/!$w//%c*	 " "DtV,,%dii0 " 776?"4t,D|DJTKrM   c                     [        U S5      (       d   S5       eU R                  R                  (       a  U R                  4S jnOU R                  4S jn[	        [        XR                  R                  5      5      $ )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                     XR                   -
  $ r   )r*  r  r}   s     rK   r   0Paragraph.getActualLineWidths0.<locals>.<lambda>
  s    a//.ArM   c                     XS   -
  $ r<  rb   r  s     rK   r   r  
  s
    aq'krM   )r   r/  r   r   ro   ru   r.  )rY  r  s     rK   getActualLineWidths0Paragraph.getActualLineWidths0
  s\    
 tW%%N'NN%;;"&**AD"&**9DC[[../00rM   c                    S/nUR                   n[        U 5       H  u  pVU(       ai  U" SUS   -  5        USS   HH  nU" S[        US   5      -  5        U" SUS   -  5        U" SXVR                  R                  4-  5        MJ     U" S5        Mu  U" S	US   S
R                  S USS   5       5      XVR                  R                  4-  5        M     US-  nUSU-   R                  U5      -   $ )N[z    [%r,r   r?   z        (%s,)z        %r),z    ], #%d %sz    ]z[%r, %s], #%d %s, c              3   l   #    U  H*  nS US   R                   R                  < SUS   < S3v   M,     g7f)r  r   ,r?   )N)r<  rd   )r  r  s     rK   r  &Paragraph.dumpFrags.<locals>.<genexpr>  s-     8vpujlbeooF^F^_abc_d9epus   24r<   r4   )r   r   r  r<  rd   rn   )r  r[  fullr{  r  r  r  r  s           rK   	dumpFragsParagraph.dumpFrags
  s   EXXU#CA:!$%AB%Bbe45~1-.!KK,@,@)AAB   7%1dii8vpqrsrtpu8v.wxy  {F  {F  {O  {O  )P  P  Q $ 3JDF==###rM   )rD  rC  r:  r  r/  rP  r  r  r  r  r   r   rT   r   )NNNr?   rO   r   r   )   F)rd   re   rf   rg   rh   r  r  r  r  r  r  r  rS   r,  r  r  rI  r+  r  r  staticmethodr  ri   rb   rM   rK   r   r     sp    =|n.'"R;	;
Sj"B2H(:T)V"p2
1 $ $rM   r   __main__c                    [        S[        U 5      -  5        U R                  R                  n[        R
                  R                  n[        U5       H  u  p4X   n[        US5      (       a  UR                  nOUS   n[        U5      nU" SX6[        [        USS5      5      4-  5        [        U5       H  nU" SU[        XW   SXW   5      4-  5        M!     [        5         M     g )	Nz$dumpParagraphLines(<Paragraph @ %d>)r   r?   zline%d: %d(%s)
  r+  Unknownz %d:'%s'rT   )printidr/  r.  sysstdoutwriter   r   r   r   rQ  r   r  )Pr.  outwr  r  r   nwordsr}   s           rK   dumpParagraphLinesr    s    4r!u<=zz&FA8DtG$$

QZF%#gd;y6Y2Z([[\6]Z758F58#D EEF #G 'rM   c           	          SU S   -  /nS H>  n[        U S   U5      (       d  M  UR                  U< S[        U S   U5      < 35        M@     SR                  U5      $ )Nz'%s'r?   )	r   r   r   r   rt  striker   r   r7  r   =r  )r   r   r   rn   )r}   r{  rW  s      rK   fragDumpr    sV    QqTM?sAqtAAgad1o67 t yy|rM   c                 j   [        S[        U 5      U R                  5       4-  5        U R                  n[	        U5      n[        U5       Hj  n[        SX1U   R                  SR                  X   R                   Vs/ s H#  oD[        :w  d  M  U< S[        X   U5      < 3PM%     sn5      4-  5        Ml     [        R                  R                  nSnSn[        US5       HI  nXgS   -  nU" SX6US   4-  5        USS   H  nU" S	[        U5      -  5        M     [        5         US-  nMK     g s  snf )
Nz6dumpParagraphFrags(<Paragraph @ %d>) minWidth() = %.2fzfrag%d: '%s' %sr<   r  r   ih  zfragword%d: cum=%3d size=%dr?   z (%s))r  r  r  r  r   r  rT   rn   r  r   r  r  r  r  r  )	r  r  r(  r  r~  r  cumr  r}   s	            rK   dumpParagraphFragsr    s<   F"Q%QRQ[Q[Q]I^^_u:qA#q(--mrmum~m~  BKm~hi  FJ  CJBcQwW\W_`aObBcm~  BK  9L  'M  M  N  zzuS)AQ4KC.!!A$?@qrUWx{*+ GFA * BKs   <D0D0c           	        ^ [        [        R                  S   [        5      (       a  0 m/ R                  nU4S jn[        R                   H  nU" U" U5      5        M     [        S5        [        SR                  S [        TR                  5       5       5       5      5        [        [        < SSR                  UR                  5      < S35        [        S5        g g )	Nr   c                 4  > / R                   nU SS   HD  n[        US   5      nUT;  a  [        T5      US   4TU'   U" STU   S   < SUS   < S35        MF     SU R                  R                  < SU S   < SSR                  UR                  5      < S	3$ )
Nr?   r   z(__frag_z__, r  r  r  r  z]),)r   r  r   r<  rd   rn   r  )r}   rs  r`  fid_Fs       rK   	_showWord%dumpProcessedFrags.<locals>._showWord4  s    II12AQqT(C"}#&r71Q4.3RWQZ!=>	 
 34++2F2F!diiXYXbXbNcddrM   zfrom reportlab.platypus.paragraph import _HSFrag, _SplitFragHS, _SplitFragHY, _SplitFrag, _getFragWords
from reportlab.platypus.paraparser import ParaFrag
from reportlab.lib.colors import Colorr4   c              3   ,   #    U  H
  nS U-  v   M     g7f)z__frag_%s__ = %rNrb   r&  s     rK   r  %dumpProcessedFrags.<locals>.<genexpr>?  s     Q=P/!3=Ps   z=[
z  ]z%print(_getFragWords(processed_frags)))r]  r(  r  ro   r   r  rn   r  r|  processed_fragsr  )r  r   _Sr  r`  r  s        @rK   dumpProcessedFragsr  0  s    bhhqk$''BBe XX9Q<    X  Y$))QVBIIK=PQRS2;;9OPQ9:! (rM   )getSampleStyleSheetr&   )cm4c                 N    SU;   =(       d    SU;   =(       d    [        U 5      U;   $ )Nall*)rQ  )r  TESTSs     rK   flaggedr  I  s"    ~@@Q5@rM   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Ӆ@r  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)r  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&  Courierr2  )r   g֣p=
w{@i'  )TTFont)registerFont
DejaVuSanszDejaVuSans.ttfzNotoSansKhmer-RegularzNotoSansKhmer-Regular.ttfur   Hello clifftop <font name='NotoSansKhmer-Regular'>ឆ្នាំ</font> world <span color='red'>of </span>wonder!dvsstyler   )r<   r  )Tr  )r  )__all____version__rh   stringr   operatorr   unicodedatar	   reportlab.pdfbase.pdfmetricsr
   r   r   reportlab.pdfgen.textobjectr   r   r   r   r   r   r   r   r   r   r   reportlab.pdfbase.ttfontsr   reportlab.platypus.paraparserr   r   r   rF   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_accelr0   retypesr1   r=  rn   rY   compileescaperS   rR   r  r=  rL   rB   r\   r_   r   r   rs   r   rx   r~   r   r   r   r   r   r   r   r   r   r   r$  r   r.  r2  r4  r8  r:  r   ro   r?  rA  rC  rE  rG  rI  rL  rQ  rN  ra  rc  rj  rk  r  r  r  r  r  r  r  r  r  r  Ir  r  r  _hy_lettersrP  _hy_shyr  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r"  r*  r,  r2  r=  r?  rW  r\  rc  rr  r  r  r  r  r  r  r  r  r  r  r  rG  r   rd   r  r  r  r  r  reportlab.lib.unitsr  r  argvr  r  
styleSheetBr   r   rT   r  r  r"  r  r}   r   r  rG   r  r  h0r  r   r  r  rb   rM   rK   <module>r     s`	  	
 3     O O9 9 9 9 4 ] ] 1 & H H 1 ? /  #  : : + 	  
ww  @ jj"))D/1288

8RYYt_45<<q
	 		t 	9 &&"g(9$ 	iV4" ,$ ]W	d 		D 		 		* 	
	; 		:g 		< 	S  $&/t &/PZHl Z	, 	 

	(,q||
.f **  Q  SU  SW  SW  X* 
jjABjjCD

277DU#;<=JJrwwW['GHI jj$wt!456>)@,HY1x 7(	 		J 		* 		; 		3 	#6c #6J	', 		
 		t 	
 3
R!F2.
1f1(8t. ZZ23
C @/b#J/3 /@@O)bC@ "	E$ E$N  Z $;( I&HHQRLEby% A %&J:A+A6EENqzz
 D
1BffRn!1GGBrNAFF2bMq!B 
 qzz
H*U]J^
_1ffRo!1qzz D*V,
-1ffT6"!1qzz X
D!
1ffRm!"1Q'1GGBrN1Q4 !		"R 2 B'1Q4 qzzEHXcRUhW
D*V,
-1ffT6"!1qzzD j2!DAq!&&v&CAaq! qzzg
D*V,
-1ffT6"!1qzzi
D*X.
/1ffT6"!1GGD3c!f1Q4 1Q4 	!		$1Q4 1Q4  qzz) 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r{{4=VL)9:;V34OPQ Q
D~j,XZ[
\1 [ AWFs   .b b