U
    æk7gÿ`  ã                   @   s`  d Z ddlmZ ddlZddlmZmZmZ ddlm	Z	 dZ
ejd dkZdZd	Zd
ZdZdZdZeeeeeeeddeed
ZdZdZdZdZdZdZeeeeeeeddeed
ZdZdZdZdZdZdZeeeeeeeddeed
ZdZd Zd!Zd!Zd"Zd#Zd$Zd%Zd&Zd&Zd'Zd(Zd)Zd$Zeeeeeeeeeeed
Zd*Zd+Zd,Zd-Zd.Zd/Zd0Zd1Zeeeeeeeeeeed
Z d2Zd+Zd,Zd-Zd.Zd/Zd3Zd4Zeeeeeeeeeeed
Z!d5Z"d6Z#d7Z$d8Z%d9Z&d:Zd:Zd:Zd;Zed<d<d=eeed>d=ed?d
Z'ed@d@dAdBdBdBdCdAdBdAd
Z(dDZ)dUdFdG„Z*dVdHdI„Z+dWdJdK„Z,dXdMdN„Z-i ddOdPfdQdR„Z.G dSdT„ dTe/ƒZ0dS )Yz¤
flask_paginate
~~~~~~~~~~~~~~~~~~

Adds pagination support to your flask application.

:copyright: (c) 2012 by Lix Xu.
:license: BSD, see LICENSE for more details
é    )Úunicode_literalsN)Úcurrent_appÚrequestÚurl_for)ÚMarkupz
2024.04.12é   z2<li class="previous"><a href="{0}"{2}>{1}</a></li>zW<li><a href="{0}" aria-label="Previous"{2}><span aria-hidden="true">{1}</span></a></li>z <li class="page-item"><a class="page-link" href="{0}" aria-label="Previous"{2}><span aria-hidden="true">{1}</span><span class="sr-only">Previous</span></a></li>z{<li class="page-item"><a class="page-link" href="{0}" aria-label="Previous"{2}><span aria-hidden="true">{1}</span></a></li>zJ<a class="pagination-previous" href="{0}" aria-label="Previous"{2}>{1}</a>z]<li class="waves-effect"><a href="{0}"{1}><i class="material-icons">chevron_left</i></a></li>z+<a class="item arrow" href="{0}"{2}>{1}</a>z/<li class="arrow"><a href="{0}"{2}>{1}</a></li>)
Ú	bootstrapÚ
bootstrap2Ú
bootstrap3Úbootstrap3_3Ú
bootstrap4Ú
bootstrap5ÚsemanticÚ
foundationÚbulmaÚmaterializez.<li class="next"><a href="{0}"{2}>{1}</a></li>zS<li><a href="{0}" aria-label="Next"{2}><span aria-hidden="true">{1}</span></a></li>z˜<li class="page-item"><a class="page-link" href="{0}" aria-label="Next"{2}><span aria-hidden="true">{1}</span><span class="sr-only">Next</span></a></li>zw<li class="page-item"><a class="page-link" href="{0}" aria-label="Next"{2}><span aria-hidden="true">{1}</span></a></li>zB<a class="pagination-next" href="{0}" aria-label="Next"{2}>{1}</a>z^<li class="waves-effect"><a href="{0}"{1}><i class="material-icons">chevron_right</i></a></li>z"<li class="active"><a>{0}</a></li>zO<li class="active"><span>{0} <span class="sr-only">(current)</span></span></li>ze<li class="page-item active"><a class="page-link">{0} <span class="sr-only">(current)</span></a></li>zX<li class="page-item active" aria-current="page"><span class="page-link">{0}</span></li>zJ<li><a class="pagination-link is-current" aria-current="page">{0}</a></li>z,<li class="active"><a href="#!">{0}</a></li>z<a class="item active">{0}</a>z#<li class="current"><a>{0}</a></li>z<li><a href="{0}">{1}</a></li>z"<a class="item" href="{0}">{1}</a>zB<li class="page-item"><a class="page-link" href="{0}">{1}</a></li>z6<li><a class="pagination-link" href="{0}">{1}</a></li>z3<li><a class="waves-effect" href="{0}">{1}</a></li>z$<li class="disabled"><a>...</a></li>zJ<li class="disabled"><span><span aria-hidden="true">...</span></span></li>zF<li class="page-item disabled"><span class="page-link">...</span></li>z <a class="disabled item">...</a>z'<li class="unavailable"><a>...</a></li>z:<li><span class="pagination-ellipsis">&hellip;</span></li>z;<li class="previous disabled unavailable"><a> {0} </a></li>zJ<li class="disabled"><span><span aria-hidden="true">{0}</span></span></li>zH<li class="page-item disabled"><span class="page-link"> {0} </span></li>z@<li class="page-item disabled"><a class="page-link">{0}</a></li>z&<a class="item arrow disabled">{0}</a>z'<li class="unavailable"><a>{0}</a></li>z/<a class="pagination-previous" disabled>{0}</a>zU<li class="disabled"><a href="#!"><i class="material-icons">chevron_left</i></a></li>z+<li class="next disabled"><a> {0} </a></li>z+<a class="pagination-next" disabled>{0}</a>zV<li class="disabled"><a href="#!"><i class="material-icons">chevron_right</i></a></li>z&laquo;z&raquo;ÚrecordszGdisplaying <b>{start} - {end}</b> {record_name} in total <b>{total}</b>zEfound <b>{found}</b> {record_name}, displaying <b>{start} - {end}</b>z5<nav aria-label="..."><ul class="pagination {0} {1}">zX<nav class="pagination {0} {1} {2}" role="navigation">{3}{4}<ul class="pagination-list">z$<div class="pagination {0} {1}"><ul>z<ul class="pagination {0} {1}">z <div class="ui pagination menu">z<ul class="pagination">z</ul></div>z</ul>z</ul></nav>ú</div>z<div class="pagination-{0}">Úpagec                 C   sX   |st j ¡ }| t j ¡ ¡ | sP|dkr.dnd}| |¡} | sPtj | ¡ ¡} | pV|S )Nr   Úpage_parameterÚper_page_parameter)	r   ÚargsÚcopyÚupdateÚ	view_argsÚgetr   ÚconfigÚupper)Úparamr   ÚdefaultÚpk© r!   ú;/tmp/pip-unpacked-wheel-a1z__h_e/flask_paginate/__init__.pyÚget_parameterç   s    

r#   c                 C   s   t | |dƒS )Nr   ©r#   ©r   r   r!   r!   r"   Úget_page_parameterõ   s    r&   c                 C   s   t | |dƒS )NÚper_pager$   r%   r!   r!   r"   Úget_per_page_parameterù   s    r(   Fc                 K   s¸   t j ¡ }| t j ¡ ¡ t| |ƒ}t||ƒ}||fD ]}||kr6| ||| ¡ q6|r`||fS t|j	|dtdƒ}|j	|td}	|	sštt
j 	dd¡ƒ}	nt|	ƒ}	|d |	 }
||	|
fS )zparam order: 1. passed parameter 2. request.args 3: config value
    for_test will return page_parameter and per_page_parameteré   )ÚtypeZPER_PAGEé
   )r   r   r   r   r   r&   r(   Ú
setdefaultÚintr   r   r   )r   r   Zfor_testÚkwargsr   Z	page_nameZper_page_nameÚnamer   r'   Úoffsetr!   r!   r"   Úget_page_argsý   s     


r1   Ú Z
paginationc                 C   s6   |p| }|rd  ||¡}tj | ¡ |¡}| | |¡S )z)Get parameter value from kwargs or configz{}_{})Úformatr   r   r   r   )r/   r.   r   Úcfg_nameÚprefixZconfig_nameZ	cfg_valuer!   r!   r"   Úget_param_value  s
    r6   c                   @   sŽ   e Zd ZdZddd„Zdd„ Zdd„ Zed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZdd„ Zdd„ Zedd„ ƒZedd„ ƒZdS )Ú
Paginationz(A simple pagination extension for flask.r   c                 K   s¬  || _ | d¡}|stƒ }|| _t| | jd¡ƒ| _| jdk rDd| _| d¡}|sXtƒ }|| _tt||ddddƒ| _	| j	dk | _
| jd | j	 | _ttd|d	ƒƒ| _ttd
|dƒƒ| _td|tƒ| _td|tƒ| _| dd¡| _| dd¡| _td|dƒ| _td|dƒ| _td|dƒ| _td|tƒ| _td|tƒ| _td|tƒ| _td|dƒ ¡ | _| jtkrhd| _| j  d¡rH| jdd… }|dkr–d| _!n~|r¤|| _!nptd|d ƒ| _!| j!d!krÆd| _nN| j!d"krÚd#| _n:| j!d$krîd%| _n&| j!d&krd| _n| j!d'krd(| _t"| j!tƒsH| j! #¡ r<t| j!ƒ| _!nt$| j!ƒ| _!td)|dƒ| _%| j%rœ| jd*krrd| _%n*| jd+krŽd, &| j%¡| _%nd- &| j%¡| _%td.|dƒ| _'| j'rÀd, &| j'¡| _'td/|dƒ| _(| j(räd0 &| j(¡| _(td1|dƒ| _)| j)rd0 &| j)¡| _)td2|dƒ| _*| j*r‚| j  d¡r‚| jd3kr`| j*d4krLd5| _*n| j*d6kr‚d7| _*n"| jd8kr|d- &| j*¡| _*nd| _*| j*r¤| jd+kr¤d, &| j*¡| _*| d9¡| _+| d:¡| _,td;|dƒ| _-t.| _/| jdkrät0| _/nN| jd(krøt1| _/n:| jd<krt2| _/n&| jd+kr t3| _/n| jd=kr2t4| _/t| j | _5t6| j | _7t8| j | _9t:| j | _;t<| j | _=t>| j | _?t@| j | _AtB| j | _Ctd>|dƒ| _D|  E¡  dS )?az  Detail parameters.

            **found**: used when searching

            **page**: current page

            **per_page**: how many records displayed on one page

            **page_parameter**: a name(string) of a GET parameter that holds             a page index, Use it if you want to iterate over multiple             Pagination objects simultaneously.
            default is 'page'.

            **per_page_parameter**: a name for per_page likes page_parameter.
            default is 'per_page'.

            **inner_window**: how many links around current page

            **outer_window**: how many links near first/last link

            **prev_label**: text for previous page, default is **&laquo;**

            **next_label**: text for next page, default is **&raquo;**

            **search**: search or not?

            **total**: total records for pagination

            **display_msg**: text for pagination information

            **search_msg**: text for search information

            **record_name**: record name showed in pagination information

            **link_size**: font size of page links

            **alignment**: the alignment of pagination links

            **href**: Add custom href for links - this supports forms             with post method. It MUST contain {0} to format page number

            **show_single_page**: decide whether or not a single page             returns pagination

            **bs_version**: the version of bootstrap, default is **4**

            **css_framework**: the css framework, default is **bootstrap4**

            **anchor**: anchor parameter, appends to page href

            **format_total**: number format total, like **1,234**,             default is False

            **format_number**: number format start and end, like **1,234**,             default is False

            **url_coding**: coding for url encoding, default is **utf-8**

            **bulma_style**: page link style for bulma css framework

            **prev_rel**: rel of previous page

            **next_rel**: rel of next page

            **include_first_page_number**: include 1 for first page or not

        r   r)   r   r+   r'   r2   )r4   r5   Úinner_windowr   Úouter_windowÚ
prev_labelÚ
next_labelÚsearchFÚtotalr   Úformat_totalÚformat_numberÚ
url_codingzutf-8Údisplay_msgÚ
search_msgÚrecord_nameÚcss_frameworkr   r   é	   N)Ú3_3ú3.3rG   Ú
bs_versioné   )r   Ú2)é   Ú3r
   )rG   rF   r   )rI   Ú4)é   Ú5r   Ú	link_sizer   r   z is-{0}z pagination-{0}Úbulma_styleÚprev_relz	 rel="{}"Únext_relÚ	alignment)r   r   Úcenterz justify-content-center)ÚrightÚendz justify-content-endr	   ÚhrefÚanchorÚshow_single_pager   r   Úinclude_first_page_number)FÚfoundr   r&   r   r-   r   r(   r   r6   r'   Úis_disabledÚskipr8   r9   Ú
PREV_LABELr:   Ú
NEXT_LABELr;   r<   r=   r>   r?   r@   ÚDISPLAY_MSGrA   Ú
SEARCH_MSGrB   ÚRECORD_NAMErC   ÚlowerrD   ÚCURRENT_PAGESÚ
startswithrH   Ú
isinstanceÚisdigitÚfloatrP   r3   rQ   rR   rS   rT   rX   rY   rZ   ÚLINKÚlinkÚBS4_LINKÚBS5_LINKÚSEMANTIC_LINKÚ
BULMA_LINKÚMATERIALIZE_LINKÚcurrent_page_fmtÚ	CSS_LINKSÚlink_css_fmtÚGAP_MARKERSÚgap_marker_fmtÚPREV_DISABLED_PAGESÚprev_disabled_page_fmtÚNEXT_DISABLED_PAGESÚnext_disabled_page_fmtÚ
PREV_PAGESÚprev_page_fmtÚ
NEXT_PAGESÚnext_page_fmtÚCSS_LINKS_ENDÚcss_end_fmtr[   Úinit_values)Úselfr\   r.   r   Zper_page_paramrH   r!   r!   r"   Ú__init__&  sâ    D


ÿ  ÿ

  ÿzPagination.__init__c                 C   st   | j r| j  |pd¡}n>|| j| j< | jrFt| jfd| ji| j—Ž}nt| jf| jŽ}| jrptrl| 	| j¡S |S |S )Nr)   Z_anchor)
rX   r3   r   r   rY   r   Úendpointr@   ÚPY2Údecode)r   r   Úurlr!   r!   r"   Ú	page_hrefî  s    zPagination.page_hrefc                 C   sÔ   | j r| jn| j}| jr,d| _d | _| _nDt|| jƒ}|d rL|d d n|d | _| j	dk| _| j	| jk | _t
j ¡ }| t
j ¡ ¡ i | _| ¡ D ].\}}t|ƒdkr¼|d | j|< q˜|| j|< q˜t
j| _d S )Nr)   Fr   )r<   r\   r=   r]   Útotal_pagesÚhas_prevÚhas_nextÚdivmodr'   r   r   r   r   r   r   ÚlistsÚlenrƒ   )r   Zcurrent_totalÚpagesr   ÚkÚvr!   r!   r"   r€   þ  s     
zPagination.init_valuesc                 C   sl   | j r^| jd }| jdkr$| js$d }|  |¡}| jdkrD|| jf}n|| j| jf}| jj|Ž S | j	 | j¡S )Nr)   r   r   )
r‰   r   r[   r‡   rD   rR   r:   r{   r3   rw   )r   r   r†   r   r!   r!   r"   Ú	prev_page  s    


zPagination.prev_pagec                 C   sT   | j rF|  | jd ¡}| jdkr,|| jf}n|| j| jf}| jj|Ž S | j | j¡S )Nr)   r   )	rŠ   r‡   r   rD   rS   r;   r}   r3   ry   )r   r†   r   r!   r!   r"   Ú	next_page%  s    
zPagination.next_pagec                 C   s@   | j r4| jr | j |  d¡d¡S | j |  d ¡d¡S | j d¡S ©Nr)   )r‰   r[   rk   r3   r‡   rq   )r   r!   r!   r"   Ú
first_page2  s
    zPagination.first_pagec                 C   s0   | j r"|  | j¡}| j || j¡S | j | j¡S )N)rŠ   r‡   rˆ   rk   r3   rq   r   )r   r†   r!   r!   r"   Ú	last_page=  s    zPagination.last_pagec                 C   sŽ  | j | jd d k r$td| j d ƒS g }| j| j }| j| j }|| j kr^||| j  8 }| j }|dk r†|d | }d}|| j kr†| j }|| jkr¶| td| jd d ƒ¡ | d ¡ n| td|d ƒ¡ || j | j d k rL|| jkrþ| t||d ƒ¡ | d ¡ | jdkr.| t| j | j d ƒ¡ n| t| j d | j d ƒ¡ n>|| jkrp| t|| j d ƒ¡ n| t|d | j d ƒ¡ |S )Nr   r)   r   )rˆ   r8   Úranger   Úextendr9   Úappend)r   rŽ   Zwin_fromZwin_tor!   r!   r"   rŽ   E  s8    




zPagination.pagesc                 C   sH   || j kr| j |¡S |dkr$| jS || jkr4| jS | j |  |¡|¡S r“   )r   rq   r3   r”   rˆ   r•   rk   r‡   )r   r   r!   r!   r"   Úsingle_pagen  s    

zPagination.single_pagec                 C   s„   | j  | j| j¡g}| | j¡ | |  d¡¡ | | j¡ | | j¡ | j	dkrv| jrv| 
dt | j¡¡ | d¡ td |¡ƒS )Nr)   r   r   r   r2   )rs   r3   rP   rT   r˜   r‘   r™   r’   r   rD   ÚinsertÚF_ALIGNMENTr   Újoin)r   Úsr!   r!   r"   Ú_get_single_page_linkz  s    
z Pagination._get_single_page_linkc                 C   s  | j dkr| jr|  ¡ S dS | jdkrz| j | j| j| j| j	| j
¡g}| jD ]}| |rb|  |¡n| j¡ qL| | j¡ n| j | j| j¡g}| | j	¡ | jD ]}| |r¶|  |¡n| j¡ q | | j
¡ | | j¡ | jdkr
| jr
| dt | j¡¡ | d¡ td |¡ƒS )zGet all the pagination links.r)   r2   r   r   r   r   )rˆ   rZ   rž   rD   rs   r3   rP   rT   rQ   r‘   r’   rŽ   r˜   r™   ru   r   rš   r›   r   rœ   )r   r   r   r!   r!   r"   Úlinks†  s4    

ûÿ	


zPagination.linksc              	   C   s
  dg}| j r| jn| j}| jr,d | j¡}nd | j¡}| jrVd}| j rN| jn| j}nZd| jd | j	  }|| j	 d }|| jkr”| j rŽ| jn| j}|| jkr°| j rª| jn| j}| j
rÌd |¡}d |¡}n|}|}| |j| j|||| jd¡ | d¡ td |¡ƒS )zGet the pagination information.z"<div class="pagination-page-info">z{0:,}z{0}r)   )r\   r=   ÚstartrW   rC   r   r2   )r<   rB   rA   r>   r3   r=   r]   r\   r   r'   r?   r˜   rC   r   rœ   )r   r   Zpage_msgZ
total_textr    rW   Ú
start_textZend_textr!   r!   r"   Úinfo«  s<    


ûÿ	
zPagination.infoN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r‚   r‡   r€   Úpropertyr‘   r’   r”   r•   rŽ   r™   rž   rŸ   r¢   r!   r!   r!   r"   r7   #  s*   
 I





(
$r7   )NNr   )NN)NN)NNF)1r¦   Ú
__future__r   ÚsysZflaskr   r   r   Z
markupsafer   Ú__version__Úversion_infor„   Z_bsZ_bs33Z_bs4Z_bs5Z_bulmaZ_materializeÚdictrz   r|   re   rj   rn   rl   rm   ro   rp   Z_seZ_fart   rv   rx   r_   r`   rc   ra   rb   rr   r~   r›   r#   r&   r(   r1   r6   Úobjectr7   r!   r!   r!   r"   Ú<module>   sR  
öööööööö


     ÿ

