diff --git a/src/main/java/run/halo/app/controller/content/model/CategoryModel.java b/src/main/java/run/halo/app/controller/content/model/CategoryModel.java index 7998cdd0c..b7161cba5 100644 --- a/src/main/java/run/halo/app/controller/content/model/CategoryModel.java +++ b/src/main/java/run/halo/app/controller/content/model/CategoryModel.java @@ -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 postPage = postCategoryService.pagePostBy(category.getId(), PostStatus.PUBLISHED, pageable); Page 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"); } } diff --git a/src/main/java/run/halo/app/controller/content/model/JournalModel.java b/src/main/java/run/halo/app/controller/content/model/JournalModel.java index 658d68d7b..754de3edb 100644 --- a/src/main/java/run/halo/app/controller/content/model/JournalModel.java +++ b/src/main/java/run/halo/app/controller/content/model/JournalModel.java @@ -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 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"); diff --git a/src/main/java/run/halo/app/controller/content/model/PhotoModel.java b/src/main/java/run/halo/app/controller/content/model/PhotoModel.java index 70d6c2cfb..3cc42d48c 100644 --- a/src/main/java/run/halo/app/controller/content/model/PhotoModel.java +++ b/src/main/java/run/halo/app/controller/content/model/PhotoModel.java @@ -43,39 +43,8 @@ public class PhotoModel { Page 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"); diff --git a/src/main/java/run/halo/app/controller/content/model/PostModel.java b/src/main/java/run/halo/app/controller/content/model/PostModel.java index db84478f3..5660b41ab 100644 --- a/src/main/java/run/halo/app/controller/content/model/PostModel.java +++ b/src/main/java/run/halo/app/controller/content/model/PostModel.java @@ -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 postPage = postService.pageBy(PostStatus.PUBLISHED, pageable); Page 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 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"); diff --git a/src/main/java/run/halo/app/controller/content/model/TagModel.java b/src/main/java/run/halo/app/controller/content/model/TagModel.java index 4d97c05ec..071348671 100644 --- a/src/main/java/run/halo/app/controller/content/model/TagModel.java +++ b/src/main/java/run/halo/app/controller/content/model/TagModel.java @@ -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 postPage = postTagService.pagePostsBy(tag.getId(), PostStatus.PUBLISHED, pageable); Page 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"); diff --git a/src/main/java/run/halo/app/core/freemarker/tag/CategoryTagDirective.java b/src/main/java/run/halo/app/core/freemarker/tag/CategoryTagDirective.java index 9fc7be408..b07d0d150 100644 --- a/src/main/java/run/halo/app/core/freemarker/tag/CategoryTagDirective.java +++ b/src/main/java/run/halo/app/core/freemarker/tag/CategoryTagDirective.java @@ -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 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; } diff --git a/src/main/java/run/halo/app/core/freemarker/tag/JournalTagDirective.java b/src/main/java/run/halo/app/core/freemarker/tag/JournalTagDirective.java new file mode 100644 index 000000000..61a349e30 --- /dev/null +++ b/src/main/java/run/halo/app/core/freemarker/tag/JournalTagDirective.java @@ -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 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; + } + } + } +} diff --git a/src/main/java/run/halo/app/core/freemarker/tag/PhotoTagDirective.java b/src/main/java/run/halo/app/core/freemarker/tag/PhotoTagDirective.java index 0280e90e2..eac321623 100644 --- a/src/main/java/run/halo/app/core/freemarker/tag/PhotoTagDirective.java +++ b/src/main/java/run/halo/app/core/freemarker/tag/PhotoTagDirective.java @@ -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 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; } diff --git a/src/main/java/run/halo/app/core/freemarker/tag/PostTagDirective.java b/src/main/java/run/halo/app/core/freemarker/tag/PostTagDirective.java index 4e15f8a25..32a2ae2ce 100644 --- a/src/main/java/run/halo/app/core/freemarker/tag/PostTagDirective.java +++ b/src/main/java/run/halo/app/core/freemarker/tag/PostTagDirective.java @@ -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 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; } diff --git a/src/main/java/run/halo/app/core/freemarker/tag/TagTagDirective.java b/src/main/java/run/halo/app/core/freemarker/tag/TagTagDirective.java index 0fba322fe..d73fa8e92 100644 --- a/src/main/java/run/halo/app/core/freemarker/tag/TagTagDirective.java +++ b/src/main/java/run/halo/app/core/freemarker/tag/TagTagDirective.java @@ -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 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; } diff --git a/src/main/java/run/halo/app/model/support/Pagination.java b/src/main/java/run/halo/app/model/support/Pagination.java new file mode 100644 index 000000000..8f927a6f1 --- /dev/null +++ b/src/main/java/run/halo/app/model/support/Pagination.java @@ -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 rainbowPages; + + private String nextPageFullPath; + + private String prePageFullPath; + + private Boolean hasPrev; + + private Boolean hasNext; +} diff --git a/src/main/java/run/halo/app/model/support/RainbowPage.java b/src/main/java/run/halo/app/model/support/RainbowPage.java new file mode 100644 index 000000000..36cddca3b --- /dev/null +++ b/src/main/java/run/halo/app/model/support/RainbowPage.java @@ -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; +} diff --git a/src/main/resources/templates/themes/anatole b/src/main/resources/templates/themes/anatole index a25940ca7..db9da874b 160000 --- a/src/main/resources/templates/themes/anatole +++ b/src/main/resources/templates/themes/anatole @@ -1 +1 @@ -Subproject commit a25940ca70146600bbf371386f9e9a87948f3e6f +Subproject commit db9da874bf5c07a093c35804c6c70e8e1157dbb0