
    JՁjk!                        U d Z ddlZddlmZmZmZmZ ddlmZ ddl	m
Z
mZ ddlmZmZmZ daeed	<   daeed
<   daeed<   dZeed<   dZdZ G d de      Z	 	 	 d0deeedf   deeedf   deeee   df   deeeef   fdZdee   dee   dee   fdZdee   defdZ dedeee   ee   f   deee   ee   f   deee   ee   f   dee   deed f   d!ed"ed#eeeeeeegdf      d$ed%ed&edeeeee   ee   f   fd'Z!d(eeeef      d)ee   d*ee   d+edeed f   deee"f   fd,Z#ded)ee   d*ee   dee   d+ed-ed"ed.e"d#eeeeeeegdf      deee"ef   fd/Z$y)1ze
Code related to text extraction.

Some parts are still in _page.py. In doubt, they will stay there.
    N)AnyCallableOptionalUnion   )Font)is_char_neutralis_char_rtl)DictionaryObjectTextStringObjectencode_pdfdocencoding CUSTOM_RTL_MINCUSTOM_RTL_MAXCUSTOM_RTL_SPECIAL_CHARS    LAYOUT_NEW_BT_GROUP_SPACE_WIDTHSi c                       e Zd Zy)OrientationNotFoundErrorN)__name__
__module____qualname__     F/tmp/pip-target-jj2dfcxx/lib/python/pypdf/_text_extraction/__init__.pyr   r      s    r   r   _min_maxspecialsreturnc                    t        | t              r$t        | cxk  r	t        k  rn nt	        |       ndant        | t              r| at        |t              r$t        |cxk  r	t        k  rn nt	        |      ndant        |t              r|at        |t              r|an(t        |t              rdj                  d |D              at
        t        t        fS )a  
    Change the Right-To-Left and special characters custom parameters.

    Args:
        _min: The new minimum value for the range of custom characters that
            will be written right to left.
            If set to ``None``, the value will not be changed.
            If set to a valid integer, it will be converted to its corresponding character.
            The default value is "", which sets no additional range to be converted.
        _max: The new maximum value for the range of custom characters that will
            be written right to left.
            If set to ``None``, the value will not be changed.
            If set to a valid integer, it will be converted to its corresponding character.
            The default value is "", which sets no additional range to be converted.
        specials: The new list of special characters to be inserted in the
            current insertion order.
            If set to ``None``, the current value will not be changed.
            If set to a string, it will be converted to a list of ASCII codes.
            The default value is an empty list.

    Returns:
        A tuple containing the new values for ``CUSTOM_RTL_MIN``,
        ``CUSTOM_RTL_MAX``, and ``CUSTOM_RTL_SPECIAL_CHARS``.

    r   c              3   `   K   | ]&  }t         |cxk  r
t        k  sn nt        |       ( y w)N)UNICODE_LOWER_LIMITUNICODE_UPPER_LIMITchr).0chars     r   	<genexpr>z!set_custom_rtl.<locals>.<genexpr>D   s'      +
.AT.`M`.`CI+
s   ..)
isinstanceintr"   r#   r$   r   strr   r   listjoin)r   r   r   s      r   set_custom_rtlr-      s    > $&9T&XEX&XT^`	D#	$&9T&XEX&XT^`	D#	(C #+ 	Hd	##%77 +
"*+
 $
  >+CCCr   mnc           	      &   | d   |d   z  | d   |d   z  z   | d   |d   z  | d   |d   z  z   | d   |d   z  | d   |d   z  z   | d   |d   z  | d   |d   z  z   | d   |d   z  | d   |d   z  z   |d   z   | d   |d   z  | d   |d   z  z   |d   z   gS )Nr      r         r   r   )r.   r/   s     r   multr4   J   s    	!qtadQqTk!	!qtadQqTk!	!qtadQqTk!	!qtadQqTk!	!qtadQqTk!AaD(	!qtadQqTk!AaD( r   c                 :    | d   dkD  ry| d   dk  ry| d   dkD  ryy)	Nr2   gư>r   gư   r1   Z     r   )r.   s    r   orientr9   U   s/    td{te|taxr   text	cmtm_prevcmtm_matrix	memo_cmtmfont_resourceorientations.output	font_sizevisitor_text
str_widths
spacewidth
str_heightc                    |d   }|d   }|d   }|d   }|d   }|d   }t        ||      }t        ||      }t        |      }|d   |d   z
  }|d   |d   z
  }t        j                  |d   dz  |d   dz  z         }t        j                  |d   dz  |d   dz  z         }t        j                  |d   dz  |d   dz  z         }|}||vrt        |dv r|}|}n|dv r|}|}	 t              d	t        ||z  ||z        z  kD  r'|| z   d
   dk7  r7|| dz   z  }| || dz   ||||       d} n|
|	z   |z  k\  r|| z   d
   dk7  r| dz  } |j                         }|j                         }| |||fS # t        $ r Y 1w xY w)Nr   r1   r3   r   r   r2   )r   r6   )r7   r8   g?
r    )	r4   r9   mathsqrtr   absmin	Exceptioncopy)r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   cm_prevtm_prev	cm_matrix	tm_matrixmemo_cmmemo_tmm_prevr.   orientationdelta_xdelta_yscale_prev_xscale_prev_yscale_ymoved_heightmoved_widths                               r   crlf_space_checkr_   _   s    lGlGAIAIlGlG'7#FY	"A)KdVAYGdVAYG99WQZ]WQZ]:;L99WQZ]WQZ]:;Lii	!a)A,/9:GG,&&&h%$			!|sSl)BIPWDW%XXXr"d*$+%+ t%! Z*4DD$#s*CKD nnGnnG'))	  s   "A#E+ +	E76E7operandsrR   rS   fontc                 `   d}d}t        ||      }t        |      }||v rt        |       dkD  rt        | d   t              r| d   }d}||fS d}t        | d   t              rt        | d         n| d   }	t        |j                  t              r!	 |	j                  |j                  d      }||fS dj                  |	D 
cg c]9  }
|
|j                  v r|j                  |
   nt        |
f      j                         ; c}
      }||fS # t        $ r |	j                  dd      }Y ||fS w xY wc c}
w )Nr   Fr   Tsurrogatepasscharmap)r4   r9   lenr(   r*   r   encodingdecoderN   r,   bytes)r`   rR   rS   ra   r?   tis_str_operandsr.   rW   ttxs              r   get_text_operandsrm      sO    AOY	"A)Kl"s8}q'8hqk3'A"O( % A hqk3/ &hqk2a[ 
 $--->		$--AA  GG_abZ[dmm);T]]1%tASASAUUb  ! > 		)_=A
 > cs   D >>D+D('D(text_operandsrtl_dirc	                    d}	|D ]  }
|	|
|j                   k(  r|j                  n|j                  |
      z  }	|j                  j	                  |
|
      }t        |      dk(  rft        |t              r|r|| z   n| |z   } yt        |t        t              r|sd}| || ||||       d} || z   } |rd}| || ||||       d} | |z   } |r|| z   n| |z   }  | ||	fS )Ng        r1   Tr   F)
space_charspace_widthget_text_widthcharacter_mapgetre   r	   r   r
   r   r   )r:   rR   rS   r>   ra   rn   rA   ro   rB   widthsraw_characterrl   s               r   get_display_strrx      s    F& 5mt&F$""DL_L_`mLnn""=-@q6Q;  #;<#*q4xq A~~>"G#/$T9iPYZD4x #G#/$T9iPYZDax  '1t8D1HD=5> &  r   )r   r   N)%__doc__rJ   typingr   r   r   r   _fontr   _utilsr	   r
   genericr   r   r   r   r*   __annotations__r   r   r   r)   r"   r#   rN   r   r+   tupler-   floatr4   r9   r_   boolrm   rx   r   r   r   <module>r      s    1 1  1 O O   " # "()  # )  	y 	
 #%"$,0-D
S$
-D
S$
-D CcD()-D 3S=	-D`DK DK DK d5k c >*
>*T%[$u+-.>* tE{DK/0>* T%[$u+-.	>*
 ,->* S/>* >* >* 8S#sC$=t$CDE>* >* >* >* 3T%[$u+-.>*B" 5../0" E{"  E{"  	" 
 S/"  39" J,!
,!E{,! E{,! ,-	,!
 ,! ,! ,! ,! 8S#sC$=t$CDE,! 3e,!r   