refactor: freemarker pagination tag. (#621)

pull/624/head
Ryan Wang 2020-03-07 10:53:13 +08:00 committed by GitHub
parent eb71e98087
commit fa50d2d5d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 492 additions and 211 deletions

View File

@ -1,6 +1,6 @@
package run.halo.app.controller.content.model;
import cn.hutool.core.util.PageUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
@ -73,50 +73,17 @@ public class CategoryModel {
Page<Post> postPage = postCategoryService.pagePostBy(category.getId(), PostStatus.PUBLISHED, pageable);
Page<PostListVO> posts = postService.convertToListVo(postPage);
// TODO remove this variable
final int[] rainbow = PageUtil.rainbow(page, posts.getTotalPages(), 3);
// Next page and previous page url.
StringBuilder nextPageFullPath = new StringBuilder();
StringBuilder prePageFullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
nextPageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
prePageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
// Generate meta description.
if (StringUtils.isNotEmpty(category.getDescription())) {
model.addAttribute("meta_description", category.getDescription());
} else {
nextPageFullPath.append("/");
prePageFullPath.append("/");
}
nextPageFullPath.append(optionService.getCategoriesPrefix())
.append("/")
.append(category.getSlug());
prePageFullPath.append(optionService.getCategoriesPrefix())
.append("/")
.append(category.getSlug());
nextPageFullPath.append("/page/")
.append(posts.getNumber() + 2)
.append(optionService.getPathSuffix());
if (posts.getNumber() == 1) {
prePageFullPath.append(optionService.getPathSuffix());
} else {
prePageFullPath.append("/page/")
.append(posts.getNumber())
.append(optionService.getPathSuffix());
model.addAttribute("meta_description", optionService.getSeoDescription());
}
model.addAttribute("is_category", true);
model.addAttribute("posts", posts);
model.addAttribute("rainbow", rainbow);
model.addAttribute("category", categoryDTO);
model.addAttribute("nextPageFullPath", nextPageFullPath.toString());
model.addAttribute("prePageFullPath", prePageFullPath.toString());
model.addAttribute("meta_keywords", optionService.getSeoKeywords());
model.addAttribute("meta_description", optionService.getSeoDescription());
return themeService.render("category");
}
}

View File

@ -1,6 +1,5 @@
package run.halo.app.controller.content.model;
import cn.hutool.core.util.PageUtil;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
@ -45,43 +44,8 @@ public class JournalModel {
Page<Journal> journals = journalService.pageBy(JournalType.PUBLIC, pageable);
// TODO remove this variable
int[] rainbow = PageUtil.rainbow(page, journals.getTotalPages(), 3);
// Next page and previous page url.
StringBuilder nextPageFullPath = new StringBuilder();
StringBuilder prePageFullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
nextPageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
prePageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
} else {
nextPageFullPath.append("/");
prePageFullPath.append("/");
}
nextPageFullPath.append(optionService.getJournalsPrefix());
prePageFullPath.append(optionService.getJournalsPrefix());
nextPageFullPath.append("/page/")
.append(journals.getNumber() + 2)
.append(optionService.getPathSuffix());
if (journals.getNumber() == 1) {
prePageFullPath.append(optionService.getPathSuffix());
} else {
prePageFullPath.append("/page/")
.append(journals.getNumber())
.append(optionService.getPathSuffix());
}
model.addAttribute("is_journals", true);
model.addAttribute("journals", journalService.convertToCmtCountDto(journals));
model.addAttribute("rainbow", rainbow);
model.addAttribute("nextPageFullPath", nextPageFullPath.toString());
model.addAttribute("prePageFullPath", prePageFullPath.toString());
model.addAttribute("meta_keywords", optionService.getSeoKeywords());
model.addAttribute("meta_description", optionService.getSeoDescription());
return themeService.render("journals");

View File

@ -43,39 +43,8 @@ public class PhotoModel {
Page<PhotoDTO> photos = photoService.pageBy(pageable);
// Next page and previous page url.
StringBuilder nextPageFullPath = new StringBuilder();
StringBuilder prePageFullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
nextPageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
prePageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
} else {
nextPageFullPath.append("/");
prePageFullPath.append("/");
}
nextPageFullPath.append(optionService.getPhotosPrefix());
prePageFullPath.append(optionService.getPhotosPrefix());
nextPageFullPath.append("/page/")
.append(photos.getNumber() + 2)
.append(optionService.getPathSuffix());
if (photos.getNumber() == 1) {
prePageFullPath.append(optionService.getPathSuffix());
} else {
prePageFullPath.append("/page/")
.append(photos.getNumber())
.append(optionService.getPathSuffix());
}
model.addAttribute("is_photos", true);
model.addAttribute("photos", photos);
model.addAttribute("nextPageFullPath", nextPageFullPath.toString());
model.addAttribute("prePageFullPath", prePageFullPath.toString());
model.addAttribute("meta_keywords", optionService.getSeoKeywords());
model.addAttribute("meta_description", optionService.getSeoDescription());
return themeService.render("photos");

View File

@ -1,6 +1,5 @@
package run.halo.app.controller.content.model;
import cn.hutool.core.util.PageUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
@ -144,36 +143,8 @@ public class PostModel {
Page<Post> postPage = postService.pageBy(PostStatus.PUBLISHED, pageable);
Page<PostListVO> posts = postService.convertToListVo(postPage);
// TODO remove this variable
int[] rainbow = PageUtil.rainbow(page, posts.getTotalPages(), 3);
// Next page and previous page url.
StringBuilder nextPageFullPath = new StringBuilder();
StringBuilder prePageFullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
nextPageFullPath.append(optionService.getBlogBaseUrl());
prePageFullPath.append(optionService.getBlogBaseUrl());
}
nextPageFullPath.append("/page/")
.append(posts.getNumber() + 2)
.append(optionService.getPathSuffix());
if (posts.getNumber() == 1) {
prePageFullPath.append("/");
} else {
prePageFullPath.append("/page/")
.append(posts.getNumber())
.append(optionService.getPathSuffix());
}
model.addAttribute("is_index", true);
model.addAttribute("posts", posts);
model.addAttribute("rainbow", rainbow);
model.addAttribute("pageRainbow", rainbow);
model.addAttribute("nextPageFullPath", nextPageFullPath.toString());
model.addAttribute("prePageFullPath", prePageFullPath.toString());
model.addAttribute("meta_keywords", optionService.getSeoKeywords());
model.addAttribute("meta_description", optionService.getSeoDescription());
return themeService.render("index");
@ -190,42 +161,9 @@ public class PostModel {
List<ArchiveYearVO> archives = postService.convertToYearArchives(postPage.getContent());
// TODO remove this variable
int[] rainbow = PageUtil.rainbow(page, posts.getTotalPages(), 3);
// Next page and previous page url.
StringBuilder nextPageFullPath = new StringBuilder();
StringBuilder prePageFullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
nextPageFullPath.append(optionService.getBlogBaseUrl());
prePageFullPath.append(optionService.getBlogBaseUrl());
}
nextPageFullPath.append("/")
.append(optionService.getArchivesPrefix());
prePageFullPath.append("/")
.append(optionService.getArchivesPrefix());
nextPageFullPath.append("/page/")
.append(posts.getNumber() + 2)
.append(optionService.getPathSuffix());
if (posts.getNumber() == 1) {
prePageFullPath.append(optionService.getPathSuffix());
} else {
prePageFullPath.append("/page/")
.append(posts.getNumber())
.append(optionService.getPathSuffix());
}
model.addAttribute("is_archives", true);
model.addAttribute("posts", posts);
model.addAttribute("archives", archives);
model.addAttribute("rainbow", rainbow);
model.addAttribute("pageRainbow", rainbow);
model.addAttribute("nextPageFullPath", nextPageFullPath.toString());
model.addAttribute("prePageFullPath", prePageFullPath.toString());
model.addAttribute("meta_keywords", optionService.getSeoKeywords());
model.addAttribute("meta_description", optionService.getSeoDescription());
return themeService.render("archives");

View File

@ -1,6 +1,5 @@
package run.halo.app.controller.content.model;
import cn.hutool.core.util.PageUtil;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
@ -59,48 +58,9 @@ public class TagModel {
Page<Post> postPage = postTagService.pagePostsBy(tag.getId(), PostStatus.PUBLISHED, pageable);
Page<PostListVO> posts = postService.convertToListVo(postPage);
// TODO remove this variable
final int[] rainbow = PageUtil.rainbow(page, posts.getTotalPages(), 3);
// Next page and previous page url.
StringBuilder nextPageFullPath = new StringBuilder();
StringBuilder prePageFullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
nextPageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
prePageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
} else {
nextPageFullPath.append("/");
prePageFullPath.append("/");
}
nextPageFullPath.append(optionService.getTagsPrefix())
.append("/")
.append(tag.getSlug());
prePageFullPath.append(optionService.getTagsPrefix())
.append("/")
.append(tag.getSlug());
nextPageFullPath.append("/page/")
.append(posts.getNumber() + 2)
.append(optionService.getPathSuffix());
if (posts.getNumber() == 1) {
prePageFullPath.append(optionService.getPathSuffix());
} else {
prePageFullPath.append("/page/")
.append(posts.getNumber())
.append(optionService.getPathSuffix());
}
model.addAttribute("is_tag", true);
model.addAttribute("posts", posts);
model.addAttribute("rainbow", rainbow);
model.addAttribute("tag", tagDTO);
model.addAttribute("nextPageFullPath", nextPageFullPath.toString());
model.addAttribute("prePageFullPath", prePageFullPath.toString());
model.addAttribute("meta_keywords", optionService.getSeoKeywords());
model.addAttribute("meta_description", optionService.getSeoDescription());
return themeService.render("tag");

View File

@ -1,15 +1,20 @@
package run.halo.app.core.freemarker.tag;
import cn.hutool.core.util.PageUtil;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Component;
import run.halo.app.model.entity.Category;
import run.halo.app.model.support.HaloConst;
import run.halo.app.model.support.Pagination;
import run.halo.app.model.support.RainbowPage;
import run.halo.app.service.CategoryService;
import run.halo.app.service.OptionService;
import run.halo.app.service.PostCategoryService;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -28,9 +33,15 @@ public class CategoryTagDirective implements TemplateDirectiveModel {
private final PostCategoryService postCategoryService;
public CategoryTagDirective(Configuration configuration, CategoryService categoryService, PostCategoryService postCategoryService) {
private final OptionService optionService;
public CategoryTagDirective(Configuration configuration,
CategoryService categoryService,
PostCategoryService postCategoryService,
OptionService optionService) {
this.categoryService = categoryService;
this.postCategoryService = postCategoryService;
this.optionService = optionService;
configuration.setSharedVariable("categoryTag", this);
}
@ -52,6 +63,81 @@ public class CategoryTagDirective implements TemplateDirectiveModel {
case "count":
env.setVariable("count", builder.build().wrap(categoryService.count()));
break;
case "pagination":
// Get params
int page = Integer.parseInt(params.get("page").toString());
int total = Integer.parseInt(params.get("total").toString());
int display = Integer.parseInt(params.get("display").toString());
String slug = params.get("slug").toString();
// Create pagination object.
Pagination pagination = new Pagination();
// Generate next page full path and pre page full path.
StringBuilder nextPageFullPath = new StringBuilder();
StringBuilder prePageFullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
nextPageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
prePageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
} else {
nextPageFullPath.append("/");
prePageFullPath.append("/");
}
nextPageFullPath.append(optionService.getCategoriesPrefix())
.append("/")
.append(slug);
prePageFullPath.append(optionService.getCategoriesPrefix())
.append("/")
.append(slug);
nextPageFullPath.append("/page/")
.append(page + 2)
.append(optionService.getPathSuffix());
if (page == 1) {
prePageFullPath.append(optionService.getPathSuffix());
} else {
prePageFullPath.append("/page/")
.append(page)
.append(optionService.getPathSuffix());
}
pagination.setNextPageFullPath(nextPageFullPath.toString());
pagination.setPrePageFullPath(prePageFullPath.toString());
// Generate rainbow page number.
int[] rainbow = PageUtil.rainbow(page + 1, total, display);
List<RainbowPage> rainbowPages = new ArrayList<>();
StringBuilder fullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
fullPath.append(optionService.getBlogBaseUrl());
}
nextPageFullPath.append("/")
.append(optionService.getCategoriesPrefix())
.append("/")
.append(slug);
fullPath.append("/page/");
for (int current : rainbow) {
RainbowPage rainbowPage = new RainbowPage();
rainbowPage.setPage(current);
rainbowPage.setFullPath(fullPath.toString() + current + optionService.getPathSuffix());
rainbowPage.setIsCurrent(page + 1 == current);
rainbowPages.add(rainbowPage);
}
pagination.setRainbowPages(rainbowPages);
pagination.setHasNext(total != page + 1);
pagination.setHasPrev(page != 0);
env.setVariable("pagination", builder.build().wrap(pagination));
break;
default:
break;
}

View File

@ -0,0 +1,113 @@
package run.halo.app.core.freemarker.tag;
import cn.hutool.core.util.PageUtil;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.stereotype.Component;
import run.halo.app.model.support.HaloConst;
import run.halo.app.model.support.Pagination;
import run.halo.app.model.support.RainbowPage;
import run.halo.app.service.OptionService;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author ryanwang
* @date 2020-03-06
*/
@Component
public class JournalTagDirective implements TemplateDirectiveModel {
private final OptionService optionService;
public JournalTagDirective(Configuration configuration,
OptionService optionService) {
this.optionService = optionService;
configuration.setSharedVariable("journalTag", this);
}
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
final DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25);
if (params.containsKey(HaloConst.METHOD_KEY)) {
String method = params.get(HaloConst.METHOD_KEY).toString();
switch (method) {
case "pagination":
// Get params
int page = Integer.parseInt(params.get("page").toString());
int total = Integer.parseInt(params.get("total").toString());
int display = Integer.parseInt(params.get("display").toString());
String slug = params.get("slug").toString();
// Create pagination object.
Pagination pagination = new Pagination();
// Generate next page full path and pre page full path.
StringBuilder nextPageFullPath = new StringBuilder();
StringBuilder prePageFullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
nextPageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
prePageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
} else {
nextPageFullPath.append("/");
prePageFullPath.append("/");
}
nextPageFullPath.append(optionService.getJournalsPrefix());
prePageFullPath.append(optionService.getJournalsPrefix());
nextPageFullPath.append("/page/")
.append(page + 2)
.append(optionService.getPathSuffix());
if (page == 1) {
prePageFullPath.append(optionService.getPathSuffix());
} else {
prePageFullPath.append("/page/")
.append(page)
.append(optionService.getPathSuffix());
}
pagination.setNextPageFullPath(nextPageFullPath.toString());
pagination.setPrePageFullPath(prePageFullPath.toString());
// Generate rainbow page number.
int[] rainbow = PageUtil.rainbow(page + 1, total, display);
List<RainbowPage> rainbowPages = new ArrayList<>();
StringBuilder fullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
fullPath.append(optionService.getBlogBaseUrl());
}
nextPageFullPath.append("/")
.append(optionService.getJournalsPrefix());
fullPath.append("/page/");
for (int current : rainbow) {
RainbowPage rainbowPage = new RainbowPage();
rainbowPage.setPage(current);
rainbowPage.setFullPath(fullPath.toString() + current + optionService.getPathSuffix());
rainbowPage.setIsCurrent(page + 1 == current);
rainbowPages.add(rainbowPage);
}
pagination.setRainbowPages(rainbowPages);
pagination.setHasNext(total != page + 1);
pagination.setHasPrev(page != 0);
env.setVariable("pagination", builder.build().wrap(pagination));
break;
default:
break;
}
}
}
}

View File

@ -1,13 +1,19 @@
package run.halo.app.core.freemarker.tag;
import cn.hutool.core.util.PageUtil;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Component;
import run.halo.app.model.support.HaloConst;
import run.halo.app.model.support.Pagination;
import run.halo.app.model.support.RainbowPage;
import run.halo.app.service.OptionService;
import run.halo.app.service.PhotoService;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static org.springframework.data.domain.Sort.Direction.DESC;
@ -23,8 +29,11 @@ public class PhotoTagDirective implements TemplateDirectiveModel {
private final PhotoService photoService;
public PhotoTagDirective(Configuration configuration, PhotoService photoService) {
private final OptionService optionService;
public PhotoTagDirective(Configuration configuration, PhotoService photoService, OptionService optionService) {
this.photoService = photoService;
this.optionService = optionService;
configuration.setSharedVariable("photoTag", this);
}
@ -48,6 +57,75 @@ public class PhotoTagDirective implements TemplateDirectiveModel {
case "count":
env.setVariable("count", builder.build().wrap(photoService.count()));
break;
case "pagination":
// Get params
int page = Integer.parseInt(params.get("page").toString());
int total = Integer.parseInt(params.get("total").toString());
int display = Integer.parseInt(params.get("display").toString());
String slug = params.get("slug").toString();
// Create pagination object.
Pagination pagination = new Pagination();
// Generate next page full path and pre page full path.
StringBuilder nextPageFullPath = new StringBuilder();
StringBuilder prePageFullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
nextPageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
prePageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
} else {
nextPageFullPath.append("/");
prePageFullPath.append("/");
}
nextPageFullPath.append(optionService.getPhotosPrefix());
prePageFullPath.append(optionService.getPhotosPrefix());
nextPageFullPath.append("/page/")
.append(page + 2)
.append(optionService.getPathSuffix());
if (page == 1) {
prePageFullPath.append(optionService.getPathSuffix());
} else {
prePageFullPath.append("/page/")
.append(page)
.append(optionService.getPathSuffix());
}
pagination.setNextPageFullPath(nextPageFullPath.toString());
pagination.setPrePageFullPath(prePageFullPath.toString());
// Generate rainbow page number.
int[] rainbow = PageUtil.rainbow(page + 1, total, display);
List<RainbowPage> rainbowPages = new ArrayList<>();
StringBuilder fullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
fullPath.append(optionService.getBlogBaseUrl());
}
nextPageFullPath.append("/")
.append(optionService.getPhotosPrefix());
fullPath.append("/page/");
for (int current : rainbow) {
RainbowPage rainbowPage = new RainbowPage();
rainbowPage.setPage(current);
rainbowPage.setFullPath(fullPath.toString() + current + optionService.getPathSuffix());
rainbowPage.setIsCurrent(page + 1 == current);
rainbowPages.add(rainbowPage);
}
pagination.setRainbowPages(rainbowPages);
pagination.setHasNext(total != page + 1);
pagination.setHasPrev(page != 0);
env.setVariable("pagination", builder.build().wrap(pagination));
break;
default:
break;
}

View File

@ -1,16 +1,21 @@
package run.halo.app.core.freemarker.tag;
import cn.hutool.core.util.PageUtil;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.stereotype.Component;
import run.halo.app.model.entity.Post;
import run.halo.app.model.enums.PostStatus;
import run.halo.app.model.support.HaloConst;
import run.halo.app.model.support.Pagination;
import run.halo.app.model.support.RainbowPage;
import run.halo.app.service.OptionService;
import run.halo.app.service.PostCategoryService;
import run.halo.app.service.PostService;
import run.halo.app.service.PostTagService;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -25,15 +30,19 @@ public class PostTagDirective implements TemplateDirectiveModel {
private final PostService postService;
private final OptionService optionService;
private final PostTagService postTagService;
private final PostCategoryService postCategoryService;
public PostTagDirective(Configuration configuration,
PostService postService,
OptionService optionService,
PostTagService postTagService,
PostCategoryService postCategoryService) {
this.postService = postService;
this.optionService = optionService;
this.postTagService = postTagService;
this.postCategoryService = postCategoryService;
configuration.setSharedVariable("postTag", this);
@ -79,6 +88,77 @@ public class PostTagDirective implements TemplateDirectiveModel {
String tagSlug = params.get("tagSlug").toString();
env.setVariable("posts", builder.build().wrap(postService.convertToListVo(postTagService.listPostsBy(tagSlug, PostStatus.PUBLISHED))));
break;
case "pagination":
// Get params
int page = Integer.parseInt(params.get("page").toString());
int total = Integer.parseInt(params.get("total").toString());
int display = Integer.parseInt(params.get("display").toString());
boolean isArchives = Boolean.parseBoolean(params.get("isArchives").toString());
// Create pagination object.
Pagination pagination = new Pagination();
// Generate next page full path and pre page full path.
StringBuilder nextPageFullPath = new StringBuilder();
StringBuilder prePageFullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
nextPageFullPath.append(optionService.getBlogBaseUrl());
prePageFullPath.append(optionService.getBlogBaseUrl());
}
if (isArchives) {
nextPageFullPath.append("/")
.append(optionService.getArchivesPrefix());
prePageFullPath.append("/")
.append(optionService.getArchivesPrefix());
}
nextPageFullPath.append("/page/")
.append(page + 2)
.append(optionService.getPathSuffix());
if (page == 1) {
prePageFullPath.append("/");
} else {
prePageFullPath.append("/page/")
.append(page)
.append(optionService.getPathSuffix());
}
pagination.setNextPageFullPath(nextPageFullPath.toString());
pagination.setPrePageFullPath(prePageFullPath.toString());
// Generate rainbow page number.
int[] rainbow = PageUtil.rainbow(page + 1, total, display);
List<RainbowPage> rainbowPages = new ArrayList<>();
StringBuilder fullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
fullPath.append(optionService.getBlogBaseUrl());
}
if (isArchives) {
fullPath.append("/")
.append(optionService.getArchivesPrefix());
}
fullPath.append("/page/");
for (int current : rainbow) {
RainbowPage rainbowPage = new RainbowPage();
rainbowPage.setPage(current);
rainbowPage.setFullPath(fullPath.toString() + current + optionService.getPathSuffix());
rainbowPage.setIsCurrent(page + 1 == current);
rainbowPages.add(rainbowPage);
}
pagination.setRainbowPages(rainbowPages);
pagination.setHasNext(total != page + 1);
pagination.setHasPrev(page != 0);
env.setVariable("pagination", builder.build().wrap(pagination));
break;
default:
break;
}

View File

@ -1,15 +1,20 @@
package run.halo.app.core.freemarker.tag;
import cn.hutool.core.util.PageUtil;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Component;
import run.halo.app.model.entity.Tag;
import run.halo.app.model.support.HaloConst;
import run.halo.app.model.support.Pagination;
import run.halo.app.model.support.RainbowPage;
import run.halo.app.service.OptionService;
import run.halo.app.service.PostTagService;
import run.halo.app.service.TagService;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -28,9 +33,15 @@ public class TagTagDirective implements TemplateDirectiveModel {
private final PostTagService postTagService;
public TagTagDirective(Configuration configuration, TagService tagService, PostTagService postTagService) {
private final OptionService optionService;
public TagTagDirective(Configuration configuration,
TagService tagService,
PostTagService postTagService,
OptionService optionService) {
this.tagService = tagService;
this.postTagService = postTagService;
this.optionService = optionService;
configuration.setSharedVariable("tagTag", this);
}
@ -52,6 +63,81 @@ public class TagTagDirective implements TemplateDirectiveModel {
case "count":
env.setVariable("count", builder.build().wrap(tagService.count()));
break;
case "pagination":
// Get params
int page = Integer.parseInt(params.get("page").toString());
int total = Integer.parseInt(params.get("total").toString());
int display = Integer.parseInt(params.get("display").toString());
String slug = params.get("slug").toString();
// Create pagination object.
Pagination pagination = new Pagination();
// Generate next page full path and pre page full path.
StringBuilder nextPageFullPath = new StringBuilder();
StringBuilder prePageFullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
nextPageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
prePageFullPath.append(optionService.getBlogBaseUrl())
.append("/");
} else {
nextPageFullPath.append("/");
prePageFullPath.append("/");
}
nextPageFullPath.append(optionService.getTagsPrefix())
.append("/")
.append(slug);
prePageFullPath.append(optionService.getTagsPrefix())
.append("/")
.append(slug);
nextPageFullPath.append("/page/")
.append(page + 2)
.append(optionService.getPathSuffix());
if (page == 1) {
prePageFullPath.append(optionService.getPathSuffix());
} else {
prePageFullPath.append("/page/")
.append(page)
.append(optionService.getPathSuffix());
}
pagination.setNextPageFullPath(nextPageFullPath.toString());
pagination.setPrePageFullPath(prePageFullPath.toString());
// Generate rainbow page number.
int[] rainbow = PageUtil.rainbow(page + 1, total, display);
List<RainbowPage> rainbowPages = new ArrayList<>();
StringBuilder fullPath = new StringBuilder();
if (optionService.isEnabledAbsolutePath()) {
fullPath.append(optionService.getBlogBaseUrl());
}
nextPageFullPath.append("/")
.append(optionService.getTagsPrefix())
.append("/")
.append(slug);
fullPath.append("/page/");
for (int current : rainbow) {
RainbowPage rainbowPage = new RainbowPage();
rainbowPage.setPage(current);
rainbowPage.setFullPath(fullPath.toString() + current + optionService.getPathSuffix());
rainbowPage.setIsCurrent(page + 1 == current);
rainbowPages.add(rainbowPage);
}
pagination.setRainbowPages(rainbowPages);
pagination.setHasNext(total != page + 1);
pagination.setHasPrev(page != 0);
env.setVariable("pagination", builder.build().wrap(pagination));
break;
default:
break;
}

View File

@ -0,0 +1,23 @@
package run.halo.app.model.support;
import lombok.Data;
import java.util.List;
/**
* @author ryanwang
* @date 2020-03-06
*/
@Data
public class Pagination {
private List<RainbowPage> rainbowPages;
private String nextPageFullPath;
private String prePageFullPath;
private Boolean hasPrev;
private Boolean hasNext;
}

View File

@ -0,0 +1,17 @@
package run.halo.app.model.support;
import lombok.Data;
/**
* @author ryanwang
* @date 2020-03-06
*/
@Data
public class RainbowPage {
private Integer page;
private String fullPath;
private Boolean isCurrent;
}

@ -1 +1 @@
Subproject commit a25940ca70146600bbf371386f9e9a87948f3e6f
Subproject commit db9da874bf5c07a093c35804c6c70e8e1157dbb0