
    ;3h                      L   d dl 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 ddlmZ dee
   d	eee	f   fd
Zdee
   d	efdZ edddd      Zde
d	efdZded	eee	f   fdZdee   d	efdZdeded	ee   fdZded	e	fdZde
ded	ee
   fdZdee
   ded	efdZdee
   ded	efdZdee
   ded	efdZdee
   ded	efdZde
d ed!e	d	e
fd"Zdee
   d#ed$e	d	efd%Zde
d&ed!e	d	e
fd'Zd(e
d	efd)Zd*e
d	efd+Z d,e
d	e
fd-Z!de
d	efd.Z"	 	 	 d4d/ee
   d0ee   d1ee   d2e	d	ef
d3Z#y)5    N)
itemgetter)DictIterableOptional   )T_bboxT_numT_obj
T_obj_list   )cluster_objectsobjectsreturnc                 *    t        t        |             S )z
    Given an iterable of objects, return the smallest rectangle (i.e. a
    dict with "x0", "top", "x1", and "bottom" keys) that contains them
    all.
    )bbox_to_rectobjects_to_bboxr   s    Y/var/www/html/audio-gradio/venv/lib/python3.12/site-packages/pdfplumber/utils/geometry.pyobjects_to_rectr   	   s     011    c                 4    t        t        t        |             S )zd
    Given an iterable of objects, return the smallest bounding box that
    contains them all.
    )merge_bboxesmapbbox_getterr   s    r   r   r      s    
 K122r   x0topx1bottomobjc                     t        |       }|S )z0
    Return the bounding box for an object.
    )r   )r   bboxs     r   obj_to_bboxr"      s     s#DKr   r!   c                 (    | d   | d   | d   | d   dS )zd
    Return the rectangle (i.e a dict with keys "x0", "top", "x1",
    "bottom") for an object.
    r   r   r      r   r   r   r    )r!   s    r   r   r   %   s#    
 q'$q'aDGLLr   bboxesc                 p    t        |  \  }}}}t        |      t        |      t        |      t        |      fS )zk
    Given an iterable of bounding boxes, return the smallest bounding box
    that contains them all.
    )zipminmax)r'   r   r   r   r   s        r   r   r   -   s5    
 v,BRGSXs2wF44r   abc                     | \  }}}}|\  }}}}	t        ||      }
t        ||      }t        ||	      }t        ||      }||
z
  }||z
  }|dk\  r|dk\  r||z   dkD  r|
|||fS y )Nr   )r+   r*   )r,   r-   a_lefta_topa_righta_bottomb_leftb_topb_rightb_bottomo_lefto_righto_bottomo_topo_widtho_heights                   r   get_bbox_overlapr=   6   s    '($FE7H'($FE7H F'7#G8X&HuEG%H1}A(W*<q*@w11r   c                 V    | \  }}}}||kD  s||kD  rt        |  d      ||z
  ||z
  z  S )Nz  has a negative width or height.)
ValueError)r!   leftr   rightr   s        r   calculate_arearB   E   sC    #D#ufe|sV|D6!ABCCDLVc\**r   c                     t        t        |       |      }|y t        |      }t        |       }dD ]
  }||   ||<    |d   | d   z
  }d|v r| d   |z   |d<   |d   |d   z
  |d<   |d   |d   z
  |d<   |S )	Nr%   r   doctopr   r   widthr   height)r=   r"   r   dict)r   r!   overlapdimscopyattrdiffs          r   clip_objrM   L   s    {3/6G D9D-  $ZT
  ;U#D4X-XJd+DM(^d5k1DNKr   objsc                 X    | D cg c]  }t        t        |      |      | c}S c c}w )z:
    Filters objs to only those intersecting the bbox
    r=   r"   rN   r!   r   s      r   intersects_bboxrR   `   s*      XC#3K4Dd#K#WCXXX   ''c                 n    | D cg c]%  }t        t        |      |      t        |      k(  r|' c}S c c}w )z:
    Filters objs to only those fully within the bbox
    rP   rQ   s      r   within_bboxrU   g   s=     K,d3{37GG 	  s   *2c                 X    | D cg c]  }t        t        |      |      | c}S c c}w )z;
    Filters objs to only those fully outside the bbox
    rP   rQ   s      r   outside_bboxrW   r   s*      TC#3K4Dd#K#SCTTTrS   c                 @    t        t        dfd| D                    S )zp
    Filters objs to only those intersecting the bbox,
    and crops the extent of the objects to the bbox.
    Nc              3   6   K   | ]  }t        |        y w)N)rM   ).0r   r!   s     r   	<genexpr>zcrop_to_bbox.<locals>.<genexpr>~   s     BchsD1Bs   )listfilter)rN   r!   s    `r   crop_to_bboxr^   y   s    
 tBTBCDDr   axisvaluec                 4   |dv sJ |dk(  rd| d   |z   fd| d   |z   fg}|dk(  rAd| d   |z   fd| d   |z   fg}d| v r|d| d   |z   fgz  }d	| v r|d	| d	   |z
  fd
| d
   |z
  fgz  }| j                  t        | j                               t              z         S )N)hvrb   r   r   rc   r   r   rD   y0y1)	__class__tupleitems)r   r_   r`   	new_itemss       r   move_objectrj      s    :s{3t9u$%3t9u$%
	 s{CJ&'s8}u,-
	 s?8S]U%:;<<I3;s4y5()s4y5() I ==syy{+eI.>>??r   rK   	tolerancec                    ddddd|   }t        |       }t        |t        |      |      }|D cg c],  }t        t	        t        |      |            t        |      z  . }}t        ||      D 	cg c]&  \  }}|D 	cg c]  }	t        |	|||	|   z
         c}	( }
}}}	t        t        j                  |
       S c c}w c c}	w c c}	}}w )Nrb   rc   r   r   r   r   )
r\   r   r   sumr   lenr)   rj   	itertoolschain)rN   rK   rk   r_   	list_objsclustersclusteravgsavgr   snapped_clusterss              r   snap_objectsrx      s    S<TBDT
Iy*T*:IFHNVW7CJt$g./#g,>WDW  $/ GS =DDSS$c$i	0D  	!1233 XDs   1B=3C?CCCkeyc                    |dv sJ | |   }||z
  }||fg}|dk(  r$|| d   k  sJ |j                  d| d   |z
  f       n|dk(  r$|| d   k\  sJ |j                  d|| d   z
  f       n|dk(  rZ|| d   k  sJ |j                  d| d   |z   f       |j                  d| d   |z
  f       d	| v r_|j                  d	| d	   |z
  f       nE|dk(  r@|| d   k\  sJ |j                  d| d   |z   f       d
| v r|j                  d
| d
   |z
  f       | j                  t        | j                               t        |      z         S )Nrm   r   r   rE   r   r   rD   rF   re   rd   )appendrf   rg   rh   )r   ry   r`   	old_valuerL   ri   s         r   resize_objectr}      s   ////CI9D	eI d{D	!!!'3t9u#456	D	!!!'53t9#456	H%%%(CMD$89:(CMD$89:3;dCI$456	E
"""(CMD$89:3;dCI$456==syy{+eI.>>??r   curvec                    t        | d   | d   dd        }|D cg c]  \  }}dt        |d   |d         t        |d   |d         t        |d   |d         t        |d   |d         | d   | d   z
  z   t        |d   |d         t        |d   |d   z
        t        |d   |d   z
        |d   |d   k(  rdn|d   |d   k(  rdnd d		 c}}S c c}}w )
Nptsr   
curve_edger   rD   r   rc   rb   )	object_typer   r   r   rD   r   rE   rF   orientation)r)   r*   r+   abs)r~   point_pairsp0p1s       r   curve_to_edgesr      s   eElE%L$45K " B (beRU#beRU#r!ube$"Q%A'5?U5\+IJ"Q%A'AA'"Q%"Q%-("$Q%2a5.3ber!unsRV
	
  s   B0Crectc           	      ^   t        d      D cg c]  }t        |        c}\  }}}}|j                  dd| d   | d   dd       |j                  dd| d   | d   | d	   z   | d
   | d	   z   dd       |j                  dd| d   dd       |j                  dd| d   dd       ||||gS c c}w )N   	rect_edger   re   r   rb   )r   rF   rd   r   r   rd   rF   rD   )r   rF   re   r   rD   r   r   rc   )r   rE   r   r   r   )r   rE   r   r   )rangerG   update)r   xr   r   r@   rA   s         r   rect_to_edgesr      s    49!H=qT
=CuJJ&t*5k	
 MM&t*;h/8ntH~5	
	 	KK&t*		
 
LL&t*		
 u%%I  >s   B*linec                 @    t        |       }| d   | d   k(  rdnd|d<   |S )Nr   r   rb   rc   r   )rG   )r   edges     r   line_to_edger      s+    :D"&u+h"?#cDKr   c                 f    | d   }d|v r| gS |dk(  rt        |       gS t        t        d|   |       S )Nr   _edger   )r   r~   )r   r   r   )r   ts     r   obj_to_edgesr      sD    MA!|u	
fS!""%?B3GGr   edgesr   	edge_type
min_lengthc                 x    dvrt        d      dt        dt        ffd}t        t	        ||             S )N)rc   rb   NzOrientation must be 'v' or 'h'er   c                     | d   dk(  rdnd}| d   k(  nd}d u xs | d   k(  }t        |xr |xr | |   k\        S )Nr   rc   rF   rE   r   T)bool)r   dim
et_correctorient_correctr   r   r   s       r   testzfilter_edges.<locals>.test  sd    M*c1hw6?6KQ}%2QU
$,O-0@K0OJL>Lqv7KMMr   )r?   r
   r   r\   r]   )r   r   r   r   r   s    ``` r   filter_edgesr     sD     **9::N N$ N tU#$$r   )NNr   )$rp   operatorr   typingr   r   r   _typingr   r	   r
   r   
clusteringr   strr   r   r   r"   r   r   r=   rB   rM   rR   rU   rW   r^   rj   rx   r}   r   r   r   r   r   r&   r   r   <module>r      s     + + 6 6 '2Xe_ 2c5j1A 23Xe_ 3 3 udH5U v Mv M$sEz"2 M5&) 5f 5 6 hv.> + +E +% v (5/ (Y(5/ Y YJ Yhuo V 
 Ux Uf U UEx Ef E E@U @# @e @ @,	4x 	4c 	4e 	4
 	4@u @3 @u @ @6% J $%& %&* %&Pu  He H
 H "&#	%E?%#% }% 	%
 %r   