o
    œœ<Wž  ã                   @   s`   d Z ddlZddlmZ dZdjed�ZG dd	„ d	eƒZd
Z	G dd„ de
ƒZedƒZdd„ 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/mstamy2/PyPDF2/blob/master/LICENSE
é    Né   )ÚisStringz(0|-?[1-9]\d*)z%^({int}|({int}?(:{int}?(:{int}?)?)))$©Úintc                   @   s   e Zd ZdS )Ú
ParseErrorN)Ú__name__Ú
__module__Ú__qualname__© r
   r
   úB/var/www/html/env/lib/python3.10/site-packages/PyPDF2/pagerange.pyr      s    r   aµ  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.
c                   @   sZ   e Zd ZdZdd„ Zejrejjed�e_edd„ ƒZdd„ Z	d	d
„ Z
dd„ Zdd„ ZdS )Ú	PageRangeaC  
    A slice-like representation of a range of page indices,
        i.e. 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.
      o  PageRange(str) parses a string representing a page range.
      o  PageRange(slice) directly "imports" a slice.
      o  to_slice() gives the equivalent slice.
      o  str() and repr() allow printing.
      o  indices(n) is like slice.indices(n).
    c                 C   sª   t |tƒr
|| _dS t |tƒr| ¡ | _dS t|ƒot t|¡}|s&t	|ƒ‚| 
d¡rDt| 
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.
        {page_range_help}
        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Úgr
   r
   r   Ú
<listcomp>P   s    ÿz&PageRange.__init__.<locals>.<listcomp>é   é   é   )Ú
isinstanceÚsliceÚ_slicer   Úto_slicer   ÚreÚmatchÚPAGE_RANGE_REr   Úgroupr   )ÚselfÚargÚmÚstartÚstopr
   r
   r   Ú__init__2   s    



ÿzPageRange.__init__)Úpage_range_helpc                 C   s,   t | tƒpt | tƒpt| ƒott t| ¡ƒS )z7 True if input is a valid initializer for a PageRange. )r   r   r   r   Úboolr   r   r   )Úinputr
   r
   r   ÚvalidW   s   
ÿýzPageRange.validc                 C   s   | j S )z1 Return the slice equivalent of this page range. )r   ©r   r
   r
   r   r   _   s   zPageRange.to_slicec                 C   sf   | j }|jdkr!|jdk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 kr
dnt |ƒV  qd S )NÚ )Ústr)r   Úir
   r
   r   Ú	<genexpr>m   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__o   s   zPageRange.__repr__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   Únr
   r
   r   r0   s   s   zPageRange.indicesN)r   r   r	   Ú__doc__r"   ÚformatÚPAGE_RANGE_HELPÚstaticmethodr&   r   r1   r4   r0   r
   r
   r
   r   r   $   s    "
r   r(   c                 C   sl   g }d}d}| dg D ](}t  |¡r$|stdƒ‚| |t |ƒf¡ d}q|r/|s/| |tf¡ |}d}q|S )a0  
    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&   Ú
ValueErrorÚappendÚPAGE_RANGE_ALL)ÚargsÚpairsÚpdf_filenameÚdid_page_ranger   r
   r
   r   Úparse_filename_page_ranges~   s   
rA   )r6   r   Úutilsr   Ú_INT_REr7   r   Ú	Exceptionr   r8   Úobjectr   r<   rA   r
   r
   r
   r   Ú<module>   s   W