
    ,h                         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	      Z G d	 d
      Z ed      Zdeeeedf      deeeef      fdZeeeeeef   eeeef   ee   f   Zy)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                       e Zd ZdZdeed ef   ddfdZede	de
fd       ZdefdZdefd	Zdefd
Zdedeeeef   fdZde	de
fdZddZy)	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).

    argreturnNc                     t        |t              r|| _        yt        |t              r|j	                         | _        yt        |t
              xr t        j                  t        |      }|st        |      |j                  d      r8t        |j                  d            }|dk7  r|dz   nd}t        ||      | _        yt        |j                  ddd      D cg c]  }|rt        |      nd c} | _        yc c}w )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            )
isinstanceslice_slicer   to_slicestrrematchPAGE_RANGE_REr   groupr	   )selfr   mstartstopgs         R/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/PyPDF2/pagerange.py__init__zPageRange.__init__%   s    . c5!DKc9%,,.DKsC ARXXmS%AS/!WWQZ
OE %519Dt,DKAqAQ!RAA#a&4"7!RSDK!Rs   C;inputc                     t        | t        t        f      xs5 t        | t              xr# t	        t        j                  t        |             S )z5True if input is a valid initializer for a PageRange.)r   r   r   r   boolr   r   r   )r$   s    r"   validzPageRange.validO   s<     %%!34 
uc"KtBHH]E,J'K	
    c                     | j                   S )z/Return the slice equivalent of this page range.)r   r   s    r"   r   zPageRange.to_sliceV   s    {{r(   c                 T   | j                   }|j                  V|j                  1|j                  |j                  dz   k(  rt	        |j                        S |j                  |j                  f}n#|j                  |j                  |j                  f}dj                  d |D              S )zA string like "1:2:3".r   :c              3   :   K   | ]  }|dn
t        |        y w)N )r   ).0is     r"   	<genexpr>z$PageRange.__str__.<locals>.<genexpr>e   s     EaiSV3Es   )r   stepr   r    r   join)r   sindicess      r"   __str__zPageRange.__str__Z   s}    KK66>ww"qvv1'<177|#ggqvvoGggqvvqvv-GxxEWEEEr(   c                 6    dt        t        |             z   dz   S )z#A string like "PageRange('1:2:3')".z
PageRange())reprr   r*   s    r"   __repr__zPageRange.__repr__g   s    d3t9o-33r(   nc                 8    | j                   j                  |      S )z
        n is the length of the list of pages to choose from.

        Returns arguments for range().  See help(slice.indices).
        )r   r5   )r   r;   s     r"   r5   zPageRange.indicesk   s     {{""1%%r(   otherc                 V    t        |t              sy| j                  |j                  k(  S )NF)r   r   r   )r   r=   s     r"   __eq__zPageRange.__eq__s   s"    %+{{ell**r(   c           
         t        |t              st        dt        |             | j                  j
                  |j                  j
                  t        d      | j                  j                  | j                  j                  f}|j                  j                  |j                  j                  f}|d   |d   kD  r||}}|d   |d   kD  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   r2   
ValueErrorr   r    r   max)r   r=   abs       r"   __add__zPageRange.__add__x   s    %+6tE{mDEE;;'5<<+<+<+H>??KKt{{///LL 1 11Q4!A$;aqA Q4!A$;<==qtS1qt_566r(   )r=   r   r   r   )__name__
__module____qualname____doc__r   r   r   r#   staticmethodr   r&   r'   r   r6   r:   r	   r   r5   r?   rG    r(   r"   r   r      s    "(TE%c"9: (Tt (TT 
S 
T 
 
% F F4# 4& &sC}!5 &+C +D +
7r(   r   r,   argsr   c                     g }d}d}| dgz   D ]b  }t         j                  |      r,|st        d      |j                  |t        |      f       d}D|r|s|j                  |t        f       |}d}d |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'   rC   appendPAGE_RANGE_ALL)rN   pairspdf_filenamedid_page_ranger   s        r"   parse_filename_page_rangesrU      s     *,ELNtf} #??3 N  LL,	#78!N NlN;<L"N#  Lr(   )rK   r   typingr   r   r   r   errorsr   _INT_REformatr   r   rQ   r   rU   r	   PageRangeSpecrM   r(   r"   <module>r[      s    
 * * 
7>>7>Kt7 t7n 3
uS)T)*
+	%Y
 @ c9eCHouS#s]7KTRUYVWr(   