o
    gi$                     @   sd   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 G dd dZ
G d	d
 d
ZdS )zw
Base Transformer implementation.
Add children to handle specific cases (transforming dictionaries, arrays, xref, etc)
    N)HighLevelTokenizer)
AnyPDFType)	Reference)EventListenerc                   @   s`   e Zd ZdZ				d	deje dejej dejeje	j
e	je	jf  deje fddZdS )
ReadTransformerStatea  
    This class represents all the meta-information used in the process of reading a PDF document.
    This includes:
    - the root object (the Document itself)
    - the tokenizer
    - references that have been resolved (to avoid endless loops)
    - etc
    Npasswordroot_objectsource	tokenizerc                 C   s*   t  | _|| _|| _d | _|| _|| _d S )N)setindirect_reference_chainr   r   security_handlerr	   r
   )selfr   r   r	   r
    r   L/home/ubuntu/.local/lib/python3.10/site-packages/borb/io/read/transformer.py__init__   s   	
zReadTransformerState.__init__)NNNN)__name__
__module____qualname____doc__typingOptionalstrAnyUnionioBufferedIOBase	RawIOBaseBytesIOr   r   r   r   r   r   r      s"    
r   c                   @   s   e Zd ZdZdd ZdefddZddd	Zd
ej	e
je
je
jef defddZdejd  fddZdddZdg fdej	e
je
jef dejdeje deje dejf
ddZdS )Transformerz
    Base Transformer implementation.
    Add children to handle specific cases (transforming dictionaries, arrays, xref, etc)
    c                 C   s   g | _ d| _d| _d | _d S )Nr   )	_children_invocation_count_level_parentr   r   r   r   r   B   s   
zTransformer.__init__returnc                 C   sT   z#|}|g}|d ur!|  }||v rW dS || |d us
W dS W dS    Y dS )NTF)
get_parentappend)r   object_to_transformpparentsr   r   r   _is_recursive_objectL   s   

z Transformer._is_recursive_objectchild_transformerc                 C   s   | j | | |_| S )ac  
        Add a child ReadBaseTransformer to this ReadBaseTransformer.
        Child transformers can be used to encapsulate specific object-creation/transformation logic.
        e.g. creating XREF, converting arrays, dictionaries, etc
        :param handler: the ReadBaseTransformer implementation to be added
        :type handler:  Transformer
        )r    r'   r#   )r   r,   r   r   r   add_child_transformer]   s   z!Transformer.add_child_transformerobjectc                 C   s   dS )z{
        This function returns True if the object to be transformed can be transformed by this ReadBaseTransformer
        Fr   )r   r.   r   r   r   can_be_transformedi   s   zTransformer.can_be_transformedc                 C   s   | j S )zc
        This functions returns all child ReadBaseTransformers of this ReadBaseTransformer
        )r    r$   r   r   r   get_childrenr   s   zTransformer.get_childrenc                 C   s"   | }|j dur|j }|j dus|S )aD  
        This function returns the top-level ReadBaseTransformer.
        This is useful when delegating calls from inside a ReadBaseTransformer to another.
        e.g. Transforming a dictionary by reading its delimiters and then transforming each key/value in turn by
        calling top-level ReadBaseTransformer
        N)r#   )r   r)   r   r   r   get_root_transformerx   s
   

z Transformer.get_root_transformerNr(   parent_objectcontextevent_listenersc                 C   sl   |  |r|S | jD ])}||r3|  jd7  _|  jd7  _|j||||d}|  jd8  _|  S q
dS )z
        This function reads an object from a byte stream.
        The object being read depends on the implementation of ReadBaseTransformer.
           )r2   r3   r4   N)r+   r    r/   r"   r!   	transform)r   r(   r2   r3   r4   houtr   r   r   r6      s    


zTransformer.transform)r,   r   r%   r   )r%   r   )r   r   r   r   r   boolr+   r-   r   r   r   r   r   r   r   r/   Listr0   r1   r   r   r   r   r6   r   r   r   r   r   8   s2    	


	
r   )r   r   r   *borb.io.read.tokenize.high_level_tokenizerr   borb.io.read.typesr   r   $borb.pdf.canvas.event.event_listenerr   r   r   r   r   r   r   <module>   s   '