)Ej FUddlZddlmZddlmZmZddlmZddlm Z m Z ddl m Z dZ eed <id d d d d d dd ddd d dddd ddd d dddd ddd d dddd ddd d dddd ddd d dddd ddd d dddd ddd d dddd ddd d idddd dd d d d ddd d!d"d d d"d!dd d#d$d d d$d#dd d%d&d d d&d%dd d'd(d d d(d'dd d)d*d d d*d)dd d+d,d d d,d+dd d-d.d d d.d-dd id/d0d d d0d/dd d1d2d d d2d1dd d3d4d d d4d3dd d5d6d d d6d5dd d7d8d d d8d7dd d9d:d d d:d9dd d;dd d d>d=dd d?d@d d id@d?dd dAdBd d dBdAdd dCdDd d dDdCdd dEdFd d dFdEdd dGdHd d dHdGdd dIdJd d dKdLdd dLdKd d dJdIdd dMdNd d dNdMdd dOdPd d dPdOdd idQdRd d dRdQdd dSdTd d dTdSdd dUdVd d dVdUdd dWdXd d dXdWdd dYdZd d dZdYdd d[d\d d d\d[dd d]d^d d d^d]dd d_d`d d d`d_dd dadbd d idbdadd dcddd d dddcdd dedfd d dfdedd dgdhd d dhdgdd didjd d djdidd dkdld d dldkdd dmdnd d dndmdd dodpd d dpdodd dqdrd d drdqdd idsdtd d dtdsdd dudvd d dvdudd dwdxd d dxdwdd dydzd d dzdydd d{d|d d d|d{dd d}d~d d d~d}dd ddd d dddd ddd d dddd ddd d ddd dd d ddd dd d ddd dd d ddd dd d ddd d Zeeeeeffed<GddZeGddZGddZ ddededede fdZdeedeefdZGddZdS)N)deque) dataclassreplace) itemgetter)Optional TypedDict) TextDirection} MAX_DEPTH()o)pairtypec[]{}u༺u༻u༼u༽u᚛u᚜u⁅u⁆u⁽u⁾u₍u₎u⌈u⌉u⌊u⌋u〈〉u❨u❩u❪u❫u❬u❭u❮u❯u❰u❱u❲u❳u❴u❵u⟅u⟆u⟦u⟧u⟨u⟩u⟪u⟫u⟬u⟭u⟮u⟯u⦃u⦄u⦅u⦆u⦇u⦈u⦉u⦊u⦋u⦌u⦍u⦐u⦎u⦏u⦑u⦒u⦓u⦔u⦕u⦖u⦗u⦘u⧘u⧙u⧚u⧛u⧼u⧽u⸢u⸣u⸤u⸥u⸦u⸧u⸨u⸩u⹕u⹖u⹗u⹘u⹙u⹚u⹛u⹜u〈〉u《u》u「u」u『u』u【u】u〔u〕u〖u〗u〘u〙u〚u〛u﹙u﹚u﹛u﹜u﹝u﹞u()][}{⦆⦅」「) rrrrrrrr!r BIDI_BRACKETSc ZeZdZgdZdededededdf dZdefd Zd eddfd Z defd Z dS) BidiCharactercharacter_index character bidi_classoriginal_bidi_classembedding_level directionr&r'r*debugreturnNc||_||_|r|rd|_nt j||_|j|_||_d|_dS)NR) r&r'isupperr( unicodedata bidirectionalr)r*r+)selfr&r'r*r,s ;C:\PYTHON\MyICR_Suite\python\Lib\site-packages\fpdf/bidi.py__init__zBidiCharacter.__init__sh /"  CY&&(( C!DOO)7 BBDO#'? .c|jdzrdndS)Nr/L)r*r3s r4get_direction_from_levelz&BidiCharacter.get_direction_from_levels*Q.7ssC7r6clsc||_dSN)r()r3r<s r4 set_classzBidiCharacter.set_classs r6crd|jd|jd|jd|jzd|jd|jzS)Nzcharacter_index: z character: z bidi_class: z original_bidi_class: z embedding_level: z direction: r%r:s r4__repr__zBidiCharacter.__repr__s[ R 4 R R$. R R_do__TE]__ `U4#7UUT^UU V r6) __name__ __module__ __qualname__ __slots__intstrboolr5r;r?rAr6r4r$r$sI " /2 EH QU      8#8888ST #      r6r$c6eZdZUgdZeed<eed<eed<dS)DirectionalStatusr*directional_override_statusdirectional_isolate_statusr*rMrNN)rBrCrDrErF__annotations__rGrHrIr6r4rKrKsII !$$$$ $$$$$$r6rKczeZdZgdZdeedededdfdZd dZdee e e ffd Z d d Z d d Z dS) IsolatingRun) charactersprevious_directionnext_directionrRsoseosr-Nc||_||_||_|||dSr>)rRrSrTresolve_weak_typesresolve_neutral_typesresolve_implicit_levels)r3rRrUrVs r4r5zIsolatingRun.__init__sU$"%! !!! ""$$$ $$&&&&&r6ctjD]r\}}|jdkrb|dkr|j1|j|dz jdvrdnj|dz jsj}jD]X}|jdvr|j}|jdkr|d|jd kr|dkr|d YtjD]\}}|dt jdz fvr!|jd krGj|dz jd kr.j|dzjd kr|d |jd krkj|dz jd vrTj|dzjj|dz jkr(|j|dz jdt dtffd dt dtffd tjD]Y\}}|jdkr+|s |r|d |jdvr|dZj}jD]8}|jdvr|j}|jd kr|dkr|d9dS)NNSMrr )LRIRLIFSIPDION)r/r9ALrbr/ENANESCSrdrcir-c|dkrdSj|dz jdkr|dz Sj|dz jdkS)NrFr ETrc)rRr()rh prev_is_enr3s r4rkz3IsolatingRun.resolve_weak_types..prev_is_ensWAvvuq1u%0D88!z!a%(((?1q5)4< .next_is_en shC((1,,,uq1u%0D88!z!a%(((?1q5)4<  2 * *I#'777#,#7 #t++##C(((#t++0@D0H0H##D)))&do66 G GLAyQDO,,q0111$,,OAE*5==OAE*5==##D)))$,,OAE*5EEOAE*5?1q5)455##DOAE$:$EFFF =# =$ = = = = = = = =# =$ = = = = = = =&do66 * *LAy#t++:a==.JJqMM.''---#'999##D))) 2 ) )I#'777#,#7 #t++0@C0G0G##C(((  ) )r6cg}d}g}t|jD]\}}|jtvr|jdkrt|jddkr+|dkrgcS||j|f|dz }t|jddkr|dkrt |ddD]u}||dz \}}t|d |jkst|d d vr4|jd vr+|||f|d |dz }|dz }nvt|td S) a Calculate all the bracket pairs on an isolate run, to be used on rule N0 How to calculate bracket pairs: - Basic definitions 14, 15 and 16: http://www.unicode.org/reports/tr9/#BD14 - BIDI brackets for dummies: https://www.unicode.org/notes/tn39/ rrarr?r rr)rrN)key) rorRr'r"r(appendrangesortedr) r3 open_bracketsopen_bracket_count bracket_pairsindexcharcurrent_open_bracket open_char open_indexs r4 pair_bracketszIsolatingRun.pair_brackets#s02 /1 $T_55 " "KE4~..4?d3J3J 08C??)R//! !(($.%)@AAA&!+& 08C??)Q.. 056H!R0P0P " ",0=>RUV>V0W- :))4V<NN))4V<NN $. @ @)00*e1DEEE,9:T.previous_strongDsfzz..uqy)4;;suqy)48IIIs"?519-- -r6c|tjdz krjSj|dzjdkrdSj|dzjdvrdS|dzS)Nr r9rr/)rmrRrTr()r| next_strongr3s r4rz7IsolatingRun.resolve_neutral_types..next_strongMswDO,,q000**uqy)4;;suqy)48IIIs;uqy)) )r6rFr r9rr/Tr\ra)BSWSrar_r]r^r`) rFrGrrRr;rwr(rmr)ro)r3bracketsembedding_directionbstrong_same_directionstrong_opposite_directionresulting_directionr|opposite_direction next_charrhrprrs` @@r4rYz"IsolatingRun.resolve_neutral_typesCs .3 .3 . . . . . . . *s *s * * * * * * *%%'' ) G"&/!"4"M"M"O"O ' G' G(-%,1)&*#"1Q41..99E.9S@@/366.9=NNN/36604-.9S@@/366.9=NNN/366481(B*=''.B0Cs0J0JPS&&qt,,0BBB.@++.A+& G7JDOAaD)47JDOAaD)44?++adQh66$(OAaD1H$= %9UBB ) 4 < <3FI0%do66 P PLAy# (  #?1%%Q77+:?1+=+=I((+4+M+M+O+OI( P Pr6c|jD]^}|jdzdkr5|jdkr|xjdz c_|jdvr|xjdz c_E|jdvr|xjdz c__dS)Nr8rr/r rg)r9rcrd)rRr*r()r3rps r4rZz$IsolatingRun.resolve_implicit_levelss 3 3I(1,11'3..--2--'<77--2--'+<<<--2-- 3 3r6r-N)rBrCrDrElistr$rGr5rXtuplerFrrYrZrIr6r4rQrQsFFFI'4 #6'S's't''''O)O)O)O)b8tE#s(O48888@PPPPPPPPd 3 3 3 3 3 3r6rQFstring stop_at_pdir,r-cPd}|D]}tj|}|r|rd}|dkr|dkr|rtjcS|dvr|dz }|dkr |dkr|dz}|dvr|dkrtjcS|dkr|dkrtjcStjS)aH This function applies rules P2 and P3 to detect the direction of a paragraph, retuning the first strong direction and skipping over isolate sequences. P1 must be applied before calling this function (breaking into paragraphs) stop_at_pdi can be set to True to get the direction of a single isolate sequence rr/r`r]r^r_r )r/rbr9)r1r2r0r LTRRTL)rrr,isolater}r(s r4auto_detect_base_directionrsG % % .t44  Z'')) J   7a<.LevelRunleveltextcompleterUrVN) rBrCrDrFrOrr$rHrGrIr6r4LevelRunrsE =!!!!  r6rrF)rrrrUrVrr-c|dzdkrdSdS)Nr8rr9r/rI)rs r4level_to_directionz2calculate_isolate_runs..level_to_directions 19>>3sr6rr rrtrrUrVTr`)rRrUrV) rr*rvrFrGromaxrmr)rQ)rr level_runlrlr_embedding_levelrprr|lr1rUrV isolate_runslr2ir_charsnlrs r4calculate_isolate_runsrsK9!#I B'l:    $(: : :   / %    B!*!:  ) '   ##  ** s z?   A::$$S\22CC$$SWy7KG7T%U%UVVC C NNQ& & &$$S\22CC6{226KKK((W66((G i &:7&CDDE E (*L **QQ s z?  %j%jv;J v;r? .2G G G -  LCL00F A:eCCKKK3v;.KKK&*C Oe*C6{2:BWWWLH#3OOOPPPP r6c HeZdZdZ ddedeededdfdZde e fd Z de e fd Z de e d ffd Zde e e e e d fffd ZdefdZde e eefd ffdZddZde e eefd ffdZde e d ffdZdS) BidiParagraph)rbase_directionr,base_embedding_levelrRNFrrr,r-c||_|st|j|n||_||_|jtjkrdnd|_g|_|dS)Nrr ) rrrr,r rrrRget_bidi_characters)r3rrr,s r4r5zBidiParagraph.__init__"s{  " &ty% 8 8 8   $ (999AAq !02   """""r6c|jSr>)rRr:s r4get_characterszBidiParagraph.get_characters5s r6c8||jSr>)reorder_resolved_levelsrRr:s r4#get_characters_with_embedding_levelz1BidiParagraph.get_characters_with_embedding_level8s $$&&&r6.c*|Sr>)rr:s r4get_reordered_charactersz&BidiParagraph.get_reordered_characters>s++---r6c8|j|fSr>)rRrr:s r4get_allzBidiParagraph.get_allAs < < > >>>r6cddd|DS)zUsed for conformance validationrc3$K|] }|jV dSr>)r').0rs r4 z5BidiParagraph.get_reordered_string..Fs$KKqq{KKKKKKr6)joinrr:s r4get_reordered_stringz"BidiParagraph.get_reordered_stringDs/wwKKD,H,H,J,JKKKKKKr6c*|Sr>)split_bidi_fragmentsr:s r4get_bidi_fragmentsz BidiParagraph.get_bidi_fragmentsHs((***r6ct}t|jdd}|t |d}d}d}g}t |jD]\}}t|||j|j } d} | j dkr>t|j|dzdd|j tj krd nd | _ | j d vr| j dd kr|jdzdz} n |jd zdz} | j d dkr|jdkr|j} | tkr|dkrz|dkrt| |_| j d dkr | j dnd|_| j d dkr |dz }d|_nd|_|t |n"| j d dkr|dz }n |dkr|dz }| j dvr|jdkr|j} | j dkr|dkr|dz}nZ|dkrTd} |djs|# |t |d}|dz}t%|tsJ|j| _|jdkr|j} | j dkrU|dkrO|dkr|dz}nC|js !+A.#55+q0+DHAADIALL!8!89999 +A.#55.!3..1Q66494# ,  "=DD%3%ON#u,,)A--*a/**(1,,/0,$RyC%!IIKKK$IIKKK%,U2Y%7%7N'1,'!.2CDDDDD,:,J )!=DD%3%ON#u,,)Q../!330A500!/ I@ #E Q!IIKKK-4U2Y-?-?N 6'5 $#,'3..040II--2:OOO0>0NI-y)))  DO F!w'''''r6cg}t|jdkrdSd}d}|jD]o}||krK|r3|||dkr tjn tjfd}|}||jz }p|r3|||dkr tjn tjft|S)NrrIrr/) rmrRr;rvr rrr'r)r3bidi_fragmentscurrent_fragmentcurrent_directionrs r4rz"BidiParagraph.split_bidi_fragmentss:< t  1 $ $2 , ,A))++/@@@# ")),$5#;#;!. 1 1%2%6    $& $%$>$>$@$@!  +      ! !$-33&))*.    ^$$$r6cd}d}d}d}t|jD]j}|jdvr|j|_d}n|jdvr|s|r |j|_nd}d}|j|kr|j}|jdzdkr|j|kr|j}k|j}t ||dz d D]{}g}g} |D]U}|j|kr| |#| r| || z }g} ||V| r| || z }|}|t|S) NTri)rr)rrr_r]r^r`Fr8r rt) reversedrRr)rr*copyrwrvreverser) r3before_separator end_of_line max_level min_odd_levelrpreordered_paragraphr temp_resultsrevs r4rz%BidiParagraph.reorder_resolved_levelss   !$/22 : :I, ::,0,E )#'  .3$J{J040II-#( # (944%5 )A-22- == ) 9 #o22449ma&7<< / /E02L')C0 3 3 ,55JJy))))! $+   '' 2222 $ # ".  ()))r6)NFr)rBrCrDrErGrr rHr5rr$rrrrrrrrrrrIr6r4rrsI37 ###!/# #  ####&] 3T-5H .% s0B*C....?tM2E-:L4MMN????LcLLLL+E%]0B*CS*H$I++++G(G(G(G(R!%eE#}2D,Es,J&K!%!%!%!%F4*}c/A)B4*4*4*4*4*4*r6r)FF)r1 collectionsr dataclassesrroperatorrtypingrrenumsr r rFrOr"dictrGr$rKrQrHrrrrrIr6r4rs'  ********&&&&&&&&  3 A,#s # #A,#s # #A,#s # #A,#s # # A, #s # # A, #s # # A, E3 ' 'A, E3 ' 'A, E3 ' 'A, E3 ' 'A, E3 ' 'A, E3 ' 'A, E3 ' 'A, E3 ' 'A, E3 ' 'A,  E3 ' '!A," E3 ' '#A,A,$ E3 ' '%A,& E3 ' ''A,( E3 ' ')A,* E3 ' '+A,, E3 ' '-A,. E3 ' '/A,0 E3 ' '1A,2 E3 ' '3A,4 E3 ' '5A,6 E3 ' '7A,8 E3 ' '9A,: E3 ' ';A,< E3 ' '=A,> E3 ' '?A,@ E3 ' 'AA,B E3 ' 'CA,D E3 ' 'EA,A,A,F E3 ' 'GA,H E3 ' 'IA,J E3 ' 'KA,L E3 ' 'MA,N E3 ' 'OA,P E3 ' 'QA,R E3 ' 'SA,T E3 ' 'UA,V E3 ' 'WA,X E3 ' 'YA,Z E3 ' '[A,\ E3 ' ']A,^ E3 ' '_A,` E3 ' 'aA,b E3 ' 'cA,d E3 ' 'eA,f E3 ' 'gA,A,A,h E3 ' 'iA,j E3 ' 'kA,l E3 ' 'mA,n E3 ' 'oA,p E3 ' 'qA,r E3 ' 'sA,t E3 ' 'uA,v E3 ' 'wA,x E3 ' 'yA,z E3 ' '{A,| E3 ' '}A,~ E3 ' 'A,@ E3 ' 'AA,B E3 ' 'CA,D E3 ' 'EA,F E3 ' 'GA,H E3 ' 'IA,A,A,J E3 ' 'KA,L E3 ' 'MA,N E3 ' 'OA,P E3 ' 'QA,R E3 ' 'SA,T E3 ' 'UA,V E3 ' 'WA,X E3 ' 'YA,Z E3 ' '[A,\ E3 ' ']A,^ E3 ' '_A,` E3 ' 'aA,b E3 ' 'cA,d E3 ' 'eA,f E3 ' 'gA,h E3 ' 'iA,j E3 ' 'kA,A,A,l E3 ' 'mA,n E3 ' 'oA,p E3 ' 'qA,r E3 ' 'sA,t E3 ' 'uA,v E3 ' 'wA,x E3 ' 'yA,z E3 ' '{A,| E3 ' '}A,~ E3 ' 'A,@ E3 ' 'AA,B E3 ' 'CA,D E3 ' 'EA,F E3 ' 'GA,H E3 ' 'IA,J E3 ' 'KA,L E3 ' 'MA,A,A,N E3 ' 'OA,P E3 ' 'QA,R E3 ' 'SA,T E3 ' 'UA,V E3 ' 'WA,X E3 ' 'YA,Z E3 ' '[A,\ E3 ' ']A,^ E3 ' '_A,` E3 ' 'aA,b E3 ' 'cA,d E3 ' 'eA,f E3 ' 'gA,h E3 ' 'iA,j E3 ' 'kA,l E3 ' 'mA,n E3 ' 'oA,A,p3 ' '3 ' '3 ' '3 ' '3 ' '3 ' '3 ' '3 ' '3 ' 'AA,A,A, tCc3h'(AAAH" " " " " " " " J %%%%%%% %[3[3[3[3[3[3[3[3~;@ "378Ud=&9Ud<>PUUUUpR*R*R*R*R*R*R*R*R*R*r6