U
    –BÞb  ã                   @   s¦   d Z ddlZddlmZmZmZmZ ddlmZ dZ	dj
e	d�ZG d	d
„ d
ƒZedƒZeeeedf  eeeef  dœdd„Zeeeeeef eeeef f ZdS )z÷
Representation and utils for ranges of PDF file pages.

Copyright (c) 2014, Steve Witham <switham_github@mac-guyver.com>.
All rights reserved. This software is available under a BSD license;
see https://github.com/py-pdf/PyPDF2/blob/main/LICENSE
é    N)ÚAnyÚListÚTupleÚUnioné   )Ú
ParseErrorz(0|-?[1-9]\d*)z%^({int}|({int}?(:{int}?(:{int}?)?)))$©Úintc                   @   s¢   e Zd ZdZeed ef ddœdd„Zee	e
dœdd„ƒZed	œd
d„Zed	œdd„Zed	œdd„Zeeeeef dœdd„Ze	e
dœdd„Zd d dœdd„ZdS )Ú	PageRangeaK  
    A slice-like representation of a range of page indices.

    For example, page numbers, only starting at zero.

    The syntax is like what you would put between brackets [ ].
    The slice is one of the few Python types that can't be subclassed,
    but this class converts to and from slices, and allows similar use.

      -  PageRange(str) parses a string representing a page range.
      -  PageRange(slice) directly "imports" a slice.
      -  to_slice() gives the equivalent slice.
      -  str() and repr() allow printing.
      -  indices(n) is like slice.indices(n).

    N)ÚargÚreturnc                 C   s¬   t |tƒr|| _dS t |tƒr,| ¡ | _dS t |tƒo@t t|¡}|sPt	|ƒ‚nX| 
d¡rŠt| 
d¡ƒ}|dkrx|d nd}t||ƒ| _ntdd„ | 
ddd	¡D ƒŽ | _dS )
aÒ  
        Initialize with either a slice -- giving the equivalent page range,
        or a PageRange object -- making a copy,
        or a string like
            "int", "[int]:[int]" or "[int]:[int]:[int]",
            where the brackets indicate optional ints.
        Remember, page indices start with zero.
        Page range expression examples:
            :     all pages.                   -1    last page.
            22    just the 23rd page.          :-1   all but the last page.
            0:3   the first three pages.       -2    second-to-last page.
            :3    the first three pages.       -2:   last two pages.
            5:    from the sixth page onward.  -3:-1 third & second to last.
        The third, "stride" or "step" number is also recognized.
            ::2       0 2 4 ... to the end.    3:0:-1    3 2 1 but not 0.
            1:10:2    1 3 5 7 9                2::-1     2 1 0.
            ::-1      all pages in reverse order.
        Note the difference between this notation and arguments to slice():
            slice(3) means the first three pages;
            PageRange("3") means the range of only the fourth page.
            However PageRange(slice(3)) means the first three pages.
        Né   éÿÿÿÿr   c                 S   s   g | ]}|rt |ƒnd ‘qS )Nr   )Ú.0Úg© r   ú4/tmp/pip-unpacked-wheel-weujb6sz/PyPDF2/pagerange.pyÚ
<listcomp>M   s     z&PageRange.__init__.<locals>.<listcomp>é   é   é   )Ú
isinstanceÚsliceÚ_slicer
   Úto_sliceÚstrÚreÚmatchÚPAGE_RANGE_REr   Úgroupr	   )Úselfr   ÚmÚstartÚstopr   r   r   Ú__init__%   s    




zPageRange.__init__)Úinputr   c                 C   s(   t | ttfƒp&t | tƒo&tt t| ¡ƒS )z5True if input is a valid initializer for a PageRange.)r   r   r
   r   Úboolr   r   r   )r%   r   r   r   ÚvalidO   s    ÿzPageRange.valid)r   c                 C   s   | j S )z/Return the slice equivalent of this page range.)r   ©r    r   r   r   r   V   s    zPageRange.to_slicec                 C   sf   | j }|jdkrB|jdk	r4|j|jd kr4t|jƒS |j|jf}n|j|j|jf}d dd„ |D ƒ¡S )zA string like "1:2:3".Nr   ú:c                 s   s"   | ]}|d krdnt |ƒV  qd S )NÚ )r   )r   Úir   r   r   Ú	<genexpr>e   s     z$PageRange.__str__.<locals>.<genexpr>)r   Ústepr"   r#   r   Újoin)r    ÚsÚindicesr   r   r   Ú__str__Z   s    

zPageRange.__str__c                 C   s   dt t| ƒƒ d S )z#A string like "PageRange('1:2:3')".z
PageRange(ú))Úreprr   r(   r   r   r   Ú__repr__g   s    zPageRange.__repr__)Únr   c                 C   s   | j  |¡S )zˆ
        n is the length of the list of pages to choose from.

        Returns arguments for range().  See help(slice.indices).
        )r   r0   )r    r5   r   r   r   r0   k   s    zPageRange.indices)Úotherr   c                 C   s   t |tƒsdS | j|jkS )NF)r   r
   r   )r    r6   r   r   r   Ú__eq__s   s    
zPageRange.__eq__c                 C   s®   t |tƒstdt|ƒ› �ƒ‚| jjd k	s4|jjd k	r<tdƒ‚| jj| jjf}|jj|jjf}|d |d krv|| }}|d |d krŽtdƒ‚tt	|d t
|d |d ƒƒƒS )NzCan't add PageRange and zCan't add PageRange with strider   r   zCan't add PageRanges with gap)r   r
   Ú	TypeErrorÚtyper   r-   Ú
ValueErrorr"   r#   r   Úmax)r    r6   ÚaÚbr   r   r   Ú__add__x   s    

zPageRange.__add__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r$   Ústaticmethodr   r&   r'   r   r1   r4   r	   r   r0   r7   r>   r   r   r   r   r
      s   *r
   r)   )Úargsr   c                 C   sl   g }d}d}| dg D ]P}t  |¡rH|s0tdƒ‚| |t |ƒf¡ d}q|r^|s^| |tf¡ |}d}q|S )a-  
    Given a list of filenames and page ranges, return a list of (filename, page_range) pairs.

    First arg must be a filename; other ags are filenames, page-range
    expressions, slice objects, or PageRange objects.
    A filename not followed by a page range indicates all pages of the file.
    NFz8The first argument must be a filename, not a page range.T)r
   r'   r:   ÚappendÚPAGE_RANGE_ALL)rD   ÚpairsZpdf_filenameZdid_page_ranger   r   r   r   Úparse_filename_page_ranges�   s     

ÿrH   )rB   r   Útypingr   r   r   r   Úerrorsr   Z_INT_REÚformatr   r
   rF   r   rH   r	   ZPageRangeSpecr   r   r   r   Ú<module>   s   wþ 