
    w9h                       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mZmZmZmZmZmZmZ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/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z= ddl>m?Z? ddl@Z@ddlAmBZB 	 ddlCZCdj                  d      ZE e@j                  d e@j                  eE      z        j                  ZI e@j                  d e@j                  eE      z        j                  ZKddZLddZHd ZMd ZNd  ZO G d! d"e4      ZP G d# d$e4      ZQd% ZRdd&ZSd' ZTd( ZUdd)ZVdd*ZWdd+ZXdd,ZYdd-ZZd. Z[d/ Z\d0 Z]d1Z^d2Z_d3 Z`dd4Zadd5Zbdd6Zcdd7Zddd8Zedd9Zfd: Zg G d; d<eh      Zi G d= d>eh      Zj G d? d@eh      Zk G dA dBek      Zl G dC dDel      Zm G dE dFekei      Zn G dG dHen      Zo G dI dJep      ZqddKZr G dL dMeh      Zs G dN dOesem      Zt G dP dQesen      ZudR ZvdZwdSZxdTZydUZzdV Z{dW Z|ddXZ}dY Z~dZ Z e@j                  d[e@j                         Zd\ Zd] Zd^Zd_Zd`Z e@j                  da      Z e@j                  db      Z e@j                  dj                  dceddf            Z e@j                  dj                  dceeddf            Z e@j                  dj                  deedff            Zdg Zdh Zdi Zdj Ze9fdkZ G dl dmep      Z G dn doe      Z G dp dqe      Z G dr dse      Z G dt duep      Z G dv dwep      Z G dx dyee      Z G dz d{ee      Z G d| d}eh      Ze9fd~ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z e@j                  d      Zd Zd Zd Zd Z G d dep      Zd ZddZd ZddZd Z G d de"      Zedk(  rnd Zd Zd ZddZddl/mZm0Z0 ddlmZ ddlZejt                  dSd Zeg k(  rdgZefdZ e       Zed   Z e0de      Zde_         edS      rldZ eee      Z ee«       d\  ZZej                  eeī      \  ZZ ee«       ej                  eeī      ZeD ]  Zeɐj                  eeī        eeɫ       dZČ!  edT      r2 eded         Z ee«       ej                  dd      \  ZZ ee«        edU      r4dZ eeed         Z ee«       ej                  dd      \  ZZ ee«        ed      rdZdZdZ eee      Z ee«       ej                  eeī      \  ZZ edeeǫ        ee«       ej                  eeī      Z eed          ed   j                  eeī      \  ZZ edee̫        eed           ed      rGd ed      d ed      dZ eeed         Z ee«       ej                  dd      \  ZZ ee«        ed      r;dD ]6  Z eeed   d      Z ee«       ej                  dd      \  ZZ ee«       8  ed      r4dZ eeed         Z ee«       ej                  dd      \  ZZ ee«        ed      rdZ eeed         Z ee«       ej                  dd      \  ZZ ee«       ej                  dedz        Z e eeȫ              eed           eed          edS   j                  dd        eedS           eedS           edë      rCdZ ee e0ded   e)ƫ            Z ee«       ej                  dez  dz
  d      \  ZZ ee«        edȫ      rCdZ ee e0ded   e)ƫ            Z ee«       ej                  dez  dz
  d      \  ZZ ee«        edʫ      r;dZ ee e0dddȬΫ      ϫ      Z ee«       ej                  ddѫ      \  ZZ ee«        edǫ      rHddlmZ ddl	mZ  e eddի              e edd׫             dZ ee e0dddȬΫ      ϫ      Z ee«       yyy#  dZCY xY w))	ParagraphcleanBlockQuotedText	ParaLinesFragLinez3.5.20z%The standard paragraph implementation    )
whitespace)truth)category)stringWidthgetAscentDescentgetFont)
rtlSupportbidiTextbidiWordList	isBidiStrbidiStrWrap
isBidiListBidiListbidiListWrap	BidiIndexbidiFragWordinnerBidiStrWrap)shapeFragWord)
ParaParser_PCT_num_re_us_value)Flowable)Color)TA_LEFTTA_RIGHT	TA_CENTER
TA_JUSTIFY)normalizeTRBL)	wordSplitALL_CANNOT_START)ParagraphStyle)deepcopy)ABag)decimalSymbol_FUZZparaFontSizeHeightOffsethyphenationMinWordLength)
_classNameisBytesisStr)sameFragN)
MethodType )	
    u    u    u    u    u    u    u    u    u    u    u    u    u   ​u    u    u    u    u   　z[%s]+z[%s]+$c                     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       V/var/www/kjolmonster/venv/lib/python3.12/site-packages/reportlab/platypus/paragraph.py_usConvrL   O   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      rK   rS   rS   ]   sb    t}T[[0dWU^U\\&5IU7<}SWd 3]a]g]ghm]npeEppps   	A+c                 d    t        |       r| j                  d      } | j                  t              S NrO   )r.   rQ   rB   _wscrT   s    rK   rB   rB   b   s%    t}T[[0d::drM   c                 d    t        |       r| j                  d      } | j                  t              S rX   )r.   rQ   lstriprY   rZ   s    rK   r\   r\   f   %    t}T[[0d;;trM   c                 d    t        |       r| j                  d      } | j                  t              S rX   )r.   rQ   rstriprY   rZ   s    rK   r_   r_   j   r]   rM   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__ rM   rK   r   r   n       rM   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.
    Nra   rf   rM   rK   r   r   y   rg   rM   r   c                 v    dj                  t        t        t        t	        t        |                               S )Nr<   )joinlistfilterr   rS   rB   Ls    rK   
_lineCleanro      s%    88DeE!Ho6788rM   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.r4   )rk   rl   r   mapro   rS   rj   )rT   joinerrn   s      rK   r   r      s6     6%SU4->?@ABA;;q>rM   c                 <    |dkD  s|dk  r| j                  |       y y )Ngư>gư)setXPos)txdxs     rK   rt   rt      s    	$w"U(


2 rM   c                 \    t        |       r| j                  d      S | j                  d      S )Ns    rP   )r.   count)ws    rK   
_nbspCountrz      s&    qzww{##wwvrM   c                 n   |dkD  xs t        | dd      }dj                  |      }t        | |       |st        |      t	        |      z   dz
  }|dk  }|r| j                  |d       n@| j                  |t              z         | j                  |d       | j                  d       t        | |        |S N:0yEpreformattedFr<   r?   r   )getattrrj   rt   lenrz   _textOutsetWordSpacerD   )ru   offset
extraspacewordslastsimplerT   nSpacess           rK   _leftDrawParaLiner      s    AN5!AF88E?DBve*Z--a/!
D

U7^34
D
BwMrM   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 )Nr}   r~   Fr<   r?   r         ?r   rj   r   rz   rt   r   r   rD   	ru   r   r   r   r   r   rT   r   rJ   s	            rK   _centerDrawParaLiner      s    AN5!AF88E?De*Z--a/!S:%%1
D

U7^341
D
BrNHrM   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 r|   r   r   s	            rK   _rightDrawParaLiner      s    AN5!AF88E?De*Z--a/!Z1
CHHUOA&

U7^341
D
BrNHrM   c                    t        | |       dj                  |      }t        | dd      xs d|cxk  xr dk  nc xs	 |xr |dkD  }|st        |      t	        |      z   dz
  }|dk  }|r| j                  |d       n@| j                  |t              z         | j                  |d       | j                  d       t        | |        |S )Nr<   r~   Fr}   :0yE>r?   r   )rt   rj   r   r   rz   r   r   rD   )ru   r   r   r   r   rT   r   r   s           rK   _justifyDrawParaLiner      s    BvHHUODb.i53IT3IitOhXbchXhFe*Z--a/!
D

U7^34
D
BwMrM   c                 2     |rt         nt        | ||||      S N)r   r   )ru   r   r   r   r   s        rK   _justifyDrawParaLineRTLr      s    @$,@"fjZ_aeffrM   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       rK   	imgVRanger      s    	:~	!	!qj	X#h,q.#--	'	'X%	W(l	U8m	%	&  *s1u9rM   c                 @    t        | d      r| j                  |      S | S )Nr   r   )vnvs     rK   imgNormVr      s#    q"#  $$rM   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   rT   .fontNamer   	textColor	backColordy)endDotsr/   r   r   r   r   r   )styledotsrT   r   r   r   r   r   s           rK   _getDotsInfor      s    ==DT{>>>>OO	OO	tF3'4
5>>:4
5>>:DU__=	DU__=	T$q!)Ib88rM   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   rf   )argskwdss     rK   <lambda>z_putFragLine.<locals>.<lambda>  s    rM   )minmaxr   r   
_wordSpacer   cbDefnimgauto)maskanchorzMissing z callback attribute '')ru   cur_xcur_yleadingxslabelr2   r?   endg?startr   r<   RTLrightleftF)r   )Fr   r~   	XtraStater   _x0autoLeadingr   
leftIndentr   _56ascent_16descent_leading
setLeading_olb	_oleadingabssetTextOriginr   us_lineslinks	enumerater   r   kind	_fontsizer   r   r   width	paraWidthheightr   valign_canvas	drawImageimagert   namebookmarkHorizontalAttributeErrordict_curr_tx_info	_fontnamesetFontr   r   r   rise_trailingSpaceLengthrT   _setFontsetFillColorsetRisesetlinkr   r   backColor_x
backColorsappendr
   rx   rz   r   wordWrap_do_dots_fragmaxWidth	_x_offset)9r   ru   liner   pKind
linkRecordr~   r   r   x0r   r   dalr   r   olbxcywsr   r   ALLLr   r   ifr   r   txfsry   r   iy0iy1cur_x_sr   funcend_xr   r   r   SNSnLLeLLlnALeALrT   l0fsmaxnlonhilohibgtxtlenr   s9                                                            rK   _putFragLiner    s   M*DEJ??L	BHHE	B..KjjG	R]]E

&C
WT[[1F#g+t||m4G[[F||mG.	{{G
g
gg?f*C||W$2<<//3u9~d"  E* '/	L	#BGJJE	B	B{{HHHE%  k811XXXF;;DU{||<88,,DV\\",,7V]]40#AfmmD9C'"*,

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

4  QZZG_1f"f 4A"*1+e"3HQK4QVV|G[1f"f (A$Qx~E!Hq'( 66DKKQ%)^,QZZ JA#$Xi"@"IHQKJZZ 3A (IB~&((l3
 X%C/CQVV| *A !%yS0E!Hq)* VV >A!&qJBB2vR#%c#bk#c"+#=a>
 ;t,B",,!!(MM((2>>5",,*OQ#'BL[[",,.",,2LMM((2>>5",,*OQ#%BL%,BNZZ++D",,MFVOEtzz#z$'777GWk8Z WQYN"G  88e#g~eGDMM"R@F]LLE%U
BG	 	/A"1+w.HQK	/ 
 	 AQx(E!Hq	  
||
r~~wEG	vvrz2bff9 I JJ4s   &a55bc                    t        |j                        \  }}}}	}
}|j                  j                  |||      }||z   |k  r|j                  |k7  s|j
                  |k7  r|j                  ||       |r|t        |d|j                        z  }|j                  d|j                  |z          t        ||| z
         t        ||z
  |z        }t        ||||z  z
         |j                  |	k7  r|j                  |	       |
r|j                  j!                  | ||
f       |j#                  ||z  d       |r*|j                  |j                  |j                  |z
         y y y )N_dotsOffsetXr   r?   )r   r   r   r
   r   r   r   r   r   r   r   rt   intr   r   r   r   r   )r   r  r   r   ru   r   rT   r   r   r   r   r   r  ns                 rK   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  rM   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 )Nr}   r~   Fr   r?   r   r   )r   rt   
extraSpacer   	wordCountsumr   r   rz   rT   r  r   rD   ru   r   r   r   r%  r   ry   r   s           rK   _leftDrawParaLineXr)    s    BLBvJCnU!CF..$**%hQT[\]^fTgj&8%h!iijkk!VRtV4

U7^34VRtV4
Bw &is   C+
&C+
c           
      D   || _         || j                  z   | _        	 |j                  }|dkD  xs t	        |dd      }|sX|j
                  t        |j                  D cg c]$  }t        |d      rt        |j                        & c}      z   dz
  }|dk  }|r.|d|j                  z  z   }t        | |       t        || ||d       n?|}| j                  |t              z         t        || ||d       | j                  d       t        | |        | `y c c}w # | `w xY w)	Nr}   r~   Fr   r?   r   r   center)r   r   r!  r%  r   r&  r'  r   r   rz   rT   rt   r  r   rD   	ru   r   r   r   r%  r   ry   r   rJ   s	            rK   _centerDrawParaLineXr-    s   BLrvvoBO__
E!GWT.%GnnSdjj)lX_`abjXk*QVV*<)l%mmnooGaZFs4??**ABqMBd84AOOJw78BdH5OOAA2O *m Os%   A D D
/D
BD D Dc           
         || _         |j                  }|dkD  xs t        |dd      }|sX|j                  t	        |j
                  D cg c]$  }t        |d      rt        |j                        & c}      z   dz
  }|dk  }|r+||j                  z   }t        | |       t        || ||d       n?|}| j                  |t              z         t        || ||d       | j                  d       t        | |        y c c}w )Nr}   r~   Fr   r?   r   r   )r   r%  r   r&  r'  r   r   rz   rT   rt   r  r   rD   r,  s	            rK   _rightDrawParaLineXr/    s    BLJCnU!CF..$**%hQT[\]^fTgj&8%h!iijkk!4??"1Qr4w/

U7^34QD$0
BrN &is   C<
C<
c           
      
   || _         t        | |       |j                  }|j                  xs d|cxk  xr dk  nc xs	 |xr |dkD  }|sX|j                  t        |j                  D cg c]$  }t        |d      rt        |j                        & c}      z   dz
  }|dk  }|s>| j                  |t              z         t        || ||d       | j                  d       nt        || ||d       t        | |        y c c}w )Nr}   r   r   r?   r   justify)r   rt   r%  	lineBreakr&  r'  r   r   rz   rT   r   rD   r  r(  s           rK   _justifyDrawParaLineXr3    s    BLBvJ^^Vj 6$ 6VD<UZPUEUF..$**%hQT[\]^fTgj&8%h!iijkk!

U7^34VRtY7
VRtY7Bw &is   )D 
;D 
c                 0     |rt         nt        | |||      S r   )r/  r3  )ru   r   r   r   s       rK   _justifyDrawParaLineXRTLr5    s    B4-BRQUW[\\rM   c                     t        |       }|r?|j                  j                  |j                         |j                  |j
                        S dS Nr   )_wsc_end_searchr   r
   rE   r   r   )rT   ru   r  s      rK   r   r     s;    		BMO2::!!"((*bllBLLIVUVVrM   c                       e Zd ZdZy)_HSFragz!a frag that's followed by a spaceNra   rf   rM   rK   r:  r:    s    +rM   r:  c                       e Zd ZdZy)_InjectedFragzHa frag that's injected in breaklines and must be removed on reprocessingNra   rf   rM   rK   r<  r<    s    RrM   r<  c                       e Zd ZdZy)
_SplitFragza split fragNra   rf   rM   rK   r>  r>  #  s    rM   r>  c                       e Zd ZdZy)_SplitFragHz.a split frag that's the head part of the splitNra   rf   rM   rK   r@  r@  '  s    8rM   r@  c                       e Zd ZdZy)_SplitFragHYz:a head split frag that needs '-' removing before rejoiningNra   rf   rM   rK   rB  rB  ,  s    DrM   rB  c                       e Zd ZdZy)_SplitFragHSz'a split frag that's followed by a spaceNra   rf   rM   rK   rD  rD  0      1rM   rD  c                       e Zd ZdZy)_SplitFragLLz<a frag that is forced to end in - because of paragraph splitNra   rf   rM   rK   rG  rG  4  s    FrM   rG  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   r2   r   )rS   _shyr   r   rj   str__new___shyIndices)clsuXaxrG   selfs          rK   rM  z_SHYIndexedStr.__new__9  s    AAAA SV! 
A#2A{{3q!rM   r   )rb   rc   rd   rM  rf   rM   rK   rI  rI  8  s    rM   rI  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   rN  )r_   
isinstancerI  rN  r   extend)rG   ssrP  rQ  rS  _s         rK   _shyUnsplitr[  H  s    	A!N#MM!bEr-(r~~6!!A#67GAa""		R2m$HH2>>2aac23!!A&&H 7 3s   C-Cc                       e Zd ZdZd Zy)_SHYWordzIa fragword containing soft hyphens some of its strings are _SHYIndexedStrc           
          | d   }d| _         |dk(  rg S d }d}||z
  x}}d }t        | dd        D ]  \  }	\  }
fd}t        |
t              ra |d      }||z   }t        |
j                        D ]0  \  }}|
d | |
|d  }}| ||      z   }||}||kD  }|r n|	||||||f}2 | ||
      z  }n| ||
      z  }||kD  }|s| n |||z
  nd| _         |sg S |\  }	}}}}}}|	dz   }| |   \  }
|
j                  }t        |dz   |d |dz          }| d | |fgz   }||z
  |d<   ||d   z
  |z   g|sg n%t        |||dz   d  D cg c]  }||z
  	 c}      fgz   | |dz   d  z   }t        |      t        |      fS c c}w )Nr   Fr?   c                 F    t        | j                  j                        S r   r
   r   r   )rG   r	  s    rK   r   z%_SHYWord.shyphenate.<locals>.<lambda>e  s    ;q!**ajjA rM   rV  )_fswwr   rW  rI  rN  _SplitFragSHY
_SHYWordHS)rT  newWidthr   wwpossibleexceeded	baseWidth
baseWidth0fswwr  tsWshyLenbwjrS  r   r   leftwi1rQ  leftsrn   rZ  Rr	  s                            @rK   
shyphenatez_SHYWord.shyphenate\  s%   !W
q5)!)B.	J ab* 	4GAeqAB!N+C'%amm4 CDAq"#BQ%12%Dr$xKE|ET$x/H !QtUFBHC RU"	RU"	$x/D,e#	4$ )-(8T*_j
.6+1aeVqSBx1MMtCx$1Q30"I!E#z!!!WV^bQ~eZ[\]^_\_\`ZaLbUVQqSLb7c4d3efimnpqrnrnsittQA.. Mcs   E;N)rb   rc   rd   re   ru  rf   rM   rK   r]  r]  Z  s
    S$/rM   r]  c                       e Zd ZdZy)rc  zOa head split frag that requires removal of a hyphen at the end before rejoiningNra   rf   rM   rK   rc  rc    s    YrM   rc  c                       e Zd ZdZy)rd  z=a fragword containing soft hyphens that's followed by a spaceNra   rf   rM   rK   rd  rd        GrM   rd  c                 J    	 t        | d   d   t        t        f      S #  Y yxY w)Nr   F)rW  rD   r"  )fragss    rK   _processed_fragsr{    s*    %(1+uSk22s    "r?   r@      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   Nr?   r   r   )r   rW  rB  r
   r   r   r[  _reconstructSplitFrags)
Frt  aRwLenpstyr	  rmhyffstyrl  s
             rK   _rejoinSplitFragWordsr    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''rM   c                     t        | t              rt        | t              rt        S t        S t        | t              rt        | t              rt        S t        S t
        S r   )rW  r]  r:  rd  rG  rk   )r	  s    rK   r~  r~    sU    CMaPXCY:a0Z qh qOYZ[\cOd:a#=<qCJqjnqrM   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 r7  )rW  r   _normalizerr   )r	  ry   r   s     rK   _rescaleFragz#_getFragWords.<locals>._rescaleFrag  sL    aDa}}h& (%%h/! ' rM   TNr   r   Fr2   r   r   r   r2  ) r   r{  rW  r<  r>  r:  r  rB  r
   r   r   r[  r~  rT   _FK_TEXT_fkindr\   rS   r   insertr]  rK  rI  rd  r   r   r   r  r   _FK_IMG
_FK_APPEND	_FK_BREAK)rz  r   r  rt  r  WaWr	  f0Wlenr  lfrl  tshangingSpacer#  hangingStrip
shyIndicesrT   r  whsry   cbs    `                     rK   _getFragWordsr    s-    	A	
B
AXX  a.Qa
+qE!!W-034aD034aDqE (+,d 
 T	$A66DRx#!$<D#(L$K7j(1*8A;!<*%*
',=JquW$=2 3B 
Aqy*1-%)
HHaUOQ

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

;;DH
2HHQqMjJq4Jx{PWXYPZ[A!&JA8$XXBwq)q!23(0--h7171:1=%*
',&AH1R&zN#(L)AHz!B%'@"aV,!B(K(HHQqMqEAA!&J#(L$Aqf:#iT	$l HHQqMjJq,Bx{JaAAHQrFA
 HrM   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)Nr?   r   r   r   rO   )r   r   r   r.   rQ   r
   r   r   )ry   r	  rG   cs       rK   _fragWordIterr  l  s     !" 	11XWQXXga0!33qzHHV$ BQqzz1::>AAB 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.
    r?   r   r2   rT   )r   r   r  boolcloner   rT   r   r>  rW  r:  rD  r@  )ry   r   	maxWidthslinenort  	maxlinenomaxWidthNextr  	lineWidthfragText	wordWidthr	  gcwr  newLineWidthtooLongs                    rK   _splitFragWordr  x  s|    	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HrM   uK  (^(?:[a-z0-9\.\-\+]*)://)(?:\S+(?::\S*)?@)?(?:(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}|\[[0-9a-f:\.]+\]|([a-z¡-￿0-9](?:[a-z¡-￿0-9-]{0,61}[a-z¡-￿0-9])?(?:\.(?!-)[a-z¡-￿0-9-]{1,63}(?<!-))*\.(?!-)(?:[a-z¡-￿-]{2,63}|xn--[a-z0-9]{1,59})(?<!-)\.?|localhost))(?::\d{2,5})?(?:[/?#][^\s]*)?\Zc              #      K   d}| j                  |      r||z  }| d d } | j                  |      rd}	 | j                  ||      }|dk  ry |dz  }|| d | z   | |d  |z   f 0w)Nr2   r   r@   r   r?   )endswithfind)urischemeslashtailr  s        rK   _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 )NrO   r?   /\)	r.   rQ   uri_patrC   rE   r   rk   r  reverse)r  rJ   r  r  rt  s        rK   _uri_split_pairsr    s    s|3::f-ScATWWQZF
c&kl
CCsNT 
"s63-d<FSX;Y6ZZAIIKHrM   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 )	NrO   r   r2   r   rV  r?   r|  r@   )r.   rQ   _hy_pfx_patrC   rE   r   rW  _SplitWordLL_hy_sfx_patsearchr  r
   _hy_shy_patrS   _hy_letters_pat_hy_shy_letters_patreversedrangerj   )
hyphenatorrG   rf  re  r   r   r   uriWasteReduceembeddedHyphenationhymwlrJ   pfxsfxw0rt  r   rl  hwtwHhylenjcjclenr#  r  s                            rK   
_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#trM   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   r?   Nr   r   rO   r2   )rX  r   r  r   r   r   r   r   r.   rQ   rj   tuple)
FWccplenrQ  eXUaUr  r	  rl  s
             rK   _fragWordSplitRepr    s     MB
A	
B
A	
B1SW !u16619T1X7188GA#>(1:188F+q
1
3q6Ab6(?
c!f 771:eAhrM   c                 .    t        d | D              g| z   S )zF are the fragsc              3   d   K   | ](  \  }}t        ||j                  |j                         * y wr   ra  ).0rG   rP  s      rK   	<genexpr>z#_rebuildFragWord.<locals>.<genexpr>,  s%     C#!AQqzz!**5Cs   .0)r'  )r  s    rK   _rebuildFragWordr  *  s    CCDEaGGrM   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 )	NrO   r   r2   r   r?   rV  r|  r@   )r  r.   rQ   r  rC   rE   r   rW  rG  r  r  r  r   r  r  r  rS   r  r  r  r  rj   )r  r  re  r   r  r  r  rQ  rG   rJ   r  r  rf  r  rt  r   rl  posfxr  FLffxsfxlsfxrFRr  r  r#  r  s                                rK   _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 5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5 	!A,,Q/4G4M4Ma4PUW_`U`a= 	1CAaAAa&CsVFBAbB"vHCwB<D$$QrU+r		3tBw-(s2vw<DBqDEBRYYq#d, $A!A$w !,R000'	1. 	AA!t#!8K8Q8QRS8T%!A,' 	1AcBGGAbqEN*+CsVFBAbB"vHCwB<DRYYDz*s2vw<DBqDEBRYYq#d, $A!A$w !,R000	1 9U#trM   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   r@   r?   )r   rW  rG  r  r  r   r   rB  r@  r:  rD  r>  r  )r  r  re  r   r  r  r  rf  r	  rG   rt  r  r  r  r  r   rl  s                    rK   _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rM   c                       e Zd ZdZy)
_SplitWordzcsimple str word split into _SplitWord instances
    the function _splitWord does the splitting
    Nra   rf   rM   rK   r  r    s     	rM   r  c                       e Zd ZdZy)_SplitWordEndz/the remainder of a str word that has been splitNra   rf   rM   rK   r  r    s    9rM   r  c                       e Zd ZdZy)_SplitWordHz'hyphenation head if no hyphen was addedNra   rf   rM   rK   r  r    rE  rM   r  c                       e Zd ZdZy)_SplitWordHYz6head part of a hyphenation word pair with added hyphenNra   rf   rM   rK   r  r    s    @rM   r  c                       e Zd ZdZy)r  z=a word that's forced to end with - because of paragraph splitNra   rf   rM   rK   r  r    rx  rM   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 )Nr?   r2   r   r   )rS   rK  r   rL  rM  rj   r   __sp__)rO  rG   r  rT  spasprY  s          rK   rM  z_SHYStr.__new__  s    GGDMq6!8;;sBGGAJ/DB))C $BrF3r7N#$Qr(DK  ;;sA&DDKrM   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
            r_  Nr?   rV  )rb  r  rk   r   r  r
   r   r  r  rK  rj   )rT  r   r   ri  limWidthencodingr  r  swswwswnwTrp  r  s                 rK   __shysplit__z_SHYStr.__shysplit__  s    
 $DJ!$y'=">? 62 #2Y!"h(Cs$* 38#AB3t9+5A49#a&(ODqad1QqS6*DAD CB $BQBIwtyy|4556 Es   C.NrO   )rb   rc   rd   re   rM  r  rf   rM   rK   r  r    s    *6rM   r  c                       e Zd Zy)_SHYSplitHYNrb   rc   rd   rf   rM   rK   r
  r
        rM   r
  c                       e Zd Zy)	_SHYSplitNr  rf   rM   rK   r  r    r  rM   r  c                       e Zd ZdZy)r   z4lines/words value for a bidiSorted kind==0 paragraphNra   rf   rM   rK   r   r     s    >rM   r   c
                    |dk(  rg S t        | |||||||||	
      }
|
rl|
\  }}}}}}t        |      r6t         |rt        nt        ||z         |      t        t        |      |      gS  |rt        nt        ||z         t        |      gS y r7  )r  r   r   r  r  r  )r  r   r   ry   rf  re  r   r  r  r  rt  hyr  r  r  r   rl  s                    rK   _hyphenateWordr    s    	1uRi:q"h(Hn]prwxA"#E2r1aQ<!Dad KANa 035 5 9R\[!B$?a@PQQ 	rM   c                    g }|j                   }t        |      dz
  }	d}
|t        |	|         }|t        |	|dz            }t        |       r| j	                  |      } t        |       }| D ]l  }t        ||||      }||z   }||kD  rK|
s|
sG||k  rB ||rt        t        |
      |       n
t        |
             |dz  }|}|t        |	|         }|}d}
|
|z  }
|}n  ||rt        t        |
      |              |S 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
    r?   r2   )
r   r   r   r.   rQ   r   r
   r   r  r  )ry   r  r  r  r   r   r  rt  r  r  wordTextr   r  bidir  r  r  s                    rK   
_splitWordr    s(    	A	
BIq IHYv./HS6!845LqzHHXQ<D !8HX6 | hxBDTd{:h/2
8@TUaKF#H Yv!67HLHA 	! {=*1-SH <I;RSHrM   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   r2   c              3   J   K   | ]  }t        |t              r|d d n|  y wNr   )rW  r  r  rZ  s     rK   r  z$_rejoinSplitWords.<locals>.<genexpr>  s$     LQz!L9QsVq@Ls   !#rV  )rW  r  r[  r  r  rL  rj   )rt  rrZ  cfrG   s        rK   _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rM   c                 2    t        t        |       | d         S r7  )r   r  )rt  s    rK   _BidiStrWrapRejoinSplitWordsr    s    (+AaD11rM   c              #   &  K   g }|j                   }	 t
        }| j                  || D ]Y  }|d   D ]O  }t        |t              r( ||       t        |t              r ||       |d d = ;|r ||       |d d = | Q [ |r ||       y y w)Nr?   )r   rW  linesr   r  r  r  r  )blParar   stoprt  r  jfuncr  ry   s           rK   _yieldBLParaWordsr%  "  s     
A	
B "\\%% 1 	A!J'1a.(N!(N!G	 	Ah 	s   BBc                    | j                         }dD ]  }t        ||      st        ||        t        t	        | ||            |_        t        | j                  t              r7|j
                  j                  d        t        |j
                        |_        t        |j
                  d   t              r;t        |j
                  d   t              rt        nt        |j
                  d   _        |gS )N)r!  r   rT   c                     | j                   S r   )	__bidiL__rZ  s    rK   r   z%_split_blParaSimple.<locals>.<lambda>?  s
    Q[[ rM   keyr   )r  r   delattrrk   r%  r   rW  r!  r   sortr  r  r  r  	__class__)r"  r   r#  r	  rR  s        rK   _split_blParaSimpler/  9  s    A& &1Q<1&$VE$78AG&,,x(	01177#!''"+l+-7G-L	R^3JrM   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   r?   r   r   r   r<   )r!  r   r   r   r   r   r   rT   )	r"  r   r#  r	  r!  r  ry   r  r  s	            rK   _split_blParaHardr1  E  s    
ALLt$E 	4 	AHHQK	E"IAqAQ$71Q41'!A$++gVW:XZ[_`Z`Z[!Q$71Q41'!A$++gVW:X!taDvvqvVVBZ_affmf	4 HrM   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bulletFontSizerT   r   r   r   	beginTextbulletIndentrightIndentr   r   r   textOutdrawTextgetXr   r   )canvasr   r   
bulletTextr   rtlr7  r3  rl  qbulletWidthr	  tx2r   bulletStart	bulletEnds                   rK   _drawBulletrI  T  s   %%L
e  ')	)A.MQ.Aa//0!%a)=)=u?S?STK+{=%BVBVX]XlXl'm!mm+ K FF2 21177=12A3]AJJPQPZPZ)[#[[K{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MrM   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   r6  r   N)r/   r
   r9  r:  rT   r   r   r<  r   r=  firstLineIndentr   )rB  r   r  rE  r	  	bulletLenindents          rK   _handleBulletWidthrN    s     %z53G3GI]I]^K K K{1661::qzzJJK&&4sU=Q=Q7QQ	>>5 &&u'<'<<F%%e&;&;;FvaLY/0L  rM   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   r?   r<   )NNNr@   N)r   rT   r  r
   r   r   r   )rz  widthsr!  lineNummaxWr  r  limr   rT   r	  r  r   cLenr   rp  ry   s                    rK   splitLines0rU    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+ rM   c                     | j                   }|j                  }||k7  r|j                  |       |j                  }	||	k7  r|j	                  |       |j                  ||||       y r   )r   
_lineWidthsetLineWidth_strokeColorObjsetStrokeColorr   )
ru   x1y1x2y2nlwnsccanvolwoscs
             rK   _do_linerd    s[    ::D
//C
Cx#


C
CxC IIb"b"rM   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)rn   r  r	  r<   r?   	underlinerI   r2   -0.125*L0.25*Lr   )r   r   r   r   r	  r   r   r   _defaultLineWidthr   r
   rj   r!  r   rL   rd  )r  r[  r  ru   r   r   r   y0r	  fstcvaluesdwr]  r#  kr  ry   or  rJ   r  rf  lwlgr   ys                              rK   _do_under_lineru    sa   	BHHE	AemmO	#B
A	
B	
BBb!F			B	bjj$$SXXbll.@.@.CA.F%GWYZ	Z]_	_B# !Aa!Aa{N	Qvb&:&:;Qva(Us"FW2Ij8STU[\\b!cKKAr1b!,GAFA crM   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#r2   r?   )relative:r@   r   documentpdfGoToRURI)rx  r   )	
startswithr   linkRectrS   r   lower
_scheme_rerC   linkURL)ru   r   rectpartsr  r   s         rK   _doLinkr    s    s


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

3q!UQ358>>#39r:JJE!HdQ?f%&27;eDW}U1XdJJtTADAJJtTAEBrM   c           
         |j                   }|j                  j                  }|j                  | |z  z
  |j                  j
                  dz  z
  }dj                  |j                  |    d         }|j                  j                  ||j                  |j                        }|j                  D ]  \  }	}
t        ||
||||z   ||z   f        y )Ng       @r<   r?   )r   r   r   r   r	  r   rj   r!  r   r
   r   r   r   r  )r  t_offr  ru   r   r   rt  rT   textlenr#  r   s              rK   _do_link_liner    s    	BhhG
1W9rtt}}S00A88BHHQKN#Djj$$T2<<FG77 @4D5!U7]AgI>?@rM   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   r?   )strokefillrm   rf  r	  r  rg  r2   rh  ri  )r   r   r	  r   r   r   r   r   r   r   r   r  r   sortedr   rn  r  r   rj  r   rL   rd  ) ru   r   rk  r	  r   r   r   ylydescr[  r]  r  r#  r   r  r  ro  rn  rp  ry   rq  r  rJ   r  rl  rm  r  rf  rr  rs  r   rt  s                                    rK   _do_post_textr    s\   	B	B
AhhG..KzzHEgc(l+	e	h,	}}(]W}} 	DGBr!JJ##A&JJOOBuRU7!OC	D $*288??+<$= 2 (1T2r"bD2r"ub"R%012BH	{{!!!7=bkk>P>P>R7S 	30)q1Qq1Q2b%;IF3KF3K6"*>*>?B6!,BBBB3bQae	*xY_``A"aA#B2q"a0RQ A#	 HHHrM   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 invalidr?   r   Tr<   )textTransformr  rL  uppertitle
ValueErrorr   rT   r~  r  r  )rz  r   ttr#  pbr	  rP  r  s           rK   textTransformFragsr  A  sI   			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= 
rM   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   )
rL  rM  _fragr   r   r   _widthr
   r   r   )rO  valuefragr  rT  ry   s         rK   rM  zcjkU.__new__h  sb    {{3u%
4!GA.ADK  &eDMM$--HDKrM   c                     | j                   S r   )r  rT  s    rK   r   zcjkU.<lambda>q  s
     rM   c                     | j                   S r   )r  r  s    rK   r   zcjkU.<lambda>r  s
    $++ rM   N)rb   rc   rd   re   rM  propertyr  r   rf   rM   rK   r  r  f  s"    > +,D-.ErM   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   r2   r?   )
r   r%  r&  r   r   r   r   r   currentWidthr2  )r   r  r   r   r   r   r   r   r   r   r   r   r0   r  rj   rT   r   )r  r   	widthUsedr%  r2  
calcBoundsr   CWr  maxSize	maxAscent
minDescentrP  r	  r   r   r   r   s                     rK   makeCJKParaLiner  t  s|   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  @  @rM   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   r?   r   r2  i 0  r   Zsc              3   <   K   | ]  }|   j                     y wr   )r   )r  iir  s     rK   r  zcjkFragSplit.<locals>.<genexpr>  s     1S"!B%++1Ss   NFr   r!  )rT   r.   rQ   rX  r  r   r   r   r   r  r   r  r*   ordr  r	   r'  r%   r  
IndexErrorr   )rz  r  r  r  r	  rT   rl  r!  r  r  lineStartPosr   nUrP  ry   r2  endLiner%  
limitCheckrp  ujrp  r  s                         @rK   cjkFragSplitr    s   
A ,vv4=;;x(DHH$7Qd1Qx(78HHT$q*+, E#$$A$	L|H	QB
B$aD	QGG1&'$AM!!(+AQ	AFF;/	X--=)A+K)!I-Jq6&= #/q.1!4J"1Q3z"5 
&qT(2,"4B !!A s$%aC *c1SaPQ
1S.S S
$%aDJJ$%aD$% %
&& ,,<>1A FA!OJLL<):8IjYbcmno)$SZ0 LIu B$z 1}_Q|}%5hyR[I[\ablmn!%((O 8z  )$R=)s   H3
#H8 8I	I	c                    |j                   | _        t        |dd      | _        t        |dd      | _        t        |dd      xs d| _        t        |dd      | _        t        |dd      | _        t        |dd      xs d	| _        y )
NunderlineColorr2   underlineWidthunderlineOffsetz-0.125fstrikeColorstrikeWidthstrikeOffsetz0.25f)	rW  rj  r   _underlineColor_underlineWidth_underlineOffset_strikeColor_strikeWidth_strikeOffset)ru   rA  r   s      rK   _setTXLinePropsr    s    !,,B '7;B '7;B!%(9"=JBeM"5BOeM"5BOu^B7B7BrM   c                     t        d      }g j                  }| D ]1  }d}|dd D ]  \  }}t        |d      r|}n|s|}||z  }  ||       3 t        |j                  |d      S )z0return the Visual order for a list of frag wordsi   r2   r?   Nr   T	directionwx)chrr   r   r   __self__)r   r  pur  ry   rT   r	  rG   s           rK   fragWordsVisualOrderr    s    	VB
		A abE 	DAqq"AID	 	
$ 

Y$??rM   c                     | j                   S r   )	__bidiV__r)  s    rK   r   r     s
    akk rM   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   rB  )r&   caseSensitiver  _setupr   r   )rT  rT   r   rB  rz  r  r  s          rK   __init__zParagraph.__init__>  sE    ="(GHE* D%!Owu\$/OQVXlmrM   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(r4   r<     z: z) #)
r.  rb   rk   __dict__keysr   reprreplacer   rj   )rT  r#  rn   r  rp  s        rK   __repr__zParagraph.__repr__F  s    NN##sUGDMM&&() 	LAHHas!;!C!CD!MdSZ[_abScNdNlNlmqsvNwNN  AE  FI  OJ  K  L	L	qyy|rM   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   r   r  rT   rz  r   rB  debug)rT  rT   r   rB  rz  cleaner_parserbulletTextFragss           rK   r  zParagraph._setupO  s    
 =4=D lG$($6$6G!,3MM$u,E)E5/} ~~a(.@s2c$i/@)A"C D DuU+_
 	

$
rM   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   r_  CJKr   r2   r?   r2   offr   r   r   invalid autoLeading value %r)r*   r   r   r   rK  r=  _wrapWidthsr   breakLinesCJK
breakLinesr"  r   r   r   r!  r   r   r   r  r   r   )rT  
availWidthavailHeightr   r   first_line_widthlater_widthsr"  r   r   r   r  s               rK   wrapzParagraph.wrapf  s   e 


%%
%E4I4I)IJUM^M^^!J.1B1BB,l;>>U"''(8(89F__T%5%56Fd=}R1PQ--;;>*,%#\\ B#ahhqyy&8"AAB %'#\\ 7!((QYY"667 %%Ck%QRRV\\*W4E!gfmmFNN&BCe# --6&0Fzz6!!rM   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   r?   c              3   8   K   | ]  }t        |        y wr   )r
   )r  ry   fNfSs     rK   r  z%Paragraph.minWidth.<locals>.<genexpr>  s     l{1R+ls   rT   r<   c              3   &   K   | ]	  }|d      yw)r   Nrf   )r  ry   s     rK   r  z%Paragraph.minWidth.<locals>.<genexpr>  s     :qt:   )rz  r   r{  r   r   r   r   rS   rT   r   r  )rT  rz  nFragsr	  r  r  s       @@rK   minWidthzParagraph.minWidth  s    

E
a19-e4aABBlGTUV\L]eAFFC6Hlllcdcjcjlll:]5%9:::rM   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!  sFWr   rz  rW  r<  rB  r]  rd  rG  r.  )rT  r"  r   r#  r!  r  sFWNr  s           rK   _split_blParaProcessedz Paragraph._split_blParaProcessed  s    BYEl"&E
"2uT{DJJJJs4 Jqu]32aJqu]3aeL),6quX,FjLAbEOrM   c                     | j                   j                  dk(  rt        S t        | j                        st
        S | j                  S r7  )r"  r   r/  r{  rz  r1  r  r  s    rK   _get_split_blParaFunczParagraph._get_split_blParaFunc  s>    '+{{'7'7':# 	;3CDJJ3O+	;!88	;rM   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   r2   r?   r  r   r   r   r  r   allowOrphansallowWidowsr|  )rB  rz  )r   r!  aHr  r2  )r   )"r   rz  r*   r   r  r"  r   r   r   r!  r   r   r   r   r   r  r   r"  rD   r  r   r'   r.  rB  r   rW  r   r2  _JustifyLast
_splitparar   r   rK  setattr)rT  r  r  r"  r   r   r   r!  rG   r   r  r  r   r#  r  r	  r  style1P1P2rR  s                        rK   rS   zParagraph.split  s   tzz?AE!1[5Fr	 tH%IIj-

d=}R1PQ--;;>k;NAE!$V\\2 CAaAHHQYY.w7AqAT))F!A e#$V\\2 CAaqxx		1AT))F!A !!?+!MNNAE!ENN 23e#&Ka()AqSFtN75PQ3RSA!Q$IJd=}Q1OPa46M!A#v QTacFAI))+==e_F!FNF>>$vtFSTUVGW>X16<<!+<zZ	  *&,,qs*;HE  @$+FLL1,={$K @$*LL1$5$?$?A 	  A%UOE$%E!>>$u4q;K>L 	.AtA1WT!_-1WT!_-		. 2wrM   c                 :    | j                  | j                         y r   )drawParar  r  s    rK   drawzParagraph.draw  s     	djj!rM   c                 >$   d| _         t        |t        t        f      s|g}n|}g }dx| _        }t        |      dz
  }| j                  }|j                  }|xr |j                         dv }|rt        }t        st        d       |j                  xr( 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}
|j0                  }|j2                  }|dkD  }|j4                  }|j6                  }|
xs |xs |}|rt!        |d	t8              }dx| _        | _        t?        | j@                  ||       |d   }t!        | d
t!        |d
d            }|dv}| jB                  }t        |      }|dk(  r%|jD                  stG        |d   d      stG        |d   d      stI        |      s|	s|d   }|jJ                  }|j                  }tM        ||      \  }}d}tG        |d      rt%        |jN                        }|s|jQ                  dg |||      S tS        |      }|r|}|	rbtU        |tV        d      } tY        |      D !"cg c]9  \  }!}"t[        t]        |"|j                  t^        jJ                        | |!   |!      ; }}!}"ntU        ||      }||k7  }nSt        |j`                  tb              }|j`                  dd }|D ]  }#t%        |#      s n |jQ                  dg |||      S te        d||| jf                        }$||$z  }%g }&|$ }'te        d||| jf                        }(d})|r|ji                  d      }*|*st        |*tj              rd})ntl        |*v rto        |*      }*te        |*||| jf                        }+|'|$z   |+z   },||%t        |&      z  z   }-|,|-kD  rt        |*tp              s|)st        |*tn              r|*js                  |||'|$z   |(z   dz
  |-| jf                        }.|.r|.|dd | xj<                  dz  c_        d})t        |&      r|tu        ||         }/|s|*jv                  |(z   dz   |/k  r|*js                  ||d|(z   dz
  |/| jf                        }.|.r|*g|dd d})d}*|'},n|rt!        |dd       }0ty        |0r|
nd|||*|+|,|-|0r|nd|xr |0
      }.|.r|.|dd | xj<                  dz  c_        d})|r9t        |&      r.ty        |0r|
nd|||*|+|+||0r|nd|xr |0|
      }.|.r|*g|dd d})|'},d}*|rlt        |*tj              s\|)sZtu        ||      }1|+t{        ||1|1dz          kD  r:t}        |*|'|$z   ||||| jf                        |dd | xj:                  dz  c_        d})>|,|-k  st        |&      r|)r`|*r|&j                  |*       |)rHd})|,| j                   kD  r|,| _         |j                  ||,z
  |&f       g }&|$ }'|dz  }|tu        ||         }nH|,}'nE|'| j                   kD  r|'| _         |j                  ||'z
  |&f       |*g}&|+}'|dz  }|tu        ||         }|r|&g k7  r,|'| j                   kD  r|'| _         |j                  ||'z
  |&f       |r+|D ]  }2|2d   j                  t                tc        |      }|jQ                  d||||      S |dk  rGt        d|jJ                  |j                  |j                  |jJ                  d|jJ                  z  g       S |j                   }3g }g }4|4j~                  }5t        ||      }d}|rt        d |D              s{t        ||      } |	r>tY        |      D !"cg c]'  \  }!}"t        t        |"      t        | |!   |!            ) }}!}"nHtY        |      D !"cg c]  \  }!}"t        |"|| |!   |!       }}!}"n|	r|D "cg c]  }"t        |"       }}"d}6|	rc|ji                  d      }# |5|#       |#d   d   }|j                  }|jJ                  }|sdx}7x}$}'|}8tM        ||      \  }9}:|#d   }+|#d   d   }|+dkD  r	'$z   |+z   },n'},|j                  t        k(  };|}-|rl$}<|D ][  }=|=j                  t        k(  s|=jN                  j                  d      }>|>s5|<|>te        d|=j                  |=jJ                        z  z  }<] |<|z  }<|-|<z  }-|;s|,|-kD  rt        |#t              stG        |d      st        |#t              r|#j                  |,|-      }.|.ra|.|dd |j                  dt        d|jQ                  t        d       dfg             |4ji                  d       | xj<                  dz  c_        t        |4      dkD  rp|tu        ||         }/|s|#jv                  dz   |/k  rL|#j                  |+|/      }.|.r7t        d|jQ                  t        d       dfg      |#g|dd |4ji                  d       %|rt!        |dd       }0t        |0r|
nd|#|,|-|0r|nd|xr |0      }.|.ra|.|dd |j                  dt        d|jQ                  t        d       dfg             |4ji                  d       | xj<                  dz  c_        |rit        |4      dkD  r[t        |0r|
nd|#|+||0r|nd|xr |0|      }.|.r<t        d|jQ                  t        d       dfg      |#g|dd |4ji                  d        |rt        |#t              stu        ||      }1|+t{        ||1|1dz          kD  rst        |#|$z
  |'z
  ||      |dd |j                  dt        d|jQ                  t        d       dfg             |4ji                  d       | xj:                  dz  c_        |,|-kD  xr 7dkD  xs |;}?|?s|;r|#d   d   }@|@r7dz  }7|jJ                  }|rp|j                  t        k(  rCt        t        |j                  j                  |      |j                  j                  |      \  }}n3tM        |j                  |      \  }}ntM        |j                  |      \  }}t{        8|      }8t{        9|      }9tu        :|      }:|s|jQ                         }A|Ag}@|A_'        nt        A|      s$rgt        |      dz
  }!|!dk\  rT||!   }=|!dz  }!|=j                  t        k(  r1|=jN                  j                  d      s|=xjN                  dz  c_'        n|!dk\  rT|jQ                         }A|j                  |A       @|A_'        na$rJAjN                  j                  d      sAxjN                  d@z   z  c_'        n+AxjN                  @z  c_'        nAxjN                  @z  c_'        t        |#t              rte        d||      nd}$d}B|#d!d D ]  }!|!d   jQ                         }A|!d   |A_'        |AjN                  rd}B|j                  A       |AjJ                  }|rpAj                  t        k(  rCt        t        Aj                  j                  |      |Aj                  j                  |      \  }}n3tM        Aj                  |      \  }}ntM        Aj                  |      \  }}t{        |8|      }8t{        |9|      }9tu        |:|      }: @sBr7dz  }7|,}'nq|;r7|jQ                         }A|j                  |A       |3xr t        |#t               }Cnd}C|'| j                   kD  r|'| _         |j                  t        ||'z
  7C|89:||6"	             t        |4      dz
  }6|dz  }|tu        ||         }|;rg }t        |#t              rte        d||      nd}$|$|z  }%|+}'d}7|jQ                         }A|AjJ                  }8|rpAj                  t        k(  rCt        t        Aj                  j                  |      |Aj                  j                  |      \  }}n3tM        Aj                  |8      \  }9}:ntM        Aj                  |8      \  }9}:Ag}|#d   d   |A_'        |#d!d D ]  }!|!d   jQ                         }A|!d   |A_'        |j                  |A       |AjJ                  }|rpAj                  t        k(  rCt        t        Aj                  j                  |      |Aj                  j                  |      \  }}n3tM        Aj                  |      \  }}ntM        Aj                  |      \  }}t{        |8|      }8t{        |9|      }9tu        |:|      }: |r	c|r<'| j                   kD  r|'| _         |j                  t        ||'z
  7d|89:||6"	             |r'|D ]"  }2|2j`                  j                  t               $ |4| _!        t        d|#      S c c}"}!w c c}"}!w c c}"}!w 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   r?   )r   LTRr2   hyphenationLang)langNzLhyphenator should be a language spec or a callable unicode -->  pairs not %rr,   r   r  r   r   FrT   )r   r!  r   r   r   Tr  r   r   )r  r<   rV  r   )r  nobrr*  皙ɿ)r   r   r   r   r   r   r!  c              3   2   K   | ]  }t        |        y wr   )isBidiIndexListr  s     rK   r  z'Paragraph.breakLines.<locals>.<genexpr>  s     $HA_Q%7$Hs   )r  bidiVbidiLr   )r  rT   r@   )	r%  r&  r2  r   r   r   r   r   r  r  )a
_width_maxrW  r  rk   r   r   r   r   r  r   r   shapingr  r   r   shapabler   r/   rB   pyphenPypheniteratecallabler  r  r  spaceShrinkagesplitLongWordsr,   _splitLongWordCount_hyphenationsrN  rB  rz  r   r   r{  r   r   rT   r  rS   r   r  r   r   shapeStrr   r   r   r
   r  popr  rK  r  r  r  r   rb  r  r   r  r   r-  	sortBidiVr   r   justifyBreaksr  anyr  bidiIndexListWrapr   r   r   r  r  r  rx   r@  r]  ru  r  r<  r  r>  r  r  r   r   r   r   r0   r  r:  r   )DrT  r   r  r!  r  r  r   r   doBidir   r  r  r  hyphenation2r&  r'  attemptHyphenationr  r   r   r  rz  r  r	  r   r   r   r   bidiSortrT   r   _wordsVXr  rZ  ry   
spaceWidthdSpaceShrinkcLiner  hywforcedSplitwordr  re  r  hswnMWhyOknmwr  njlbvr  aFWr  r#  r  r  r  r2  spaceShrinkwinsr  nTextr  nillbsD                                                                       rK   r  zParagraph.breakLines  s   @ %t-E7yi  f	N1$	

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

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

3t0Cc/I&*&7&7$,h$%GdN$'/3}}	 '8 '& $'26E!AJ23K+/D/;H+#*1VE#::,4ZT ((D)Xx6:N$7$@D%I ),E!AJ ..!3.*+K$)c%j"0t ((D)YPX6:N$7$@D%#IC  #.2Va
./+7'+%z$z/Jk!&3$S3s1u)=%>>)3Dj9PQZ[abjkstx  uB  uB  *CE!AJ 4494*+K$X%SZ;U\\$/"&'#doo5th&95%AB "(2{!#,S6-B#C'/#doo5tLL(\"95!AB!FE#,LaKF(Yv)>?Hq v by/<h5u=> -AaDII)I,- 77fWV^7__QY!ennu~~&+ooennUYZ_ZhZhUh"$& & +++EEB))C"52FH$H$H I)&HE`ijp`qrY\YZ[\/a0@2a5QRASTrFr`ijp`qrY\YZ[\l1xbeRSTrFr4:;q-*;;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Xl5JVW25U18T^iq,/"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%<
={ \ /<X(\2IUVaf*/'[eow|A B 0AGGLLYL/0DJ!511C %PH sr;s   4>AH-,AH+AHAH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   r?   r   r"  r  r  rT   r2   r   r  )r   r!  r   r   )r   r   r   r   r!  r   r   r   r  )rW  rk   r  r   r   rN  rB  rz  r   r   r   r   r  r"  r!  rT   rj   r$   r   r   r   r   r  )rT  r  r   rz  r  r	  r!  r  rT   r  r   wrappedLinesr   r  s                 rK   r  zParagraph.breakLinesCJK	  s    )T%L1	{9

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

U19WU1Xh7aAtH%'$|A*FwwAT[[->->w??EFq vvwwwq45dIqzz1::FE
 <AAZb$R$LALA77ajjRVWXWaWaRa7bbQY!ennu~~&+ooRu~~^bchcqcq^qs s 4!gd<&B;;d=}R1PQ 
2
E9j99 Bs    G8c                 :    | j                   j                  ||      S r   )ra  r;  )rT  rS  rt  s      rK   r;  zParagraph.beginText	  s    yy""1a((rM   c           	         | 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                  }|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
  }|dv r|dz   n||#_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   |%|&       > ns|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        ||#_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   r2   r   r?   r   g?borderWidthNborderColor)r  r  r  borderRadiusradiusr  borderPadding_offsetsr   r  Fr   r   )rC  r~   r   r   )r  r   z-handledzbad align %s)NN)Vra  r   r"  r!  r   r   r   r   r   	saveStater  r   rZ  rX  	roundRectr   r#   r   r=  r   restoreStater   rB  	alignmentrK  justifyLastLiner   r  r   r   r   r!   r   r    r   r"   r   r   r+   r   rI  r   r;  r.  rb   r  r~   r   r   r   r  r   r   r   r   r1   rd  r(   r   r   r  r   r	  r   ru  r  r  r   r)  r-  r/  r5  r3  r  r  r   r   r   r   r   r   r   r   r&  r  r?  )-rT  r  rA  r   r"  r!  r   r   r   r   ro  bcr  opr   brbptbprbpbbplbpnLinesrB  rQ  rU  r   rS  noJustifyLastjllwcr   isRTLbRTLdplr	  r   ru   r  r   lastLiner  r   rv   r  r   oos-                                                rK   r  zParagraph.drawPara	  sK    

--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~~HeOE-T--D{{A~'+C)+-C(*,C*,5:1@TC+ KK!**4E KK'!HQZZ*HHE(uZRVWF ##AKK0^^E51"0DNN4K4K4Q4Q4S"S%!'&--*FGG %'$mmFNN:G 7?-6Ox
2U] 

1::qzz7;1Xa[a(6VQY#e*U*:"HRUH=::",Xb"9BK046BE6B#B6$BHBD$BH$BHFFBG#$;;BL$&BMz)B *,q"zz&q"b"ajjAvv}QB; #1f- @"1Xa[ %a#0#;QV##e*U2B%*H #R!b% J":-$j0H1b::*1eRQZZH66=BB#?@ #1f- L %a#0#;QV##e*U2B%*HR!eAhqk5(KL  % 6%)ZZ"%5
6!H+ KK!**4E KK'!HQZZ*HHE(B(uZSWXF',C)+.C(*-C*,6;2AVC$^d9o%EFF ^^E51"0DNN4K4K4Q4Q4S"SFE2("5'"&&(R\!!  "]]
 *"  !,#zz,6)R\Qx(6VQY$..*>"HRx0b! q&) &A 8D,7CHEdnnU.B!&Xa[$9!"%& OOB!A rM   c                 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. rz  Nr?   r<   rT   r2   )	r   r   r{  rW  r:  r   rT   rj   r  )	rT  identifyrz  plainsplains_appendr;  r   rT   r  s	            rK   getPlainTextzParagraph.getPlainText
  s     WT*F"MMM&! +D&*12h ,
d%d+,!$w/%c*	+ " 1DtV,%dii01 776?"4t,D|DJTKrM   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  ry   s     rK   r   z0Paragraph.getActualLineWidths0.<locals>.<lambda>
  s    a$//.A rM   c                     || d   z
  S r7  rf   rn  s     rK   r   z0Paragraph.getActualLineWidths0.<locals>.<lambda>
  s    a$q'k rM   )r   r"  r   r   rk   rq   r!  )rT  r  s     rK   getActualLineWidths0zParagraph.getActualLineWidths0
  s[    
 tW%N'NN%;;"&**AD"&**9DCT[[../00rM   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   r?   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   ,r?   )N)r.  rb   )r  r  s     rK   r  z&Paragraph.dumpFrags.<locals>.<genexpr>  s+     8vjlbeooF^F^_abc_d9e8vs   -/r<   r4   )r   r   r  r.  rb   rj   )rz  rM  fullrt  r  r  r	  r  s           rK   	dumpFragszParagraph.dumpFrags
  s    EXXU# 		QCAa:!$%AB% CBbe45~1-.!AKK,@,@)AABC 7%1dii8vpqrsrtpu8v.wxyz{  {F  {F  {O  {O  )P  P  Q		Q 3JDF==###rM   )NNNr?   rO   r   r   )   F)rb   rc   rd   re   r  r  r  r  r   r  r  rS   r  r  r  r;  r  rk  rp  staticmethodrx  rf   rM   rK   r   r     sp    =|n.'"R;	;
Sj"B2H(:T)V"p2
1 $ $rM   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>)r   r?   zline%d: %d(%s)
  r&  Unknownz %d:'%s'rT   )printidr"  r!  sysstdoutwriter   r   r   r   rL  r   r  )Pr!  outwr  r   r   nwordsry   s           rK   dumpParagraphLinesr    s    4r!u<=zz& 
	FAd8DtG$

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