o
    h{O                  	   @   s<  d dl Z 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mZ d dlmZ eeZejZejZejZejZej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Z0e/dZ1e/dZ2e/dZ3e/dZ4e/dZ5e/d Z6e/d!Z7e/dZ8e/d"Z9e/d#Z:d$d%d&d'd(d)d*d+d,Z;ee<e=eee>f Z?G d-d. d.Z@ed/ZAee,e<e=ee>e	eeAf ZBeeCeBeA f ZDG d0d1 d1e@eeA ZEdS )2    N)AnyBinaryIODictGenericIteratorListOptionalTupleTypeTypeVarUnion)psexceptionssettings)choplistc                   @   s   e Zd ZdZdS )PSObjectz0Base class for all PS or PDF-related data types.N)__name__
__module____qualname____doc__ r   r   J/var/www/html/govbot/env/lib/python3.10/site-packages/pdfminer/psparser.pyr   !   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__3      
zPSLiteral.__init__c                 C      | j }d| S Nz/%rr   r   r   r   r   __repr__6      zPSLiteral.__repr__)
r   r   r   r   r   strbytesNameTyper   r#   r   r   r   r   r   %   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   F   r    zPSKeyword.__init__c                 C   r!   r"   r   r   r   r   r   r#   I   r$   zPSKeyword.__repr__)r   r   r   r   r&   r   r%   r#   r   r   r   r   r(   ;   s    
r(   _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   dictr+   )r   r+   r   r   r   r   W   s   
zPSSymbolTable.__init__r   c                 C   s0   || j v r| j | }|S | |}|| j |< |S r   r,   )r   r   litr   r   r   intern[   s   



zPSSymbolTable.intern)
r   r   r   r   r
   r)   r   r   r'   r/   r   r   r   r   r*   Q   s    r*      {   }   [   ]s   <<s   >>xr   c                 C   sd   t | tr$t | jtr| jS zt| jdW S  ty#   t| j Y S w tjr.td| t| S )Nutf-8zLiteral required: )
isinstancer   r   r%   UnicodeDecodeErrorr   STRICTPSTypeError)r4   r   r   r   literal_namer   s   
r:   c                 C   s6   t | tstjrtd|  | }|S t| jdd}|S )NzKeyword required: %rr5   ignore)r6   r(   r   r8   r9   r%   r   )r4   r   r   r   r   keyword_name   s   
r<   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 d S )NFr   )rN   eofseekr   rN   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   rN   bufposr   r   r   r   r#         zPSBaseParser.__repr__c                 C      d S r   r   rT   r   r   r   flush      zPSBaseParser.flushc                 C   s   |    d S r   )rW   rT   r   r   r   close      zPSBaseParser.closec                 C   s   | j | j S r   )rS   charposrT   r   r   r   tell   rZ   zPSBaseParser.tellP   posnc                 C   sL   | j  }|s| j| j }| j | td|| j | | j | d S )Nzpoll(%d): %r)rN   r\   rS   r[   rP   logdebugread)r   r^   r_   pos0r   r   r   poll   s   
zPSBaseParser.pollc                 C   sN   t d| | j| || _d| _d| _| j| _d| _	d| _
g | _d| _dS )z'Seeks the parser to the given position.zseek: %r    r   FN)r`   ra   rN   rP   rS   bufr[   _parse_main_parse1	_curtoken_curtokenpos_tokensrO   r   r^   r   r   r   rP      s   
zPSBaseParser.seekc                 C   sH   | j t| jk r
d S | j | _| j| j| _| jstdd| _ d S )NUnexpected EOFr   )	r[   lenrf   rN   r\   rS   rb   BUFSIZPSEOFrT   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.re   F      
r   N   Tznextline: %r, %r)
rS   r[   rq   rf   EOLsearchendrn   r`   ra   )r   linebuflineposeolcmr   r   r   nextline   s.   zPSBaseParser.nextlinec                 c   s    | j dtj | j  }d}|dkr]|}td|| j }| j | | j || }|s0dS 	 t|d|d}|dkrE|| }n||d | V  |d| }d}q1|dksdS dS )ziFetches a next line backword.

        This is used to locate the trailers at the end of a file.
        r   re   rr   ru   rs   rt   N)	rN   rP   ioSEEK_ENDr\   maxro   rb   rfind)r   r^   rf   prevpossr_   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   rr      %   /re   s   -+   .rJ      <   >    )NONSPCrw   rn   startrS   rj   ri   _parse_commentrh   _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   rg     sV   
zPSBaseParser._parse_mainobjc                 C   s   | j | j|f d S r   )rk   appendrj   )r   r   r   r   r   r   ?  rU   zPSBaseParser._add_tokenc                 C   sZ   t ||}|s|  j||d  7  _t|S |d}|  j||| 7  _| j| _|S Nr   )rv   rw   ri   rn   r   rg   rh   r   r   r   r}   r   r   r   r   r   B  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   rr      #re   r5   )END_LITERALrw   ri   rn   r   hex_parse_literal_hexrh   r%   	Exceptionr   LITrg   )r   r   r   r}   r   r|   r   r   r   r   r   N  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 )Nrr         )	HEXmatchrn   r   ri   r&   intr   rh   r   r   r   r|   r   r   r   r   b  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   rr   r   )
END_NUMBERrw   ri   rn   r   r   rh   r   r   
ValueErrorrg   r   r   r   r   r   l  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 r   )
r   rw   ri   rn   r   r   floatr   rg   rh   r   r   r   r   r     s   
zPSBaseParser._parse_floatc                 C   s   t ||}|r|d}|  j||| 7  _n|  j||d  7  _t|S | jdkr0d}n| jdkr8d}nt| j}| | | j| _|S )Nr   s   trueTs   falseF)	END_KEYWORDrw   r   ri   rn   r   r   rg   rh   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   rr   rL   re   rJ   rK   )
END_STRINGrw   ri   rn   r   oct_parse_string_1rh   r   r   rg   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rGt| jd}|dk s7J dt| j|f |  jt|f7  _| j| _	|S |t
v rX|  jtt
| f7  _n|dkrtt||d krt||d |d  dkrt|d7 }| j| _	|d S )	z;Parse literal strings

        PDF Reference 3.2.3
        rr      r=      zInvalid octal %s (%d)ru   r   rs   )
OCT_STRINGr   rn   r   r   reprri   r&   r   rh   
ESC_STRING)r   r   r   r|   chrcoder   r   r   r     s    0zPSBaseParser._parse_string_1c                 C   sB   |||d  }|dkr|  t | j| _|d7 }|S | j| _|S )Nrr   r   )r   KEYWORD_DICT_BEGINrg   rh   _parse_hexstringr   r   r   r   r     s   
zPSBaseParser._parse_wopenc                 C   s6   |||d  }|dkr|  t |d7 }| j| _|S )Nrr   r   )r   KEYWORD_DICT_ENDrg   rh   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>re   )END_HEX_STRINGrw   ri   rn   r   HEX_PAIRsubSPCr   rg   rh   r   r   r   r   r     s   

zPSBaseParser._parse_hexstringc                 C   s   | j rtd| js4z|   | | j| j| _W n ty0   | dd| _d| _ | js. Y nw | jr
| jd}t	d| |S )Nrm   rs   r   Tznexttoken: %r)
rO   rp   rk   rq   rh   rf   r[   popr`   ra   )r   r   r   r   r   	nexttoken  s"   zPSBaseParser.nexttokenr   N)Nr]   )%r   r   r   r   ro   r   r   r%   r#   rW   rY   r   r\   r   rd   rP   rq   r	   r&   r~   r   r   rg   PSBaseParserTokenr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rM      s6    



.

rM   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 ) PSStackParserrN   r   Nc                 C      t | | |   d S r   )rM   r   resetrQ   r   r   r   r        zPSStackParser.__init__c                 C   s   g | _ d | _g | _g | _d S r   )contextcurtypecurstackresultsrT   r   r   r   r     s   
zPSStackParser.resetr^   c                 C   r   r   )rM   rP   r   rl   r   r   r   rP   #  r   zPSStackParser.seekobjsc                 G   s   | j | d S r   )r   extendr   r   r   r   r   push'  s   zPSStackParser.pushr_   c                 C   s$   | j | d  }g | j | d < |S r   r   )r   r_   r   r   r   r   r   *  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))r`   ra   r   r   r   r   r   r   r   add_results4  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   r`   ra   )r   r^   r   r   r   r   
start_type;  s   zPSStackParser.start_typec                 C   s\   | j |krtd| j d|dd | jD }| j \}| _ | _td||| ||fS )NzType mismatch: z != c                 S   s   g | ]\}}|qS r   r   ).0_r   r   r   r   
<listcomp>C  s    z*PSStackParser.end_type.<locals>.<listcomp>z"end_type: pos=%r, type=%r, objs=%r)r   r9   r   r   r   r`   ra   )r   r   r   r^   r   r   r   end_type@  s   
zPSStackParser.end_typer   c                 C   rV   r   r   )r   r^   r   r   r   r   
do_keywordH  rX   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 nZ ty   tjr Y nNw |tkr| |d nB|tkrz
| 	| d W n3 ty   tjr Y n'w t|trtd	||| j | || ntd
||| j | || t| 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   )r:   )r   kvr   r   r   
<dictcomp>l  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   r6   r   r   boolr%   r&   r   r   KEYWORD_ARRAY_BEGINr   KEYWORD_ARRAY_ENDr   r9   r   r8   r   r   rn   PSSyntaxErrorr   KEYWORD_PROC_BEGINKEYWORD_PROC_ENDr(   r`   ra   r   r   errorPSExceptionr   rW   r   r   )r   r^   r   r   	error_msgr   r   r   r   r   
nextobjectK  s   
AzPSStackParser.nextobjectr   )r   r   r   r   r   r   r   rP   PSStackEntryr   r   r   r   r   r   r%   r   r	   PSStackTyper   r(   r   r   r   r   r   r   r     s    
"r   )Fr   loggingretypingr   r   r   r   r   r   r   r	   r
   r   r   pdfminerr   r   pdfminer.utilsr   	getLoggerr   r`   r   rp   r   r9   PSValueErrorr   r   r(   r)   r*   PSLiteralTablePSKeywordTabler/   r   r   r   r   r   r   r   r   r%   r:   r<   compilerv   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r   rM   r   r   r   r   r   r   r   r   r   <module>   sr   4











  p