o
    -Ä"jÄ  ã                	   @   s¸   d Z ddlZddlmZmZ ddlmZ dZde› de› d	e› d	e› d
�	ZG dd„ dƒZ	e	dƒZ
deeee	df  deeee	f  fdd„Zeee	eeef eeeef ee 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/pypdf/blob/main/LICENSE
é    N)ÚAnyÚUnioné   )Ú
ParseErrorz(0|-?[1-9]\d*)z^(z|(z?(:z?)?)))$c                   @   s²   e Zd ZdZdeed ef ddfdd„Zede	de
fdd	„ƒZdefd
d„Zdefdd„Zdefdd„Zdedeeeef fdd„Zdede
fdd„Zdefdd„Zddd„ZdS )Ú	PageRangeaJ  
    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).
    ÚargÚreturnNc                 C   s¬   t |tƒr
|| _dS t |tƒr| ¡ | _dS t |tƒo t t|¡}|s't	|ƒ‚| 
d¡rEt| 
d¡ƒ}|dkr;|d nd}t||ƒ| _dS 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 ©N)Úint)Ú.0Úg© r   ú\/home/develop/edictos_py/central_edictos/env/lib/python3.10/site-packages/pypdf/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__Úinputc                 C   s(   t | ttfƒpt | tƒott t| ¡ƒS )zè
        True if input is a valid initializer for a PageRange.

        Args:
            input: A possible PageRange string or a PageRange object.

        Returns:
            True, if the ``input`` is a valid PageRange.

        )r   r   r   r   Úboolr   r   r   )r#   r   r   r   ÚvalidO   s   ÿzPageRange.validc                 C   s   | j S )z/Return the slice equivalent of this page range.)r   ©r   r   r   r   r   _   s   zPageRange.to_slicec                 C   sf   | j }|jdu r!|jdur|j|jd krt|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 u r
dnt |ƒV  qd S )NÚ )r   )r   Úir   r   r   Ú	<genexpr>n   s   €" z$PageRange.__str__.<locals>.<genexpr>)r   Ústepr    r!   r   Újoin)r   ÚsÚindicesr   r   r   Ú__str__c   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__p   s   zPageRange.__repr__Únc                 C   s   | j  |¡S )a/  
        Assuming a sequence of length n, calculate the start and stop indices,
        and the stride length of the PageRange.

        See help(slice.indices).

        Args:
            n:  the length of the list of pages to choose from.

        Returns:
            Arguments for range().

        )r   r.   )r   r3   r   r   r   r.   t   s   zPageRange.indicesÚotherc                 C   s   t |tƒsdS | j|jkS )NF)r   r   r   )r   r4   r   r   r   Ú__eq__„   s   
zPageRange.__eq__c                 C   s    t | j| jj| jj| jjffƒS r   )ÚhashÚ	__class__r   r    r!   r+   r&   r   r   r   Ú__hash__‰   s    zPageRange.__hash__c                 C   s®   t |tƒstdt|ƒ› �ƒ‚| jjd us|jjd urtdƒ‚| jj| jjf}|jj|jjf}|d |d kr;||}}|d |d krGt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   r4   ÚaÚbr   r   r   Ú__add__Œ   s   

 zPageRange.__add__)r4   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r"   Ústaticmethodr   r$   r%   r   r/   r2   r   Útupler.   Úobjectr5   r8   r?   r   r   r   r   r      s    +r   r'   Úargsr   c                 C   sŒ   g }d}d}g | ¢d‘D ]7}t  |¡r+|stdƒ‚|dusJ ‚| |t |ƒf¡ d}q|r6|s6| |tf¡ t|t ƒr?J |ƒ‚|}d}q|S )a©  
    Given a list of filenames and page ranges, return a list of (filename, page_range) pairs.

    Args:
        args: A list where the first element is a filename. The other elements are
            filenames, page-range expressions, slice objects, or PageRange objects.
            A filename not followed by a page range indicates all pages of the file.

    Returns:
        A list of (filename, page_range) pairs.

    NFz8The first argument must be a filename, not a page range.T)r   r%   r;   ÚappendÚPAGE_RANGE_ALLr   )rG   ÚpairsÚpdf_filenameÚdid_page_ranger   r   r   r   Úparse_filename_page_ranges¡   s$   
ÿrM   )rC   r   Útypingr   r   Úerrorsr   Ú_INT_REr   r   rI   Úlistr   rE   rM   r   ÚPageRangeSpecr   r   r   r   Ú<module>   s     ÿ
þ,'