package utility
import (
"fmt"
"jybxseo/internal/consts"
"strconv"
)
const (
disabled = `disabled`
li = `
%s`
prevMoreClass = `prev-more`
nextMoreClass = `next-more`
active = `active`
number = "number"
ul = ``
noHref = `javascript:void(0);`
href = `/xxx/%d`
prevPageIcon = ``
nextPageIcon = ``
moreIcon = ``
prevPageClass = "prev-page"
nextPageClass = "next-page"
pagerNumSize = 5 //两个点点点之间的页面数量
currPrevNextSize = 2 //当前页前后多少页开始显示点点点
)
type Pagination struct {
PagingHtml string
PageNum, PageCount, PageSize int
UrlFormat string
PrevHref, NextHref string
}
func GetLetterPaging(currentPage, totalPage int, href string) (pagingMap *Pagination) {
if currentPage == 0 {
currentPage = 1
}
pagination := &Pagination{
PagingHtml: PaggingHtml(currentPage, totalPage, href),
PageNum: currentPage,
PageCount: totalPage,
PageSize: consts.SettingPageSize,
UrlFormat: href,
}
if currentPage > 1 {
pagination.PrevHref = fmt.Sprintf(href, currentPage-1)
}
if currentPage < totalPage {
pagination.NextHref = fmt.Sprintf(href, currentPage+1)
}
return pagination
}
func PaggingHtml(currentPage, totalPage int, href string) string {
if currentPage > totalPage {
return ""
}
ppc, npc := prevPageClass, nextPageClass
pph, nph := fmt.Sprintf(href, currentPage-1), fmt.Sprintf(href, currentPage+1)
if totalPage == 1 {
ppc += " " + disabled
npc += " " + disabled
pph = noHref
nph = noHref
} else if currentPage == 1 {
ppc += " " + disabled
pph = noHref
} else if currentPage == totalPage {
npc += " " + disabled
nph = noHref
}
lis := ""
hasPrevMore, hasNextMore := false, false
for i := 1; i <= totalPage; i++ {
if i > 1 && i < totalPage && totalPage > pagerNumSize {
isContinue := false
if currentPage < pagerNumSize && i > pagerNumSize+1 {
isContinue = true
} else if currentPage >= pagerNumSize && currentPage < totalPage-currPrevNextSize-1 && (i < currentPage-currPrevNextSize || i > currentPage+currPrevNextSize) {
isContinue = true
} else if currentPage > totalPage-pagerNumSize+1 && i < totalPage-pagerNumSize {
isContinue = true
}
if isContinue {
if !hasPrevMore && i < currentPage {
hasPrevMore = true
lis += fmt.Sprintf(li, prevMoreClass, fmt.Sprintf(href, currentPage-pagerNumSize), moreIcon)
} else if !hasNextMore && i > currentPage {
hasNextMore = true
lis += fmt.Sprintf(li, nextMoreClass, fmt.Sprintf(href, currentPage+pagerNumSize), moreIcon)
}
continue
}
}
if i == currentPage {
lis += fmt.Sprintf(li, number+" "+active, noHref, strconv.Itoa(i))
} else {
lis += fmt.Sprintf(li, number, fmt.Sprintf(href, i), strconv.Itoa(i))
}
}
lis = fmt.Sprintf(li, ppc, pph, prevPageIcon) + lis + fmt.Sprintf(li, npc, nph, nextPageIcon)
return fmt.Sprintf(ul, currentPage, totalPage, lis)
}