mirror of https://github.com/halo-dev/halo
refactor: freemarker pagination tag. (#621)
parent
eb71e98087
commit
fa50d2d5d6
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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
|
Loading…
Reference in New Issue