
    gg                    6   d Z dZdZddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZ ddlmZ dd	lmZmZmZmZ dd
lmZ ddlmZ ddlmZmZmZmZ ddlmZ ddl m!Z!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4Z4ddl5m6Z6 	 ddl7Z7djq                  d      Z9 e4jt                  d e4jv                  e9      z        jx                  Z= e4jt                  d e4jv                  e9      z        j|                  Z?ddZ@ddZ<d ZAd ZBd ZC G d  d!e(      ZD G d" d#e(      ZEd$ ZFdd%ZGd& ZHd' ZIdd(ZJdd)ZKdd*ZLdd+ZMdd,ZNd- ZOd. ZPd/ ZQd0ZRd1ZSd2 ZTdd3ZUdd4ZVdd5ZWdd6ZXdd7ZYdd8ZZd9 Z[ G d: d;e\      Z] G d< d=e\      Z^ G d> d?e\      Z_ G d@ dAe_      Z` G dB dCe`      Za G dD dEe_e]      Zb G dF dGeb      Zc G dH dIed      ZeddJZf G dK dLe\      Zg G dM dNegea      Zh G dO dPegeb      ZidQ ZjdZkdRZldSZmdTZndU ZodV ZpddWZqdX ZrdY Zs e4jt                  dZe4j                        Zud[ Zvd\ Zwd]Zxd^Zyd_Zz e4jt                  d`      Z{ e4jt                  da      Z| e4jt                  djq                  dbexdcf            Z} e4jt                  djq                  dbezexdcf            Z~ e4jt                  djq                  ddezdef            Zdf Zdg Zdh Zdi Ze-fdjZ G dk dled      Z G dm dne      Z G do dpe      Z G dq dre      Z G ds dted      Z G du dved      Z G dw dxee      Z G dy dzee      Ze-fd{Zdd|Zd} Zd~ Zd Zd Zd Zd Zd Zd Zd Z e4jt                  d      Zd Zd Zd Zd Z G d ded      Zd ZddZd Z G d de      Zedk(  rnd Zd Zd ZddZddl#mZm$Z$ ddlmZ ddlZejV                  dRd Zeg k(  rdgZefdZ e       Zed   Z e$de      Zde_         edR      rldZ eee      Z ee       d\  ZZejm                  ee      \  ZZ ee       ejy                  ee      ZeD ]  Zejm                  ee        ee       dZ!  edS      r2 eded         Z ee       ejm                  dd      \  ZZ ee        edT      r4dZ eeed         Z ee       ejm                  dd      \  ZZ ee        ed      rdZdZdZ eee      Z ee       ejm                  ee      \  ZZ edee        ee       ejy                  ee      Z eed          ed   jm                  ee      \  ZZ edee        eed           ed      rGd ed      d ed      dZ eeed         Z ee       ejm                  dd      \  ZZ ee        ed      r;dD ]6  Z eeed   d      Z ee       ejm                  dd      \  ZZ ee       8  ed      r4dZ eeed         Z ee       ejm                  dd      \  ZZ ee        ed      rdZ eeed         Z ee       ejm                  dd      \  ZZ ee       ejy                  dedz        Z e ee              eed           eed          edR   jm                  dd        eedR           eedR           ed      rCdZ ee e$ded   e            Z ee       ejm                  dez  dz
  d      \  ZZ ee        ed«      rCdZ ee e$ded   e            Z ee       ejm                  dez  dz
  d      \  ZZ ee        edī      r;dZ ee e$ddd¬ȫ      ɫ      Z ee       ejm                  dd˫      \  ZZ ee        ed      rHddlmZ ddl	mZ  e eddϫ              e eddѫ             dZ ee e$ddd¬ȫ      ɫ      Z ee       yyy#  dZ7Y xY w))	ParagraphcleanBlockQuotedText	ParaLinesFragLinez3.5.20z%The standard paragraph implementation    )
whitespace)truth)category)stringWidthgetAscentDescentgetFont)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                     t        |       ri| j                         } | rSt        j                  |       }|r/t	        |j                  d            ||j                  d         z  S t        | d      S |r|S | S )z/convert a strike/underline distance to a number      F)allowRelative)r$   stripr   matchfloatgroup_parser_num)svMapdefaultms       T/var/www/html/Beni/venv/lib/python3.12/site-packages/reportlab/platypus/paragraph.py_usConvrA   K   si    QxGGI""1%AQWWQZ(aggaj)999"1599NH    c                     t        |       r| j                  d      } |t        |      r|j                  d      }|d| v rt        |       n| j                  |      D cg c]  }| c}S c c}w )Nutf8    )r#   decode_wsc_re_splitsplit)textdelimuwords      r@   rH   rH   Y   sk    t}T[[0dWU^U\\&5IU7<}SWd 3]a]g]ghm]n np neE nppps   	A+c                 d    t        |       r| j                  d      } | j                  t              S NrD   )r#   rF   r7   _wscrI   s    r@   r7   r7   ^   s%    t}T[[0d::drB   c                 d    t        |       r| j                  d      } | j                  t              S rM   )r#   rF   lstriprN   rO   s    r@   rQ   rQ   b   %    t}T[[0d;;trB   c                 d    t        |       r| j                  d      } | j                  t              S rM   )r#   rF   rstriprN   rO   s    r@   rT   rT   f   rR   rB   c                       e Zd ZdZy)r   a/  
    class ParaLines contains the broken into lines representation of Paragraphs
        kind=0  Simple
        fontName, fontSize, textColor apply to whole Paragraph
        lines   [(extraSpace1,words1),....,(extraspaceN,wordsN)]

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

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


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

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

4  QZZG_1f"f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"R@F]LLE%U
BG	A"1+w.HQK  
AQx(E!Hq  
||
r~~wEG	vvrz2bff9 I JJ4s   &a55bc                    t        |j                        \  }}}}	}
}|j                  j                  |||      }||z   |k  r|j                  |k7  s|j
                  |k7  r|j                  ||       |r|t        |d|j                        z  }|j                  d|j                  |z          t        ||| z
         t        ||z
  |z        }t        ||||z  z
         |j                  |	k7  r|j                  |	       |
r|j                  j!                  | ||
f       |j#                  ||z  d       |r*|j                  |j                  |j                  |z
         y y y )N_dotsOffsetXr   r4   )r   r   r   r
   r   r   r   rt   r   r   r   ri   intr   r   r   r   rv   )r   r  r   r   rj   r   rI   r   r   r   r   r   r  ns                 r@   r   r     s6   4@4J1D(9YrZZ##D(H=Fv~x<<!R\\8%;JJx)WRrvv>>
288B;'75=!'!6)*8fQh&'<<"OOI&bmm**E(9+EF
AdF1rrxx{32  rB   c           
         || _         t        | |       |j                  }|dkD  xs t        |dd      }|sX|j                  t        |j                  D cg c]$  }t        |d      rt        |j                        & c}      z   dz
  }|dk  }|rt        || ||d       n=| j                  |t              z         t        || ||d       | j                  d       t        | |        y c c}w )Nrr   rs   Fr   r4   r   r   )r   ri   
extraSpacert   	wordCountsumrz   r   ro   rI   r  rw   r9   rj   rx   r   r{   r  r|   rn   r}   s           r@   _leftDrawParaLineXr    s    BLBvJCnU!CF..$**%h*QT[\]^fTgj&8*%h!iijkk!VRtV4

U7^34VRtV4
Bw &is   C+
&C+
c           
      D   || _         || j                  z   | _        	 |j                  }|dkD  xs t	        |dd      }|sX|j
                  t        |j                  D cg c]$  }t        |d      rt        |j                        & c}      z   dz
  }|dk  }|r.|d|j                  z  z   }t        | |       t        || ||d       n?|}| j                  |t              z         t        || ||d       | j                  d       t        | |        | `y c c}w # | `w xY w)	Nrr   rs   Fr   r4   r   r   center)r   r   r  r  rt   r  r  rz   r   ro   rI   ri   r  rw   r9   	rj   rx   r   r{   r  r|   rn   r}   r?   s	            r@   _centerDrawParaLineXr"    s   BLrvvoBO__
E!GWT.%GnnSdjj)ljX_`abjXk*QVV*<j)l%mmnooGaZFs4??**ABqMBd84AOOJw78BdH5OOAA2O *m Os%   A D D
/D
BD D Dc           
         || _         |j                  }|dkD  xs t        |dd      }|sX|j                  t	        |j
                  D cg c]$  }t        |d      rt        |j                        & c}      z   dz
  }|dk  }|r+||j                  z   }t        | |       t        || ||d       n?|}| j                  |t              z         t        || ||d       | j                  d       t        | |        y c c}w )Nrr   rs   Fr   r4   r   r   )r   r  rt   r  r  rz   r   ro   rI   ri   r  rw   r9   r!  s	            r@   _rightDrawParaLineXr$    s    BLJCnU!CF..$**%h*QT[\]^fTgj&8*%h!iijkk!4??"1Qr4w/

U7^34QD$0
BrN &is   C<
C<
c           
      
   || _         t        | |       |j                  }|j                  xs d|cxk  xr dk  nc xs	 |xr |dkD  }|sX|j                  t        |j                  D cg c]$  }t        |d      rt        |j                        & c}      z   dz
  }|dk  }|s>| j                  |t              z         t        || ||d       | j                  d       nt        || ||d       t        | |        y c c}w )Nrr   r   r   r4   r   justify)r   ri   r  	lineBreakr  r  rz   r   ro   rI   rw   r9   r  r  s           r@   _justifyDrawParaLineXr(     s    BLBvJ^^Vj 6$ 6VD<UZPUEUF..$**%h*QT[\]^fTgj&8*%h!iijkk!

U7^34VRtY7
VRtY7Bw &is   )D 
;D 
c                 0     |rt         nt        | |||      S r   )r$  r(  )rj   rx   r   r{   s       r@   _justifyDrawParaLineXRTLr*    s    B4-BRQUW[\\rB   c                     t        |       }|r?|j                  j                  |j                         |j                  |j
                        S dS Nr   )_wsc_end_searchr   r
   r:   r   r   )rI   rj   r   s      r@   r   r     s;    		BMO2::!!"((*bllBLLIVUVVrB   c                       e Zd ZdZy)_HSFragz!a frag that's followed by a spaceNrV   r[   rB   r@   r/  r/    s    +rB   r/  c                       e Zd ZdZy)_InjectedFragzHa frag that's injected in breaklines and must be removed on reprocessingNrV   r[   rB   r@   r1  r1    s    RrB   r1  c                       e Zd ZdZy)
_SplitFragza split fragNrV   r[   rB   r@   r3  r3    s    rB   r3  c                       e Zd ZdZy)_SplitFragHz.a split frag that's the head part of the splitNrV   r[   rB   r@   r5  r5  #  s    8rB   r5  c                       e Zd ZdZy)_SplitFragHYz:a head split frag that needs '-' removing before rejoiningNrV   r[   rB   r@   r7  r7  (  s    DrB   r7  c                       e Zd ZdZy)_SplitFragHSz'a split frag that's followed by a spaceNrV   r[   rB   r@   r9  r9  ,  s    1rB   r9  c                       e Zd ZdZy)_SplitFragLLz<a frag that is forced to end in - because of paragraph splitNrV   r[   rB   r@   r;  r;  0  s    FrB   r;  c                       e Zd ZddZy)_SHYIndexedStrNc                     |sX|j                  t              }g }|j                  }d}|D ]  }|t        |      z  } ||        dj	                  |      }|d d }t
        j                  | |      }||_        |S )Nr   r'   r   )rH   _shyr   ru   r_   str__new___shyIndices)clsuXaxr<   selfs          r@   rA  z_SHYIndexedStr.__new__5  sz    AAAASV!  
A#2A{{3q!rB   r   )rW   rX   rY   rA  r[   rB   r@   r=  r=  4  s    rB   r=  c                    | j                  d      }t        | t              r_| j                  dd }|d   }|r=t	        |d      r,|j                  |j                  D cg c]  }||z   	 c}       ||z  }t        ||      S |rI||z  }t	        |d      r8j                  |j                  D cg c]  }|z   	 c}       t        ||      S |S c c}w c c}w )zDrejoin two parts of an original _SHYIndexedStr or str that was split-Nr   rB  )rT   
isinstancer=  rB  r   extend)r<   ssrD  rE  rG  _s         r@   _shyUnsplitrO  D  s    	A!N#MM!bEr-(r~~6~!!A#~67GAa""		R2m$HH2>>2>aac>23!!A&&H 7 3s   C-Cc                       e Zd ZdZd Zy)_SHYWordzIa fragword containing soft hyphens some of its strings are _SHYIndexedStrc           
          | d   }d| _         |dk(  rg S d }d}||z
  x}}d }t        | dd        D ]  \  }	\  }
fd}t        |
t              ra |d      }||z   }t        |
j                        D ]0  \  }}|
d | |
|d  }}| ||      z   }||}||kD  }|r n|	||||||f}2 | ||
      z  }n| ||
      z  }||kD  }|s| n |||z
  nd| _         |sg S |\  }	}}}}}}|	dz   }| |   \  }
|
j                  }t        |dz   |d |dz          }| d | |fgz   }||z
  |d<   ||d   z
  |z   g|sg n%t        |||dz   d  D cg c]  }||z
  	 c}      fgz   | |dz   d  z   }t        |      t        |      fS c c}w )Nr   Fr4   c                 F    t        | j                  j                        S r   r
   r   r   )r<   r   s    r@   r   z%_SHYWord.shyphenate.<locals>.<lambda>a  s    ;q!**ajjArB   rJ  )_fswwr   rK  r=  rB  _SplitFragSHY
_SHYWordHS)rH  newWidthr   wwpossibleexceeded	baseWidth
baseWidth0fswwr   tsWshyLenbwjrG  r   r   leftwi1rE  leftsrc   rN  Rr   s                            @r@   
shyphenatez_SHYWord.shyphenateX  s   !W
q5)!)B.	J ab*GAeqAB!N+C'%amm4DAq"#BQ%12%Dr$xKE|ET$x/H !QtUFBH 5 RU"	RU"	$x/D,e# +$ )-(8T*_j
.6+1aeVqSBx1MMtCx$1Q30"I!E#z!!!WV^bQ~eZ[\]^_\_\`ZaLbZaUVQqSZaLb7c4d3efimnpqrnrnsittQA.. Mcs   E;N)rW   rX   rY   rZ   ri  r[   rB   r@   rQ  rQ  V  s
    S$/rB   rQ  c                       e Zd ZdZy)rW  zOa head split frag that requires removal of a hyphen at the end before rejoiningNrV   r[   rB   r@   rW  rW  ~  s    YrB   rW  c                       e Zd ZdZy)rX  z=a fragword containing soft hyphens that's followed by a spaceNrV   r[   rB   r@   rX  rX        GrB   rX  c                 J    	 t        | d   d   t        t        f      S #  Y yxY w)Nr   F)rK  r9   r  )fragss    r@   _processed_fragsro    s*    %(1+uSk22s    "r4   r5      c                 |   dg}|j                   }d}d}| D ]  }||d   z  }t        |t              }|dd D ]m  }|\  }}	|r<||d   u r5|t        |	d   |j                  |j
                        dz   z  }t        |	      }	||u r|t        |d   d   |	      f|d<   b |||	f       |}o  ||d<    t              |      S )z!F should be a list of _SplitFragsr   Nr4   r   r   )r   rK  r7  r
   r   r   rO  _reconstructSplitFrags)
Frh  aRwLenpstyr   rmhyffstyr`  s
             r@   _rejoinSplitFragWordsrz    s    	
A	
BDD!!L)AB%BFCaeAbE#,,s||DtKKNs{k!B%(156"C7   AaD$!!$Q''rB   c                     t        | t              rt        | t              rt        S t        S t        | t              rt        | t              rt        S t        S t
        S r   )rK  rQ  r/  rX  r;  r`   )r   s    r@   rr  rr    sU    CMaPXCY:a0Z qh qOYZ[\cOd:a#=<qCJqjnqrB   c                    fd}g }|j                   }g }t        |       r|j                   }	 | D ]{  }t        |t              r ||       t        |t              r0 ||       t        |t
              sE |t        |             |dd= \|r |t        |             |dd=  ||       } |r |t        |             nmd}d}d}d}| D ]&  }|j                  }|dk7  rt        |_        |rt!        |      }|s1d}t#        |      }|d   t$        v s|sc|r2|j'                  d|        ||rt)        |      n|       |}g }d}d}d}n|xr t        |d   t
              }|s|j'                  dd       n|s|dd D ]  }t*        |v rt-        |      }d}|j                  ||f       |t        ||j                  |j                        z  }|j'                  d|        ||st        |t(              rt/        |      n
t        |             g }d}d} d}|d   }t*        |v rt-        |      }d}|j                  ||f       |t        ||j                  |j                        z  }|s|d   t$        v s|j'                  d|        ||st        |t(              rt)        |      n
t        |             g }d}d}t1        |d      r|j2                  }t5        |d	d      }|rpt1        |d
      r|_        |j9                        }|r/|j'                  d|        ||rt        |      n|       g }d}d}d}t:        |_         |||dfg       d}t<        |_        |s-|r+t        |d   t
              r|d   j                  |df       |j                  |df       t1        |d      s|r"|j'                  d|        ||       g }d}d}d}t>        |_         |d|dfg       d}) |r7|j'                  d|        ||st        |t(              rt)        |      n|       |s| r| d   }t        |_        d|dfgg}|S )z given a Parafrag list return a list of fragwords
        [[size, (f00,w00), ..., (f0n,w0n)],....,[size, (fm0,wm0), ..., (f0n,wmn)]]
        each pair f,w represents a style and some string
        each sublist represents a word
    c                     | d   }t        |t              r.|j                  k7  r|_        |j                        }|| d<   y y y r,  )rK  r   _normalizerr   )r   rn   r   s     r@   _rescaleFragz#_getFragWords.<locals>._rescaleFrag  sL    aDa}}h& (%%h/! ' rB   TNr   r   Fr'   r   r   r   r'  ) r   ro  rK  r1  r3  r/  rz  r7  r
   r   r   rO  rr  rI   _FK_TEXT_fkindrQ   rH   r   insertrQ  r?  r=  rX  r   r   rt   r~  r   _FK_IMG
_FK_APPEND	_FK_BREAK)rn  r   r  rh  rt  WaWr   f0Wlenry  lfr`  tshangingSpacer  hangingStrip
shyIndicesrI   r  whsrn   cbs    `                     r@   _getFragWordsr    s    	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86Lz!}RYZ[R\]A!&JA    %bE19&q)A!%J!A[AJJ

;;DH
2HHQqMjJq4Jx{PWXYPZ[A!&JA8$XXBwq)q!23(0--h7171:1=%*
',&AH1R&zN#(L)AHz!B%'@"aV,!B(K(HHQqMqEAA!&J#(L$Aqf:#i l HHQqMjJq,Bx{JaAAHQrFA
 HrB   c              #     K   | dd  D ]  \  }}t        |d      r|t        |j                  dd      |f /|rJt        |      r|j	                  d      }|D ](  }|t        ||j                  |j                        |f * {|d|f  y w)Nr4   r   r   r   rD   )r   rt   r   r#   rF   r
   r   r   )rn   r   r<   cs       r@   _fragWordIterr  h  s     !"11XWQXXga0!33qzHHV$Qqzz1::>AA  Q'M s   BBc                    g }t        |      dz
  }|t        ||dz            }g }d}d}	d}
| d   d   }t        |       D ]  \  }}}||z   }||kD  xr t        |
xs
 |
 xr ||k        }||us|r{|j	                         }t        |d      r|	|_        |j                  ||	f       |r?t        |
g|z         }|j                  |       |dz  }|}|t        ||dz            }g }|}d}
d}	|}|
|z  }
|	|z  }	|} |j                  ||	f        t        | t              rt        nt        |
g|z         }|j                  |       |S )a  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.
    r4   r   r'   rI   )ru   r   r  boolcloner   rI   r   r3  rK  r/  r9  r5  )rn   r   	maxWidthslinenorh  	maxlinenomaxWidthNextr  	lineWidthfragText	wordWidthr   gcwr  newLineWidthtooLongs                    r@   _splitFragWordr  t  sw    	AIq IS6!845L
AIHI	!QA""Q |x'cD1b9}?aQSUaQa,cA:	Aq !HHa\"	{1}-!'(Yvax)@A!	HAR	A 	+ #, HHa\	?Ag.K)QOAHHQKHrB   uK  (^(?:[a-z0-9\.\-\+]*)://)(?:\S+(?::\S*)?@)?(?:(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}|\[[0-9a-f:\.]+\]|([a-z¡-￿0-9](?:[a-z¡-￿0-9-]{0,61}[a-z¡-￿0-9])?(?:\.(?!-)[a-z¡-￿0-9-]{1,63}(?<!-))*\.(?!-)(?:[a-z¡-￿-]{2,63}|xn--[a-z0-9]{1,59})(?<!-)\.?|localhost))(?::\d{2,5})?(?:[/?#][^\s]*)?\Zc              #      K   d}| j                  |      r||z  }| d d } | j                  |      rd}	 | j                  ||      }|dk  ry |dz  }|| d | z   | |d  |z   f 0w)Nr'   r   r5   r   r4   )endswithfind)urischemeslashtailr   s        r@   _slash_partsr    s     D
,,u
#2h ,,u
 	
A
HHU1Q3	QS!WnSWT\))	 s
   /A%3A%c                 $   t        |       r| j                  d      } t        j                  |       }|sy |j	                  d      }| t        |      d  } |sd| vrdnd}|r| r|| fgng t        t        | ||            z   }|j                          |S )NrD   r4   /\)	r#   rF   uri_patr8   r:   ru   r`   r  reverse)r  r?   r  r  rh  s        r@   _uri_split_pairsr    s    s|3::f-ScATWWQZF
c&kl
CCsNT 
"s63-d<FSX;Y6ZZAIIKHrB   u[   A-Za-zÀ-ÖØ-öø-ɏẀ-ẅḀ-ỿА-яḂḃḊḋḞḟṀṁṖṗṠṡṪṫẛỲỳ   ­u   -­u   ^['"([{¿‘‚“„]+u   []'")}?!.,;:’‛”‟]+$z^[z]+$([z])c
                    t        |      r|j                  d      }t        j                  |      }
|
r |
j	                  d      }|t        |      d  }nd}t        |t              r|d   dk(  rd}|d d }n:t        j                  |      }
|
r!|
j	                  d      }|d t        |        }nd}t        |      |	k  ry ||z
  }t        |      }|K||kD  s|rC|d|z
  |z  k  r8|D ]3  \  }}||z   }||z   }t        |||      }||z   }||k  s(dd|||z
  ||fc S  y t        j                  |      }| rt        j                  |      st        j                  |      rsd|vrot        d||      } | |      D ]W  \  }}||z   }t        j                  |d         sd}|}nd}d}||z   }t        |||      }||z   |z   }||k  sL|||||z
  ||fc S  t        |      }|dk\  r|rd|vrt        j                  |      rnt!        t#        d|d            D ]T  }|dj%                  |d |       z   }dj%                  ||d        |z   }t        |||      }||z   }||k  sIdd|||z
  ||fc S  y y y y y )	NrD   r   r'   r   rJ  r4   rp  r5   )r#   rF   _hy_pfx_patr8   r:   ru   rK  _SplitWordLL_hy_sfx_patsearchr  r
   _hy_shy_patrH   _hy_letters_pat_hy_shy_letters_patreversedranger_   )
hyphenatorr<   rZ  rY  r   r   r   uriWasteReduceembeddedHyphenationhymwlr?   pfxsfxw0rh  r   r`  hwtwHhylenjcjclenr  r   s                            r@   
_hyGenPairr    s   qzqxx'1!Aggajc#hiL!L!aeSjcrFq!''!*C*CH9AC
1v~v	BBA}h;>bQ~5Ex4O.O1EG 8H5"Wx<a2b51,,  	!A--a05H5N5Nq5QVX`aVaC2a=CAaaA$$QrU+CAQx1BBB8|%2b51,, !  	AA!t#!8K8Q8QRS8T%!A,'Abggaen$A!"$AQx1BBB8|!Br"uQq(( ( 9U#trB   c                    dx}}g }|j                   }g }|j                  }t        dt        |             D ]  }| |   \  }}	|j                  dk7  r yt        |d      rt        |j                  dd      r y|	sDt        |	      r|	j                  d      }	 ||	        |t        |	      ||fgz         |t        |	      z  } dj                  |      t        |      fS )ztakes a frag word and assembles a unicode word from it
    if a rise is seen or a non-zerowidth cbdefn then we return
    None. Otherwise we return (uword,([i1,c1],[i2,c2],...])
    where each ii is the index of the word fragment in the word
    r   r4   Nr   r   rD   r'   )rL  r   r  ru   r   r   rt   r   r#   rF   r_   tuple)
FWccplenrE  eXUaUr   r   r`  s
             r@   _fragWordSplitRepr    s     MB
A	
B
A	
B1SW!u16619T1X7188GA#>(1:188F+q
1
3q6Ab6(?
c!f  771:eAhrB   c                 .    t        d | D              g| z   S )zF are the fragsc              3   d   K   | ](  \  }}t        ||j                  |j                         * y wr   rU  ).0r<   rD  s      r@   	<genexpr>z#_rebuildFragWord.<locals>.<genexpr>(  s&     C#!AQqzz!**5s   .0)r  )rs  s    r@   _rebuildFragWordr  &  s    CCDEaGGrB   c           	         t        |      }|sy |\  }}t        |      r|j                  d      }t        j	                  |      }	|	r |	j                  d      }
|t        |
      d  }nd}
t        |t              r|d   d   d   dk(  rd}|d d }n:t        j                  |      }	|	r!|	j                  d      }|d t        |        }nd}t        |      |k  ry |d   }||z
  }t        |      }|||kD  s|r|d|z
  |z  k  r|D ]  \  }}|
|z   }t        |      }||   \  }}|d| }||   \  }}|d ||z
   }|r|j                  ||f       |||z
  d  }||dz   d  }|r|j                  d||f       t        |      }||d   z   |k  sd|t        |      fc S  y t        j!                  |      }| rt"        j	                  |      st$        j	                  |      rd|vr | |      D ]  \  }}|
|z   }t        |      }||   \  }}|d| }||   \  }}|d ||z
   }t        j	                  |d         sd}nd}|s|r|j                  |||z   f       |||z
  d  }||dz   d  }|r|j                  d||f       t        |      }||d   z   |k  s||t        |      fc S  t        |      }|dk\  r|rd|vrt$        j	                  |      rt'        t)        d|d            D ]  }t        |
dj+                  |d |       z         }||   \  }}|d| }||   \  }}|d ||z
   }|r|j                  ||f       |||z
  d  }||dz   d  }|r|j                  d||f       t        |      }||d   z   |k  sd|t        |      fc S  y y y y y )	NrD   r   r'   r   r4   rJ  rp  r5   )r  r#   rF   r  r8   r:   ru   rK  r;  r  r  r  r   r  r  r  rH   r  r  r  r  r_   )r  r  rY  r   r  r  r  rE  r<   r?   r  r  rZ  r  rh  r   r`  posfxr  FLffxsfxlsfxrFRr  r  r  r   s                                r@   _hyGenFragsPairr  *  s   "AfDAqqzqxx'1!Aggajc#hiL"\"r"vay}c'9crFq!''!*C*CH9AC
1v~v	AB	BB 	A}h;>bQ~5Ex4O.O1E!f3B"Xb6S7CF|C:.3r67|1Y1c$Z0$R(ad7H$a 0 444  	!A,,Q/4G4M4Ma4PUW_`U`a=CAaAAa&CsVFBAbB"vHCwB<D$$QrU+r		3tBw-(s2vw<DBqDEBRYYq#d, $A!A$w !,R000' !. 	AA!t#!8K8Q8QRS8T%!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#trB   c                    |d   }|dk(  rg S t        |      dk(  r|d   \  }}	t        |t              rt        |	      }	t	        | |	||||j
                  |j                  |||
      }
|
rM|
\  }}}}}} |rt        nt        ||z   |||z   fg       t        |t              rt        nt        |||fg      gS y t        | ||||||      }
|
rB|
\  }}} |rt        nt        |       t        |t              rt        |      gS t        |      gS y )Nr   r5   r4   )ru   rK  r;  r  r  r   r   r7  r5  r/  r9  r3  r  )r  r  rY  r   r  r  r  rZ  r   r<   rh  r  r  r  r  r   r`  s                    r@   _hyphenateFragWordr    sX   	AB	1uRi
2wz!u1b&QAz1b(Hajj!**Ucdwy~&'#Br2q!8R\[2e8QqtH:MN  QG`jkmnu`vP\  }G  JL  NO  PQ  MR  IS  PT  U  U  JHh~NachiHB18R\[!<>tjY[\cNdlvw=xyyjtvw=xyyrB   c                       e Zd Zy)
_SplitWordNrW   rX   rY   r[   rB   r@   r  r        rB   r  c                       e Zd Zy)_SplitWordEndNr  r[   rB   r@   r  r    r  rB   r  c                       e Zd Zy)_SplitWordHNr  r[   rB   r@   r  r    r  rB   r  c                       e Zd ZdZy)_SplitWordHYz$head part of a hyphenation word pairNrV   r[   rB   r@   r  r    s    .rB   r  c                       e Zd ZdZy)r  z=a word that's forced to end with - because of paragraph splitNrV   r[   rB   r@   r  r    rl  rB   r  c                       e Zd ZdZd ZddZy)_SHYStrz for simple soft hyphenated wordsc                 B   |j                  t              }t        |      dkD  r^t        j	                  | dj                  |            }dg}|j                  }|D ]  } ||d   t        |      z           |dd |_        |S t        j	                  | |      }g |_        |S )Nr4   r'   r   r   )rH   r?  ru   r@  rA  r_   r   __sp__)rC  r<   r  rH  spasprM  s          r@   rA  z_SHYStr.__new__  s    GGDMq6!8;;sBGGAJ/DB))CBrF3r7N# Qr(DK  ;;sA&DDKrB   c           	         d| _         t        t        t        | j                                    D ]  \  }}| d| }t        ||||      }	|s|	| _         ||	z   }
|
|k  s-| j                  |d t        |       gz   }t        t        |      dz
        D cg c]  }| ||   ||dz        }}t        |dz         }| j                  d| |_        |t        t        j                  |            gc S  yc c}w )z{
            baseWidth = currentWidth + spaceWidth + hyphenWidth
            limWidth = maxWidth + spaceShrink
            rS  Nr4   rJ  )rV  r  r`   r   r  r
   ru   r  r  r?  r_   )rH  r   r   r]  limWidthencodingr   r  swswwswnwTrd  r  s                 r@   __shysplit__z_SHYStr.__shysplit__  s    
 $DJ!$y'=">?2 #2Y!"h(Cs$* 38#AB3t9+5A49#a&(ODOqad1QqS6*OAD CB $BQBIwtyy|455 @ Es   C.NrD   )rW   rX   rY   rZ   rA  r  r[   rB   r@   r  r    s    *6rB   r  c                       e Zd Zy)_SHYSplitHYNr  r[   rB   r@   r   r     r  rB   r   c                       e Zd Zy)	_SHYSplitNr  r[   rB   r@   r  r    r  rB   r  c
                     |dk(  rg S t        | |||||||||	
      }
|
r+|
\  }}}}}} |rt        nt        ||z         t        |      gS y r,  )r  r  r  r  )r  r   r   rn   rZ  rY  r   r  r  r  rh  hyr  r  r  r   r`  s                    r@   _hyphenateWordr    sd    	1uRi:q"h(Hn]prwxA"#E2r1a4ad;M!<LMM 	rB   c                    g }|j                   }t        |      dz
  }	d}
|t        |	|         }|t        |	|dz            }t        |       r| j	                  |      } | D ]U  }t        ||||      }||z   }||kD  r4|
s|
s0||k  r+ |t        |
             |dz  }|}|t        |	|         }|}d}
|
|z  }
|}W  |t        |
             |S )z
    split w into words that fit in lines of length
    maxWidth
    maxWidths[lineno+1]
    .....
    maxWidths[lineno+n]

    then push those new words onto words
    r4   r'   )r   ru   r   r#   rF   r
   r  r  )rn   r  r  r  r   r   r  rh  rt  r  wordTextr   r  r  r  r  s                   r@   
_splitWordr    s     	A	
BIq IHYv./HS6!845LqzHHX8HX6 | hxBDTz(#$aKF#H Yv!67HLHA 	  }XHrB   c                 ^   t        | d   t              r| d   }| dd D ]  }t        ||      } |S t        | d   t              rZt        | d   t              rt
        nt        }dj                  d | D              }t        | d   t              r|S t        |dz         S dj                  |       S )z-R can be a list of pure _SplitWord or _SHYStrr   Nr   r'   c              3   J   K   | ]  }t        |t              r|d d n|  y wNr   )rK  r  r  rN  s     r@   r  z$_rejoinSplitWords.<locals>.<genexpr>  s%     L!Qz!L9QsVq@!s   !#rJ  )rK  r  rO  r  r  r@  r_   )rh  rrN  cfr<   s        r@   _rejoinSplitWordsr    s    !A$waD1AAa A 	AaD	&qum4S,GGL!LMqum4qM,qu:MMwwqzrB   c              #   *  K   g }|j                   }| j                  || D ]_  }|d   D ]U  }t        |t              r+ ||       t        |t              rt        |       |d d = >|rt        |       |d d = | W a |rt        |       y y w)Nr4   )r   linesrK  r  r  r  )blParar   stoprh  rt  r	  rn   s          r@   _yieldBLParaWordsr    s     
A	
B\\%%1A!J'1a.+A..!+A..!G  & 	"" 	s   BBc                 N   | j                         }dD ]  }t        ||      st        ||        t        t	        | ||            |_        t        |j
                  d   t              r;t        |j
                  d   t              rt        nt        |j
                  d   _        |gS )N)r  r   rI   r   )r  r   delattrr`   r  rz   rK  r  r  r  r  	__class__)r  r   r  r   rF  s        r@   _split_blParaSimpler     s{    A&1Q<1 '$VE$78AG!''"+l+-7G-L	R^3JrB   c                    g }| j                   || }|D ]  }|j                  D ]  }|j                  |        ||d   us-t        |      dz
  }|dk\  r]t	        ||   d      rNt        ||   j                  dd      s4|dz  }|dk\  r*t	        ||   d      rt        ||   j                  dd      s4|dk\  s||   }|j                  sd|_        |j                  d   dk7  s|xj                  dz  c_         |S )Nr   r4   r   r   r   r1   )r  rz   r   ru   r   rt   r   rI   )	r  r   r  r   r  r	  rn   r   r  s	            r@   _split_blParaHardr  )  s    
ALLt$EAHHQK E"IAqAQ$71Q41'!A$++gVW:XZ[_`Z`Z[!Q$71Q41'!A$++gVW:X!taDvvqvVVBZ_affmf  HrB   c                    |j                   }|s|j                   dk7  r|dk(  }t        |      rw|}|xr t        |v }	|	r|d|j                  t               }t	        ||j
                  |j                        }
|	r|
dt	        t        |j
                  |j                        z  z  }
nd}
|D ]  }|j                  }|xr t        |v }	|	rC|d|j                  t               }|
dt	        t        |j                  |j                        z  z  }
|
t	        ||j                  |j                        z  }
|	s n nd}
|dk(  r|
dz  }
|t        |dd      z  }|s | j                  |j                  |
z
  |      }n6|d   }||j                  z   |j                  |
z   z
  }| j                  ||      }|j                  |j
                  |j                         |j                  t        |d|j                                t        |      r|j#                  |       nc|D ]^  }|j                  |j                  |j                         |j                  |j                          |j#                  |j                         ` | j%                  |       |s9|j'                         |j                  d	z  z   }t)        |||j*                  z
        }|S )
z:draw a bullet text could be a simple string or a frag listr   numericNr   r   r   bulletOffsetYbulletColor333333?)bulletAnchorr$   r   indexr
   bulletFontNamebulletFontSizerI   r   r   rt   	beginTextbulletIndentrightIndentr   r   r   textOutdrawTextgetXr   r   )canvasrx   r   
bulletTextr   rtlr   r  r`  qbulletWidthr   tx2r   bulletStart	bulletEnds                   r@   _drawBulletr2  8  s}   %%L
e  ')	)A.MQ.Aa//0!%a)=)=u?S?STK+{=%BVBVX]XlXl'm!mm+ KFF2 21177=12A3]AJJPQPZPZ)[#[[K{1ajj!**EE   X{c1{	WU?1--Eu11+=eDAE---u/A/A+/MN{E2KK$$e&:&:;WU=ABZJAKK

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

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


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

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

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

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

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

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

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

%%
%E4I4I)IJUM^M^^!J.1B1BB,l;>>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!gfmmFNN&BCe# --6&0Fzz6!!rB   c                 ^   | j                   }t        |      }|sy|dk(  rrt        |      sg|d   }|j                  |j                  t        fdt        |d      rt        |j                  d      D              S |j                  D              S t        d t        |      D              S )z-Attempt to determine a minimum sensible widthr   r4   c              3   8   K   | ]  }t        |        y wr   )r
   )r  rn   fNfSs     r@   r  z%Paragraph.minWidth.<locals>.<genexpr>k  s     l6j{1R+6js   rI   r1   c              3   &   K   | ]	  }|d      yw)r   Nr[   )r  rn   s     r@   r  z%Paragraph.minWidth.<locals>.<genexpr>m  s     :%9qt%9   )rn  ru   ro  r   r   r   r   rH   rI   rz   r  )rH  rn  nFragsr   r  r  s       @@r@   minWidthzParagraph.minWidthb  s    

E
a19-e4aABBlGTUV\L]eAFFC6H6jlllcdcjcj6jlll:]5%9:::rB   c                    |sg S |j                   }||   j                  }|t        |      k7  r||   j                  nt        | j                        }| j                  || }|r,t	        |d   t
              r|d= |rt	        |d   t
              rt	        |d   t              r't	        |d   t              rt        nt        |d   _
        |S r  )r  sFWru   rn  rK  r1  r7  rQ  rX  r;  r  )rH  r  r   r  r  r  sFWNrs  s           r@   _split_blParaProcessedz Paragraph._split_blParaProcessedo  s    BYEl"&E
"2uT{DJJJJs4 Jqu]32aJqu]3aeL),6quX,FjLAbEOrB   c                     | j                   j                  dk(  rt        S t        | j                        st
        S | j                  S r,  )r  r   r  ro  rn  r  r  r  s    r@   _get_split_blParaFunczParagraph._get_split_blParaFuncz  s>    '+{{'7'7':# 	;3CDJJ3O+	;!88	;rB   c           
      8   t        | j                        dk  s|t        k  s	|t        k  rg S t        | d      s| j	                  ||       | j
                  }| j                  }t        | dt        |dd            }|j                  }|j                  }|j                  dk(  r|dvrdx}}	|dk(  rWt        |j                        D ]>  \  }
}t        |j                  |j                  z
  |      }|	|z   }||dz   kD  r n|}	|
dz   }@ n|d	k(  rKt        |j                        D ]2  \  }
}|	|j                  z   |j                  z
  }||dz   kD  r ni|}	|
dz   }4 n_t        d
|z        |}|dk(  rt        |d|j                   z        }n|d	k(  rd|j                   z  }t#        |t%        |      z        }||z  }	t        | dt        |dd            }|s|dk  s|dk(  r| `g S t        |      }t        | dt        |dd            }||k  r| gS |s||dz   k(  r|r|dk(  s|dkD  r|dz  }n| `g S | j'                         }|j(                  rt+        |      }d |_        n|}| j-                  d || j.                   ||d|            }t1        d|j                  d| ||      |_        t3        |j                  |dz
     t4              xr: t        |j                  |dz
     d      xr |j                  |dz
     j6                   |_        d|_        |	|_        ||_        |j@                  dk7  rt+        |      }d|_         | j-                  d |d  ||||            }dD ]=  }t        | |      stC        ||t        | |             tC        ||t        | |             ? ||gS )Nr   r  r   r'   r4   r  r   r   r   r  r   allowOrphansallowWidowsrp  )r+  rn  )r   r  aHr  r'  )r   )"ru   rn  r   r   r  r  r   rt   r   r  r   r   r   r   r   r  r   r  r9   r  r   r   r  r+  r   rK  r   r'  _JustifyLast
_splitparar   r   r4  setattr)rH  r  r  r  r   r   r   r  r<   r   r   r	  r   r  r  r  r  style1P1P2rF  s                        r@   rH   zParagraph.split  s   tzz?AE!1[5Fr	 tH%IIj-

d=}R1PQ--;;>k;NAE!$V\\2CAaAHHQYY.w7AqAT))F!A 3 e#$V\\2CAaqxx		1AT))F!A 3 !!?+!MNNAE!ENN 23e#&Ka()AqSFtN75PQ3RSA!Q$IJd=}Q1OPa46M!A#v QTacFAI))+==e_F!FNF>>$vtFSTUVGW>X16<<!+<zZ	  *&,,qs*;HE  @$+FLL1,={$K @$*LL1$5$?$?A 	  A%UOE$%E!>>$u4q;K>LAtA1WT!_-1WT!_-	 2wrB   c                 :    | j                  | j                         y r   )drawParar  r  s    r@   drawzParagraph.draw  s     	djj!rB   c                     d| _         t        |t        t        f      s|g}n|}g }dx| _        }t        |      dz
  }| j                  }t        t        |j                        j                        }t        |dd      }|r`t        |      r<|j                         }|r't        r!t        j                  |      j                   }nd}nt#        |      st%        d|z        d}|j&                  }	|j(                  }
|
dkD  }|j*                  }|j,                  }|xs |	xs |
}|rt        |dt.              }dx| _        | _        t5        | j6                  ||       |d   }t        | d	t        |d	d            }|d
v}| j8                  }t        |      }|dk(  rb|j:                  sUt=        |d   d      sEt=        |d   d      s5t?        |      s)|s&|d   }|j@                  }|j                  }tC        ||      \  }}t=        |d      r9t        |jD                        }|s|jG                  dg |||      S tI        |      }n9|jJ                  dd }|D ]  }t        |      s n |jG                  dg |||      S tM        d||| jN                        }||z  }g }| } tM        d||| jN                        }!d}"|r|jQ                  d      }#|#st        |#tR              rd}"ntT        |#v rtW        |#      }#tM        |#||| jN                        }$| |z   |$z   }%||t        |      z  z   }&|%|&kD  rt        |#tX              s|"st        |#tV              r|#j[                  ||| |z   |!z   dz
  |&| jN                        }'|'r|'|dd | xj2                  dz  c_        d}"t        |      r|t]        ||         }(|s|#j^                  |!z   dz   |(k  r|#j[                  ||d|!z   dz
  |(| jN                        }'|'r|#g|dd d}"d}#| }%n|rt        |dd       })ta        |)r|nd|||#|$|%|&|)r|	nd|
xr |)
      }'|'r|'|dd | xj2                  dz  c_        d}"|r9t        |      r.ta        |)r|nd|||#|$|$||)r|	nd|
xr |)|
      }'|'r|#g|dd d}"| }%d}#|rlt        |#tR              s\|"sZt]        ||      }*|$tc        ||*|*dz          kD  r:te        |#| |z   ||||| jN                        |dd | xj0                  dz  c_        d}">|%|&k  st        |      r|"r`|#r|jg                  |#       |"rHd}"|%| j                   kD  r|%| _         |jg                  ||%z
  |f       g }| } |dz  }|t]        ||         }nH|%} nE| | j                   kD  r| | _         |jg                  || z
  |f       |#g}|$} |dz  }|t]        ||         }|r|g k7  r,| | j                   kD  r| | _         |jg                  || z
  |f       |jG                  d||||      S |dk  rGti        d|j@                  |j                  |jj                  |j@                  d|j@                  z  g       S |jl                   }+g }g },|,jf                  }-to        ||      }.|r|.D /cg c]  }/tq        |/       }.}/d}0|.	rc|.jQ                  d      } |-|       |d   d   }|j                  }|j@                  }|sdx}1x}} |}2tC        ||      \  }3}4|d   }$|d   d   }|$dkD  r	 z   |$z   }%n }%|jr                  tt        k(  }5|}&|rl}6|D ][  }7|7jr                  tv        k(  s|7jD                  jy                  d      }8|8s5|6|8tM        d|7j                  |7j@                        z  z  }6] |6|z  }6|&|6z  }&|5s|%|&kD  rt        |tz              st=        |d      st        |t|              r|j                  |%|&      }'|'ra|'|.dd |.j                  dt        d|jG                  tt        d      dfg             |,jQ                  d       | xj2                  dz  c_        t        |,      dkD  rp|t]        ||         }(|s|j^                  dz   |(k  rL|j                  |$|(      }'|'r7t        d|jG                  tt        d      dfg      |g|.dd |,jQ                  d       %|rt        |dd       })t        |)r|nd||%|&|)r|	nd|
xr |)      }'|'ra|'|.dd |.j                  dt        d|jG                  tt        d      dfg             |,jQ                  d       | xj2                  dz  c_        |rit        |,      dkD  r[t        |)r|nd||$||)r|	nd|
xr |)|      }'|'r<t        d|jG                  tt        d      dfg      |g|.dd |,jQ                  d        |rt        |t              st]        ||      }*|$tc        ||*|*dz          kD  rst        ||z
  | z
  ||      |.dd |.j                  dt        d|jG                  tt        d      dfg             |,jQ                  d       | xj0                  dz  c_        |%|&kD  xr 1dkD  xs |5}9|9s|5r|d   d   }:|:r1dz  }1|j@                  }|rp|jr                  t        k(  rCt        t        |j                  j                  |      |j                  j                  |      \  }}n3tC        |j                  |      \  }}ntC        |j                  |      \  }}tc        2|      }2tc        3|      }3t]        4|      }4|s|jG                         };|;g}|:|;_"        nt        ;|      srgt        |      dz
  }<|<dk\  rT||<   }7|<dz  }<|7jr                  tv        k(  r1|7jD                  j                  d      s|7xjD                  dz  c_"        n|<dk\  rT|jG                         };|jg                  |;       |:|;_"        narJ|;jD                  j                  d      s|;xjD                  d|:z   z  c_"        n+|;xjD                  |:z  c_"        n|;xjD                  |:z  c_"        t        |t              rtM        d||      nd}d}=|dd D ]  }<|<d   jG                         };|<d   |;_"        |;jD                  rd}=|jg                  |;       |;j@                  }|rp|;jr                  t        k(  rCt        t        |;j                  j                  |      |;j                  j                  |      \  }}n3tC        |;j                  |      \  }}ntC        |;j                  |      \  }}tc        |2|      }2tc        |3|      }3t]        |4|      }4 |:s|=r1dz  }1|%} nq|5r7|jG                         };|jg                  |;       |+xr t        |t               }>nd}>| | j                   kD  r| | _         |jg                  t        || z
  1|>|234||0	             t        |,      dz
  }0|dz  }|t]        ||         }|5rg }t        |t              rtM        d||      nd}||z  }|$} d}1|jG                         };|;j@                  }2|rp|;jr                  t        k(  rCt        t        |;j                  j                  |      |;j                  j                  |      \  }}n3tC        |;j                  |2      \  }3}4ntC        |;j                  |2      \  }3}4|;g}|d   d   |;_"        |dd D ]  }<|<d   jG                         };|<d   |;_"        |jg                  |;       |;j@                  }|rp|;jr                  t        k(  rCt        t        |;j                  j                  |      |;j                  j                  |      \  }}n3tC        |;j                  |      \  }}ntC        |;j                  |      \  }}tc        |2|      }2tc        |3|      }3t]        |4|      }4 |.r	c|r< | j                   kD  r| | _         |jg                  ti        || z
  1d|234||0	             |,| _        ti        d|      S c c}/w )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   r4   hyphenationLangr'   )langNzLhyphenator should be a language spec or a callable unicode -->  pairs not %rr!   r   r  r   r   rI   )r   r  r   r   r   r1   rJ  r   )r  nobrF皙ɿ)r   r   r   r   r   r   r  r   )r  rI   r5   )	r  r  r'  rz   r   r   r   r   r  r  )N
_width_maxrK  r  r`   r   ru   r   r  r   r   isShapedrt   r$   r7   pyphenPypheniteratecallabler  r  r  spaceShrinkagesplitLongWordsr!   _splitLongWordCount_hyphenationsr7  r+  rn  r   r   ro  r   r   rI   r  rH   rz   r
   r  popr  r?  r  r  r  r   rV  r  r   r  r   r   r   justifyBreaksr  r   r  r  r  rm   r5  rQ  ri  r  r1  r  r3  r  r  r   r   r   r   r%   r  r/  r   )?rH  r   r  r  r  r  r   shapingr  r  r  hyphenation2r  r  attemptHyphenationr  r   r   r  rn  r  r   r   r   r   r   rI   rz   rn   
spaceWidthdSpaceShrinkcLiner  hywforcedSplitwordr  rY  r  hswnMWhyOknmwnjlbvr  aFW_wordsrN  r  r  r  r  r  r'  spaceShrinkwinsr  nTextr  r   nillbs?                                                                  r@   r  zParagraph.breakLines  s   @ %t-E7yi  f	N1$	

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

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

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

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

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

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

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

1::qzz7;1Xa[a(6VQY#e*U*:"HRUH=::",Xb"9BK046BE6B#B6$BHBD$BH$BHFFBG#$;;BL$&BMz)B *,q"zz&q"b"ajjAvv}QB; #1f-"1Xa[ %a#0#;QV##e*U2B%*H #R!b% J":-$j0H1b::*1eRQZZH66=BB#? . #1f- %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FE2("5#zz22"&&(R\!!  "]]
 *"  !,#zz,6)R\Qx(6VQY$..*>"HRx0b! q&)A 8D,7CHEdnnU.B!&Xa[$9!"% * OOB! rB   c                 j   t        | dd      }|rg }|j                  }t        |      r6|D ]0  }|dd D ]  \  }} ||        t        |t              s) |d       2 n&|D ]!  }t        |d      s ||j                         # dj                  |      S |rt        | dd      }|t        |       }|S y)z`Convenience function for templates which want access
        to the raw text, without XML tags. rn  Nr4   r1   rI   r'   )	rt   r   ro  rK  r/  r   rI   r_   r  )	rH  identifyrn  plainsplains_appendr  r   rI   r  s	            r@   getPlainTextzParagraph.getPlainText~
  s     WT*F"MMM&!D&*12h
d%d+ '/!$w/%c*	 " "DtV,%dii0 " 776?"4t,D|DJTKrB   c                     t        | d      sJ d       | j                  j                  r| j                  fd}n| j                  fd}t	        t        || j                  j                              S )zConvenience function; tells you how wide each line
        actually is.  For justified styles, this will be
        the same as the wrap width; for others it might be
        useful for seeing if paragraphs will fit in spaces.r   z%Cannot call this method before wrap()c                      || j                   z
  S r   )r  r  rn   s     r@   r   z0Paragraph.getActualLineWidths0.<locals>.<lambda>
  s    a$//.ArB   c                     || d   z
  S r,  r[   rA  s     r@   r   z0Paragraph.getActualLineWidths0.<locals>.<lambda>
  s    a$q'krB   )r   r  r   r   r`   rf   r  )rH  r  s     r@   getActualLineWidths0zParagraph.getActualLineWidths0
  s[    
 tW%N'NN%;;"&**AD"&**9DCT[[../00rB   c                    dg}|j                   }t        |       D ]  \  }}|rg |d|d   z         |dd  D ]H  } |dt        |d         z          |d|d   z          |d||j                  j                  fz         J  |d       o |d	|d   d
j                  d |dd  D              ||j                  j                  fz          |dz  }|d|z   j                  |      z   S )N[z    [%r,r   r4   z        (%s,)z        %r),z    ], #%d %sz    ]z[%r, %s], #%d %s, c              3   b   K   | ]'  }d |d   j                   j                  d|d   d ) yw)r  r   ,r4   )N)r  rW   )r  r  s     r@   r  z&Paragraph.dumpFrags.<locals>.<genexpr>
  s.     8vpujlbeooF^F^_abc_d9epus   -/r1   r)   )r   r   r  r  rW   r_   )rn  r6  fullrh  rt  r   r   r  s           r@   	dumpFragszParagraph.dumpFrags
  s   EXXU#CAa:!$%AB%Bbe45~1-.!AKK,@,@)AAB   7%1dii8vpqrsrtpu8v.wxyz{  {F  {F  {O  {O  )P  P  Q $ 3JDF==###rB   )NNNr4   rD   r   r   )   F)rW   rX   rY   rZ   r  r  r  r  r  r  r  rH   r  r  r  r$  r  r>  rC  staticmethodrK  r[   rB   r@   r   r     sp    =|n.'"R;	;
Sj"^2@(:T)U"n2
1 $ $rB   r   __main__c                    t        dt        |       z         | j                  j                  }t        j
                  j                  }t        |      D ]  \  }}||   }t        |d      r|j                  }n|d   }t        |      } |d||t        t        |dd            fz         t        |      D ]   } |d|t        ||   d||         fz         " t                 y )	Nz$dumpParagraphLines(<Paragraph @ %d>)rz   r4   zline%d: %d(%s)
  r  Unknownz %d:'%s'rI   )printidr  r  sysstdoutwriter   r   rz   ru   r@  rt   r  )Pr  outwr	  r   rz   nwordsrn   s           r@   dumpParagraphLinesrZ  
  s    4r!u<=zz&FAd8DtG$

QZF%6#gd;y6Y2Z([[\6]Z758F58#D EEF #G 'rB   c           	          d| d   z  g}dD ]5  }t        | d   |      s|j                  |dt        | d   |             7 dj                  |      S )Nz'%s'r4   )	r   r   r   r   rO  striker   r   r'  r   =rF  )r   r   rt   r_   )rn   rh  rF  s      r@   fragDumpr^  
  sT    QqTM?sAqtAAgad1o67 t yy|rB   c                 \   t        dt        |       | j                         fz         | j                  }t	        |      }t        |      D ]f  }t        d|||   j                  dj                  ||   j                  D cg c]   }|t        k7  s|dt        ||   |      " c}      fz         h t        j                  j                  }d}d}t        |d      D ]H  }||d   z  } |d|||d   fz         |dd  D ]  } |d	t        |      z          t                |dz  }J y c c}w )
Nz6dumpParagraphFrags(<Paragraph @ %d>) minWidth() = %.2fzfrag%d: '%s' %sr1   r]  r   ih  zfragword%d: cum=%3d size=%dr4   z (%s))rR  rS  r  rn  ru   r  rI   r_   r  rt   rT  rU  rV  r  r^  )	rW  rn  r  r	  rY  rX  cumr  rn   s	            r@   dumpParagraphFragsra  
  sL   F"Q%QRQ[Q[Q]I^^_u:qA#q%(--mrstmum~m~  BKm~hi  CD  FJ  CJQwW\]^W_`aObBcm~  BK  9L  'M  M  N  zzuS)A1Q4KC.!S!A$?@qrUWx{*+ GFA * BKs   >D)D)c           	         t        t        j                  d   t              ri g j                  }fd}t        j                  D ]  } | ||              t        d       t        dj                  d t        j                               D                     t        t        ddj                  |j                        d       t        d       y y )	Nr   c                 "   g j                   }| dd  D ]?  }t        |d         }|vrt              |d   f|<    |d|   d   d|d   d       A d| j                  j                  d| d   ddj                  |j                        d	S )
Nr4   r   z(__frag_z__, rI  r  r  rF  z]),)r   rS  ru   r  rW   r_   __self__)rn   r`  rN  fid_Fs       r@   	_showWordz%dumpProcessedFrags.<locals>._showWord
  s    II12AQqT(C"}#&r71Q4.3RWQZ!=>	 
 34++2F2F!diiXYXbXbNcddrB   zfrom reportlab.platypus.paragraph import _HSFrag, _SplitFragHS, _SplitFragHY, _SplitFrag, _getFragWords
from reportlab.platypus.paraparser import ParaFrag
from reportlab.lib.colors import Colorr)   c              3   &   K   | ]	  }d |z    yw)z__frag_%s__ = %rNr[   r  s     r@   r  z%dumpProcessedFrags.<locals>.<genexpr>
  s     Q=P/!3=Pr  z=[
z  ]z%print(_getFragWords(processed_frags)))rK  r  rn  r`   r   rR  r_   rv  rW  processed_fragsrd  )rW  r   _Srg  rN  rf  s        @r@   dumpProcessedFragsrk  
  s    bhhqk$'BBe XX9Q<    X  Y$))QVBIIK=PQRS2;;9OPQ9:! (rB   )getSampleStyleSheetr   )cm4c                 4    d|v xs d|v xs t        |       |v S )Nall*)r@  )r   TESTSs     r@   flaggedrs  
  s"    ~@@Q5@rB   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Ӆ@rM  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)rv  align   
   u   a b cÂ d e f   a  This page tests out a number of attributes of the <b>paraStyle</b><onDraw name="_indexAdd" label="paraStyle"/> tag.
This paragraph is in a style we have called "style1". It should be a normal <onDraw name="_indexAdd" label="normal"/> paragraph, set in Courier 12 pt.
It should be a normal<onDraw name="_indexAdd" label="normal"/> paragraph, set in Courier (not bold).
It should be a normal<onDraw name="_indexAdd" label="normal"/> paragraph, set in Courier 12 pt.r  Courier)r   r   )r   g֣p=
w{@i'  )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   )r1   rL  )Tr  )ri  )__all____version__rZ   stringr   operatorr   unicodedatar	   reportlab.pdfbase.pdfmetricsr
   r   r   reportlab.pdfbase.ttfontsr   reportlab.platypus.paraparserr   r   r   r;   r   reportlab.platypus.flowablesr   reportlab.lib.colorsr   reportlab.lib.enumsr   r   r   r   reportlab.lib.geomutilsr   reportlab.lib.textsplitr   r   reportlab.lib.stylesr   copyr   reportlab.lib.abagr   reportlab.rl_configr   r   r    r!   reportlab.lib.utilsr"   r#   r$   reportlab.lib.rl_accelr%   retypesr&   r  r_   rN   compileescaperH   rG   r  r-  rA   r7   rQ   rT   r   r   rd   r   ri   ro   r~   r   r   r   r   r   r   r   r   r   r  r   r  r"  r$  r(  r*  r   r`   r/  r1  r3  r5  r7  r9  r;  r@  r=  rO  rQ  rW  rX  ro  r  r  r  r  rz  rr  r  r  r  Ir  r  r  _hy_lettersr?  _hy_shyr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r2  r7  r>  rM  r^  rj  rn  rr  ry  r  r  r  r  r  r   rW   rZ  r^  ra  rk  rl  reportlab.lib.unitsrm  rT  argvrr  rs  
styleSheetBr   r   rI   rW  r  r  r  rn   r   r  r<   rR  r  h0chrru   r  r  r[   rB   r@   <module>r     s*	  	
 3     O O 3 ] ] 1 & H H 1 ? /  #  : : + 	  
ww  @ bjj)"))D/1288

8YRYYt_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* 
bjjABbjjCD

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