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>

这将打印这样的链接
1 2 3 4 5 6 7 8 9 10 11 - and the list keeps going to the last page lets say 100

我想完成的是这些情况(在<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

在上面的freemarker代码中有什么想法吗?伪代码也很好。

最佳答案

这里有两个helper函数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>

当使用一系列页码和当前页调用时,此宏将生成。
<@pages 1..100 2 />
<@pages 1..100 13 />
<@pages 1..100 96 />
<@pages 1..3 2 />

以下输出(删除了一些空白):
1 <2> 3 4 5 ... 100
1 ... 11 12 <13> 14 15 ... 100
1 ... <96> 97 98 99 100
1 <2> 3

关于algorithm - Freemarker分页-或只是用于点击页面的通用算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6391668/

10-16 20:18