Freemarker Pagination - 或者只是点击页面的一般算法

Mat*_* B. 2 algorithm pagination freemarker

 p - is request parameter where the page number is given by user

<#assign totalPages =searchResult.getTotalPages()>
<#assign lastPage = 0>

<#list totalPages as curPage>
    <#if p=curPage>
         <a href="#" class="selected">${p}</a>
         <#assign lastPage = curPage?number>
    <#else>
         <a href="/search.html?q=${q?html}&amp;p=${curPage}">${curPage}</a>
    </#if>
</#list>
Run Code Online (Sandbox Code Playgroud)

这将打印这样的链接

1 2 3 4 5 6 7 8 9 10 11 - and the list keeps going to the last page lets say 100
Run Code Online (Sandbox Code Playgroud)

我想要完成的是这些情况(数字输入<x>是用户选择的p页面):

Case A: 
1 <2> 3 4 5 ... 100

Case B:
1 ... 11 12 <13> 14 15 ... 100

Case C:
1 ... <96> 97 98 99 100
Run Code Online (Sandbox Code Playgroud)

有关如何在上述freemarker代码中执行此操作的任何想法?伪代码也很好.

Cha*_*tay 6

这里有两个辅助功能maxmin和宏我打电话pages:

<#function max x y>
    <#if (x<y)><#return y><#else><#return x></#if>
</#function>
<#function min x y>
    <#if (x<y)><#return x><#else><#return y></#if>
</#function>
<#macro pages totalPages p>
    <#assign size = totalPages?size>
    <#if (p<=5)> <#-- p among first 5 pages -->
        <#assign interval = 1..(min(5,size))>
    <#elseif ((size-p)<5)> <#-- p among last 5 pages -->
        <#assign interval = (max(1,(size-4)))..size >
    <#else>
        <#assign interval = (p-2)..(p+2)>
    </#if>
    <#if !(interval?seq_contains(1))>
     1 ... <#rt>
    </#if>
    <#list interval as page>
        <#if page=p>
         <${page}> <#t>
        <#else>
         ${page} <#t>
        </#if>
    </#list>
    <#if !(interval?seq_contains(size))>
     ... ${size}<#lt>
    </#if>
</#macro>
Run Code Online (Sandbox Code Playgroud)

当使用一系列页码和当前页面调用时,该宏产生,例如

<@pages 1..100 2 />
<@pages 1..100 13 />
<@pages 1..100 96 />
<@pages 1..3 2 />
Run Code Online (Sandbox Code Playgroud)

以下输出(删除了一些空格):

1 <2> 3 4 5 ... 100
1 ... 11 12 <13> 14 15 ... 100
1 ... <96> 97 98 99 100 
1 <2> 3 
Run Code Online (Sandbox Code Playgroud)