
    FgR                        % S r SSKrSSKrSSKrSSKrSSKJr  SSKJrJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJrJrJr  SSKJrJr  \(       a  SSKJr  SSKrSr\\R>                  \ \RB                  4   r"\\\
4   r# " S S	5      r$S
\ S\%4S jr&S\'S\ 4S jr(S\ S\)S\ 4S jr*  SVS\\%\ 4   S\ S\ S\ 4S jjr+S\)S\)S\)S\)4S jr,S\)S\)S\)S\)S\%S\%4S jr-\\.\.4   r/\\.\.\.\.4   r0\\.\.\.\.\.\.4   r1\\\    \\ \.\.4   \\ \.\.\.\.4   \\ \.\.\.\.\.\.4   4   r2S r3\1\4S!'   S\	S\04S" jr5S#\1S$\1S\14S% jr6S&\1S'\/S\14S( jr7S&\1S'\/S\/4S) jr8S&\1S'\/S\/4S* jr9S&\1S\.4S+ jr:S,\'S\;4S- jr<\" S.5      r=S/\\=   S\\=   4S0 jr>S\\=/\;4   S/\\=   S\\\=   \\=   4   4S1 jr?S2\.S3\.S4\)S\@4S5 jrAS6\\/   S\04S7 jrB SWS8\\=   S9\\=/\.4   S:\\=   S\\=   4S; jjrCS<\)S8\\=   S\\\=S=4      4S> jrDSXS\%S?\)S\)4S@ jjrESAR                  SB SC 5       5      rGS\%S\ 4SD jrHS,\ S\ 4SE jrISF\0S\ 4SG jrJS&\1S\ 4SH jrKSISJSKSJS\/4SL jrL\" SMSJSN9rM " SO SP\\M   5      rN/ SQQrO/ SRQrPSS\)S\ 4ST jrQSS\)S\ 4SU jrRg)YzMiscellaneous Routines.    N)escape)TYPE_CHECKINGAnyBinaryIOCallableDictGenericIterableIteratorListOptionalSetTextIOTupleTypeVarUnioncast)PDFTypeErrorPDFValueError)LTComponentic                   Z    \ rS rSrSrS\S\S\SS4S jrS\4S	 jr	S
\
S\
S\
SS4S jrSrg)open_filename+   zContext manager that allows opening a filename
(str or pathlib.PurePath type is supported) and closes it on exit,
(just like `open`), but does nothing for file-like objects.
filenameargskwargsreturnNc                 ^   [        U[        R                  5      (       a  [        U5      n[        U[        5      (       a  [	        U/UQ70 UD6U l        SU l        g [        U[        R                  5      (       a  [        [        U5      U l        SU l        g [        S[        U5      -  5      e)NTFzUnsupported input type: %s)
isinstancepathlibPurePathstropenfile_handlerclosingioIOBaser   AnyIOr   type)selfr   r   r   s       ]/Users/admin/workspace/ai/PDFMathTranslate/myenv/lib/python3.13/site-packages/pdf2zh/utils.py__init__open_filename.__init__1   s    h 0 0118}Hh$$'+H'Ft'Fv'FDDL")),, $UH 5D DL;d8nLMM    c                     U R                   $ N)r$   r*   s    r+   	__enter__open_filename.__enter__=   s       r.   exc_typeexc_valexc_tbc                 \    U R                   (       a  U R                  R                  5         g g r0   )r%   r$   close)r*   r4   r5   r6   s       r+   __exit__open_filename.__exit__@   s     <<##% r.   )r%   r$   )__name__
__module____qualname____firstlineno____doc__
FileOrNamer   r,   r(   r2   objectr9   __static_attributes__ r.   r+   r   r   +   sZ    

N 
NC 
N3 
N4 
N!5 !& && && &T &r.   r   in_strr   c                 ~    [        U [        5      (       d   [        [        U 5      5      5       eU R                  5       $ )z'Converts to bytes, encoding to unicode.)r   r"   r)   encode)rD   s    r+   make_compat_bytesrG   E   s/    fc""5CV$55"==?r.   oc                     [        U [        5      (       a+  [        R                  " U 5      n U R	                  US   5      $ [        U 5      $ ! [
         a    [        U 5      s $ f = f)z>Converts everything to string, if bytes guessing the encoding.encoding)r   bytescharset_normalizerdetectdecodeUnicodeDecodeErrorr"   )rH   encs     r+   make_compat_strrQ   K   s\    !U ''*	88C
O,, 1v " 	q6M	s   A A$#A$ssizec                 d    US:  a  U S U $ [        U 5      U:  a  US-
  S-  nU S U  SX* S   3$ U $ )N         z ... )len)rR   rS   lengths      r+   shorten_strrZ   W   sN    ax$x
1v}(qGV*U1WX;-00r.   bytesorstringrJ   	erractionc                     [        U [        5      (       a  U $ [        U [        5      (       d   [        [        U 5      5      5       eU R	                  X5      $ )zVWhen Py2 str.encode is called, it often means bytes.encode in Py3.

This does either.
)r   r"   rK   r)   rN   )r[   rJ   r\   s      r+   compatible_encode_methodr^   a   sJ     -%%mU++ESm1D-EE+44r.   leftabove
upper_leftc                     X-   U-
  n[        X0-
  5      n[        X1-
  5      n[        X2-
  5      nXE::  a  XF::  a  U $ XV::  a  U$ U$ r0   )abs)r_   r`   ra   ppapbpcs          r+   paeth_predictorrh   p   sR     	z!A	QXB	QYB	Q^	B 
xBH	r.   predcolorscolumnsbitspercomponentdatac                     US;  a  SU-  n[        U5      eX-  U-  S-  nX-  S-  n/ n[        SU-  5      n	[        S[        U5      US-   5       GH  n
XJ   nXJS-   U
S-   U-    n/ nUS:X  a  [        U5      nGOrUS:X  aJ  [	        U5       H9  u  pX-
  S:  a  SnO[        XU-
     5      nUU-   S-  nUR                  U5        M;     GO"US:X  a/  [        X5       H  u  nnUU-   S-  nUR                  U5        M!     OUS	:X  a]  [	        U5       HM  u  nnX-
  S:  a  SnO[        XU-
     5      n[        X   5      nUUU-   S-  -   S-  nUR                  U5        MO     OUS
:X  av  [	        U5       Hf  u  nnX-
  S:  a  SnSnO [        XU-
     5      n[        XU-
     5      n[        X   5      n[        UUU5      nUU-   S-  nUR                  U5        Mh     O[        SU-  5      eUR                  U5        Un	GM     [        U5      $ )zpReverse the effect of the PNG predictor

Documentation: http://www.libpng.org/pub/png/spec/1.2/PNG-Filters.html
)      z"Unsupported `bitspercomponent': %dro       r   rp      rW         zUnsupported predictor value: %d)r   listrangerX   	enumerateintappendziprh   extendrK   )ri   rj   rk   rl   rm   msgnbytesbppbuf
line_above
scanline_ifilter_typeline_encodedrawjsub_x	raw_x_bppraw_xup_xprior_x	average_xpaeth_xprior_x_bpppaeths                           r+   apply_png_predictorr      sZ    v%25EEC   00A5F

#q
(C
Cg'(JAs4y&1*5
&NZ!^f-DE!|$CA &l37Q; !I #CCL 1I*c1

5! 4 A "%\!>g3.

5! "? A !*, 797Q; !I #CCL 1Ijm,"i'&9a%??3F

5! !8 A (5
77Q; !I"#K #CCL 1I"%jS&9":Kjm,'	7KH 5C/

5! 6   AK OPP

3
] 6^ :r.   )rp   r   r   rp   r   r   MATRIX_IDENTITYc                      U u  pp4[        U5      [        U5      [        U5      [        U5      4$ ! [         a    [        S5      ef = f)NzCould not parse rectangle)float
ValueErrorr   )rH   x0y0x1y1s        r+   
parse_rectr      sK    9Ry%)U2Yb	99 97889s	   .1 Am1m0c                     U u  p#pEpgUu  ppp X-  X-  -   X-  X-  -   X-  X-  -   X-  X-  -   X-  X-  -   U-   X-  X-  -   U-   4$ r0   rC   )r   r   a1b1c1d1e1f1a0b0c0d0e0f0s                 r+   mult_matrixr      sy    !RRR!RRR5
"'
"'
"'
"'
"'B
"'B r.   mvc                 J    U u  p#pEpgUu  pX#XEX-  X-  -   U-   X-  X-  -   U-   4$ )zTranslates a matrix by (x, y).rC   
r   r   abcdefxys
             r+   translate_matrixr     s>    Q1FQququ}q(!%!%-!*;;;r.   c                 H    U u  p#pEpgUu  p X(-  XI-  -   U-   X8-  XY-  -   U-   4$ r0   rC   r   s
             r+   apply_matrix_ptr     s=    Q1FQ&515=1aeaema///r.   c                 :    U u  p#pEpgUu  pX(-  XI-  -   X8-  XY-  -   4$ )zCEquivalent to apply_matrix_pt(M, (p,q)) - apply_matrix_pt(M, (0,0))rC   )
r   r   r   r   r   r   r   r   rd   qs
             r+   apply_matrix_normr     s0    Q1FQ515=!%!%-''r.   c                 *    U u  pp4pVUS-  US-  -   S-  $ )NrW   g      ?rC   r   r   r   r   r   r   r   s          r+   matrix_scaler     s%    Q1qDAIr.   r   c                 .    [        U [        [        45      $ r0   )r   rx   r   r   s    r+   isnumberr   &  s    a#u&&r.   _Tobjsc              #   j   #    [        5       nU  H  nX!;   a  M
  UR                  U5        Uv   M!     g7f)zEliminates duplicated elements.N)setadd)r   doneobjs      r+   uniqr   -  s.     5D;		 s   13c                     / n/ nU H4  nU " U5      (       a  UR                  U5        M#  UR                  U5        M6     X#4$ )z9Split a list into two classes according to the predicate.)ry   )ri   r   tr   r   s        r+   fsplitr   7  s>    
A
A99HHSMHHSM	 
 4Kr.   v0v1r   c                 N    [        [        U 5      U-  [        X-   5      U-  5      $ )zReturns a discrete range.)rv   rx   )r   r   r   s      r+   dranger   C  s"    RAs26{a/00r.   ptsc                     [         [         [         * [         * 4nUu  p#pEU  H1  u  pg[        X&5      n[        X75      n[        XF5      n[        XW5      nM3     X#XE4$ )z7Compute a minimal rectangle that covers all the points.)INFminmax)r   limitr   r   r   r   r   r   s           r+   	get_boundr   H  sZ    cTC4(ERRZZZZ	 
 2>r.   seqfuncmaxobjc                 D    SnU  H  nU" U5      nUb  X5:  d  M  XTp#M     U$ )z;Picks the object obj where func(obj) has the highest value.NrC   )r   r   r   maxscorer   scores         r+   pickr   T  s3     HS	x/"'v  Mr.   n.c              #      #    / nU H4  nUR                  U5        [        U5      U :X  d  M%  [        U5      v   / nM6     g7f)z$Groups every n elements of the list.N)ry   rX   tuple)r   r   rr   s       r+   choplistr   b  s8     
A	q6Q;(NA	 s
   &A A defaultc                    [        U 5      nU(       d  U$ US:X  a  [        U 5      $ US:X  a(  [        [        [        R
                  " SU 5      S   5      $ US:X  a+  [        [        [        R
                  " SSU -   5      S   5      $ US:X  a(  [        [        [        R
                  " SU 5      S   5      $ US	:X  a(  [        [        [        R
                  " S
U 5      S   5      $ [        SU-  5      e)z/Unpacks 1 to 4 or 8 byte integers (big endian).rp   rW   z>Hr   rs   z>Lrq   rt   ro   z>Qzinvalid length: %d)rX   ordr   rx   structunpackr   )rR   r   rY   s      r+   nunpackr   l  s    VF	11v	1CtQ/233	1CtWq[9!<==	1CtQ/233	1CtQ/233/&899r.    c              #   8   #    U  H  n[        U5      v   M     g 7fr0   )chr).0r   s     r+   	<genexpr>r     s$      DA FFAs   (   r   rp   rW   rs   rt   rV      rU   ro   	   
                                       r   i  i  i  i  i  i  i  i      !   "   #   $   %   &   '   (   )   *   r   ,   -   .   /   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _   `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~   r   i"   i    i!   i&   i   i   i  iD   i9   i:   i"  i0   i   i   i   i   i   i   i"!  i  i  iA  iR  i`  ix  i}  i1  iB  iS  ia  i~  r   i                                       r                                                                                                                                                                                                                                                      rr   c                 ~    U R                  S5      (       a  [        U SS SS5      $ SR                  S U  5       5      $ )z+Decodes a PDFDocEncoding string to Unicode.s   rW   Nzutf-16beignorer   c              3   4   #    U  H  n[         U   v   M     g 7fr0   )PDFDocEncoding)r   r   s     r+   r   decode_text.<locals>.<genexpr>  s     4!Q~a(!s   )
startswithr"   join)rR   s    r+   decode_textr    s;    ||K  1QR5*h//ww4!444r.   c                 D    [        U [        5      (       a  g[        U 5      $ )z"Encodes a string for SGML/XML/HTMLr   )r   rK   r   r   s    r+   rP   rP     s    !U!9r.   bboxc                 .    U u  pp4US SUS SUS SUS 3$ )Nz.3f,rC   )r  r   r   r   r   s        r+   bbox2strr    s1    RRXQr#ha3xqC11r.   c                 D    U u  pp4pVSUS SUS SUS SUS SUS SUS S3$ )N[z.2fr  z, (z)]rC   r   s          r+   
matrix2strr    sG    Q1qgQqgQqgQqgS3q3rBBr.   obj1r   obj2c                    [        U R                  UR                  5      [        U R                  UR                  5      p2[        U R                  UR                  5      [        U R
                  UR
                  5      pTXB-
  XS-
  pvX`R                  -
  UR                  -
  XpR                  -
  UR                  -
  pUS:  a|  U	S:  av  U R                  U R                  -   S-  U R                  U R
                  -   S-  pUR                  UR                  -   S-  UR                  UR
                  -   S-  pX-
  X-
  4$ [        SU5      [        SU	5      4$ )aj  A distance function between two TextBoxes.

Consider the bounding rectangle for obj1 and obj2.
Return vector between 2 boxes boundaries if they don't overlap, otherwise
returns vector betweeen boxes centers

         +------+..........+ (x1, y1)
         | obj1 |          :
         +------+www+------+
         :          | obj2 |
(x0, y0) +..........+------+
r   rW   )r   r   r   r   r   r   widthheight)r  r  r   r   r   r   owohiwihxc1yc1xc2yc2s                 r+   vecBetweenBoxesr    s    DGGTWW%s477DGG'<DGGTWW%s477DGG'<ZZ$**,b;;.>.L	Av"q&ww(A-$''0AQ/Fcww(A-$''0AQ/Fcy#)##1bz3q":%%r.   LTComponentT)boundc                       \ rS rSrSrSS\S\SS4S jjrS\4S jr	S\
\   4S	 jrS\4S
 jrS\S\4S jrS\S\
\   4S jrS\\   SS4S jrS\SS4S jrS\SS4S jrS\S\
\   4S jrSrg)Planei  zA set-like data structure for objects placed on a plane.

Can efficiently find objects in a certain rectangular area.
It maintains two parallel lists of objects, each of
which is sorted by its x or y coordinate.
r  gridsizer   Nc                     / U l         [        5       U l        0 U l        X l        Uu  U l        U l        U l        U l        g r0   )	_seqr   _objs_gridr  r   r   r   r   )r*   r  r  s      r+   r,   Plane.__init__  s4    (*	(+
68
 /3,$'47DGr.   c                     S[        U 5      -  $ )Nz<Plane objs=%r>)ru   r1   s    r+   __repr__Plane.__repr__  s     4:--r.   c                 0   ^  U 4S jT R                    5       $ )Nc              3   J   >#    U  H  oTR                   ;   d  M  Uv   M     g 7fr0   r  )r   r   r*   s     r+   r   !Plane.__iter__.<locals>.<genexpr>  s     >y4::,=ys   #	#)r  r1   s   `r+   __iter__Plane.__iter__  s    >tyy>>r.   c                 ,    [        U R                  5      $ r0   )rX   r  r1   s    r+   __len__Plane.__len__  s    4::r.   r   c                     XR                   ;   $ r0   r  )r*   r   s     r+   __contains__Plane.__contains__  s    jj  r.   c              #     #    Uu  p#pEX@R                   ::  d/  U R                  U::  d  XPR                  ::  d  U R                  U::  a  g [	        U R                   U5      n[	        U R                  U5      n[        U R                  U5      n[        U R                  U5      n[        X5U R                  5       H%  n[        X$U R                  5       H  nXv4v   M
     M'     g 7fr0   )r   r   r   r   r   r   r   r  )r*   r  r   r   r   r   grid_ygrid_xs           r+   	_getrangePlane._getrange  s     =DGGrMR77]dggm""""RT]]3F 7&& 8 4s   CCr   c                 8    U H  nU R                  U5        M     g r0   )r   )r*   r   r   s      r+   r{   Plane.extend  s    CHHSM r.   c                 x   U R                  UR                  UR                  UR                  UR                  45       HC  nX R
                  ;  a  / nX0R
                  U'   OU R
                  U   nUR                  U5        ME     U R                  R                  U5        U R                  R                  U5        g)zPlace an object.N)
r  r   r   r   r   r  ry   r  r  r   )r*   r   kr   s       r+   r   	Plane.add  s     @AA

"(* !

1JJqMHHSM B 			

sr.   c                 .   U R                  UR                  UR                  UR                  UR                  45       H"  n U R
                  U   R                  U5        M$     U R                  R                  U5        g! [        [        4 a     MU  f = f)zDisplace an object.N)
r  r   r   r   r   r  removeKeyErrorr   r  )r*   r   r  s      r+   r  Plane.remove  sw     @AA

1$$S) B
 	

# j) s   B  BBc              #   `  #    Uu  p#pE[        5       nU R                  U5       H  nXpR                  ;  a  M  U R                  U    H_  nX;   a  M
  UR                  U5        UR                  U::  d.  XHR
                  ::  d  UR                  U::  d  XXR                  ::  a  M[  Uv   Ma     M     g7f)z)Finds objects that are in a certain area.N)r   r  r  r   r   r   r   r   )	r*   r  r   r   r   r   r   r  r   s	            r+   find
Plane.find  s     u%A

"zz!};66R<2<366R<2<	 % &s   B,B.)r  r  r  r  r   r   r   r   )r  )r;   r<   r=   r>   r?   Rectrx   r,   r"   r  r   r  r  r  rA   boolr  Pointr  r
   r{   r   r  r  rB   rC   r.   r+   r  r    s    4T 4S 4$ 4.# .?(<0 ? ! !4 !
'd 
'x 
'8L1 d 
| 
 
, 4  (<"8 r.   r  )ir   r   r   )r   lr   valuec                    SU s=:  a  S:  d   e   e/ nSnU S:w  a  [        U S5      u  pUS:X  a6  UR                  S[        U   5        UR                  S[        US-      5        OUS:X  a3  UR                  S[        U   5        UR                  S[        U   5        OOUS:  nU(       a  UR                  S[        U   5        US-  nUR                  U(       a  SOS[        U   U-  5        US-  nU S:w  a  M  SR	                  U5      $ )	z,Format a number as lowercase Roman numerals.r   i  r   r   rp   rt   rV   r   )divmodinsert
ROMAN_ONESROMAN_FIVESr  )r  resultindex	remainder	over_fives        r+   format_int_romanr    s    utFE
1*!%,>MM!Z./MM!Z	23!^MM!Z./MM![/0!QIaU!34Q	MMy!aE1BY1NO
 1*  776?r.   c                    U S:  d   e/ nU S:w  aR  [        U S-
  [        [        R                  5      5      u  pUR	                  [        R                  U   5        U S:w  a  MR  UR                  5         SR                  U5      $ )z5Format a number as lowercase letters a-z, aa-zz, etc.r   rp   r   )r  rX   stringascii_lowercasery   reverser  )r  r  r  s      r+   format_int_alphar  )  sr    199F
1*!%!)S1G1G-HIf,,Y78 1* NN776?r.   )zutf-8r  r0   )r   )Sr?   r&   r    r  r   htmlr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   pdf2zh.pdfexceptionsr   r   pdf2zh.layoutr   rL   r   r!   r"   r'   r@   r(   r   rK   rG   rA   rQ   rx   rZ   r^   rh   r   r   r  r   MatrixPathSegmentr   __annotations__r   r   r   r   r   r   r  r   r   r   r   rv   r   r   r   r   r   r  r  r  rP   r  r  r  r  r  r	  r
  r  r  rC   r.   r+   <module>r     s    	        & =)   7##S"))34
fh& &4c e 	v 	# 	3 c c  5$55 5 		5# c s s $b
bb b 	b
 b bJ 	eUlUE5%'(	ueUE5%7	8	#J	#ue
	#ueUE
)*	#ueUE5%
78: - ,9# 9$ 9F  6 < <5 <V <0v 0% 0E 0( (E (e (F u ' '4 ' T]x|  	2$*% 	Xb\ 	eDHdSUhDV>W 	1u 1% 1C 1E 1
	8E? 	t 	  	"
B4;
 RL b\	 (2, 8E"c'N+C :u :s :3 :&  DAD DN55 5S 53 3 24 2C 2
C& CS C
&- &} & &4 ~];MGL! M` "
C C 2
C 
C 
r.   