Ответ 1
Уже есть несколько других ответов, но я хотел бы показать вам подход, который я принял для его решения: Во-первых, давайте посмотрим, как Qaru обрабатывает обычные случаи и крайние случаи. Каждая из моих страниц отображает 10 результатов, поэтому, чтобы узнать, что она делает для 1 страницы, найдите тег, который имеет менее 11 записей: usability работает сегодня. Мы видим, что ничего не отображается, что имеет смысл.
Как насчет 2 страниц? Найдите тег, который содержит от 11 до 20 записей (emacs работает сегодня). Мы видим: " 1 2 Next" или "Prev 1 2", в зависимости от того, на какой странице мы находимся.
3 страницы? " 1 2 3... 3 Next", "Prev 1 2 3 Next" и "Prev 1... 2 3", Интересно, что мы можем видеть, что Qaru сам не очень хорошо обрабатывает этот крайний регистр: он должен отображать " 1 2... 3 Далее"
4 страницы? " 1 2 3... 4 Next", "Prev 1 2 3... 4 Next", "Prev 1... 2 3 4 Next" и "Prev 1... 3 4"
Наконец, посмотрим на общий случай, N страниц: " 1 2 3... N Далее", "Предыдущая 1 2 3... N Далее", "Предыдущая 1... 2 3 4... N Далее", "Предыдущая 1... 3 4 5... N Далее" и т.д.
Позвольте обобщить, основываясь на том, что мы видели: Кажется, что этот алгоритм имеет общие черты:
- Если мы не на первой странице, отобразите ссылку на Prev
- Всегда показывать номер первой страницы
- Всегда показывать текущий номер страницы
- Всегда показывать страницу до этой страницы и страницу после этой страницы.
- Всегда показывать номер последней страницы
- Если мы не на последней странице, отобразите ссылку на Next
Пусть игнорирует регистр края одной страницы и делает первую попытку алгоритма: (Как уже упоминалось, код для фактической печати ссылок будет более сложным. Представьте себе, что каждое место мы размещаем номер страницы, Prev или Next как вызов функции, который вернет правильный URL.)
function printPageLinksFirstTry(num totalPages, num currentPage)
if ( currentPage > 1 )
print "Prev"
print "1"
print "..."
print currentPage - 1
print currentPage
print currentPage + 1
print "..."
print totalPages
if ( currentPage < totalPages )
print "Next"
endFunction
Эта функция работает нормально, но она не учитывает, находимся ли мы на первой или последней странице. Рассматривая приведенные выше примеры, мы хотим отобразить..., если текущая страница находится на расстоянии два или более.
function printPageLinksHandleCloseToEnds(num totalPages, num currentPage)
if ( currentPage > 1 )
print "Prev"
print "1"
if ( currentPage > 2 )
print "..."
if ( currentPage > 2 )
print currentPage - 1
print currentPage
if ( currentPage < totalPages - 1 )
print currentPage + 1
if ( currentPage < totalPages - 1 )
print "..."
print totalPages
if ( currentPage < totalPages )
print "Next"
endFunction
Как вы можете видеть, у нас есть некоторое дублирование. Мы можем продолжить и очистить его для чтения:
function printPageLinksCleanedUp(num totalPages, num currentPage)
if ( currentPage > 1 )
print "Prev"
print "1"
if ( currentPage > 2 )
print "..."
print currentPage - 1
print currentPage
if ( currentPage < totalPages - 1 )
print currentPage + 1
print "..."
print totalPages
if ( currentPage < totalPages )
print "Next"
endFunction
Осталось только две проблемы. Во-первых, мы не печатаем правильно для одной страницы, а во-вторых, мы будем печатать "1" дважды, если мы находимся на первой или последней странице. Пусть очистят их обоих за один раз:
function printPageLinksFinal(num totalPages, num currentPage)
if ( totalPages == 1 )
return
if ( currentPage > 1 )
print "Prev"
print "1"
if ( currentPage > 2 )
print "..."
print currentPage - 1
if ( currentPage != 1 and currentPage != totalPages )
print currentPage
if ( currentPage < totalPages - 1 )
print currentPage + 1
print "..."
print totalPages
if ( currentPage < totalPages )
print "Next"
endFunction
Собственно, я соврал: у нас есть одна оставшаяся проблема. Если у вас есть как минимум 4 страницы и находятся на первой или последней странице, вы получаете дополнительную страницу на дисплее. Вместо " 1 2... 10 Далее" вы получаете " 1 2 3... 10 Далее". Чтобы точно соответствовать тому, что происходит в Stack Overflow, вам нужно будет проверить эту ситуацию:
function printPageLinksFinalReally(num totalPages, num currentPage)
if ( totalPages == 1 )
return
if ( currentPage > 1 )
print "Prev"
print "1"
if ( currentPage > 2 )
print "..."
if ( currentPage == totalPages and totalPages > 3 )
print currentPage - 2
print currentPage - 1
if ( currentPage != 1 and currentPage != totalPages )
print currentPage
if ( currentPage < totalPages - 1 )
print currentPage + 1
if ( currentPage == 1 and totalPages > 3 )
print currentPage + 2
print "..."
print totalPages
if ( currentPage < totalPages )
print "Next"
endFunction
Надеюсь, это поможет!