o
    fL                  	   @   s`  d dl Z d dlZd dlmZmZmZmZmZmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ e eZG dd deZG dd	 d	eZG d
d deZG dd deZG dd deZG dd dZG dd deZG dd deZedeeZG dd dee ZeeZ eeZ!e j"Z#e!j"Z$e$dZ%e$dZ&e$dZ'e$dZ(e$dZ)e$dZ*de+d efd!d"Z,de+d efd#d$Z-e.d%Z/e.d&Z0e.d'Z1e.d(Z2e.d)Z3e.d*Z4e.d+Z5e.d,Z6e.d)Z7e.d-Z8e.d.Z9d/d0d1d2d3d4d5d6d7Z:ee;e<eee=f Z>G d8d9 d9Z?ed:Z@ee;e<ee=eee@f ZAe
eBeAe@ f ZCG d;d< d<e?ee@ ZDdS )=    N)AnyBinaryIODictGenericIteratorListOptionalTupleTypeTypeVarUnion   )settings)choplistc                   @      e Zd ZdS )PSExceptionN__name__
__module____qualname__ r   r   J/home/ubuntu/webapp/venv/lib/python3.10/site-packages/pdfminer/psparser.pyr          r   c                   @   r   )PSEOFNr   r   r   r   r   r      r   r   c                   @   r   )PSSyntaxErrorNr   r   r   r   r   r   #   r   r   c                   @   r   )PSTypeErrorNr   r   r   r   r   r   '   r   r   c                   @   r   )PSValueErrorNr   r   r   r   r   r   +   r   r   c                   @   s   e Zd ZdZdS )PSObjectz0Base class for all PS or PDF-related data types.N)r   r   r   __doc__r   r   r   r   r   /   s    r   c                   @   s<   e Zd ZdZeeef ZdeddfddZdefddZ	dS )		PSLiteralaa  A class that represents a PostScript literal.

    Postscript literals are used as identifiers, such as
    variable names, property names and dictionary keys.
    Literals are case sensitive and denoted by a preceding
    slash sign (e.g. "/Name")

    Note: Do not create an instance of PSLiteral directly.
    Always use PSLiteralTable.intern().
    namereturnNc                 C   
   || _ d S Nr    selfr    r   r   r   __init__D      
zPSLiteral.__init__c                 C      | j }d| S Nz/%rr$   r%   r   r   r   __repr__G      zPSLiteral.__repr__)
r   r   r   r   r   strbytesNameTyper'   r+   r   r   r   r   r   5   s
    r   c                   @   s0   e Zd ZdZdeddfddZdefddZdS )		PSKeywordaN  A class that represents a PostScript keyword.

    PostScript keywords are a dozen of predefined words.
    Commands and directives in PostScript are expressed by keywords.
    They are also used to denote the content boundaries.

    Note: Do not create an instance of PSKeyword directly.
    Always use PSKeywordTable.intern().
    r    r!   Nc                 C   r"   r#   r$   r%   r   r   r   r'   X   r(   zPSKeyword.__init__c                 C   r)   r*   r$   r%   r   r   r   r+   [   r,   zPSKeyword.__repr__)r   r   r   r   r.   r'   r-   r+   r   r   r   r   r0   L   s    
r0   _SymbolTc                   @   s:   e Zd ZdZdee ddfddZdejdefdd	Z	dS )
PSSymbolTablezA utility class for storing PSLiteral/PSKeyword objects.

    Interned objects can be checked its identity with "is" operator.
    klassr!   Nc                 C   s   i | _ || _d S r#   dictr3   )r&   r3   r   r   r   r'   i   s   
zPSSymbolTable.__init__r    c                 C   s0   || j v r| j | }|S | |}|| j |< |S r#   r4   )r&   r    litr   r   r   internm   s   



zPSSymbolTable.intern)
r   r   r   r   r
   r1   r'   r   r/   r7   r   r   r   r   r2   c   s    r2      {   }   [   ]s   <<s   >>xr!   c                 C   s`   t | tstjrtd| | }|S | j}t |ts.zt|d}W |S  ty-   Y |S w |S )NzLiteral required: {!r}utf-8)	
isinstancer   r   STRICTr   formatr    r-   	Exceptionr<   r    r   r   r   literal_name   s   

rC   c                 C   s6   t | tstjrtd|  | }|S t| jdd}|S )NzKeyword required: %rr=   ignore)r>   r0   r   r?   r   r-   r    rB   r   r   r   keyword_name   s   
rE   s   [\r\n]s   \ss   \Ss   [0-9a-fA-F]s   [#/%\[\]()<>{}\s]s   [^\s0-9a-fA-F]s   [0-9a-fA-F]{2}|.s   [^0-9]s   [()\134]s   [0-7]   	   
         (   )   \   )   b   t   n   f   r   (   )   \c                   @   s  e Zd ZdZdZdeddfddZdefdd	Zd<d
dZ	d<ddZ
defddZd=dee deddfddZdeddfddZd<ddZdeeef fddZdee fddZdededefdd Zd!eddfd"d#Zdededefd$d%Zdededefd&d'Zdededefd(d)Zdededefd*d+Zdededefd,d-Zdededefd.d/Zdededefd0d1Zdededefd2d3Z dededefd4d5Z!dededefd6d7Z"dededefd8d9Z#deeef fd:d;Z$dS )>PSBaseParserz=Most basic PostScript parser that performs only tokenization.i   fpr!   Nc                 C   s   || _ | d d S Nr   )rW   seekr&   rW   r   r   r   r'      s   zPSBaseParser.__init__c                 C   s   d| j j| j| jf S )Nz<%s: %r, bufpos=%d>)	__class__r   rW   bufposr&   r   r   r   r+      s   zPSBaseParser.__repr__c                 C      d S r#   r   r]   r   r   r   flush      zPSBaseParser.flushc                 C   s   |    d S r#   )r_   r]   r   r   r   close   s   zPSBaseParser.closec                 C   s   | j | j S r#   )r\   charposr]   r   r   r   tell   s   zPSBaseParser.tellP   posnc                 C   sL   | j  }|s| j| j }| j | td|| j | | j | d S )Nzpoll(%d): %r)rW   rc   r\   rb   rY   logdebugread)r&   re   rf   pos0r   r   r   poll   s   
zPSBaseParser.pollc                 C   sH   t d| | j| || _d| _d| _| j| _d| _	d| _
g | _dS )z'Seeks the parser to the given position.zseek: %r    r   N)rg   rh   rW   rY   r\   bufrb   _parse_main_parse1	_curtoken_curtokenpos_tokensr&   re   r   r   r   rY      s   zPSBaseParser.seekc                 C   sH   | j t| jk r
d S | j | _| j| j| _| jstdd| _ d S )NzUnexpected EOFr   )	rb   lenrm   rW   rc   r\   ri   BUFSIZr   r]   r   r   r   fillbuf   s   zPSBaseParser.fillbufc                 C   s   d}| j | j }d}	 |   |r,| j| j| jd  }|dkr+||7 }|  jd7  _n:t| j| j}|rU|| j| j|d 7 }|d| _|dd dkrTd	}nn|| j| jd 7 }t| j| _qt	d
|| ||fS )z3Fetches a next line that ends either with \r or \n.rl   Fr      
r   N   Tznextline: %r, %r)
r\   rb   rv   rm   EOLsearchendrt   rg   rh   )r&   linebuflineposeolcmr   r   r   nextline   s.   zPSBaseParser.nextlinec                 c   s    | j dd | j  }d}d|k r[|}td|| j }| j | | j || }|s0	 dS 	 t|d|d}|dkrE|| }n||d | V  |d| }d}q1d|k sdS )	ziFetches a next line backword.

        This is used to locate the trailers at the end of a file.
        r      rl   r   ry   rw   rx   N)rW   rY   rc   maxru   ri   rfind)r&   re   rm   prevpossrf   r   r   r   revreadlines  s.   
	zPSBaseParser.revreadlinesr   ic                 C   sb  t ||}|st|S |d}|||d  }| j| | _|dkr.d| _| j| _|d S |dkr=d| _| j	| _|d S |dv sE|
 rP|| _| j| _|d S |dkr_|| _| j| _|d S | rn|| _| j| _|d S |dkrd| _d| _| j| _|d S |d	krd| _| j| _|d S |d
krd| _| j| _|d S |dkr|d S | t| |d S )Nr   r      %   /rl   s   -+   .rS      <   >    )NONSPCr{   rt   startr\   rq   rp   _parse_commentro   _parse_literalisdigit_parse_number_parse_floatisalpha_parse_keywordparen_parse_string_parse_wopen_parse_wclose
_add_tokenKWDr&   r   r   r   jr   r   r   r   rn   )  sV   
zPSBaseParser._parse_mainobjc                 C   s   | j | j|f d S r#   )rr   appendrq   )r&   r   r   r   r   r   W  s   zPSBaseParser._add_tokenc                 C   sZ   t ||}|s|  j||d  7  _t|S |d}|  j||| 7  _| j| _|S rX   )rz   r{   rp   rt   r   rn   ro   r&   r   r   r   r   r   r   r   r   [  s   
zPSBaseParser._parse_commentc                 C   s   t ||}|s|  j||d  7  _t|S |d}|  j||| 7  _|||d  }|dkr>d| _| j| _|d S zt| jd}W n t	yR   | j}Y nw | 
t| | j| _|S )Nr   r      #rl   r=   )END_LITERALr{   rp   rt   r   hex_parse_literal_hexro   r-   rA   r   LITrn   )r&   r   r   r   r   r   r    r   r   r   r   g  s&   

zPSBaseParser._parse_literalc                 C   sl   |||d  }t |rt| jdk r|  j|7  _|d S | jr0|  jtt| jdf7  _| j| _|S )Nr   r      )	HEXmatchrt   r   rp   r.   intr   ro   r&   r   r   r   r   r   r   r   {  s   zPSBaseParser._parse_literal_hexc                 C   s   t ||}|s|  j||d  7  _t|S |d}|  j||| 7  _|||d  }|dkrB|  j|7  _| j| _|d S z
| t| j W n	 t	yU   Y nw | j
| _|S )Nr   r   r   )
END_NUMBERr{   rp   rt   r   r   ro   r   r   
ValueErrorrn   r   r   r   r   r     s$   
zPSBaseParser._parse_numberc                 C   s   t ||}|s|  j||d  7  _t|S |d}|  j||| 7  _z
| t| j W n	 ty:   Y nw | j| _	|S rX   )
r   r{   rp   rt   r   r   floatr   rn   ro   r   r   r   r   r     s   
zPSBaseParser._parse_floatc                 C   s   t ||}|s|  j||d  7  _t|S |d}|  j||| 7  _| jdkr/d}n| jdkr7d}nt| j}| | | j| _|S )Nr   s   trueTs   falseF)	END_KEYWORDr{   rp   rt   r   r   r   rn   ro   r&   r   r   r   r   tokenr   r   r   r     s   




zPSBaseParser._parse_keywordc                 C   s   t ||}|s|  j||d  7  _t|S |d}|  j||| 7  _|||d  }|dkr>d| _| j| _|d S |dkrT|  jd7  _|  j|7  _|d S |dkrm|  jd8  _| jrm|  j|7  _|d S | 	| j | j
| _|d S )Nr   r   rU   rl   rS   rT   )
END_STRINGr{   rp   rt   r   oct_parse_string_1ro   r   r   rn   r   r   r   r   r     s.   
zPSBaseParser._parse_stringc                 C   s   |||d  }t |rt| jdk r|  j|7  _|d S | jr6|  jtt| jdf7  _| j| _|S |t	v rG|  jtt	| f7  _n|dkrct||d krc||d |d  dkrc|d7 }| j| _|d S )z;Parse literal strings

        PDF Reference 3.2.3
        r      rF   ry   r   rw   )

OCT_STRINGr   rt   r   rp   r.   r   r   ro   
ESC_STRINGr   r   r   r   r     s   0zPSBaseParser._parse_string_1c                 C   sB   |||d  }|dkr|  t | j| _|d7 }|S | j| _|S )Nr   r   )r   KEYWORD_DICT_BEGINrn   ro   _parse_hexstringr   r   r   r   r     s   
zPSBaseParser._parse_wopenc                 C   s6   |||d  }|dkr|  t |d7 }| j| _|S )Nr   r   )r   KEYWORD_DICT_ENDrn   ro   r   r   r   r   r     s   
zPSBaseParser._parse_wclosec                 C   s~   t ||}|s|  j||d  7  _t|S |d}|  j||| 7  _tdd td| j}| | | j	| _
|S )Nr   c                 S   s   t t| ddfS )Nr   r   )r.   r   group)r   r   r   r   <lambda>  s    z/PSBaseParser._parse_hexstring.<locals>.<lambda>rl   )END_HEX_STRINGr{   rp   rt   r   HEX_PAIRsubSPCr   rn   ro   r   r   r   r   r     s   

zPSBaseParser._parse_hexstringc                 C   sB   | j s|   | | j| j| _| j r| j d}td| |S )Nr   znexttoken: %r)rr   rv   ro   rm   rb   poprg   rh   )r&   r   r   r   r   	nexttoken  s   zPSBaseParser.nexttokenr!   N)Nrd   )%r   r   r   r   ru   r   r'   r-   r+   r_   ra   r   rc   r   rk   rY   rv   r	   r.   r   r   r   rn   PSBaseParserTokenr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rV      s6    

	
.

rV   ExtraTc                   @   s   e Zd ZdeddfddZdddZdeddfd	d
Zdee	 ddfddZ
dedeee	  fddZdeee	  fddZdee	 ddfddZdededdfddZdedeeeee	  f fddZdededdfddZdee	 fddZdS ) PSStackParserrW   r!   Nc                 C      t | | |   d S r#   )rV   r'   resetrZ   r   r   r   r'         zPSStackParser.__init__c                 C   s   g | _ d | _g | _g | _d S r#   )contextcurtypecurstackresultsr]   r   r   r   r   %  s
   zPSStackParser.resetre   c                 C   r   r#   )rV   rY   r   rs   r   r   r   rY   ,  r   zPSStackParser.seekobjsc                 G   s   | j | d S r#   )r   extendr&   r   r   r   r   push1  s   zPSStackParser.pushrf   c                 C   s$   | j | d  }g | j | d < |S r#   r   )r&   rf   r   r   r   r   r   5  s   zPSStackParser.popc                 C   s   | j }g | _ |S r#   r   r   r   r   r   popall:  s   zPSStackParser.popallc                 G   s>   zt d| W n ty   t d Y nw | j| d S )Nzadd_results: %rz!add_results: (unprintable object))rg   rh   rA   r   r   r   r   r   r   add_results?  s   zPSStackParser.add_resultstypec                 C   s6   | j || j| jf |g | _| _td|| d S )Nzstart_type: pos=%r, type=%r)r   r   r   r   rg   rh   )r&   re   r   r   r   r   
start_typeG  s   zPSStackParser.start_typec                 C   sX   | j |krtd| j |dd | jD }| j \}| _ | _td||| ||fS )NzType mismatch: {!r} != {!r}c                 S   s   g | ]\}}|qS r   r   ).0_r   r   r   r   
<listcomp>P  s    z*PSStackParser.end_type.<locals>.<listcomp>z"end_type: pos=%r, type=%r, objs=%r)r   r   r@   r   r   r   rg   rh   )r&   r   r   re   r   r   r   end_typeM  s   
zPSStackParser.end_typer   c                 C   r^   r#   r   )r&   re   r   r   r   r   
do_keywordU  r`   zPSStackParser.do_keywordc                 C   s   | j s|  \}}t|ttttttfr| 	||f n|t
kr'| |d n|tkrCz
| 	| d W n tyB   tjr@ Y nw |tkrN| |d n|tkrz*| d\}}t|d dkrjd| }t|dd td|D }| 	||f W nY ty   tjr Y nMw |tkr| |d nA|tkrz
| 	| d W n2 ty   tjr Y n&w t|trtd	||| j | || ntd
||| j | ||  | jrq |   | j r| j  d}z	td| W |S  t!y   td Y |S w )zYields a list of objects.

        Arrays and dictionaries are represented as Python lists and
        dictionaries.

        :return: keywords, literals, strings, numbers, arrays and dictionaries.
        adr   r   z Invalid dictionary construct: %rc                 S   s"   i | ]\}}|d urt ||qS r#   )rC   )r   kvr   r   r   
<dictcomp>y  s
    z,PSStackParser.nextobject.<locals>.<dictcomp>pz&do_keyword: pos=%r, token=%r, stack=%rz)unknown token: pos=%r, token=%r, stack=%rznextobject: %rz nextobject: (unprintable object))"r   r   r>   r   r   boolr-   r.   r   r   KEYWORD_ARRAY_BEGINr   KEYWORD_ARRAY_ENDr   r   r   r?   r   r   rt   r   r   KEYWORD_PROC_BEGINKEYWORD_PROC_ENDr0   rg   rh   r   r   errorr   r_   r   rA   )r&   re   r   r   	error_msgr   r   r   r   r   
nextobjectX  s   

>zPSStackParser.nextobjectr   )r   r   r   r   r'   r   r   rY   PSStackEntryr   r   r   r   r   r   r-   r   r	   PSStackTyper   r0   r   r   r   r   r   r   r     s    
"r   )Eloggingretypingr   r   r   r   r   r   r   r	   r
   r   r    r   utilsr   	getLoggerr   rg   rA   r   r   r   r   r   r   r   r0   r1   r2   PSLiteralTablePSKeywordTabler7   r   r   r   r   r   r   r   r   objectrC   rE   compilerz   r   r   r   r   r   r   r   r   r   r   r   r   r   r.   r   rV   r   r   r   r   r   r   r   r   r   <module>   sp   4











  c