pax_global_header00006660000000000000000000000064146061145460014521gustar00rootroot0000000000000052 comment=c83512ddf3896fbb80a74958b795c9f0c902fada flask-paginate-2024.4.12/000077500000000000000000000000001460611454600147235ustar00rootroot00000000000000flask-paginate-2024.4.12/.gitignore000066400000000000000000000004641460611454600167170ustar00rootroot00000000000000*.py[co] example/test.db example/app.cfg venv # Packages *.egg *.egg-info dist build eggs parts bin var sdist develop-eggs .installed.cfg # Installer logs pip-log.txt # Unit test / coverage reports .coverage .tox #Translations *.mo #Mr Developer .mr.developer.cfg /docs/_build # pytest cache dir .cache flask-paginate-2024.4.12/.readthedocs.yaml000066400000000000000000000016411460611454600201540ustar00rootroot00000000000000# Read the Docs configuration file for Sphinx projects # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the OS, Python version and other tools you might need build: os: ubuntu-22.04 tools: python: "3.11" # Build documentation in the "docs/" directory with Sphinx sphinx: configuration: docs/conf.py # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs # builder: "dirhtml" # Fail on all warnings to avoid broken references # fail_on_warning: true # Optionally build your docs in additional formats such as PDF and ePub # formats: # - pdf # - epub # Optional but recommended, declare the Python requirements required # to build your documentation # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html # python: # install: # - requirements: docs/requirements.txt flask-paginate-2024.4.12/LICENSE000066400000000000000000000026511460611454600157340ustar00rootroot00000000000000Copyright (c) 2012 by Lix Xu. Some rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. flask-paginate-2024.4.12/MANIFEST.in000066400000000000000000000001251460611454600164570ustar00rootroot00000000000000graft docs tests global-exclude __pycache__ global-exclude *.py[co] include LICENSE flask-paginate-2024.4.12/README.md000066400000000000000000000020511460611454600162000ustar00rootroot00000000000000flask-paginate ============== Pagination support for flask framework (study from will_paginate). It supports several css frameworks. It requires Python2.6+ as string.format syntax. If you want to show pagination-info ("Total 100 posts, displaying 20 - 30") above the pagination links, please add the below lines to your css file:: .. sourcecode:: css .pagination-page-info { padding: .6em; padding-left: 0; width: 40em; margin: .5em; margin-left: 0; font-size: 12px; } .pagination-page-info b { color: black; background: #6aa6ed; padding-left: 2px; padding: .1em .25em; font-size: 150%; } Full documentation: Run example: $cd example $python sql.py $python sql.py init-db $python sql.py fill-data --total=310 $cp app.cfg.example app.cfg $echo edit app.cfg $python app.py --port 5000 Open to see the example page. ![demo](/example/demo.png "demo") flask-paginate-2024.4.12/docs/000077500000000000000000000000001460611454600156535ustar00rootroot00000000000000flask-paginate-2024.4.12/docs/Makefile000066400000000000000000000127341460611454600173220ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Flask-YAMLI18N.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Flask-YAMLI18N.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/Flask-YAMLI18N" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Flask-YAMLI18N" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." flask-paginate-2024.4.12/docs/_static/000077500000000000000000000000001460611454600173015ustar00rootroot00000000000000flask-paginate-2024.4.12/docs/_static/demo.png000066400000000000000000000651551460611454600207470ustar00rootroot00000000000000PNG  IHDR)JmsRGBgAMA a pHYsttfxjIDATx^-i]eXZX![j,^ * !$^oVf1$8%Q4ͽ5KE2doPpS#=}N?~O~>Syۧt?>}aRJ)RRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*RRJ)RYRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*RRJ)RYRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*RRJ)RYRJ)ʪF-Vl\xO~cũu%X7N ){Eg_/7{CC )aW2z0YW4am<7q5Kp:KH[{o~?l-yfR/zccop"L!%v'2gWu& {L'e_qCP|x[71۾M%|_ʚ!?yeOIBE]wO~_ӊg/vCJs݉k~eR}Lϋx_bfm8N1}lK_xuch_CsP˦֡y֞!e׮~9%uWoHyjMhHo:*6ug~譯Wwm'|˯n`F[B|_-7vq%f',WigrC5:D'>svhH鄎Z ^8Z&09%FSTl)P{]=HYUFKc@qЬ017t͉M{;IN=ҨD XϦzzmwN;R%T+P@n\aIjosbԪ=LBJb !eL胺ZU/izjo0ozvtZ}c7ݯԵ(?*I=WC걧&h} W|3ݗ_ҟ.Wib{E걸xOPSRzw7_͕/x˶iGūAU}3^Voo[mߟxx׿\)seS:pYبs&q'\w͎nRv`R6BpYc!<1nO7egCCJr&0dHO>^ՎRmu^7~4'=oomLl6]ϰ~|ӮľvRCJZѼr Qp\µ 9='^ )Fpгl\2)a=Me%ǶH:[Og6#3ެ[RQj:(|_'|o<~xϧto.>^5{o(7/(^}< )zg#[ҞZ|ӛ+4f?VМF!徟)4sܪ;Uwabўp:39Qkw W?-c&A!WMڵ 3R&dD{_c|$U+Y݉v볫$ξ7' aƭ~c6m޻6V5~uZw{x̶糩~n,[>U,^z/za>jϐR/)ϽxL_iMuN;tU\kx(cUws,V'mz 1_:~Vfݾ:yݦR*5WRVwWDkGm.\-yxߍ{_vKYzM=^?WU_ӱ'2ퟷ^oCg=Tc:JJTqJLU[<Q]wR^O J akMSٱ߷k~؞*LTB6$ޟit Urⓨz/z;c{M~RnGDzZ5;潞ƆUn*!M@ >6ۖc{bV]nM}W CJYݠEfR )cߣcnαcr~xk}XsH) *ʥR} (P>)=+G~_nReӯuxR)a2ўt:zC߷\ ֵ#'Ycjm8:`?lN$<6RvZoUMn}6em].~n5vmk`ٳ ؿ# _m9qHU-#$ޱjO^^q_]?Y~ܰ]ղe_gJ-RVվ'W]V?wooy?vˊg~m'^ik{}a>~WRDQ·`[ӛ?}KOS)cKNړLXR>>_Pˆ}!\o )Q%?iu?NUuj۩stGO ߳ͱjGw$Um[ڛu?{g:^{3J|?eF_g1pEHvgy`)ή奈ipƾK5guŁ},{=YK_^WWTۓ~Jx`:{HYU㶯!L[#~qu/ɯ<\P=WI Ϗuw?-`O;ԝxs 3 7tz50xLYmTݠRAÕ1?&`MQ Bj_ Ѫ} CϿ;p}e;nwJުƾv{S-c-~ц:q49۞6۔XWorjҸk+8ZGe/?^r/̇CJ7 DO-7k:l'=gWN<ēn5םT\RKԙwkG'3lڇK/;p%ehcA8]TxA5&5ju IUJx}}'y,lZogg,ޗ}>k.{%{E(eZnS۽:ԕ:n_=~;RvY},2mM㼐_U5n*!ůV*c_請g__{PV3Z. )+n7$7^^Upy䏊x+.SyY?By!eSx`r@;$;tJJR e;ˎ۽RuKN&DLvn}'P&!oj{D۷}ڮ+,=G}6QT;{S}cjjgHi_ m+*=nP-\!k;ѮTHYW+=Z+G )}`HTwJhK\fCv1ݞq^HQ˯BʪWZZyT7EC!ozS/w7NȊ=R|W|KhTd9ց'(R_m[3O-wxm׳+o(^u_^G7ˤ0)e{5|~xw`s%UOy{G/{_xdqS?{,(kDpNSBRֈRLո](ι-!E)fw;qKHQ*RRJ)RYRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*RRJ)RYRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*RRJ)RYRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*ȈdEH"YR)@V +B !83IK+S'gDR3KM~|R )&Qjb>ipR(_18uB pfIگO_Z:!8$*/ۋn>G[W}KM-sN铋??U|sxnbٲ^O>꓋'\♯I/Iz[w}]{l>Qc5,J.]g/*s{+{˿S<'>x5s~(|NYjUׯ?V )_|?^n1qz̪*QK|Omŗ~㒟m^|3T^OnPz|[A )&QzSb"֨TH,<ՙf )wM=DY|F$[zH^MBGxNcb_R|?_Rom_RW_.z7W#|^ͭWw?/.>fz?o +oZºn+`97__R<~>,rg_gQe+>q{/H+,R3KM6⩟&].GRL|IxRW|3xnZ)/~VtUR49|ҋS?vz-zwU9AK??|_o<9nVfDc)o^jMHᛋ;_~Ӌ{7g3պlSKjIW:_~׷L?R+?}ҷ_o(? _[F'^|+5ϴE:>_*~q@R~pcO~i.pH9} O? *] !)0![蛊=K/{w_|/o!e>iKܾ#|;]\BJ#PO*7et!P|Ug!c )p_*'IY9,oxC_;_Yח旿y,^O74׵mZk˦CXj׏u~c|*.~ƣWd?҈}}~~j[v3'>UiFWh7}']dו}WUWR΋LU'BJjTMD+L Zcyx!ṝ9uկiQjg&Qk/ԡ!}|[ W3|^_zRz~g8\gK|X_>yv{Ҏc|-U᯾ )EHC$n gVZ5 ]cw zwW*4zݨC-׽z )p`=)JOַa&p\d-Zgu۪׈:vn_KjU֗_)o+앟 U]E )˶u39QmvIϨ4_mBeWR_WuhoCw>_;^;zsQL~??Q;)PWY=*N 7mSe -R߶#kx\5Ǧ )3ɏwj*->3oWJ<],%Jc;q/+>Ϩ_%?XﺂľcwHq, v_W#8ٯY=T\~)z p8V؍5xzJRm(AiBR$֕ȭ_7~*|RTگ3}-IԺ^œ[Mzqg !友^3j|_`v>7WZձ3J~Ѳs]AζxT{}.б0کS,SŸxJO{e3ۢۋ'<8uB :& }g0ܞmۜmoof963r> 1B mWg[?@~ G}ܳ0]]Ϡ/gk ]lZn᧵w~n-Xx3>?ttU,>/W|G;x󿨾֪k )p0q&FCx= FRX6}bJ5a>VݾR籁kIM*o=G?k/X~ζR*oyE)O|\^œ՟]/Sw/O'+ o(?3گBI>v3>մݗ$v|<^;7_S?Q:!mD ukwR(_18uB 9v6ozӔDRئ )uD}l'R(_18uB pfIگO_Z:!8$JW'/NYj+zVNH,5RIK+S'YR)@V +B !ȊdEH"YR)pZ-|Rm/Y TRj*9|f@OH}(⡇*yѼ,Ky/ VXzSl|>}գKHWP5pо0Tȵrgߜ۟b|d=㊊(/yWPrgC´Ra ʝ}sKom:rS΃Λ(*J?i@;<t_< )p괖Υi@;<ti@;<ti@;<ti@;<ti@;<to=K0YJ'L /|?x.1\ia=6R9).Z'OF\u90p~c)y_ Ϟ &ighDmJ)jED~{n:SWI>0Q^-LB8cǁd=qoMվμM#x\ݗ"]B Bu")ς~SH$z)9ZR,H*9&vRzkۓ3Ɣ8mJ7;W49)&=8۝ygsei!e.e3e{Z9mc)g9xԷWtt泘jL}u{1lO ڦ.MնǃltDR.٭>s )JDVr{T>{Z+!M><{2OtLX) },;:'5mxnQxRS ^r;C[RHC>OS=CJ?Nr=gz|[T8H;B۞A 琲[THYiSsB `e[RΣYJH FNc᳏CJ}|^II]1T?Ք)Mue26g>Dr=k?hVLKΟIgvRhS<~88gl{9(R(9:t{2 ]nY*C?C_d}`))>~i}-%ƺuU޺8<Ϥ=.R09!0\I@xOW5e@)!?|*չ3 )q엦6Q}@,C,/)ɕ:8gYG'mH&"S-C>OgmbBЄt_ G{_JLoLqP4 chUN/E6MطLSsB `ʃ3tNoŽtH!%o+6G|Ϋhlab_r-s __16Qd߬&}þ{9x[{ "gIkg/L)a0 >8nyTm6]K!e;TgQxw(~zdw^_]׫6~'eߩ8Pr ) kS޻+&) =rLoS{vz/Q=k7VŽwJ=Ł}@&ʉZJ ۔mTXApD :n)p9)G;s )P )fRJTm,=k+' $RΩiڹܐ2dPJ[*ckMSIs4G;8NdZKhR>i5&(WXzSlN!ڹ}aZ0kξ9?6R:i-Ky/ VXzSlN!ڹ}aZ0kξ9?6R:i-Ky/ VXzSlN!ڹ}aZ0kξ9?6R:i-Ky/ VXzSlN!ڹ}aZ0kξ9?6R:i-Ky/ VXzSlN!ڹ}aZ0kξ9?6R:i-Ky/ VXzSlN!ڹ}aZ0kξ9?6Rw_#T?Kg7i@;<t&=PS Y`h_V* ZocOMQyyR?pwG>R='t> VXzSlyO9)AMH}+\o2Og郡}aZ0kξ9?6ͧūAH3($<{3ˎE)u1*rTRj*9|g+(x+RJs*!ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V8[ׯw⎫7Gnw?ym8oT6qaUGsoG=ŖCH#yuaotI)GHUs찯Tu TCJB RhB]\N6=B R`VQ't'L!R]T[U_ɯ5_f>BJC!%YЬ m7'Bm}'m}М)0+!!8^W:DzJKc\юm.+~㭠8u <zO tU RO=W<knGоvR/`6Wz^)p4@s=>4o$@Ӻ)''{ގFpXkx #mnvq`X8q֝o 'ﰐ qu@3Ut vį[Nǭ]fqHiK8ոq]{ ,ӡ!Um'BJT!e%qJՎ];NHuu'j>91)W4  CJ2HEm>fCq6kB A֮0.Vh^Mi]ehLRck1mHiPyu!f:]^h_a'sDDXYQHCJjIv>ֿ]^xɍ r vpq6}uS;A!ƲӇfiw]D!x0̃s 춓^Y8 UD muݞBFMY)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR<~RJ)uN%RRJ) +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YRHn]Rq瓒uj[׋KYܽ.]UC5qf@ͫg9NGqrÍ?l:e1n\HN//__S%QTac3Au@)KH ?P1*ܸ]3.5I%1T^o ty:f0V®^KJqO{5u8s4k|${[So^U[v3VTJE55{n#,|]!eUI~KH#7N9ԈYH8/׷BEesPг]՘Q-~ͽBJjU $ )pҎ/ )I{JEl=V4NjU8@uԏ6F83TA#yLHi'IHwaP:$n8se!lx&QZ#eGHlw4)erʄJ\MRNfl:hޱ/D@0i?2FG,R`ngϜMRWB{3.x)MH -j J, )CAORχ1qn:mB ̮>ߪq*RO^]k殐*I;):[WQ8qE֛l3)!7U~*/g'SN{xΗգu՘R-~dHon%WPNG08(pQ>TDDshNQ?V/ cΐnf*._ K!;04;VG"n8$,H,OVz~NԱ#l;غZWNvd ):NG"M":D=Tl8!Th[2Tkm0w!T$Ց)aR=Ws􆔞0C!'  OYi൫ 6>Է +'&S䕐1?*vP焔&RgpF#L )೗IB;N]g=8 {։0kʐU`Fd[umi Ȟǰl5Wp^4 U`LRV*p )p4^ۺvB iRJR^a$%^sՋ CZrOX4!ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B ߯RJ)Ω +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YRHn]Rq瓒uj>,^Qߪ~R9]Y=PUs;8x8Ꮇ,[=n )8'PR(6gq}cjQ!Ƶ:ts'KHc.kY% .onS=vU]ݫOukT )p UG>>(7+=60A^v]r+ľxuەak )|NJZq )pF)Jt, lBJ5&PѮxq=2z!8j4&Tˬ_slH ˕P=iRVǻϲ,KWW *Ƿ֕HwR6"ac͠Q?4m;CJ#CJhks] {Y*{ZwWPm9=ƌ.;Bf[FmoN]B deXg tzȨ>>PѲ!t8vHh;U#ږ )mRR +ɘXϲhR=Ws7PT##BJ{)R +B E2>Է+/a!}~:!6x ,3: a?eH ?:LRCNφ;ϲ,!u<2DO'1^ώb̻x8`vϲ,{jҐ24n!Q.!YRJR^Y $%^ѦB g$YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH>PѲa\ ^wF-R5RB;ڏ十'KH,Kg֚<걾; ?!چx|x8B d!AZRn|H }~UqxI\U*O0Mǹm$)0٢5(et,K2: a?eH ?:R6r]}6ݱ g8CJkƍuMRBHu_t)p 5QNRu.0:ġ& )+CcծLRvm(KH醏|{EeIJ,RJM+ z=k9A6YHh\1Z+(NH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !Ȋx+RJs*!ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V8[ׯwd}cPq)f]+nV@nwƨKoU?ƻ3f,R(n\:V ),W=ƍ )ј7UɩR(6gr&(t@G< 7*ܸV~$㣯԰8B Cu5t.w(l\=k8WvZv +=l~nS%1TaWAY*3Փm1ߪpT(<4Ǝ}mW:x嚯+JNxFNGXos2HKnFphvnǙ甡g]^jLHY!/\tB 4EpUSP+Ƿ֕Hwz_V=o^DXGXl3hԏ!Z,&!fJ2 䤽Gb$\Aix3⏿6pmjK0NY:)N=}F ׇǃ8BEˆI|g!Th[2Tk'~ѸWrrJSsXBJX_Rn= )6HoHW6y6ݩR +!e4>(%L!<=z|W:y|GT )0EWKzktH;ʐ>{(}%AH|3 ;Ɓ0nkʐU`Fd[uminw;^r*8`d):vTMRVƪ]* mPHb8j3RNRJM+ z=k& )Ie +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)p|RJ):R)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH#uJqǝOJ7n\n.swCcխťhLk՛B\dB E7t )>c\_H:Qgl$QTcDG:fG_ݫ.p,͓p}!V! )p e1lm:+=Eo\`Vո.NU|}&1T B m1"} p{UjCEk0x^3 8qTcӗW#8BEes+=jY>Rwl QR ǃf}|ZW*"eF *}B? pc-QeJױڑgFܮ5R ŠY:ظ@lՃxѾ"-ƈՎ)W;Ѷ}ǨFH&}cY/T!e;$vs)}BJkYg|HimRS}CƖ )0}YVHX!eh<W= )8 7 `sφ{t` )v,?8DOg hh )Q b\8B vIT_,WQ۽R5iHYv\)b\cCH kՕKݙ&RJ}9$%^Ѧ!ec{ CH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !Ȋx+RJs*!ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V8[ׯwd}ZhVq]@.nwƪKoU?ܺ^\ƴF]Y-Tyܵ+pʄ8n舫@6}jƩu (OGQ٢9;:hr< R6c؈!+.n\F,PuTaU6>q'7WJ\dc[Sҽyh|)p UG{% R2S}U{pzH^v3>Dqxu5t B ruAeJzKbxR :W;Z_q@H6lO )YI|0tڝR\&t$ǃh |_xhUh[:kBE&@V:pkWU끡Zvh kXЮCICJBE&@V;j@Ƈ0>TmR=Cʾ!ck2 R`n큠oPJ 24vT!%|;F kWK9 )0lXMuƛ{U)\9,!qc]ShR) )QOv7ߣ)Rn:Du,$CJjҐ24V%)>66hB MRW3/1!xIBZ5m1R6WCFq )@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR<~RJ)uN%YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊGt;T՛onw . Ƕ.]Urzq=n\޵ @H:T|귱D@ YBJ$]\p897;SFʶ#o:q5OMظ'BHt }butS5.Ǧ˩qA5 5l8ɩR`nUg;.\T&ّ%\Rsy-e7W~CWk0x^3l #Fn_dJHUw t;に,,BD5C+T+^vR'SYWcT\BPHٞ @#3!R`fT;_RNZR+u"]kʪGH :eA~hچB`n_ra)0xhwABH8ipPg2Xv{Bm92ܮ5R`_nc}aфٶs=XHXMHI]=h0tvx3xmK~GEH0Y٭VRN~!z)Cρ!݁ra)0 CgFe kCJ0q?oR8#!:A)`F>?20ސ2|۽8M'dq@Q ^=@)v?8lDX%R6?&)GQNZmDz ,)qhIC3t4R%}eKH08ҝy)jRJ}9$%^s3R6c )dEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR Ox{[w};N^@R+>Us?\̀Ο>PC=T<#գy);%XB;^/L+r7ئ|.>={Gϗ(j$0Og郡}aZ0kξ9?6#z3!P^,?i@;<t7!PޛU:K J\+wy,)8[yyRi-K J\+wy,)xhЉLk \{Ǿ0Tȵrgߜ۟bgv )pȴΥ} J\+wy,)xhЉLk \{Ǿ0Tȵrgߜ۟bgv )pȴΥ} J\+wy,)xhЉLk \{Ǿ0Tȵrgߜ۟bgv )pȴΥ} J\+wy,)xhЉLk \{Ǿ0Tȵrgߜ۟bgv )pȴΥ} J\+wy,)xhЉLk \{Ǿ0Tȵrgߜ۟bgv )p ݉fU<֟jNΦlR>>?{_Lav|uw_5>Z3VZy/;"uLuj^Ťf?uY*x2~}MM>Q'Z@l)R:BФɫY-3s.BJgU6!G=ۉXRHj>`)$I"tJk}*Z,N!p!;hBZVV!%dgM?R>>8fR}uPJT3}< .-{:/a˱lO&@^> h\czmHk=)gsSH\N$>s )aH)R>>ğ=LжڔRLՊVWSu:J|ajW[:QqWzޚ%>}yF7һ/UEj?G;8DB'^ 6S 2mIF9 OSs(N\Y*Us L1i?%:';gR)gq۔ov̷iJsSHLzp; eBT]gs )UR)rzo*o %)3g1վ #;&;܃c؞FMq]m9!0<&PKщ,-\[}&k+DR1}W;B},Mylveܟ<ߙ SXwtNj,)x:ܢ4 :8v229G|jzr t90jaߝzRn_9yKTM)?DMqYw\=ُ@!e]Q_>v88$g ʔG'&4Eg9^;&(,bR}~)Sdl<|z~n'$ǭ$*?ζ?r )Ц0^Oyq<)p)ށ,sP9LPJst_tQ!eeAT 8T'RJS|CTZJ$u몎u=qxI{\?/(aʓsB `Ṓ2jʀRC>OgmwUgs )/gR/MmpuXWcY_ S-Sn+)pMup;:N$ېRMDn[0G|ń j:v[ۿ "5ՙ)~i@X Ъv_& moj?k/88g8֝ބ]<:,CJx&nWl1E="x[Cy_vd?kS`AHL}pܶl:Cv0<΢ns?poQj^VWlOpsS=p5RDM5HֽwUWLR{:$'jh4Gc^_zdn{{Vz PŁ$L)ۨ±LuRsS8vRRg2X{ WNI, %&SUӴs!eɠԕp!TNc֞E{ hv )pȴΥ} jLP27ئ㙣B @'2%s)e´Ra ʝ}sKom:9)t"ZB;^/L+r7ئ㙣B @'2%s)e´Ra ʝ}sKom:9)t"ZB;^/L+r7ئ㙣B @'2%s)e´Ra ʝ}sKom:9)t"ZB;^/L+r7ئ㙣B @'2%s)e´Ra ʝ}sKom:9)t"ZB;^/L+r7ئ㙣B @'2%s)e´Ra ʝ}sKom:9)t"ZB;^/L+r7ئ㙣B @'2%s)e´Ra ʝ}sKom:9)G~ʗn:K J\+wy,)8>AMH-z|о0Tȵrgߜ۟b&~~w|z$O,}0/L+r7ئrS΃ΛzW3 eC´Ra ʝ}sKomOyW9)J9gPI(/yfRbT* Z+>UsWP!ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH")̣p}CIENDB`flask-paginate-2024.4.12/docs/_static/flask-paginate.png000066400000000000000000000457501460611454600227100ustar00rootroot00000000000000PNG  IHDRegA5sRGBgAMA a pHYsodK}IDATx^g5IUq^7FEAd TTbsT$(Efs" s?ϿVuwUw{snZι=k͆u t t t t t t t nv- :[[[[[[[,С:7[[[[[[[CYʎz:k[[[[[[[,С:7[[[[[[[CYʎz:k[[[[[[[,С:7[[[[[[[CYʎz:k[[[[[[[,С:7[[[[[[[CY7w)z׻N|NoބnnnnnsIC ?3.>W-----p8Y(aAiބnnnnnsBYzw(du5]+8 QbQSvp昿ۿ^x3=a}獯~4ssO_PTKc {?WR[j/xWz_ Ox×OO>3>c/kkqhh-?UR/R o}[W 8/~q_ q&`{J7??/| OOwm OO 7gAߺ.W BJ??~~ixc3'~'Q5wC?Cã|?~'ru{Yp{B_Tq|k^3BSOfys>c?:\o:P}ќǯگlݷnnn,\a% )Z? G~GwGO<`/˾FU?㇯'?umTľ p|7}7 0*f__9B~U1n>S?u3?3G̶M-؄ όqp G>rQz<\wunbpn oxF 205 ^ |hps>׋wvb :-npٹ~P-__^)Z`Q@@iK]1K\й2o\ي]'x0! {RP'ԲWc_MK y31CrMPXw(cScjXowc}B-PkE(u\Ë^Qz=->y{-.! __}I`` ymm÷vi5@quRvsǂ2'DA~G_o|//}5ooߏjH1dgqtozӛ.KәT6%_@_u /~8xpWb;ܽ\*@Y60҆St_:zXWKV6 ?c pkߺj,eC ¹NW^96n}[խF"3#%)> `~wܝzЃc(Sd׽.#;Q@Yv7ͨSk6cg:\>Xxy"m&#]Ht0X`YhR,+Sߨ'=IvGKdkhu~-;5I44WbZ@hs(e??X f펭y 11Co[B1[P<$9}p5׌uw99{a?s?7߸\.ZU_U Ȩb0|~g5ޫ?!뻾kNAg$Lmgo+̬E•?#(2Pf/AY cwT"PҔ1{y{?xn%%jTG i\;hc/SNF[bBe{z(Ēqoo5Xb%e qrYRd՗B\Ӟ@ٖOݖP&cb|q_<ܔ`+ͯ.Rҁ0i; ",y7yTR%@7HS.M7(o?O0#bm:"]rʽ4RY?v R o[ؒ>k/PF:-nA~ĒL1/x/g@VsG1>fft 179GG*Fܩ!E;@a2 P(9{3PnP"^NY5rţc$<(ާ6n]; UP6KS_p=71WRп>JLd6e`f(GRe(/1PʔkÙXOyȸ%RuTpoY^` okea3)rd; f1`x-Ņ(eqljٗ Bgwdp\`), Ы H>MsCU-E+2,26ǖ+dr}GzxyN(lM F 6jYMFͧ }~vc(\ 1%-qjms Ơg;c'Dlln?ރ2J=2nF"Y7ULi35Qf wwG,@YĻi#`uH( p k}\h(ܲ'@J@`&R0R\'XL Scz蝪Kdr6RbpsUc{[yNSQei6x.IK#Q8tQ(fplŕ2M5):`,e4 l<2W6%1.R"Ix._=؁J'Ĕ(esP` ʴ[Vpo myĜ*,l!{v.Ok r8='ݵe/BY 1N,M-X2Af^ĜQ(W5QzmYr_Jai Ģ@Kug%)!XpZT\* RJX{/#Y-s KZ, ei\m&Wm]GeK,]gSV{Lw.{TZ;s֡l﫰wbRYSZ_ł֒i t<8ᢒ3Av3:IA K,2 -JPfFi"_e61e&䡔2A%?' u,}MTg)ME)L]@֞ȕMKlT%c:  ;+e8>U(+tv(y z[\mJfW2- ebr]uU[Zi.R( ⺌S%eVBsHLrIB:4Gԯp] ʴo ]GTL+ Drec8xPf(KKe#5ăRC_%~Ы&}{/Wz+X߻8`Њ2y;1Nvpn.\nN]Gf֠v.ˈ7K #ZȡP/ٻ\ݮ pPt;E(+.l)MZS{.'Yk G1T]1?Rd׹e|VS1[RanZR[ـ={}o!A_+FWD;+ĪkhǵVl-ΰA,q5? ؀1P&w6K(V4]Xʋ|ve=/s@ĒSaIJ'!,R`=cX)u-_R @u/S JrYԹw{s3θ50ܡli퟇Nrh*]W^ bǝ:5kJfpWϠ\ v 5ktT&pSS1(1W_q\Ag8V;Jc>ٺ(S)2[|lMmvG^Vl2 />J)sSI0P&!OAYzS܄nX;P)SuGH=m8o(cK=rzx{5׌ck־dCSk}xǭZ,WŶ<{c+Ř]S[W0h"6D\л4"찇{w;-<ש/iոZT?u2 h請ٺkǽz̚ |.PF-/gɤef\R;uT)3/Kȸ-푵q]>RVE nJ REnL9Ɩ{կ~&[,ef{+^1sH/qP/MfpMXՃ;\Kk_$",e=95;`a1|z^\ ۚiK۵iV7X~s?lд3e\M'yPeډ">HmUM^?:dHj&(p_-3,|pc*?, d]X _2㲌] 8r%_y2VH3DzF=h-}֛+tb۴M<xwp|9(w1{vj].\*(Y x` ryEPƱSB.YMZUwD݃`y)3Uھ=XgM?(s1{E\v"Vu,cry!X.;S=A2KXߌ䢌NҺ2)3@ѮXf)~I2# u'Fsΰg3r`LMosJ^ݬu1J|[aǠ9jH(9ܧe͵{ 'eK[5댞'-]s5*HU2Bfk0u܂km<58z[%xI[,]i|[@\xʏi csCq~):y&GJF5>X2%0qwFe1kLqGYc4), sSRY"x|NAkv\B ʀHn-toT(S61EL[ ҔXMh>]V=ܗk@ 7ZTj^ xm!mJu.:,S.Xn@:\GΣv=C|͠S*V%?:kw㾟n-pTʫV ]*/j-3e9v]S, @pcnjurukK.hrїg:&_`P~>c?vm)_}ǀb`-gx/eEeXDzI bM)'1yЇ>t\Z)qo{B;rXna|CBT' _+uɅ:Mżqu[RG x_sK]05cnԖBM| n(fqԨg[\[%rh`gV?k)a|PϮ~*֧Tn-peWrT ,|@oy ySjNԳuZrhk;&(-.ݥb<ũig*Ys+yjre6͏_rü[ZtJqkqמq ҵ\=p@oks;S  K-PmI)!n#dEUތL^. @Q_R(``KXX@f{FL96਎2n,w @'s>% ג46uu{ ],Je(KeH _^AÂ/Wi\Sb2et( @4s Q k,=ʽ/R`,&6%_; OzғF w)<5|`n}0i:J1\-geWgx!羧+ƹqgNd36U(D$40vUJLVgkf]yA{N(Ŗs1xЁzk[,ս-g Oe2JYB\E Yv0dK],A&٣%7D2} ) w P̴KTc.-bl 쬁2zyM;[A͵7Xhue ]ͭ.5NzSe,b5ae3`lP_lAjؠtLkwڕbMZeeH nZL@,yϸ+-}*E,u?zJcopoJ JYGXEBYBA@lU+!D) "Ik3qod"lX*27K¬kد7Mz)1-.E(Ke窔LX31AرH(n{ێ& e@BPTvP"RP\sͨ4@Y4 J.KPe^T(ge(eePf0lZ;c\\_s:4 ^T]`^Ax10SZZFsgjJ,J1U-J@-9jZs -c U}LQY_J75}5]GM-?PeTHґOp?_}p(eQR%&\`&v]5y0"LXZ)5v;zٗS-bf F7;0NG[C)efZkJ)T֨es܀_ss1e`ln9f5r .s-Q5v9f ZS1NX|@?K%ilY4Y[dVնbK %wysXy^SۦF3MT?R[=T-BZ)_Lz==q.,Ke܌`tOsezpY8@F!3@} (>Ӟ),Wm0}@A,HIQ {0.sc#v* HT?群 @eJcɔV c{Wyi ] kR%drYwr;\uӌ̩dd(PW[gɭd=-2Y^y Lٚxz S F?| ֥n~46wZIa*ʬ͛ۦE--I&Jdk'mVAMwR}/)f)Yֽ\LiH*.ߥ?gf#0j1MD0+Ж 3q9'?#-ࠢ!l+H+Q*;I4 ll^AM)ZڐJ{CYꞝR@K=mLkI%3, +e7 ό_ *{AY jUyjZZ <ܘ[\~{ d){Gkg 6J8r?9H46wT9lwݞiBڞ-ޟWAK+ d%JL࿙Rb\&q^,c̟ h,ֶdʧʁE! 5F$K O!]v2$,%#"DPL0mqShrYΰ2mBJ!}hbߥ4)u([dX}.!cK+,VPM{_3JYi4To[R(qX$u6U$mRg4=cJdڟ ZZPTP>LV9Q(eGX9H@qn$0eZ9K{6(ָQAfuI)YDex/V+/߉E4 +.WU/mYzָr{vI}EU4ݨc0[Ai@:#Ź{~>eڥ>m*n R@>wH)bSNrڗg}㬁ǭsnBS3NQcomImk1Rآ|)N]kI[ss҆|[kȁ,z 7m͘Ikh^gOY /\Kߥ6̿z2K!U]-\C5Y2eĕ"-# *A..Dj@C$q.X22+giqأ=m$y:U (2JX0Wn#N ޤ)~%q_R@}f ")#@],0;(o3ve"?@(&_H(fsqg{@YPd|)ܖL,גl w @COt]@<,ϒU-}9uMQYŗ]cJ3ƥvKjW:ӳ/}"s|iꍖzsZϕ/\r۬uR  Pr_ @Ow]lj܌1\Mٔ0;߱[]1i @k۠7͓nI馧lU} 7\Y]n%zF _A⫀1mrSwo|G2hQMu4&QJps6}7` 0L-k[yRjA.+Z`xJP>4Lٔ"T<,9f q ʖÖZƘE5( ypxB;gFXg7ڸ^Z [R9DXPVerݬRfSj2Rq2E6tQL>E DDeD2G92MTw].0CTl|DD5FzZ<, `!5HPF!ⲼF2H |FM)S[XpU (e@g |*B )Gq:86GUKݙr6i\~{LQ 8\?ry eԤ-2Rۖ߶nK{ k^ &+[k\0+U9o-kxHUmK@t>8jT}K\{gŴ_7/.GJҔyI>{ŀh&# {Q"Z%L\"Sb<`-??:@Sj gb93/$ùT1kb|ƍ&P pQ|5 |&hAV 1׼5#@4pƠq朂2a+6hIҘrmP6)SZ{AY?sJg򫵪v-. 0[su`<L$Lԥ\EںfiR[5nм#Z=i;ƍ TQ"^?74Qz3@Sݔ\%T5PNPP'41˘v:ǵ\qdM{([Q\0{KT۲)][\s}]G?[*(3X[2 TL hu[r=|3p$|ĀM SEDQj6i' ] ̈~9Gm ax6p}!T>ߋYܹT6K)l΃jDž˽~-<<(_ӯRǸ$ߕ7 ̱HZ qm:4󿈽grE2\ľX>=l΍wʁ{f+ AւK Z eg.M[T0;(80]E7n=Jۡ=Dz\k2 ^UKtNxjZ;-5˺0{5n,ƹ(:nL=`$?8 3COI_ʖT''PH-A eL@^z̄pF\E\\ iLs]MJiF923;{xk{\F> UZFec+Bt +S-TF6Zɍjj OYlϝIc/;w /܆.AY WR(e H 7iK*/TC=KNBBeAYskTeP#Aל-Kp ./W1=ޢeT[ܵvk{j 3(& h+3Qr@iX$!<٥cEHrk{=' MQﱤK"+}f>w-jT_Lv~`أ}O5t6ڔ眦f6GlT`zƌ2(^:w  H ZPXʢ8f1SQ]$cE)Sj` 5N \k&6ܳG\)E;`-VNypms)elV ;?}|cȍ6/8G *0kٛjYF82܃})V5k) Ȩk)}[sJ)KTk \򗱑[RH;sg7$3Xߩ` 6X4=EB25j\Bqzbűk56kL=' 'c)ac=qt]Xu/SXS^3;@Q?@oS2lRZ tD*(3ЊPC< Gppi"$0CoHSШ9>V.6Q^ey-;C9pg${ @eڄJ# fs7oo\8T*BrQiz7l]P~o( @1p _uUDuzZ m@pq Jƞ@ K;lGr6`6Dr|L2Q)xLlJ)3ւs.rwT{ԪBKn[F\J0EyS]kKOuc DSS{Q[xdі7U=w 8 S:ïU! 6i<Hsxm M_M\nDQL %y¸ݸ10Ś}؇}xSSM1wK\MKnɃ 7(g@b&^ P5/TPb3"Ru6E 'fl0A0Tevm wQhW)8l1fkvpldn2u$ ,\r(keJ)1bMGU ڇknbڸB}5[#jIZ[vV4\kZw`ƩG*[ַ\J%Zڪ(g&.֙yiku9(ᖌ$T11eCS>h)E2Q~D ƍ nsی'fB(߯~vWMLq:.RJ#3pjlլ2pLe{@F=57Ks>2娦S#E?r5nSn-컵1qڱqܵ..S:<4G`C3xPˀKL%ϖy[]: f+r84 ǺĘ} Å樎 lMozhg8{h|S#S=&i\V%wXp\ǡ6pu"OEL͹ ul&SV{/q[kҶ,8՟g_`y5(V6A4@.ͥ68WǪo n}ҿ i|SZ+#-vK=J"W\ڶ%*`Zt1OMm - #4#['I'iWq^?(,\keYŎ}-]E[$Hpխ;#TpÉf@ >Pf1yupׅJ1d2F%f^R?);́ x6`P@W]W:H%jկ"jB1KgE@5˳'fv^669MGTPФ a6+=` W&04Cq/_&T,{q-9,^J2wLٺXo&(KE7KM1/kK9$`kdɗU_|cʤby'ؕ¼6gV-PR=k]xp(JS|p0(lbUvX 'f} c]Kꙇ*(PR'A!GLq/nnc@bt nymX44}D\Uo|\n\)D.1-b[fq)`&nA,Zbn~rx%/INeJa@r!z["fJnM 0ab7pGm}ooiZԀ~kﺔr~Cw t L[[ҏtbm=%gRgpSX P@j  "7L @ w|@DropQ@42%hȽEeJ    {ʔ@@r@@AvOw= 4S`^ X"7N#CŽs* BOq5̝̽1F@{qǩ̽ aq5̝̽1F@{qǩ̽ !{ɥӐ3h$;@{ ?c!.S9LqCdd[D|^^^.IOV(w:sZepj-ք>[š߭'L~r5HeB:|dx_ޮE#ٗ#v6%8-oOX>'%0OgdÚL:N=Ig"tqnbtk=@^fgY;m%2Jo7d4Ձx]0dcn i/FSj9)!(,y%Ce5#b 'cH{8,#LL]6H= {=wB'w'm=^d;z9o8?F/RU3cYUNlZy.JCMp6gx]ۇ wg#Eis(;zCG"wH\rvp{ c@M"GrѴl:OK7f.IW5^P9!=3&)x R)D" _K{%hc*d|̠;1"H̗9deL=cw#lY7~1}&Tw E4{f"/ߢ &E8yӖfbu5Ecr;]s5rgenHZ &hӱ1a>SԢ' ] r?Wci"Nc\V rOQ5f.?&G5v_+bciW{05w3#|.!wG*I㶻d[[5w"TfP_Q)9F;J1sL"D#TlH~+62$#"ȫkFV-歈Lר=BM$[Ya!w&[*ȡ @>^ d[ Aֵ!2 \dWz*;W&o,#JrwyA+1\ xEH!cҋ8psn_H2ek47ؘq OŰ^%u8s_|nnԶKo+SWo(8 -Î䅭oZO7*wB;^Ϟ~[K қalS!AS9= ;}ނ/D\=yyqXÅkc4wq*ϩ܋ yqXikc4wq*ϩ܋ g\j83 1 }o+  @rWDV {A@@&  7 ]M@@`o@{[1$b    wH4!mŰ@@ h {Crۊa/( @侷^P +@  }o+  @rWDxui v(IENDB`flask-paginate-2024.4.12/docs/_static/paginate-info2.png000066400000000000000000000045031460611454600226140ustar00rootroot00000000000000PNG  IHDRL?sRGBgAMA a pHYsodIDATx^==} .@DEFEHmQ1s=w3=c7*4yzݒk((R`jE#@@`((T`* L|P LP4C@ Rf((0@P*0B P&>(JR( PP@T E3@x`_/k(ѷ=d`/ xG,0@Ple&}(NmLv.yIω÷oY&(0(~pK}5,0{_S/fWئ!;un_6_>˯F`yfYg8#Vu@`F} Ǘ40k!HQ&KP ["-v5I%HKe1L+k Q渱/*js (זpa-[<9)EvB7pa8oN]+jO]S=momCS/ST{`֮' ھY~= 潧`v̷c/p| +N~]xa ݞap\PL3<ɛB49 i)uNc EյA}hb8̏9. s* ͐:5vwzǼr0`xc^z֡f ?~K?%ϾK$jd6tzfJO\3gTc򘣦g3oC^h>Zjxd;X[աϰӦAxqn%""sΣ-ځfBiyvRNXJɻ-ݘRc\ 6qrvT=7ʘiM*N[HtlNyC-;J5\ѽ"L$Jdܿb;)9jψ0J *;2`kD+SFOo-@ 8Oع120Dʼn19"JLDZ8^ \J>]uJ׆k<6052 *hAT)0jo ]H֑̀ٿմ^b`\̡&:EiGA?T@Oo3[37LLypF6`fS(e/Q(fNKҒ_\O/|:}}Z)y\ɺi;c:h.%QsKiym.] b+|M}Z ?إ|ʕ>-S("l^3wR~)7Md QYeVA0p&!ey.&/}tȐKmkڟm:LoCBS;YSb|txo1q(JR( PP@T E3@ (Jh(@@Hke6IENDB`flask-paginate-2024.4.12/docs/_static/paginate-links.png000066400000000000000000000057061460611454600227250ustar00rootroot00000000000000PNG  IHDRMsRGBgAMA a pHYsod [IDATx^nJy.gK,xJH]#;jTBXTtn&['3Ǟ3c]cw9> @3ca @ ` @f3*!@8@0fTB q@  `̨ @ @08Q@ @ `&q0"  @L`FE  @4@@@0h 3>\__pqqh 4ffܘׯ_۷ony'VUzoj,X#VW76q͎kw\KzCX,2!89U&M1>j([æhb!ޯ^) a>E=wLIuj<qfMk 0ֆ%_IOMmʹU![&qH*R'MY"g/cZ8n0q0@aaˀg8HN!jm: lتH *Ry |ͥƗ [j(56t `8i2[PCƺ*تHJ6j7[5vT_:2+6Qjl8jM)#Dqd \u=2t8FǁCZ%ťr3|8ԩ\WG`5I1·r5qV:iq03 T[`Sr]m#Ɔt 2B'Mp zX#CǁCZmt8UB('Pm1S˗Mup|:Z8\}x|ru{OoCJ=KwO^8_SK"|\lka OƮy=w;?{k[<kq6 C2TJ7iq06߽ ^s7{*ʿR$x~}NWFǏmL5_fLze$W]u'ʤ.[յ* 穛TLc <afs#w+=. 7[a;p/MC3OC)/SCetԁÏ8,Yl-VC]mpqh+wxp#r?Win~0:-eإwGoƲ1nva-#0kpq ?O,- y@hΟ{y6&yOcy|K #1}o[bQu٬`n?m[F7z;lUӜ85>j([¿YGn(056opjlت0`8i2[PCƺ*تH}W,|CE zÎUc=ltyѰa" !ǿP\Qj|ۃT}TCJ.CJ#3@Z>j(56<`58 e(NV?GgV 0s0H!&co=j8`jcJ6j7[5vT_*leVmq0ԚRFnC[zd8qH`aX:Nk\a7Qj7[Vv\_::+6QJle5q߿1ơl&M$A衏6Vr駭&qkx߿+Ǐkx 45h;{CRcx 4ЀikxAИ 4@(ihLH8p+ Mͺ5 @`IsQ@&f 0 $ع( @@And @a\ IY7 LB0 v. @$qЬYC&!q; h8h֍!@8LB4 `4F It"jIENDB`flask-paginate-2024.4.12/docs/_themes/000077500000000000000000000000001460611454600172775ustar00rootroot00000000000000flask-paginate-2024.4.12/docs/_themes/.gitignore000066400000000000000000000000261460611454600212650ustar00rootroot00000000000000*.pyc *.pyo .DS_Store flask-paginate-2024.4.12/docs/_themes/LICENSE000066400000000000000000000033751460611454600203140ustar00rootroot00000000000000Copyright (c) 2010 by Armin Ronacher. Some rights reserved. Redistribution and use in source and binary forms of the theme, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. We kindly ask you to only use these themes in an unmodified manner just for Flask and Flask-related products, not for unrelated projects. If you like the visual style and want to use it for your own projects, please consider making some larger changes to the themes (such as changing font faces, sizes, colors or margins). THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. flask-paginate-2024.4.12/docs/_themes/README000066400000000000000000000021051460611454600201550ustar00rootroot00000000000000Flask Sphinx Styles =================== This repository contains sphinx styles for Flask and Flask related projects. To use this style in your Sphinx documentation, follow this guide: 1. put this folder as _themes into your docs folder. Alternatively you can also use git submodules to check out the contents there. 2. add this to your conf.py: sys.path.append(os.path.abspath('_themes')) html_theme_path = ['_themes'] html_theme = 'flask' The following themes exist: - 'flask' - the standard flask documentation theme for large projects - 'flask_small' - small one-page theme. Intended to be used by very small addon libraries for flask. The following options exist for the flask_small theme: [options] index_logo = '' filename of a picture in _static to be used as replacement for the h1 in the index.rst file. index_logo_height = 120px height of the index logo github_fork = '' repository name on github for the "fork me" badge flask-paginate-2024.4.12/docs/_themes/flask/000077500000000000000000000000001460611454600203775ustar00rootroot00000000000000flask-paginate-2024.4.12/docs/_themes/flask/layout.html000066400000000000000000000013561460611454600226070ustar00rootroot00000000000000{%- extends "basic/layout.html" %} {%- block extrahead %} {{ super() }} {% if theme_touch_icon %} {% endif %} {% endblock %} {%- block relbar2 %}{% endblock %} {% block header %} {{ super() }} {% if pagename == 'index' %} {% endif %} {%- endblock %} flask-paginate-2024.4.12/docs/_themes/flask/relations.html000066400000000000000000000011161460611454600232640ustar00rootroot00000000000000

Related Topics

flask-paginate-2024.4.12/docs/_themes/flask/static/000077500000000000000000000000001460611454600216665ustar00rootroot00000000000000flask-paginate-2024.4.12/docs/_themes/flask/static/flasky.css_t000066400000000000000000000144441460611454600242230ustar00rootroot00000000000000/* * flasky.css_t * ~~~~~~~~~~~~ * * :copyright: Copyright 2010 by Armin Ronacher. * :license: Flask Design License, see LICENSE for details. */ {% set page_width = '940px' %} {% set sidebar_width = '220px' %} @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: 'Georgia', serif; font-size: 17px; background-color: white; color: #000; margin: 0; padding: 0; } div.document { width: {{ page_width }}; margin: 30px auto 0 auto; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 {{ sidebar_width }}; } div.sphinxsidebar { width: {{ sidebar_width }}; } hr { border: 1px solid #B1B4B6; } div.body { background-color: #ffffff; color: #3E4349; padding: 0 30px 0 30px; } img.floatingflask { padding: 0 0 10px 10px; float: right; } div.footer { width: {{ page_width }}; margin: 20px auto 30px auto; font-size: 14px; color: #888; text-align: right; } div.footer a { color: #888; } div.related { display: none; } div.sphinxsidebar a { color: #444; text-decoration: none; border-bottom: 1px dotted #999; } div.sphinxsidebar a:hover { border-bottom: 1px solid #999; } div.sphinxsidebar { font-size: 14px; line-height: 1.5; } div.sphinxsidebarwrapper { padding: 18px 10px; } div.sphinxsidebarwrapper p.logo { padding: 0 0 20px 0; margin: 0; text-align: center; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: 'Garamond', 'Georgia', serif; color: #444; font-size: 24px; font-weight: normal; margin: 0 0 5px 0; padding: 0; } div.sphinxsidebar h4 { font-size: 20px; } div.sphinxsidebar h3 a { color: #444; } div.sphinxsidebar p.logo a, div.sphinxsidebar h3 a, div.sphinxsidebar p.logo a:hover, div.sphinxsidebar h3 a:hover { border: none; } div.sphinxsidebar p { color: #555; margin: 10px 0; } div.sphinxsidebar ul { margin: 10px 0; padding: 0; color: #000; } div.sphinxsidebar input { border: 1px solid #ccc; font-family: 'Georgia', serif; font-size: 1em; } /* -- body styles ----------------------------------------------------------- */ a { color: #004B6B; text-decoration: underline; } a:hover { color: #6D4100; text-decoration: underline; } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; margin: 30px 0px 10px 0px; padding: 0; } {% if theme_index_logo %} div.indexwrapper h1 { text-indent: -999999px; background: url({{ theme_index_logo }}) no-repeat center center; height: {{ theme_index_logo_height }}; } {% endif %} div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } a.headerlink { color: #ddd; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: #444; background: #eaeaea; } div.body p, div.body dd, div.body li { line-height: 1.4em; } div.admonition { background: #fafafa; margin: 20px -30px; padding: 10px 30px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; } div.admonition tt.xref, div.admonition a tt { border-bottom: 1px solid #fafafa; } dd div.admonition { margin-left: -60px; padding-left: 60px; } div.admonition p.admonition-title { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; font-size: 24px; margin: 0 0 10px 0; padding: 0; line-height: 1; } div.admonition p.last { margin-bottom: 0; } div.highlight { background-color: white; } dt:target, .highlight { background: #FAF3E8; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre, tt { font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.9em; } img.screenshot { } tt.descname, tt.descclassname { font-size: 0.95em; } tt.descname { padding-right: 0.08em; } img.screenshot { -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils { border: 1px solid #888; -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils td, table.docutils th { border: 1px solid #888; padding: 0.25em 0.7em; } table.field-list, table.footnote { border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } table.footnote { margin: 15px 0; width: 100%; border: 1px solid #eee; background: #fdfdfd; font-size: 0.9em; } table.footnote + table.footnote { margin-top: -15px; border-top: none; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.footnote td.label { width: 0px; padding: 0.3em 0 0.3em 0.5em; } table.footnote td { padding: 0.3em 0.5em; } dl { margin: 0; padding: 0; } dl dd { margin-left: 30px; } blockquote { margin: 0 0 0 30px; padding: 0; } ul, ol { margin: 10px 0 10px 30px; padding: 0; } pre { background: #eee; padding: 7px 30px; margin: 15px -30px; line-height: 1.3em; } dl pre, blockquote pre, li pre { margin-left: -60px; padding-left: 60px; } dl dl pre { margin-left: -90px; padding-left: 90px; } tt { background-color: #ecf0f3; color: #222; /* padding: 1px 2px; */ } tt.xref, a tt { background-color: #FBFBFB; border-bottom: 1px solid white; } a.reference { text-decoration: none; border-bottom: 1px dotted #004B6B; } a.reference:hover { border-bottom: 1px solid #6D4100; } a.footnote-reference { text-decoration: none; font-size: 0.7em; vertical-align: top; border-bottom: 1px dotted #004B6B; } a.footnote-reference:hover { border-bottom: 1px solid #6D4100; } a:hover tt { background: #EEE; } flask-paginate-2024.4.12/docs/_themes/flask/static/small_flask.css000066400000000000000000000017201460611454600246700ustar00rootroot00000000000000/* * small_flask.css_t * ~~~~~~~~~~~~~~~~~ * * :copyright: Copyright 2010 by Armin Ronacher. * :license: Flask Design License, see LICENSE for details. */ body { margin: 0; padding: 20px 30px; } div.documentwrapper { float: none; background: white; } div.sphinxsidebar { display: block; float: none; width: 102.5%; margin: 50px -30px -20px -30px; padding: 10px 20px; background: #333; color: white; } div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, div.sphinxsidebar h3 a { color: white; } div.sphinxsidebar a { color: #aaa; } div.sphinxsidebar p.logo { display: none; } div.document { width: 100%; margin: 0; } div.related { display: block; margin: 0; padding: 10px 0 20px 0; } div.related ul, div.related ul li { margin: 0; padding: 0; } div.footer { display: none; } div.bodywrapper { margin: 0; } div.body { min-height: 0; padding: 0; } flask-paginate-2024.4.12/docs/_themes/flask/theme.conf000066400000000000000000000002441460611454600223500ustar00rootroot00000000000000[theme] inherit = basic stylesheet = flasky.css pygments_style = flask_theme_support.FlaskyStyle [options] index_logo = '' index_logo_height = 120px touch_icon = flask-paginate-2024.4.12/docs/_themes/flask_small/000077500000000000000000000000001460611454600215675ustar00rootroot00000000000000flask-paginate-2024.4.12/docs/_themes/flask_small/layout.html000066400000000000000000000012531460611454600237730ustar00rootroot00000000000000{% extends "basic/layout.html" %} {% block header %} {{ super() }} {% if pagename == 'index' %}
{% endif %} {% endblock %} {% block footer %} {% if pagename == 'index' %}
{% endif %} {% endblock %} {# do not display relbars #} {% block relbar1 %}{% endblock %} {% block relbar2 %} {% if theme_github_fork %} Fork me on GitHub {% endif %} {% endblock %} {% block sidebar1 %}{% endblock %} {% block sidebar2 %}{% endblock %} flask-paginate-2024.4.12/docs/_themes/flask_small/static/000077500000000000000000000000001460611454600230565ustar00rootroot00000000000000flask-paginate-2024.4.12/docs/_themes/flask_small/static/flasky.css_t000066400000000000000000000110011460611454600253750ustar00rootroot00000000000000/* * flasky.css_t * ~~~~~~~~~~~~ * * Sphinx stylesheet -- flasky theme based on nature theme. * * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: 'Georgia', serif; font-size: 17px; color: #000; background: white; margin: 0; padding: 0; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 40px auto 0 auto; width: 700px; } hr { border: 1px solid #B1B4B6; } div.body { background-color: #ffffff; color: #3E4349; padding: 0 30px 30px 30px; } img.floatingflask { padding: 0 0 10px 10px; float: right; } div.footer { text-align: right; color: #888; padding: 10px; font-size: 14px; width: 650px; margin: 0 auto 40px auto; } div.footer a { color: #888; text-decoration: underline; } div.related { line-height: 32px; color: #888; } div.related ul { padding: 0 0 0 10px; } div.related a { color: #444; } /* -- body styles ----------------------------------------------------------- */ a { color: #004B6B; text-decoration: underline; } a:hover { color: #6D4100; text-decoration: underline; } div.body { padding-bottom: 40px; /* saved for footer */ } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; margin: 30px 0px 10px 0px; padding: 0; } {% if theme_index_logo %} div.indexwrapper h1 { text-indent: -999999px; background: url({{ theme_index_logo }}) no-repeat center center; height: {{ theme_index_logo_height }}; } {% endif %} div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } a.headerlink { color: white; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: #444; background: #eaeaea; } div.body p, div.body dd, div.body li { line-height: 1.4em; } div.admonition { background: #fafafa; margin: 20px -30px; padding: 10px 30px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; } div.admonition p.admonition-title { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; font-size: 24px; margin: 0 0 10px 0; padding: 0; line-height: 1; } div.admonition p.last { margin-bottom: 0; } div.highlight{ background-color: white; } dt:target, .highlight { background: #FAF3E8; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre, tt { font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.85em; } img.screenshot { } tt.descname, tt.descclassname { font-size: 0.95em; } tt.descname { padding-right: 0.08em; } img.screenshot { -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils { border: 1px solid #888; -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils td, table.docutils th { border: 1px solid #888; padding: 0.25em 0.7em; } table.field-list, table.footnote { border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } table.footnote { margin: 15px 0; width: 100%; border: 1px solid #eee; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.footnote td { padding: 0.5em; } dl { margin: 0; padding: 0; } dl dd { margin-left: 30px; } pre { padding: 0; margin: 15px -30px; padding: 8px; line-height: 1.3em; padding: 7px 30px; background: #eee; border-radius: 2px; -moz-border-radius: 2px; -webkit-border-radius: 2px; } dl pre { margin-left: -60px; padding-left: 60px; } tt { background-color: #ecf0f3; color: #222; /* padding: 1px 2px; */ } tt.xref, a tt { background-color: #FBFBFB; } a:hover tt { background: #EEE; } flask-paginate-2024.4.12/docs/_themes/flask_small/theme.conf000066400000000000000000000002701460611454600235370ustar00rootroot00000000000000[theme] inherit = basic stylesheet = flasky.css nosidebar = true pygments_style = flask_theme_support.FlaskyStyle [options] index_logo = '' index_logo_height = 120px github_fork = '' flask-paginate-2024.4.12/docs/_themes/flask_theme_support.py000066400000000000000000000114131460611454600237270ustar00rootroot00000000000000# flasky extensions. flasky pygments style based on tango style from pygments.style import Style from pygments.token import Keyword, Name, Comment, String, Error, \ Number, Operator, Generic, Whitespace, Punctuation, Other, Literal class FlaskyStyle(Style): background_color = "#f8f8f8" default_style = "" styles = { # No corresponding class for the following: #Text: "", # class: '' Whitespace: "underline #f8f8f8", # class: 'w' Error: "#a40000 border:#ef2929", # class: 'err' Other: "#000000", # class 'x' Comment: "italic #8f5902", # class: 'c' Comment.Preproc: "noitalic", # class: 'cp' Keyword: "bold #004461", # class: 'k' Keyword.Constant: "bold #004461", # class: 'kc' Keyword.Declaration: "bold #004461", # class: 'kd' Keyword.Namespace: "bold #004461", # class: 'kn' Keyword.Pseudo: "bold #004461", # class: 'kp' Keyword.Reserved: "bold #004461", # class: 'kr' Keyword.Type: "bold #004461", # class: 'kt' Operator: "#582800", # class: 'o' Operator.Word: "bold #004461", # class: 'ow' - like keywords Punctuation: "bold #000000", # class: 'p' # because special names such as Name.Class, Name.Function, etc. # are not recognized as such later in the parsing, we choose them # to look the same as ordinary variables. Name: "#000000", # class: 'n' Name.Attribute: "#c4a000", # class: 'na' - to be revised Name.Builtin: "#004461", # class: 'nb' Name.Builtin.Pseudo: "#3465a4", # class: 'bp' Name.Class: "#000000", # class: 'nc' - to be revised Name.Constant: "#000000", # class: 'no' - to be revised Name.Decorator: "#888", # class: 'nd' - to be revised Name.Entity: "#ce5c00", # class: 'ni' Name.Exception: "bold #cc0000", # class: 'ne' Name.Function: "#000000", # class: 'nf' Name.Property: "#000000", # class: 'py' Name.Label: "#f57900", # class: 'nl' Name.Namespace: "#000000", # class: 'nn' - to be revised Name.Other: "#000000", # class: 'nx' Name.Tag: "bold #004461", # class: 'nt' - like a keyword Name.Variable: "#000000", # class: 'nv' - to be revised Name.Variable.Class: "#000000", # class: 'vc' - to be revised Name.Variable.Global: "#000000", # class: 'vg' - to be revised Name.Variable.Instance: "#000000", # class: 'vi' - to be revised Number: "#990000", # class: 'm' Literal: "#000000", # class: 'l' Literal.Date: "#000000", # class: 'ld' String: "#4e9a06", # class: 's' String.Backtick: "#4e9a06", # class: 'sb' String.Char: "#4e9a06", # class: 'sc' String.Doc: "italic #8f5902", # class: 'sd' - like a comment String.Double: "#4e9a06", # class: 's2' String.Escape: "#4e9a06", # class: 'se' String.Heredoc: "#4e9a06", # class: 'sh' String.Interpol: "#4e9a06", # class: 'si' String.Other: "#4e9a06", # class: 'sx' String.Regex: "#4e9a06", # class: 'sr' String.Single: "#4e9a06", # class: 's1' String.Symbol: "#4e9a06", # class: 'ss' Generic: "#000000", # class: 'g' Generic.Deleted: "#a40000", # class: 'gd' Generic.Emph: "italic #000000", # class: 'ge' Generic.Error: "#ef2929", # class: 'gr' Generic.Heading: "bold #000080", # class: 'gh' Generic.Inserted: "#00A000", # class: 'gi' Generic.Output: "#888", # class: 'go' Generic.Prompt: "#745334", # class: 'gp' Generic.Strong: "bold #000000", # class: 'gs' Generic.Subheading: "bold #800080", # class: 'gu' Generic.Traceback: "bold #a40000", # class: 'gt' } flask-paginate-2024.4.12/docs/conf.py000066400000000000000000000205611460611454600171560ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # flask-paginate documentation build configuration file, created by # sphinx-quickstart on Tue Oct 16 16:15:46 2012. # # This file is execfile()d with the current directory set to its containing # dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import os import sys sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) sys.path.append(os.path.abspath("_themes")) # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) # -- General configuration ---------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. # They can be extensions coming with Sphinx (named 'sphinx.ext.*') # or your custom ones. extensions = [ "sphinx.ext.autodoc", "sphinx.ext.intersphinx", "sphinx.ext.todo", ] # , 'sphinx.ext.viewcode'] # 'sphinx.ext.pngmath'] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] html_theme_path = ["_themes"] # The suffix of source filenames. source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = "index" # General information about the project. project = "flask-paginate" copyright = "2012, Lix Xu" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = "2024.4.12" # The full version, including alpha/beta/rc tags. release = "2024.4.12" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ["_build"] # The reST default role (used for this markup: `text`) to use for all # documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = "flask_theme_support.FlaskyStyle" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # -- Options for HTML output -------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'nature' html_theme = "flask_small" html_theme_options = { "index_logo": "flask-paginate.png", "github_fork": "lixxu/flask-paginate", } # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = "flask-paginatedoc" # -- Options for LaTeX output ------------------------------------------------- # latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # 'preamble': '', # } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, # documentclass [howto/manual]). latex_documents = [ ( "index", "flask-paginate.tex", "flask-paginate Documentation", "Lix Xu", "manual", ), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output ------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ( "index", "flask-pagiante", "flask-paginate Documentation", ["Lix Xu"], 1, ) ] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ----------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( "index", "flask-paginate", "flask-paginate Documentation", "Lix Xu", "flask-paginate", "One line description of project.", "Miscellaneous", ), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {"http://docs.python.org/": None} flask-paginate-2024.4.12/docs/index.rst000066400000000000000000000267611460611454600175300ustar00rootroot00000000000000flask-paginate |release| documentation =========================================== .. module:: flask_paginate Overview --------- Latest version: **2024.04.12** **flask-paginate** is a simple paginate extension for `flask`_ which is reference to `will_paginate`_, and supports several css frameworks. **2024.04.12 update**: fix bug url not unquoted for bulma **2024.03.28 update**: **include_first_page_number** parameter was added, and some parameters got from config **2023.10.24 update**: **rel** parameters was added **2021.10.26 update**: **bootstrap5** is now supported **0.6.0 update**: `bulma`_ is now supported (use **css_framework** parameter):: pagination = Pagination(..., css_framework='bulma', **kwargs) **0.5.4 update**: `semantic`_ is now supported (use **css_framework** parameter):: pagination = Pagination(..., css_framework='semantic', **kwargs) **0.2 update**: `foundation`_ is now supported (use **css_framework** parameter):: pagination = Pagination(..., css_framework='foundation', **kwargs) **Note**: Python 2.6+ is required (**string.format** is used to format text) .. sourcecode:: html+jinja {{ pagination.info }} .. figure:: _static/paginate-info.png :alt: Screenshot of paginate information or .. figure:: _static/paginate-info2.png :alt: Screenshot of paginate information when search is used .. sourcecode:: html+jinja {{ pagination.links }} .. figure:: _static/paginate-links.png :alt: Screenshot of paginate links .. highlight:: bash Installation ------------------------ Install the extension with one of the following commands:: $ easy_install -U flask-paginate or alternatively if you have pip installed:: $ pip install -U flask-paginate Configuration ------------------ If you want to show the pagination information, add below lines to your css file. .. sourcecode:: css .pagination-page-info { padding: .6em; padding-left: 0; width: 40em; margin: .5em; margin-left: 0; font-size: 12px; } .pagination-page-info b { color: black; background: #6aa6ed; padding-left: 2px; padding: .1em .25em; font-size: 150%; } Test ---- Test file was added in *0.4.6* (thanks to `Rdbaker `_):: $ pip install -r test-requirements.txt $ cd tests $ pytest tests.py How to use ------------ In your flask views file (e.g. views/users.py):: from flask import Blueprint from flask_paginate import Pagination, get_page_parameter mod = Blueprint('users', __name__) @mod.route('/') def index(): search = False q = request.args.get('q') if q: search = True page = request.args.get(get_page_parameter(), type=int, default=1) users = User.find(...) pagination = Pagination(page=page, total=users.count(), search=search, record_name='users') # 'page' is the default name of the page parameter, it can be customized # e.g. Pagination(page_parameter='p', ...) # or set PAGE_PARAMETER in config file # also likes page_parameter, you can customize for per_page_parameter # you can set PER_PAGE parameter in config file # e.g. Pagination(per_page_parameter='pp') return render_template( "index.html", users=users, pagination=pagination, ) In the **users/index.html**: .. sourcecode:: html+jinja {{ pagination.info }} {{ pagination.links }} {% for user in users %} {% endfor %}
# Name Email
{{ loop.index + pagination.skip }} {{ user.name }} {{ user.email }}
{{ pagination.links }} Example ------- **Note**: 0.2.9 requires `click `_ to run this example. .. sourcecode:: sh $cd example $python sql.py --help $python sql.py init-db $python sql.py fill-data --total=300 $cp app.cfg.example app.cfg $echo edit app.cfg $python app.py --port 5000 Open ``_ to see the example page. .. figure:: _static/demo.png :alt: The screenshot of paginate example Deep into the Pagination -------------------------- Below are the parameters for **Pagination.__init__()**. You can change the settings here. **found**: used when searching **page**: current page **per_page**: how many records to display 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. defautl is **'page'**. **per_page_parameter**: a name for `per_page` likes page_parameter. default is **'per_page'**. **inner_window**: how many links arround current page **outer_window**: how many links near first/last link **prev_label**: text for previous page, default is **'«'** **next_label**: text for next page, default is **'»'** **search**: search or not? **total**: total records for pagination **display_msg**: text for pagation information **search_msg**: text for search information **record_name**: record name shown 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. 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**: show first page number or not API ------------------ .. autoclass:: Pagination :members: .. toctree:: :maxdepth: 2 Contributors ------------ - `AlessandroPoletti `_ - `DYFeng `_ - `DoctorMalboro `_ - `MasterMind2k `_ - `Rdbaker `_ - `alcaras `_ - `andodet `_ - `dp92987 `_ - `ilya-il `_ - `mkaplenko `_ - `mozillazg `_ - `skybber `_ - `tark-hidden `_ - `trein `_ - `voltterra `_ - `wong2 `_ Changelog --------- Version 2024.04.12 ------------- - fix a bug url not unquoted for bulma `issue 112 ` Version 2024.03.28 ------------- - add include_first_page_number `issue 111 ` - some parameters got from config Version 2023.10.24 ------------- - add rel `issue 109 ` Version 2023.10.08 ------------- - fix typos `PR 104 ` Version 2022.01.08 ------------- - make `bs_version` only for bootstrap Version 2021.12.28 ------------- - set `bs_version` to integer Version 2021.10.29 ------------- - `bs_version` is from `css_framework` if `css_framework` was set Version 2021.10.26 ------------- - Add `bootstrap5` support - use `YYYY.mm.dd` format for version number --------- Version 0.8.1 ------------- - Add type conversion for page and per_page args: `issue 90 `_ Version 0.8.0 ------------- - fix bug: `issue 87 `_ - fix bug: `issue 89 `_ - jump to new version due to upload to pypi by mistake. Version 0.7.1 ------------- - fix bug: `issue 76 `_ Version 0.7.0 ------------- - Support Materialize framework Version 0.6.0 ------------- - support for bulma css framework - use black for code format Version 0.5.5 ------------- - add option for url encoding or not Version 0.5.4 ------------- - support for SemanticUI Version 0.5.3 ------------- - update for bootstrp 3.3 Version 0.5.2 ------------- - add `skip` attribute to fix error in docs - read version from source file instead of hard code in setup file Version 0.5.1 ------------- - add `bootstrap4` support Version 0.5.0 ------------- - Make clear and easy customized for page/per_page parameter per on `issue 50 `_ - add `get_page_parameter` and `get_per_page_parameter` for customization Version 0.4.6 ------------- (bug fix release, released on May 31th 2017) - bug fix: - Incorrect right-most window value on outer_window=0 `issue 51 `_ - add tests file Version 0.4.5 ------------- Added new parameter `page_parameter` to simultaneously interate over multiple Pagination objects. See documentation Version 0.4.4 ------------- bug fix: - TypeError: url_for() got multiple values for keyword argument 'page' `issue 47 `_ Version 0.4.3 ------------- use `flask_paginate` insetad of `flask.ext.paginate` for new version of flask Version 0.4.2 ------------- add get_page_args() function, and change the way to get url args Version 0.4.1 ------------- remove href for disabled links to prevent navigating to top of page when clicks Version 0.3.2 ------------- 0.3.1 file upload failed, increase the version number. Version 0.3.1 ------------- (bug fix release, released on Apr 18th 2015) - URL has no necessary to unquote for links `issue 26 `_ Version 0.3.0 ------------- (small feature release, released on Apr 14th 2015) - Add option to number format total `issue 29 `_, and also can format start and end Version 0.2.9 ------------- (bugfix release, released on Apr 13th 2015) - Last release did not fix the bug `bug 24 `_ actually. Thanks `MasterMind2k `_ fix it finally. - Use `click `_ for example code Version 0.2.8 ------------- (bugfix release, released on Nov 2nd 2014) - Flat args for non-multi values style urls. This is used to fix the bug ``_ when generated url likes this (`http://xxxxxx/something/[u'param']?page=2`) - Use ``_ when generating url so that template no need to use `safe` filter any more. .. _Flask: http://flask.pocoo.org/ .. _will_paginate: https://github.com/mislav/will_paginate/wiki .. _bootstrap: https://getbootstrap.com/ .. _foundation: http://foundation.zurb.com/ .. _bulma: https://bulma.io/ .. _materialize: https://materializecss.com/ flask-paginate-2024.4.12/docs/make.bat000066400000000000000000000117701460611454600172660ustar00rootroot00000000000000@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Flask-YAMLI18N.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Flask-YAMLI18N.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end flask-paginate-2024.4.12/example/000077500000000000000000000000001460611454600163565ustar00rootroot00000000000000flask-paginate-2024.4.12/example/app.cfg.example000066400000000000000000000006001460611454600212450ustar00rootroot00000000000000PER_PAGE = 10 PAGINATION_CSS_FRAMEWORK = "boostrap5" PAGINATION_LINK_SIZE = "sm" # decide whether or not a single page returns pagination PAGINATION_SHOW_SINGLE_PAGE = False PAGINATION_INCLUDE_FIRST_PAGE_NUMBER = False PAGINATION_PREV_REL = "prev" PAGINATION_NEXT_REL = "next prefetch" PAGINATION_RECORD_NAME = "records PAGINATION_FORMAT_TOTAL = True PAGINATION_FORMAT_NUMBER = True flask-paginate-2024.4.12/example/app.py000066400000000000000000000065361460611454600175220ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import unicode_literals import sqlite3 import click from flask import Flask, current_app, g, render_template, request from flask_paginate import Pagination, get_page_args, get_parameter click.disable_unicode_literals_warning = True app = Flask(__name__) app.config.from_pyfile("app.cfg") @app.before_request def before_request(): g.conn = sqlite3.connect("test.db") g.conn.row_factory = sqlite3.Row g.cur = g.conn.cursor() @app.teardown_request def teardown(error): if hasattr(g, "conn"): g.conn.close() @app.route("/") def index(): g.cur.execute("select count(*) from users") total = g.cur.fetchone()[0] page, per_page, offset = get_page_args() if per_page: sql = "select name from users order by name limit {}, {}".format( offset, per_page ) else: sql = "select name from users order by name" g.cur.execute(sql) users = g.cur.fetchall() page_name = get_parameter() per_page_name = get_parameter(default="per_page") pagination = get_pagination( total=total, record_name="users", **{page_name: page, per_page_name: per_page}, ) return render_template( "index.html", users=users, pagination=pagination, ) @app.route("/users", defaults={"page": 1}) @app.route("/users/page/") def users(page): g.cur.execute("select count(*) from users") total = g.cur.fetchone()[0] page, per_page, offset = get_page_args(per_page_parameter="pp", pp=15) if per_page: sql = "select name from users order by name limit {}, {}".format( offset, per_page ) else: sql = "select name from users order by name" g.cur.execute(sql) users = g.cur.fetchall() pagination = get_pagination( page=page, per_page=per_page, total=total, record_name="users", ) return render_template( "index.html", users=users, pagination=pagination, active_url="users-page-url", ) @app.route("/search/") def search(name): """The function is used to test multi values url.""" sql = "select count(*) from users where name like ?" args = ("%{}%".format(name),) g.cur.execute(sql, args) total = g.cur.fetchone()[0] page, per_page, offset = get_page_args() sql = "select * from users where name like ? limit {}, {}" g.cur.execute(sql.format(offset, per_page), args) users = g.cur.fetchall() pagination = get_pagination( page=page, per_page=per_page, total=total, record_name="users", ) return render_template( "index.html", users=users, page=page, per_page=per_page, pagination=pagination, ) def get_css_framework(): css = request.args.get("bs") if css: return css return current_app.config.get("CSS_FRAMEWORK", "bootstrap4") def get_pagination(**kwargs): return Pagination(css_framework=get_css_framework(), **kwargs) @click.command() @click.option("--port", "-p", default=5000, help="listening port") def run(port): app.run(debug=True, port=port) if __name__ == "__main__": run() flask-paginate-2024.4.12/example/demo.png000066400000000000000000000651551460611454600200240ustar00rootroot00000000000000PNG  IHDR)JmsRGBgAMA a pHYsttfxjIDATx^-i]eXZX![j,^ * !$^oVf1$8%Q4ͽ5KE2doPpS#=}N?~O~>Syۧt?>}aRJ)RRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*RRJ)RYRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*RRJ)RYRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*RRJ)RYRJ)ʪF-Vl\xO~cũu%X7N ){Eg_/7{CC )aW2z0YW4am<7q5Kp:KH[{o~?l-yfR/zccop"L!%v'2gWu& {L'e_qCP|x[71۾M%|_ʚ!?yeOIBE]wO~_ӊg/vCJs݉k~eR}Lϋx_bfm8N1}lK_xuch_CsP˦֡y֞!e׮~9%uWoHyjMhHo:*6ug~譯Wwm'|˯n`F[B|_-7vq%f',WigrC5:D'>svhH鄎Z ^8Z&09%FSTl)P{]=HYUFKc@qЬ017t͉M{;IN=ҨD XϦzzmwN;R%T+P@n\aIjosbԪ=LBJb !eL胺ZU/izjo0ozvtZ}c7ݯԵ(?*I=WC걧&h} W|3ݗ_ҟ.Wib{E걸xOPSRzw7_͕/x˶iGūAU}3^Voo[mߟxx׿\)seS:pYبs&q'\w͎nRv`R6BpYc!<1nO7egCCJr&0dHO>^ՎRmu^7~4'=oomLl6]ϰ~|ӮľvRCJZѼr Qp\µ 9='^ )Fpгl\2)a=Me%ǶH:[Og6#3ެ[RQj:(|_'|o<~xϧto.>^5{o(7/(^}< )zg#[ҞZ|ӛ+4f?VМF!徟)4sܪ;Uwabўp:39Qkw W?-c&A!WMڵ 3R&dD{_c|$U+Y݉v볫$ξ7' aƭ~c6m޻6V5~uZw{x̶糩~n,[>U,^z/za>jϐR/)ϽxL_iMuN;tU\kx(cUws,V'mz 1_:~Vfݾ:yݦR*5WRVwWDkGm.\-yxߍ{_vKYzM=^?WU_ӱ'2ퟷ^oCg=Tc:JJTqJLU[<Q]wR^O J akMSٱ߷k~؞*LTB6$ޟit Urⓨz/z;c{M~RnGDzZ5;潞ƆUn*!M@ >6ۖc{bV]nM}W CJYݠEfR )cߣcnαcr~xk}XsH) *ʥR} (P>)=+G~_nReӯuxR)a2ўt:zC߷\ ֵ#'Ycjm8:`?lN$<6RvZoUMn}6em].~n5vmk`ٳ ؿ# _m9qHU-#$ޱjO^^q_]?Y~ܰ]ղe_gJ-RVվ'W]V?wooy?vˊg~m'^ik{}a>~WRDQ·`[ӛ?}KOS)cKNړLXR>>_Pˆ}!\o )Q%?iu?NUuj۩stGO ߳ͱjGw$Um[ڛu?{g:^{3J|?eF_g1pEHvgy`)ή奈ipƾK5guŁ},{=YK_^WWTۓ~Jx`:{HYU㶯!L[#~qu/ɯ<\P=WI Ϗuw?-`O;ԝxs 3 7tz50xLYmTݠRAÕ1?&`MQ Bj_ Ѫ} CϿ;p}e;nwJުƾv{S-c-~ц:q49۞6۔XWorjҸk+8ZGe/?^r/̇CJ7 DO-7k:l'=gWN<ēn5םT\RKԙwkG'3lڇK/;p%ehcA8]TxA5&5ju IUJx}}'y,lZogg,ޗ}>k.{%{E(eZnS۽:ԕ:n_=~;RvY},2mM㼐_U5n*!ůV*c_請g__{PV3Z. )+n7$7^^Upy䏊x+.SyY?By!eSx`r@;$;tJJR e;ˎ۽RuKN&DLvn}'P&!oj{D۷}ڮ+,=G}6QT;{S}cjjgHi_ m+*=nP-\!k;ѮTHYW+=Z+G )}`HTwJhK\fCv1ݞq^HQ˯BʪWZZyT7EC!ozS/w7NȊ=R|W|KhTd9ց'(R_m[3O-wxm׳+o(^u_^G7ˤ0)e{5|~xw`s%UOy{G/{_xdqS?{,(kDpNSBRֈRLո](ι-!E)fw;qKHQ*RRJ)RYRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*RRJ)RYRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*RRJ)RYRJ)ʪRJ)TV%(RJ)*!E)RJ)U )J)RJJHQJ)RJeUBRJ)R*ȈdEH"YR)@V +B !83IK+S'gDR3KM~|R )&Qjb>ipR(_18uB pfIگO_Z:!8$*/ۋn>G[W}KM-sN铋??U|sxnbٲ^O>꓋'\♯I/Iz[w}]{l>Qc5,J.]g/*s{+{˿S<'>x5s~(|NYjUׯ?V )_|?^n1qz̪*QK|Omŗ~㒟m^|3T^OnPz|[A )&QzSb"֨TH,<ՙf )wM=DY|F$[zH^MBGxNcb_R|?_Rom_RW_.z7W#|^ͭWw?/.>fz?o +oZºn+`97__R<~>,rg_gQe+>q{/H+,R3KM6⩟&].GRL|IxRW|3xnZ)/~VtUR49|ҋS?vz-zwU9AK??|_o<9nVfDc)o^jMHᛋ;_~Ӌ{7g3պlSKjIW:_~׷L?R+?}ҷ_o(? _[F'^|+5ϴE:>_*~q@R~pcO~i.pH9} O? *] !)0![蛊=K/{w_|/o!e>iKܾ#|;]\BJ#PO*7et!P|Ug!c )p_*'IY9,oxC_;_Yח旿y,^O74׵mZk˦CXj׏u~c|*.~ƣWd?҈}}~~j[v3'>UiFWh7}']dו}WUWR΋LU'BJjTMD+L Zcyx!ṝ9uկiQjg&Qk/ԡ!}|[ W3|^_zRz~g8\gK|X_>yv{Ҏc|-U᯾ )EHC$n gVZ5 ]cw zwW*4zݨC-׽z )p`=)JOַa&p\d-Zgu۪׈:vn_KjU֗_)o+앟 U]E )˶u39QmvIϨ4_mBeWR_WuhoCw>_;^;zsQL~??Q;)PWY=*N 7mSe -R߶#kx\5Ǧ )3ɏwj*->3oWJ<],%Jc;q/+>Ϩ_%?XﺂľcwHq, v_W#8ٯY=T\~)z p8V؍5xzJRm(AiBR$֕ȭ_7~*|RTگ3}-IԺ^œ[Mzqg !友^3j|_`v>7WZձ3J~Ѳs]AζxT{}.б0کS,SŸxJO{e3ۢۋ'<8uB :& }g0ܞmۜmoof963r> 1B mWg[?@~ G}ܳ0]]Ϡ/gk ]lZn᧵w~n-Xx3>?ttU,>/W|G;x󿨾֪k )p0q&FCx= FRX6}bJ5a>VݾR籁kIM*o=G?k/X~ζR*oyE)O|\^œ՟]/Sw/O'+ o(?3گBI>v3>մݗ$v|<^;7_S?Q:!mD ukwR(_18uB 9v6ozӔDRئ )uD}l'R(_18uB pfIگO_Z:!8$JW'/NYj+zVNH,5RIK+S'YR)@V +B !ȊdEH"YR)pZ-|Rm/Y TRj*9|f@OH}(⡇*yѼ,Ky/ VXzSl|>}գKHWP5pо0Tȵrgߜ۟b|d=㊊(/yWPrgC´Ra ʝ}sKom:rS΃Λ(*J?i@;<t_< )p괖Υi@;<ti@;<ti@;<ti@;<ti@;<to=K0YJ'L /|?x.1\ia=6R9).Z'OF\u90p~c)y_ Ϟ &ighDmJ)jED~{n:SWI>0Q^-LB8cǁd=qoMվμM#x\ݗ"]B Bu")ς~SH$z)9ZR,H*9&vRzkۓ3Ɣ8mJ7;W49)&=8۝ygsei!e.e3e{Z9mc)g9xԷWtt泘jL}u{1lO ڦ.MնǃltDR.٭>s )JDVr{T>{Z+!M><{2OtLX) },;:'5mxnQxRS ^r;C[RHC>OS=CJ?Nr=gz|[T8H;B۞A 琲[THYiSsB `e[RΣYJH FNc᳏CJ}|^II]1T?Ք)Mue26g>Dr=k?hVLKΟIgvRhS<~88gl{9(R(9:t{2 ]nY*C?C_d}`))>~i}-%ƺuU޺8<Ϥ=.R09!0\I@xOW5e@)!?|*չ3 )q엦6Q}@,C,/)ɕ:8gYG'mH&"S-C>OgmbBЄt_ G{_JLoLqP4 chUN/E6MطLSsB `ʃ3tNoŽtH!%o+6G|Ϋhlab_r-s __16Qd߬&}þ{9x[{ "gIkg/L)a0 >8nyTm6]K!e;TgQxw(~zdw^_]׫6~'eߩ8Pr ) kS޻+&) =rLoS{vz/Q=k7VŽwJ=Ł}@&ʉZJ ۔mTXApD :n)p9)G;s )P )fRJTm,=k+' $RΩiڹܐ2dPJ[*ckMSIs4G;8NdZKhR>i5&(WXzSlN!ڹ}aZ0kξ9?6R:i-Ky/ VXzSlN!ڹ}aZ0kξ9?6R:i-Ky/ VXzSlN!ڹ}aZ0kξ9?6R:i-Ky/ VXzSlN!ڹ}aZ0kξ9?6R:i-Ky/ VXzSlN!ڹ}aZ0kξ9?6R:i-Ky/ VXzSlN!ڹ}aZ0kξ9?6Rw_#T?Kg7i@;<t&=PS Y`h_V* ZocOMQyyR?pwG>R='t> VXzSlyO9)AMH}+\o2Og郡}aZ0kξ9?6ͧūAH3($<{3ˎE)u1*rTRj*9|g+(x+RJs*!ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V8[ׯw⎫7Gnw?ym8oT6qaUGsoG=ŖCH#yuaotI)GHUs찯Tu TCJB RhB]\N6=B R`VQ't'L!R]T[U_ɯ5_f>BJC!%YЬ m7'Bm}'m}М)0+!!8^W:DzJKc\юm.+~㭠8u <zO tU RO=W<knGоvR/`6Wz^)p4@s=>4o$@Ӻ)''{ގFpXkx #mnvq`X8q֝o 'ﰐ qu@3Ut vį[Nǭ]fqHiK8ոq]{ ,ӡ!Um'BJT!e%qJՎ];NHuu'j>91)W4  CJ2HEm>fCq6kB A֮0.Vh^Mi]ehLRck1mHiPyu!f:]^h_a'sDDXYQHCJjIv>ֿ]^xɍ r vpq6}uS;A!ƲӇfiw]D!x0̃s 춓^Y8 UD muݞBFMY)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR<~RJ)uN%RRJ) +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YRHn]Rq瓒uj[׋KYܽ.]UC5qf@ͫg9NGqrÍ?l:e1n\HN//__S%QTac3Au@)KH ?P1*ܸ]3.5I%1T^o ty:f0V®^KJqO{5u8s4k|${[So^U[v3VTJE55{n#,|]!eUI~KH#7N9ԈYH8/׷BEesPг]՘Q-~ͽBJjU $ )pҎ/ )I{JEl=V4NjU8@uԏ6F83TA#yLHi'IHwaP:$n8se!lx&QZ#eGHlw4)erʄJ\MRNfl:hޱ/D@0i?2FG,R`ngϜMRWB{3.x)MH -j J, )CAORχ1qn:mB ̮>ߪq*RO^]k殐*I;):[WQ8qE֛l3)!7U~*/g'SN{xΗգu՘R-~dHon%WPNG08(pQ>TDDshNQ?V/ cΐnf*._ K!;04;VG"n8$,H,OVz~NԱ#l;غZWNvd ):NG"M":D=Tl8!Th[2Tkm0w!T$Ց)aR=Ws􆔞0C!'  OYi൫ 6>Է +'&S䕐1?*vP焔&RgpF#L )೗IB;N]g=8 {։0kʐU`Fd[umi Ȟǰl5Wp^4 U`LRV*p )p4^ۺvB iRJR^a$%^sՋ CZrOX4!ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B ߯RJ)Ω +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YRHn]Rq瓒uj>,^Qߪ~R9]Y=PUs;8x8Ꮇ,[=n )8'PR(6gq}cjQ!Ƶ:ts'KHc.kY% .onS=vU]ݫOukT )p UG>>(7+=60A^v]r+ľxuەak )|NJZq )pF)Jt, lBJ5&PѮxq=2z!8j4&Tˬ_slH ˕P=iRVǻϲ,KWW *Ƿ֕HwR6"ac͠Q?4m;CJ#CJhks] {Y*{ZwWPm9=ƌ.;Bf[FmoN]B deXg tzȨ>>PѲ!t8vHh;U#ږ )mRR +ɘXϲhR=Ws7PT##BJ{)R +B E2>Է+/a!}~:!6x ,3: a?eH ?:LRCNφ;ϲ,!u<2DO'1^ώb̻x8`vϲ,{jҐ24n!Q.!YRJR^Y $%^ѦB g$YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH>PѲa\ ^wF-R5RB;ڏ十'KH,Kg֚<걾; ?!چx|x8B d!AZRn|H }~UqxI\U*O0Mǹm$)0٢5(et,K2: a?eH ?:R6r]}6ݱ g8CJkƍuMRBHu_t)p 5QNRu.0:ġ& )+CcծLRvm(KH醏|{EeIJ,RJM+ z=k9A6YHh\1Z+(NH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !Ȋx+RJs*!ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V8[ׯwd}cPq)f]+nV@nwƨKoU?ƻ3f,R(n\:V ),W=ƍ )ј7UɩR(6gr&(t@G< 7*ܸV~$㣯԰8B Cu5t.w(l\=k8WvZv +=l~nS%1TaWAY*3Փm1ߪpT(<4Ǝ}mW:x嚯+JNxFNGXos2HKnFphvnǙ甡g]^jLHY!/\tB 4EpUSP+Ƿ֕Hwz_V=o^DXGXl3hԏ!Z,&!fJ2 䤽Gb$\Aix3⏿6pmjK0NY:)N=}F ׇǃ8BEˆI|g!Th[2Tk'~ѸWrrJSsXBJX_Rn= )6HoHW6y6ݩR +!e4>(%L!<=z|W:y|GT )0EWKzktH;ʐ>{(}%AH|3 ;Ɓ0nkʐU`Fd[uminw;^r*8`d):vTMRVƪ]* mPHb8j3RNRJM+ z=k& )Ie +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)p|RJ):R)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH#uJqǝOJ7n\n.swCcխťhLk՛B\dB E7t )>c\_H:Qgl$QTcDG:fG_ݫ.p,͓p}!V! )p e1lm:+=Eo\`Vո.NU|}&1T B m1"} p{UjCEk0x^3 8qTcӗW#8BEes+=jY>Rwl QR ǃf}|ZW*"eF *}B? pc-QeJױڑgFܮ5R ŠY:ظ@lՃxѾ"-ƈՎ)W;Ѷ}ǨFH&}cY/T!e;$vs)}BJkYg|HimRS}CƖ )0}YVHX!eh<W= )8 7 `sφ{t` )v,?8DOg hh )Q b\8B vIT_,WQ۽R5iHYv\)b\cCH kՕKݙ&RJ}9$%^Ѧ!ec{ CH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !Ȋx+RJs*!ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V8[ׯwd}ZhVq]@.nwƪKoU?ܺ^\ƴF]Y-Tyܵ+pʄ8n舫@6}jƩu (OGQ٢9;:hr< R6c؈!+.n\F,PuTaU6>q'7WJ\dc[Sҽyh|)p UG{% R2S}U{pzH^v3>Dqxu5t B ruAeJzKbxR :W;Z_q@H6lO )YI|0tڝR\&t$ǃh |_xhUh[:kBE&@V:pkWU끡Zvh kXЮCICJBE&@V;j@Ƈ0>TmR=Cʾ!ck2 R`n큠oPJ 24vT!%|;F kWK9 )0lXMuƛ{U)\9,!qc]ShR) )QOv7ߣ)Rn:Du,$CJjҐ24V%)>66hB MRW3/1!xIBZ5m1R6WCFq )@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR<~RJ)uN%YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊGt;T՛onw . Ƕ.]Urzq=n\޵ @H:T|귱D@ YBJ$]\p897;SFʶ#o:q5OMظ'BHt }butS5.Ǧ˩qA5 5l8ɩR`nUg;.\T&ّ%\Rsy-e7W~CWk0x^3l #Fn_dJHUw t;に,,BD5C+T+^vR'SYWcT\BPHٞ @#3!R`fT;_RNZR+u"]kʪGH :eA~hچB`n_ra)0xhwABH8ipPg2Xv{Bm92ܮ5R`_nc}aфٶs=XHXMHI]=h0tvx3xmK~GEH0Y٭VRN~!z)Cρ!݁ra)0 CgFe kCJ0q?oR8#!:A)`F>?20ސ2|۽8M'dq@Q ^=@)v?8lDX%R6?&)GQNZmDz ,)qhIC3t4R%}eKH08ҝy)jRJ}9$%^s3R6c )dEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH"YR Ox{[w};N^@R+>Us?\̀Ο>PC=T<#գy);%XB;^/L+r7ئ|.>={Gϗ(j$0Og郡}aZ0kξ9?6#z3!P^,?i@;<t7!PޛU:K J\+wy,)8[yyRi-K J\+wy,)xhЉLk \{Ǿ0Tȵrgߜ۟bgv )pȴΥ} J\+wy,)xhЉLk \{Ǿ0Tȵrgߜ۟bgv )pȴΥ} J\+wy,)xhЉLk \{Ǿ0Tȵrgߜ۟bgv )pȴΥ} J\+wy,)xhЉLk \{Ǿ0Tȵrgߜ۟bgv )pȴΥ} J\+wy,)xhЉLk \{Ǿ0Tȵrgߜ۟bgv )p ݉fU<֟jNΦlR>>?{_Lav|uw_5>Z3VZy/;"uLuj^Ťf?uY*x2~}MM>Q'Z@l)R:BФɫY-3s.BJgU6!G=ۉXRHj>`)$I"tJk}*Z,N!p!;hBZVV!%dgM?R>>8fR}uPJT3}< .-{:/a˱lO&@^> h\czmHk=)gsSH\N$>s )aH)R>>ğ=LжڔRLՊVWSu:J|ajW[:QqWzޚ%>}yF7һ/UEj?G;8DB'^ 6S 2mIF9 OSs(N\Y*Us L1i?%:';gR)gq۔ov̷iJsSHLzp; eBT]gs )UR)rzo*o %)3g1վ #;&;܃c؞FMq]m9!0<&PKщ,-\[}&k+DR1}W;B},Mylveܟ<ߙ SXwtNj,)x:ܢ4 :8v229G|jzr t90jaߝzRn_9yKTM)?DMqYw\=ُ@!e]Q_>v88$g ʔG'&4Eg9^;&(,bR}~)Sdl<|z~n'$ǭ$*?ζ?r )Ц0^Oyq<)p)ށ,sP9LPJst_tQ!eeAT 8T'RJS|CTZJ$u몎u=qxI{\?/(aʓsB `Ṓ2jʀRC>OgmwUgs )/gR/MmpuXWcY_ S-Sn+)pMup;:N$ېRMDn[0G|ń j:v[ۿ "5ՙ)~i@X Ъv_& moj?k/88g8֝ބ]<:,CJx&nWl1E="x[Cy_vd?kS`AHL}pܶl:Cv0<΢ns?poQj^VWlOpsS=p5RDM5HֽwUWLR{:$'jh4Gc^_zdn{{Vz PŁ$L)ۨ±LuRsS8vRRg2X{ WNI, %&SUӴs!eɠԕp!TNc֞E{ hv )pȴΥ} jLP27ئ㙣B @'2%s)e´Ra ʝ}sKom:9)t"ZB;^/L+r7ئ㙣B @'2%s)e´Ra ʝ}sKom:9)t"ZB;^/L+r7ئ㙣B @'2%s)e´Ra ʝ}sKom:9)t"ZB;^/L+r7ئ㙣B @'2%s)e´Ra ʝ}sKom:9)t"ZB;^/L+r7ئ㙣B @'2%s)e´Ra ʝ}sKom:9)t"ZB;^/L+r7ئ㙣B @'2%s)e´Ra ʝ}sKom:9)G~ʗn:K J\+wy,)8>AMH-z|о0Tȵrgߜ۟b&~~w|z$O,}0/L+r7ئrS΃ΛzW3 eC´Ra ʝ}sKomOyW9)J9gPI(/yfRbT* Z+>UsWP!ȊdEH"YR)@V +B !ȊdEH"YR)@V +B !ȊdEH")̣p}CIENDB`flask-paginate-2024.4.12/example/requirements.txt000066400000000000000000000000251460611454600216370ustar00rootroot00000000000000flask flask-pagiante flask-paginate-2024.4.12/example/sql.py000066400000000000000000000016051460611454600175310ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import unicode_literals import sqlite3 import click click.disable_unicode_literals_warning = True sql = """create table if not exists users( id integer primary key autoincrement, name varchar(30) ) """ @click.group() def cli(): pass @cli.command(short_help="initialize database and tables") def init_db(): conn = sqlite3.connect("test.db") cur = conn.cursor() cur.execute(sql) conn.commit() conn.close() @cli.command(short_help="fill records to database") @click.option("--total", "-t", default=300, help="fill data for example") def fill_data(total): conn = sqlite3.connect("test.db") cur = conn.cursor() for i in range(total): cur.execute("insert into users (name) values (?)", ["name" + str(i)]) conn.commit() conn.close() if __name__ == "__main__": cli() flask-paginate-2024.4.12/example/static/000077500000000000000000000000001460611454600176455ustar00rootroot00000000000000flask-paginate-2024.4.12/example/static/web.css000066400000000000000000000034771460611454600211470ustar00rootroot00000000000000body{padding-top:50px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} .page-subnav, .pagination-nav { width: 100%; height: 40px; background-color: #EEE; background-repeat: repeat-x; background-image: -moz-linear-gradient(top, whiteSmoke 0%, #EEE 100%); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,whiteSmoke), color-stop(100%,#EEE)); background-image: -webkit-linear-gradient(top, whiteSmoke 0%,#EEE 100%); background-image: -ms-linear-gradient(top, whiteSmoke 0%,#EEE 100%); background-image: -o-linear-gradient(top, whiteSmoke 0%,#EEE 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); background-image: linear-gradient(top, whiteSmoke 0%,#EEE 100%); border: 1px solid #E5E5E5; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .pagination-fixed { position: fixed; top: 40px; left: 0; right: 0; z-index: 1020; border-color: #D5D5D5; border-width: 0 0 1px; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; -webkit-box-shadow: inset 0 1px 0 white, 0 1px 5px rgba(0, 0, 0, .1); -moz-box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1); box-shadow: inset 0 1px 0 white, 0 1px 5px rgba(0, 0, 0, .1); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .pagination { margin: 10px 0; margin-top: 0; margin-bottom: 0; } .pagination-page-info { padding: .6em; padding-top: 5px; padding-bottom: 0; padding-left: 0; width: 40em; margin: .5em; margin-left: 0; font-size: 12px; } .pagination-page-info b { color: black; background: #6aa6ed; padding-left: 2px; padding: .1em .25em; font-size: 150%; } flask-paginate-2024.4.12/example/templates/000077500000000000000000000000001460611454600203545ustar00rootroot00000000000000flask-paginate-2024.4.12/example/templates/base.html000066400000000000000000000054201460611454600221550ustar00rootroot00000000000000 flask-bootstrap example
{% block body %}{% endblock %}
flask-paginate-2024.4.12/example/templates/base5.html000066400000000000000000000064461460611454600222530ustar00rootroot00000000000000 flask-bootstrap example · Bootstrap v5.1
{% block body %}{% endblock %}
Place sticky footer content here.
flask-paginate-2024.4.12/example/templates/index.html000066400000000000000000000014351460611454600223540ustar00rootroot00000000000000{% if pagination.css_framework == "bootstrap5" %} {% extends 'base5.html' %} {% else %} {% extends "base.html" %} {% endif %} {% block body %} {% if users %} {{ pagination.info }} {{ pagination.links }}
{% for user in users %} {% endfor %}
#User Name
{{ loop.index + pagination.skip }} {{ user.name }}
{{ pagination.links }} {% endif %} {% endblock %} {% block js %} var element = document.getElementById("{{ active_url or 'users-url'}}"); element.children[0].classList.add("active"); {% endblock %} flask-paginate-2024.4.12/example/view-args.png000066400000000000000000000655611460611454600210050ustar00rootroot00000000000000PNG  IHDR. *ƳsRGBgAMA a pHYsttfxkIDATx^,YAexgb5 y2QwB]oSqQ4?1{1bAL)ȻZX]ƕ.oz=3͜;{o?V""")N.""k_ZEDDDDD""""""Gq⣸HQ\DDDDD(."""""R|)>EDDDDD""""""Gq⣸HQ\DDDDD(."""""R|)>EDDDDD""""""Gq⣸HQ\DDDDD(."""""R|)>EDDDDD OVVӒDU\=kS??P'R?sⲨ._{Vb(K1y+~}ug̕W.Kgee~U/&#Nx?'?_&ϐxO&W$W\vmkߺ7 s{zSkϨUog7yr;5w5/}3I^>#izA~eVDv)wW?(.Dq"t?z/(/l l׾{hne@qɚe]Iܷ(."gKble:笸us cmv#ͦ l]21k^K/T~O'dLq)&Q\Na\j[CQfP^J*Kuyy ?/!T]?ńcm(._U{C˥w7~'E>M.N_U{xwUۺ_o`ߗxOmq}jeQ߿x/WYv9mqY?J}54Ѭkc]U2uRNS\zk,n/.~VoKڇ׫qbsҎx1.;Nce^&u_}eq%cce}Ul~WMX9s[>knM?X5ťﭮ䙫3,Oz[z)÷W}򧿴˟%>xyz߿^ͩs2ɦ-N<89 QvuvMrz SI_=~~-RqӶ2'-."+= {-Y z{rۛl(.u}ףXݾ+{gllsJmn"2\|j"ml[\ƋK8=ò.QX^.>#e(Uh:7(.홖NnoadٸP\rⒺo;/uܶI8-^oZ߾Ňxa꟥#d).&.\7XZ /۫ &fz~|fG[np9mշY >~?'ִCiTwԹahlKo\& 9zp{ll/.ۗ Z.5Ĵ7{`ܤy6v ܾ&b1m_pexsZvdYrsgzb1s~{Ȏť]_\?d,Nx2(@2([q guXzr8O zsU8,ҟVMw8FO~ԟwyWrxY} ?nH{^nSԲ"L%c#ecpoΪ[Ʒeo fR~}%w'~L?~wD#dM#]@:$&lNť}mRsIx֯k&62=}|]p;}^ώ6Y;mH>QgBəz-SI/.n'cw|~v;Nmlưd"f-mHoUFPFGK:qϡs4,ҧ&uҟ|RU}ΜI*&/.S `~SKveݻGw?^KXz<ʱ|cjRgX^Vcqikl&[g_\e8NϿu-_ryou,.uHIZ\V^6w. eW˳).2﹯:T9..9wq4iY{lxM:5eq9b#eaBQ`wl~UJC*'(.1n..צϧr}׬ymgl?]/o1vz&=m<(o[g,Jgeuf..mN9>O ɣ]穋Kjk*n"c;6[d?O9,@²766[|\\He$e6R&7W}zLCeR_^{`sO^fzW߱W?xY]`V\Dd:rpH(."EEDDNPP.3"Rt=;rAEDDDDD""""""Gq⣸HQ\DDDDD(."""""R|)>EDDDDD""""""Gq⣸HQ\DDDDD(."""""R|)>EDDDDD""""""Gq⣸HQ\DDDDD(."""""R|)>*).@x P<(OqS\^S, z@qKXnaRp(.@v+-O[.u`%Is y٥d?n8 ԁ'-d:_zsuM7_2?s,i/>9ӫ??џW}sP='lv}z?Z=?׿wU_{7TGWXW=_W}?\O~/Q77͏Eܓ\?uO3/T ][/?i.rO}YxѹϳE?֔E9 W']{GP\଼۪[nߏT_yӪz'k]9'u`X*/"Gދ˭?ﷸgnoE\=h.X;e+> _ߞ6Kݧ+/r]ض??ÙG]-tϨ} -w_źP]7g%..9a%u`L粫|~%}:{..}G#>%Q:4vݯ3.zӉ< YR\(.oO>n^]xٻ/n5}w[}eC|SߘgCqN8Kd,rU["qof ͝8Wo Rgq-],ܿWH۬+x_şW-^O7w׵ަ[..f5ݿuG}VkSu!=8\カž~?m\g$ޞTa]a_[>ݟ^FO﮾SO YR\ A}{%up-_ᠲ9x'>\pYպljiQAgIXmΆ Enq꯿*yl<ha;Ew:{Fcw}P^,J_+ms YR\ eaM9x-;0?31A\؃uN<ד:ڜ_Jq<2URo^~t1?Fu gb,m7&;oNtּV6$2|r,YKuğpגXϗt:/y;I3mIXʋ7OuM՟߸X+O=>yl_Itt^@`w ~*ϣ,Ϥֿ0b{;?>7{aS2wGW?g| E;]ؿ-~w\:` \ՙZvGގ2rnjnU\:8?Sk~_3^Q=3qeNZ\Nnxħ_6/Ep#_v7Uw]WWu촽 \\6&;/)zk?Uo{| /Ϗ_Ώ ^uxz싪 ەy@%,A|AJ.I+up|:jzRד:Z5?S=́hS}΋D쿸qc8l<u^6j_l\W/^ǮYj{}.{aS*ﭞQɣg3+oDYW|gTjRz.y@ͧKi§#e|_Jܭ=@[_&_3x}O/?%'|\CԻ?Q4s|OygFha:CA_Ѧ*,o:߸Ξg<{oz/L]%jY ťN}+xcG./xk*an;=]uʉ$57׿w4_-yjm\gd}k/Jx}_~0ة׿|]./GK/?>~c~+V_9/OLSxϫ>90QJDLhG3:^zȠ>RyK-,|>AJRS:~}S<><י2OgZJ ORԔξs08hȠֳ-5}/*txNQ_6Vhv}/*txNT\ K^sιc y B)}s?)k;s.B^PjJg܏ot8N205k9ƾW 7c۟9ξSq ,ya;Z/*txNT\ K^sιc y B)}s?)k;s.B^PjJg܏ot8N205k9ƾW 7c۟9ξSq ,ya;Z/*txNT\ K^sιc y B)}s?)k;\,:nA|urn\~cjk~CcHyJr'iS,^Ⱥo6S͏NHS/li1&<1:Sijz˞=~T\ s;D{ie@Ӛ|̙l?V\Q).{;OӘSqsc!sɵ,D IkcˢY4沟k;\,AjK4t>];sŢK:8J 4 gZ^(0ۣ2h䬄R[ c@s?Ds@g=a2uưf]z}/88l_۩@m`P %0)li'dfbV7Ȳa2mSJSW-ZJgOՏr]2vrjY~y]}ԇU㒲<˟%~W:sb}ym}m% Ӳ,_0*.y>'\oc;l.OPN:g[(MDqJqu?p߰,'͜rgR2Vsi_۩@Y߰$gn%e2skZO%5縷zO7׃՗'ѧkL л0^dx>sZm@9߰%$[;en} 6&u%J{łR?`ױ|SxOg0TA~,;t̩5Em_2􅁯O2cs*.9_} g%/8ɯz=IW ϰ=ed9*4Wa\\ƺY؜dy0伜,0t@}H9?㉹2jÁ.|ϸά4_u%\g0cY~wضR?߷0&$;I$%/%NmQZqm u d Txb=J..KKm_Y9/^k:Ⲑk⮟iC_Nl} +q)>zǀ s2{o9Fgx?/?ϨCH~P\ ,o K5]$gik>+{ߔ?./'_hq9~-|r2>B9k3ƾNj#ؒ99,z? 2uKť98ɽmrMq:H]SwoKB/r_ԸC>,">_2ھNjqlɵ/rz?(.A7lLavK%n+A'ʱOB}^i?/X)el@S&26~3a9 Y5wle,Y9GY ~P\ oz[(\SbqYO)߫~G^]Uܲo^}7V~gemn8dJ,.DrMܩuJJqr< rS@γQd^7UinYkWkn't_O%.)9>J+B9\9޷(.ްuYbq MEq9}RK`Z&a rkY̠,%BsUyseRgو掵NjsY оSq ,ya;Z/9h)Ņ).P՝ARug3p̎ Uqaw # ea ̅th"磸;*7pNU\n\.EIg!\N{ƿ}q! U\ל*. n⭷þ=ϱQ\Z'..M]bZv|-D /\]Ɗˆy1.Ks;KI9EqBb>'-.w|Atf=r,?yåS)ymb0Rϕc%\ucDqH ! <8;Yq8R-9ci.5|E`WtZ\\: P\fc..݀tR"K|!xiȦ;LqtP\Z`y2H\ |D%`TⲐ,Wz?hlsb-\c(+ݳ.Tj6[\:"dޱ:2nAs|Λķ O;>1pNT҅&sqYUכ~+4%R\@30϶ [~Pt_\Z&*UKa|X- {xf`zjn&މ3Y2헗Ged|:(.@x P<(OqS\).@x P<(OqS\).@x P<(OqS\ {a |Q\).@x P<(OqS\).@x P<(OqS\).@x P<(OqBܸz'$sǵfW ^ݱ.\yfn憮{srpbo2^JV2pH]qA!//^]c@'FmiPnت\^~0/uJJ㦸@ S۞B/+pqk0WmK._I^*DRug5\2v(A3nW>™+kK08=>jh3\Թ}ە.#acn*._M-ϼ).PrC1y/W4]3WȺ:D*mE1w*.5%@&' _6T\G;t׷{g4"e۹;_tϞĥ"][>'硍ť)a).9h).pp~h>R\ǰ04v9Xvt> 9=JGʆzQعq).Pf28뢸|||08+ E8 JB"[l[4?l6%w).Pp6f| V\nťm,..Saٵ,U㥸@d^fL\hAmBg><~ J/ 0P@(C;R\?8 /Ox\\zaNX&gqAY #\cqƌۆ+fAq'D&xRTjәLey;r(F3)EfW\ť:d).K,GⲲzvfOqS\).@x P<(OqS\).@x P<(OqS\).@x P<({߇EDDD S\).@x P<(OqS\).@x P<(OqS\).@x P<(qRu˭OHkBՅ2h~^ݱ\כ&,@nTw^8rJre.^] JqhNXFvYS\O6rtŒ`n@i^eYfOq47S˅ @ Rqrť-.eY%hS-q/]\_18=Ggܧ]}^Y[,>xJ\17/{bNeYXO(ך7dAxIrx:eW4]3WGyPR4_m3G5,sSeY})]s|}wF#2\6mIXG{[l|wJNҜ9 ;%'..3(KP$?k=Θbַ˲̚%XO@660ė,LUm(.d@1KB|瓴(.ۗS>noד,%syGq!(OqS\).@x P<(OqS\).@x P<(OqS\).@x dp}3OqS\).@x P<(OqS\).@x P<(OqS\).@x K->!;5 ]ظ b5o]z7VHY*9 FuܤSJ&'؛vnDOq9n 9ŀ{jp 2se&(E˵+Sj4ߝG )\ BqE ȅ$s._T)By㧸@ 4cU\.UwfˇwSˮ.jF|s +]FrT\Ͽ.%q XO(z_v`Of-=KLF?yj>1Kfc {ʥc&H~>}v\oT4ַpP\Ve{$.am)9}KLXq,kׂ㢸a;ť3.6, Kˎ'_LGj e&#w]ƶu`6"Z6"c_&t4bےťYgF˔׎c@٘mm&5n%#wqFKΠP\F#GCqR\vYm_\ˌ Mⲩ\%ydcߪmWF㧸M~ԛvYٺL ,.'c\*v8S2hƗ] ا4 ۹üL?GC)f9. `=%268rO(‰/K%kqY6T\Kh&(.0Z >xR\͇fيJ`m`x P<(OqS\).@x P<(OqS\).@x P<(OqS\).}XDDDD0 P<(OqS\).@x P<(OqS\).@x P<(OqS\).PW/Ud,4"wrp׫;ԅ7?opju/_on ?_8v FuxfD@y9n͉2Aߥ-{@VD~4vV\(K˵+bŚ[2syP\@)`9_R1  Wybú| KƎ%h݊G{Ձy}ߜ勵jh.ho]2>|ٔw\uζp~(.PreÉSޫm5(.!78+ˮ癫E`d]|!>ʦK).2L~rUZNT qۺL ,.2,e/8 /oȧLa*,.\5(K|$?k=Θb.:'-V̂%XO@LM 8RTjә\eag[vW\ť*/p{,e)ۜX\]S\).@x P<(OqS\).@x P<(OqS\).@x P<(Oq@a9(.@x P<(OqS\).@x P<(OqS\).@x P<(Oq@!n\TrZPceWw, Wo4B=]PQyq8c<^ az0», [hS\(.P'Qz.!uVڕl;ׅ%hNo5,JT@.\\]yj.)|%qؘ[,c@ }ۻ, \\_1,*=eWߍ׻C|F#>>xJ\17xKZާy).PrC.0/2yh/;&Suu/T6Afcn[\rshnx).Pɉ7,Ҏ͙|Fdl(.22vnhoť-Kh(.pp~hReaahpTj9"i鯷9f4fCqY=貵o>;7(.`Vó([񡄄Dˆ2831V(šTضdqi~ٶm:9J -aoJeYJ[qin˾3Z2/([׊c@d^:L\hAV(݃׃@qCT70,uqBY\ŸO:..!Jqk?5ÉfeK,{ Y\gPB*c3fC11O `=%wYY9bd-. SϦd..r>).PfR2>,s}qK}&ޮ'KqYJUpZ** .>tKi.)|%=5]yp(A3o<[u`VA]1,8=G]׻C|F# s +='序iZ>|}k `=\kꐑ{9A}lYfgtDh/g&S쏬xy'Φ9h⒚)(۬S\U48Ҝr'M͙|Fdl;iO:e堽Sr6m-. #Ji9~ .*`O<|807cԁ|_b|δ_G+)yGM<\LJwGOquO^[Ϣl5Ƈ-YB/uŶ%Kζ@٘էP-u`~v+.mcwqFKƊHynX(.P =IӒ0w07 MCl cچ{z} -RЛ²A;isuq;BY\ŸO:졸^;).ppf65ф?YOisqćyc%e)T gH1[?cJpLI? [H%kqY6}$Sqm9n cXH-`/.A|}!ޮ'KqYJ<6e+.+3K8r(.@x P<(OqS\).@x P<(OqS\).@x P<(OqS\ {a3\""""/ dzsH(.A%""""@7\""""/ dzsH(.A%""""@7\""""/ dzsH(.A%""""@7\""""/ dzsH(.A%""""@7\""""/ dzsH(.A%""""@7\""""/ dzs횷)->!fwz9l^W=1G%D|w?̙#qEq Ron^o9n͉B|m/[V+ dzs'Q( #""rt?۪olH^ ?뗔,@7NiΤx S""RJ7n[]ڵyk.)>{J]oU2HvJ3lI4`-"2KsDsƾ4Qo]2>|ٔw\sL\2Hvzlq%|Aq'\;N~eȺ:7=M6ťYf'..cK! dzsɉjˆ6g[DD!|=s}} ;,^=wϞĥ"][>' dqIU ۬o >Ƴ)|%""ɰ04Iȏ$|δ_G|_0aZ=C.`L- dzsI3uY ODDd~קeB B/uŶ%KζY8/P\7 dzsISm1Ȭ[qin˾eˣťy2Z\V gVY^üc\y2Q\>Yf;ps7e(w>9 dzsmOϪNB""2l]\PrD)7>_Dq Roz2kv..y ,.~Y #\X1[ K9(.A͵SP"ɉ'K""ǘ_*Jݖ̆*.S{8QDq RoLJQxED}q:Dd).$s([qY%a z2(.A%""""@7\""""/ dzsH(.A%""""@7\""""/ dzsH(.A%""""@7\""""/ dzsH(.A%""""@7\""""/ dzsH(.A%""""@7\""""/ dzsH(.A%""""@7\""""/ dp}3OqS\).@x P<(OqS\).@x P<(OqS\).@x K->!;5 ݨ]4׫;W ќBw aXDtjO-gp<7V\>3(.Pl18; Jrr+).P6{K՝E]`yi97]L}48J ۜ-Q\W;/!Nˇˮ7sGT(:g9:=p&H1nXO(z_NL #h`6Vcx:eW4]3WtxTqY_upW\:F_bTZ殝cuAш m=KEXG{[l|4d3R\0ьM$'fcXl6S%M' 4_HjR.Uc/4(Z3DvԶ+9jOe3Ѳa+2yV۶5zp).Ppv7)ZkI V\Ʋ2\R\h޲ťwp\hX*.5Ņ 8]΢l0[[ Y\Ÿゴ2Kň).ppf e8l^6]jK=FD` Eij-.6?U8(zJdl O9;bd-. φ"eh).PpW_K >K-u_d).KlӈⲲz;sEqS\).@x P<(OqS\).@x P<(OqS\).@x P<({߇EDDD S\).@x P<(OqS\).@x P<(OqS\).@x P<(qRu˭OHkBk7;/nZJqc1W]zsύՅhNf,c@E$NrL;ǍSS˰\4 5ДħJ}a XqYa[5Yw2<|).Pf |Ƥ)8.kWrquF%=5&9u33ˣG%hS 4%?ejϞ/!NˇˮQ>x,#L/U \yp(zBrbߦ"l/yILF?yj>^#<ގ_*.JQ>p,(DA FJMqv>9X߾.3A}{$.am>Ydr).pp~w8IJJCuϊť^e]ƶaar).Pė @>ȥĀ@Vex%9\Dˎԏ~q<+dmKqCq9( . k,e&[q컸L}pvnS\hӃtW3Mh0?4 ˮc-Kqz}qP\CD(2T8YK dtzU>Jqk?5ĩz5/ҙl9۹0o,Dsՠ,*QhqT9[?k96 `='26'2 9ٺEb,Y\Dq~.䦖ݰ ̞gMڤZY51ؾR~]OⲔx6,.+&[wy\P\).@x P<(OqS\).@x P<(OqS\).@x P<(Oq@a9(.@x P<(OqS\).@x P<(OqS\).@x P<(Oq@An\Tr\zuGphy͟{n\.結FuMp,(B3W?%JK`Y8v+.L7/P\a@ǵ榅))m~07V\Vb6޺Q\.ĀN0$ve9x}jt1]m^5_VXow).ph]hJNrps:pFLEeWg.ao]eeegZ7c5ygēfsS"2+ˮ}FygSq*.Jr(.p`4Ϡ(.G-.͙;.5u2={vnho2YϯCq9W8x2Cq8j=CzCi请ͥ^e=m%л.̞ݪ2l=h0 Ί|3yVۖ.>_r(.p`-ʈpv+.mcwqNX\F;P\-L[Oܶ4m_\$]ǚB ZtTMTe uqb9Ks\v1Z\p1 o=ӝ< mO(ťw#eO\\#Ty-.6M)Q\An'DNIEغEb,Y3uV6Q\KL̚r(.P&(:J m_\j@?ޮ'KqYJ<6dqYρ[Wq9Wx P<(OqS\).@x P<(OqS\).@x P<(OqS\).@x P<(OqS\).@x P<(OqS\).@x P<(i|뮻"rNrӋL~]R;>`s d|xzᇛ[R6s0k9ƾW 7c۟9C=T}CͭgOq 3-8 g}!TA(5oܷ?sڿ}c}yQ\ ti}ti_+UJM1O>Aq k=K?Rs@'HB^PjJg܏otecq>(.69l'HB^PjJg܏ot8N205k9ƾW 7c۟9ξSq ,ya;Z/*txNT\ K^sιc y B)}s?)k;s.B^PjJg܏ot8N205k9ƾW 7c۟9ξSq ,ya;Z/*txNT\ K^sιc y B)}s?)k;s.B^PjJg܏ot8N205k9ƾW 7c۟9ξSq +w\-vw>欶?Z9 !9zO߬_M/wҜF=5>f3>Ź贌k<cm35NK,.6x~ΧKJ\g]ru3w~m+};cBr D_Rd6Zئ0_|@9ްO'&8ˉⒻ5HSoL*. &9&ɿ 9$ȉq$ɦr~R;r~ ,-0-ӼctNrK9t_2 θd^ErھrM)SRKr~xr'-S:c@,7si{?r-93.R7l sZg1[\k>+~1.{׬&T9)R\(xoMK>:cRx-á%S{}Nǖ\Y"ܽ|Æd9fjg1Y\ybYmr<۹T1/w6Kr~xebY4i+c@Zn~>֑xJJ\xvy]6ɲ߯͟s`_2L =%92>m˾Zk-K߷ga~^'_S8I>M$ĝZiά!7i ׾95<OyS斥_xzxqBATx1(ϩK{!3m_} {Zg%Tg,.Fm=m R 4Xg;[\(uF.)iXq? k;s.B^S:~}S(.>hT.}/*txNQA@>`>R&}/*txNW?q>(.ɇ>^~Peci_+UJM1O<>ީKK}/ dTP.9IR~]R;:(.@x P<(OqS\).@x P<(gϡ?IENDB`flask-paginate-2024.4.12/flask_paginate/000077500000000000000000000000001460611454600176735ustar00rootroot00000000000000flask-paginate-2024.4.12/flask_paginate/__init__.py000066400000000000000000000603771460611454600220210ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """ flask_paginate ~~~~~~~~~~~~~~~~~~ Adds pagination support to your flask application. :copyright: (c) 2012 by Lix Xu. :license: BSD, see LICENSE for more details """ from __future__ import unicode_literals import sys from flask import current_app, request, url_for from markupsafe import Markup __version__ = "2024.04.12" PY2 = sys.version_info[0] == 2 # previous link _bs = '' _bs33 = '
  • \
  • ' _bs4 = '
  • \ \ \ Previous
  • ' _bs5 = '
  • \ \
  • ' _bulma = '{1}' _materialize = '
  • \ chevron_left
  • ' PREV_PAGES = dict( bootstrap=_bs, bootstrap2=_bs, bootstrap3=_bs, bootstrap3_3=_bs33, bootstrap4=_bs4, bootstrap5=_bs5, semantic='{1}', foundation='
  • {1}
  • ', bulma=_bulma, materialize=_materialize, ) # next link _bs = '' _bs33 = '
  • \
  • ' _bs4 = '
  • \ \ \ Next
  • ' _bs5 = '
  • \ \
  • ' _bulma = '{1}' _materialize = '
  • \ chevron_right
  • ' NEXT_PAGES = dict( bootstrap=_bs, bootstrap2=_bs, bootstrap3=_bs, bootstrap3_3=_bs33, bootstrap4=_bs4, bootstrap5=_bs5, semantic='{1}', foundation='
  • {1}
  • ', bulma=_bulma, materialize=_materialize, ) # current page _bs = '
  • {0}
  • ' _bs33 = '
  • {0} \ (current)
  • ' _bs4 = '
  • {0} \ (current)
  • ' _bs5 = '
  • \ {0}
  • ' _bulma = '
  • \ {0}
  • ' _materialize = '
  • {0}
  • ' CURRENT_PAGES = dict( bootstrap=_bs, bootstrap2=_bs, bootstrap3=_bs, bootstrap3_3=_bs33, bootstrap4=_bs4, bootstrap5=_bs5, semantic='{0}', foundation='
  • {0}
  • ', bulma=_bulma, materialize=_materialize, ) # normal link LINK = '
  • {1}
  • ' SEMANTIC_LINK = '{1}' BS4_LINK = '
  • {1}
  • ' BS5_LINK = '
  • {1}
  • ' BULMA_LINK = '
  • {1}
  • ' MATERIALIZE_LINK = '
  • {1}
  • ' # disabled link _bs = '
  • ...
  • ' _bs33 = '
  • \
  • ' _bs4 = '
  • ...
  • ' _bs5 = '
  • ...
  • ' _se = '...' _fa = '
  • ...
  • ' _bulma = '
  • ' _materialize = '
  • ...
  • ' GAP_MARKERS = dict( bootstrap=_bs, bootstrap2=_bs, bootstrap3=_bs, bootstrap3_3=_bs33, bootstrap4=_bs4, bootstrap5=_bs5, semantic=_se, foundation=_fa, bulma=_bulma, materialize=_materialize, ) # previous disabled link _bs = '' _bs33 = '
  • \
  • ' _bs4 = '
  • {0} \
  • ' _bs5 = '
  • \ {0}
  • ' _se = '{0}' _fa = '
  • {0}
  • ' _bulma = '{0}' _materialize = '
  • \ chevron_left
  • ' PREV_DISABLED_PAGES = dict( bootstrap=_bs, bootstrap2=_bs, bootstrap3=_bs, bootstrap3_3=_bs33, bootstrap4=_bs4, bootstrap5=_bs5, semantic=_se, foundation=_fa, bulma=_bulma, materialize=_materialize, ) # next disabled link _bs = '' _bs33 = '
  • \
  • ' _bs4 = '
  • {0} \
  • ' _bs5 = '
  • \ {0}
  • ' _se = '{0}' _fa = '
  • {0}
  • ' _bulma = '{0}' _materialize = '
  • \ chevron_right
  • ' NEXT_DISABLED_PAGES = dict( bootstrap=_bs, bootstrap2=_bs, bootstrap3=_bs, bootstrap3_3=_bs33, bootstrap4=_bs4, bootstrap5=_bs5, semantic=_se, foundation=_fa, bulma=_bulma, materialize=_materialize, ) PREV_LABEL = "«" NEXT_LABEL = "»" RECORD_NAME = "records" DISPLAY_MSG = "displaying {start} - {end} {record_name} in \ total {total}" SEARCH_MSG = "found {found} {record_name}, \ displaying {start} - {end}" _bs4 = '", materialize="", ) # foundation alignment F_ALIGNMENT = '
    ' def get_parameter(param=None, args=None, default="page"): if not args: args = request.args.copy() args.update(request.view_args.copy()) if not param: pk = "page_parameter" if default == "page" else "per_page_parameter" param = args.get(pk) if not param: param = current_app.config.get(pk.upper()) return param or default def get_page_parameter(param=None, args=None): return get_parameter(param, args, "page") def get_per_page_parameter(param=None, args=None): return get_parameter(param, args, "per_page") def get_page_args( page_parameter=None, per_page_parameter=None, for_test=False, **kwargs ): """param order: 1. passed parameter 2. request.args 3: config value for_test will return page_parameter and per_page_parameter""" args = request.args.copy() args.update(request.view_args.copy()) page_name = get_page_parameter(page_parameter, args) per_page_name = get_per_page_parameter(per_page_parameter, args) for name in (page_name, per_page_name): if name in kwargs: args.setdefault(name, kwargs[name]) if for_test: return page_name, per_page_name page = int(args.get(page_name, 1, type=int)) per_page = args.get(per_page_name, type=int) if not per_page: per_page = int(current_app.config.get("PER_PAGE", 10)) else: per_page = int(per_page) offset = (page - 1) * per_page return page, per_page, offset def get_param_value(name, kwargs={}, default=None, cfg_name="", prefix="pagination"): """Get parameter value from kwargs or config""" config_name = cfg_name or name if prefix: config_name = "{}_{}".format(prefix, config_name) cfg_value = current_app.config.get(config_name.upper(), default) return kwargs.get(name, cfg_value) class Pagination(object): """A simple pagination extension for flask.""" def __init__(self, found=0, **kwargs): """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 **«** **next_label**: text for next page, default is **»** **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 """ self.found = found page_parameter = kwargs.get("page_parameter") if not page_parameter: page_parameter = get_page_parameter() self.page_parameter = page_parameter self.page = int(kwargs.get(self.page_parameter, 1)) if self.page < 1: self.page = 1 per_page_param = kwargs.get("per_page_parameter") if not per_page_param: per_page_param = get_per_page_parameter() self.per_page_parameter = per_page_param self.per_page = int( get_param_value(per_page_param, kwargs, 10, cfg_name="per_page", prefix="") ) self.is_disabled = self.per_page < 1 self.skip = (self.page - 1) * self.per_page self.inner_window = int(get_param_value("inner_window", kwargs, 2)) self.outer_window = int(get_param_value("outer_window", kwargs, 1)) self.prev_label = get_param_value("prev_label", kwargs, PREV_LABEL) self.next_label = get_param_value("next_label", kwargs, NEXT_LABEL) self.search = kwargs.get("search", False) self.total = kwargs.get("total", 0) self.format_total = get_param_value("format_total", kwargs, False) self.format_number = get_param_value("format_number", kwargs, False) self.url_coding = get_param_value("url_coding", kwargs, "utf-8") self.display_msg = get_param_value("display_msg", kwargs, DISPLAY_MSG) self.search_msg = get_param_value("search_msg", kwargs, SEARCH_MSG) self.record_name = get_param_value("record_name", kwargs, RECORD_NAME) self.css_framework = get_param_value( "css_framework", kwargs, "bootstrap4" ).lower() if self.css_framework not in CURRENT_PAGES: self.css_framework = "bootstrap4" if self.css_framework.startswith("bootstrap"): bs_version = self.css_framework[9:] if bs_version in ("3_3", "3.3"): self.bs_version = "3.3" elif bs_version: self.bs_version = bs_version else: self.bs_version = get_param_value("bs_version", kwargs, 4) if self.bs_version in (2, "2"): self.css_framework = "bootstrap" elif self.bs_version in (3, "3"): self.css_framework = "bootstrap3" elif self.bs_version in ("3.3", "3_3"): self.css_framework = "bootstrap3_3" elif self.bs_version in (4, "4"): self.css_framework = "bootstrap4" elif self.bs_version in (5, "5"): self.css_framework = "bootstrap5" if not isinstance(self.bs_version, int): if self.bs_version.isdigit(): self.bs_version = int(self.bs_version) else: self.bs_version = float(self.bs_version) self.link_size = get_param_value("link_size", kwargs, "") if self.link_size: if self.css_framework == "foundation": self.link_size = "" elif self.css_framework == "bulma": self.link_size = " is-{0}".format(self.link_size) else: self.link_size = " pagination-{0}".format(self.link_size) self.bulma_style = get_param_value("bulma_style", kwargs, "") if self.bulma_style: self.bulma_style = " is-{0}".format(self.bulma_style) self.prev_rel = get_param_value("prev_rel", kwargs, "") if self.prev_rel: self.prev_rel = ' rel="{}"'.format(self.prev_rel) self.next_rel = get_param_value("next_rel", kwargs, "") if self.next_rel: self.next_rel = ' rel="{}"'.format(self.next_rel) self.alignment = get_param_value("alignment", kwargs, "") if self.alignment and self.css_framework.startswith("bootstrap"): if self.css_framework in ("bootstrap4", "bootstrap5"): if self.alignment == "center": self.alignment = " justify-content-center" elif self.alignment in ("right", "end"): self.alignment = " justify-content-end" elif self.css_framework == "bootstrap2": self.alignment = " pagination-{0}".format(self.alignment) else: # v3 does not support this way # use this way:
    ...
    self.alignment = "" if self.alignment and self.css_framework == "bulma": self.alignment = " is-{0}".format(self.alignment) self.href = kwargs.get("href") self.anchor = kwargs.get("anchor") self.show_single_page = get_param_value("show_single_page", kwargs, False) self.link = LINK if self.css_framework == "bootstrap4": self.link = BS4_LINK elif self.css_framework == "bootstrap5": self.link = BS5_LINK elif self.css_framework == "semantic": self.link = SEMANTIC_LINK elif self.css_framework == "bulma": self.link = BULMA_LINK elif self.css_framework == "materialize": self.link = MATERIALIZE_LINK self.current_page_fmt = CURRENT_PAGES[self.css_framework] self.link_css_fmt = CSS_LINKS[self.css_framework] self.gap_marker_fmt = GAP_MARKERS[self.css_framework] self.prev_disabled_page_fmt = PREV_DISABLED_PAGES[self.css_framework] self.next_disabled_page_fmt = NEXT_DISABLED_PAGES[self.css_framework] self.prev_page_fmt = PREV_PAGES[self.css_framework] self.next_page_fmt = NEXT_PAGES[self.css_framework] self.css_end_fmt = CSS_LINKS_END[self.css_framework] self.include_first_page_number = get_param_value( "include_first_page_number", kwargs, False ) self.init_values() def page_href(self, page): if self.href: url = self.href.format(page or 1) else: self.args[self.page_parameter] = page if self.anchor: url = url_for(self.endpoint, _anchor=self.anchor, **self.args) else: url = url_for(self.endpoint, **self.args) # Need to return a unicode object if self.url_coding: return url.decode(self.url_coding) if PY2 else url return url def init_values(self): current_total = self.found if self.search else self.total if self.is_disabled: self.total_pages = 1 self.has_prev = self.has_next = False else: pages = divmod(current_total, self.per_page) self.total_pages = pages[0] + 1 if pages[1] else pages[0] self.has_prev = self.page > 1 self.has_next = self.page < self.total_pages args = request.args.copy() args.update(request.view_args.copy()) self.args = {} for k, v in args.lists(): if len(v) == 1: self.args[k] = v[0] else: self.args[k] = v self.endpoint = request.endpoint @property def prev_page(self): if self.has_prev: page = self.page - 1 if self.page <= 2 and not self.include_first_page_number: page = None url = self.page_href(page) if self.css_framework == "materialize": args = (url, self.prev_rel) else: args = (url, self.prev_label, self.prev_rel) return self.prev_page_fmt.format(*args) return self.prev_disabled_page_fmt.format(self.prev_label) @property def next_page(self): if self.has_next: url = self.page_href(self.page + 1) if self.css_framework == "materialize": args = (url, self.next_rel) else: args = (url, self.next_label, self.next_rel) return self.next_page_fmt.format(*args) return self.next_disabled_page_fmt.format(self.next_label) @property def first_page(self): # current page is first page if self.has_prev: if self.include_first_page_number: return self.link.format(self.page_href(1), 1) return self.link.format(self.page_href(None), 1) return self.current_page_fmt.format(1) @property def last_page(self): if self.has_next: url = self.page_href(self.total_pages) return self.link.format(url, self.total_pages) return self.current_page_fmt.format(self.page) @property def pages(self): if self.total_pages < self.inner_window * 2 - 1: return range(1, self.total_pages + 1) pages = [] win_from = self.page - self.inner_window win_to = self.page + self.inner_window if win_to > self.total_pages: win_from -= win_to - self.total_pages win_to = self.total_pages if win_from < 1: win_to = win_to + 1 - win_from win_from = 1 if win_to > self.total_pages: win_to = self.total_pages if win_from > self.inner_window: pages.extend(range(1, self.outer_window + 1 + 1)) pages.append(None) else: pages.extend(range(1, win_to + 1)) if win_to < self.total_pages - self.inner_window + 1: if win_from > self.inner_window: pages.extend(range(win_from, win_to + 1)) pages.append(None) if self.outer_window == 0: pages.extend(range(self.total_pages, self.total_pages + 1)) else: pages.extend(range(self.total_pages - 1, self.total_pages + 1)) elif win_from > self.inner_window: pages.extend(range(win_from, self.total_pages + 1)) else: pages.extend(range(win_to + 1, self.total_pages + 1)) return pages def single_page(self, page): if page == self.page: return self.current_page_fmt.format(page) if page == 1: return self.first_page if page == self.total_pages: return self.last_page return self.link.format(self.page_href(page), page) def _get_single_page_link(self): s = [self.link_css_fmt.format(self.link_size, self.alignment)] s.append(self.prev_page) s.append(self.single_page(1)) s.append(self.next_page) s.append(self.css_end_fmt) if self.css_framework == "foundation" and self.alignment: s.insert(0, F_ALIGNMENT.format(self.alignment)) s.append("
    ") return Markup("".join(s)) @property def links(self): """Get all the pagination links.""" if self.total_pages <= 1: if self.show_single_page: return self._get_single_page_link() return "" if self.css_framework == "bulma": s = [ self.link_css_fmt.format( self.link_size, self.alignment, self.bulma_style, self.prev_page, self.next_page, ) ] for page in self.pages: s.append(self.single_page(page) if page else self.gap_marker_fmt) s.append(self.css_end_fmt) else: s = [self.link_css_fmt.format(self.link_size, self.alignment)] s.append(self.prev_page) for page in self.pages: s.append(self.single_page(page) if page else self.gap_marker_fmt) s.append(self.next_page) s.append(self.css_end_fmt) if self.css_framework == "foundation" and self.alignment: s.insert(0, F_ALIGNMENT.format(self.alignment)) s.append("") return Markup("".join(s)) @property def info(self): """Get the pagination information.""" s = ['
    '] page_msg = self.search_msg if self.search else self.display_msg if self.format_total: total_text = "{0:,}".format(self.total) else: total_text = "{0}".format(self.total) if self.is_disabled: start = 1 end = self.found if self.search else self.total else: start = 1 + (self.page - 1) * self.per_page end = start + self.per_page - 1 if end > self.total: end = self.found if self.search else self.total if start > self.total: start = self.found if self.search else self.total if self.format_number: start_text = "{0:,}".format(start) end_text = "{0:,}".format(end) else: start_text = start end_text = end s.append( page_msg.format( found=self.found, total=total_text, start=start_text, end=end_text, record_name=self.record_name, ) ) s.append("
    ") return Markup("".join(s)) flask-paginate-2024.4.12/setup.cfg000066400000000000000000000000341460611454600165410ustar00rootroot00000000000000[bdist_wheel] universal = 1 flask-paginate-2024.4.12/setup.py000066400000000000000000000035051460611454600164400ustar00rootroot00000000000000""" flask-paginate -------------- Simple paginate for flask (study from will_paginate). Use bootstrap css framework, supports bootstrap2&3 and foundation """ import io import os.path from setuptools import setup version = "" work_dir = os.path.dirname(os.path.abspath(__file__)) fp = os.path.join(work_dir, "flask_paginate/__init__.py") with io.open(fp, encoding="utf-8") as f: for line in f: if line.startswith("__version__ = "): version = line.split("=")[-1].strip().replace("'", "") break setup( name="flask-paginate", version=version.replace('"', ""), url="https://github.com/lixxu/flask-paginate", license="BSD-3-Clause", author="Lix Xu", author_email="xuzenglin@gmail.com", description="Simple paginate support for flask", long_description=__doc__, packages=["flask_paginate"], zip_safe=False, platforms="any", install_requires=["Flask"], classifiers=[ "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", ], ) flask-paginate-2024.4.12/test-requirements.txt000066400000000000000000000000351460611454600211620ustar00rootroot00000000000000pytest flask-paginate>=0.5.0 flask-paginate-2024.4.12/tests/000077500000000000000000000000001460611454600160655ustar00rootroot00000000000000flask-paginate-2024.4.12/tests/tests.py000066400000000000000000000127611460611454600176100ustar00rootroot00000000000000"""Tests for flask-paginate.""" import unittest import pytest from flask import Flask from flask_paginate import ( BS4_LINK, CSS_LINKS, CSS_LINKS_END, CURRENT_PAGES, DISPLAY_MSG, GAP_MARKERS, NEXT_DISABLED_PAGES, NEXT_LABEL, NEXT_PAGES, PREV_DISABLED_PAGES, PREV_LABEL, PREV_PAGES, RECORD_NAME, SEARCH_MSG, Pagination, get_page_args ) class FlaskTestMixin(unittest.TestCase): """A mixin for a flask test.""" def setUp(self): """Run the setUp for the app for the test.""" self.app = Flask(__name__) def mocked_url_route(): return "hello world" mocked_url_route.methods = ["GET"] self.app.add_url_rule("/", "test_route", mocked_url_route) self.app_client = self.app.test_client() class TestGetPageArgs(FlaskTestMixin): """Tests for the get_page_args function.""" def test_get_page_args_fails_outside_of_request_context(self): """get_page_args raises a RuntimeError if called with no request ctx. """ with pytest.raises(RuntimeError): get_page_args() def test_get_page_args_works_inside_of_request_context(self): """get_page_args raises no error if called with a request ctx.""" with self.app.test_request_context("/"): self.app.preprocess_request() get_page_args() page_param, per_page_param = get_page_args( page_parameter="p", for_test=True ) assert page_param == "p" assert per_page_param == "per_page" page_param, per_page_param = get_page_args( per_page_parameter="pp", for_test=True ) assert page_param == "page" assert per_page_param == "pp" class TestPagination(FlaskTestMixin): """Tests for the Pagination class.""" def test_defaults(self): """Test the default values of the kwargs.""" with self.app.test_request_context("/"): pagination = Pagination() assert pagination.found == 0 assert pagination.page_parameter == "page" assert pagination.per_page_parameter == "per_page" assert pagination.page == 1 assert pagination.per_page == 10 assert pagination.inner_window == 2 assert pagination.outer_window == 1 assert pagination.prev_label == PREV_LABEL assert pagination.next_label == NEXT_LABEL assert pagination.search is False assert pagination.total == 0 assert pagination.format_total is False assert pagination.format_number is False assert pagination.display_msg == DISPLAY_MSG assert pagination.search_msg == SEARCH_MSG assert pagination.record_name == RECORD_NAME assert pagination.css_framework == "bootstrap4" assert pagination.bs_version == 4 assert pagination.link_size == "" assert pagination.alignment == "" assert pagination.href is None assert pagination.anchor is None assert pagination.show_single_page is False assert pagination.link == BS4_LINK assert ( pagination.current_page_fmt == CURRENT_PAGES[pagination.css_framework] ) assert ( pagination.link_css_fmt == CSS_LINKS[pagination.css_framework] ) assert ( pagination.gap_marker_fmt == GAP_MARKERS[pagination.css_framework] ) assert ( pagination.prev_disabled_page_fmt == PREV_DISABLED_PAGES[pagination.css_framework] ) assert ( pagination.next_disabled_page_fmt == NEXT_DISABLED_PAGES[pagination.css_framework] ) assert ( pagination.prev_page_fmt == PREV_PAGES[pagination.css_framework] ) assert ( pagination.next_page_fmt == NEXT_PAGES[pagination.css_framework] ) assert ( pagination.css_end_fmt == CSS_LINKS_END[pagination.css_framework] ) def test_pages_first_page(self): """Test the pages property is correct on the first page.""" with self.app.test_request_context("/"): pagination = Pagination(total=100, found=100) assert pagination.pages == [1, 2, 3, 4, 5, None, 9, 10] def test_pages_outer_window_0(self): """Test that pages property is correct with outer_window=0.""" with self.app.test_request_context("/"): pagination = Pagination( total=100, found=100, search=True, outer_window=0, page=5, inner_window=1, ) assert pagination.pages == [1, None, 4, 5, 6, None, 10] def test_customize_page_parameter(self): with self.app.test_request_context("/"): pagination = Pagination(page_parameter="p") assert pagination.page_parameter == "p" assert pagination.per_page_parameter == "per_page" def test_customize_per_page_parameter(self): with self.app.test_request_context("/"): pagination = Pagination(per_page_parameter="pp") assert pagination.page_parameter == "page" assert pagination.per_page_parameter == "pp"