mirror of https://github.com/halo-dev/halo
				
				
				
			feat: support post custom template.
							parent
							
								
									a0d4c7493f
								
							
						
					
					
						commit
						0c189ee06c
					
				| 
						 | 
				
			
			@ -80,9 +80,14 @@ public class ThemeController {
 | 
			
		|||
        themeService.saveTemplateContent(themeId, param.getPath(), param.getContent());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("files/custom")
 | 
			
		||||
    public Set<String> customTemplate() {
 | 
			
		||||
        return themeService.listCustomTemplates(themeService.getActivatedThemeId());
 | 
			
		||||
    @GetMapping("activation/template/custom/sheet")
 | 
			
		||||
    public Set<String> customSheetTemplate() {
 | 
			
		||||
        return themeService.listCustomTemplates(themeService.getActivatedThemeId(), ThemeService.CUSTOM_SHEET_PREFIX);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("activation/template/custom/post")
 | 
			
		||||
    public Set<String> customPostTemplate() {
 | 
			
		||||
        return themeService.listCustomTemplates(themeService.getActivatedThemeId(), ThemeService.CUSTOM_POST_PREFIX);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("{themeId}/activation")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,6 +21,7 @@ import run.halo.app.model.entity.Post;
 | 
			
		|||
import run.halo.app.model.entity.PostMeta;
 | 
			
		||||
import run.halo.app.model.entity.Tag;
 | 
			
		||||
import run.halo.app.model.enums.PostStatus;
 | 
			
		||||
import run.halo.app.model.support.HaloConst;
 | 
			
		||||
import run.halo.app.model.vo.BaseCommentVO;
 | 
			
		||||
import run.halo.app.model.vo.PostListVO;
 | 
			
		||||
import run.halo.app.service.*;
 | 
			
		||||
| 
						 | 
				
			
			@ -160,6 +161,10 @@ public class ContentArchiveController {
 | 
			
		|||
        model.addAttribute("metas", postMetaService.convertToMap(metas));
 | 
			
		||||
        model.addAttribute("comments", comments);
 | 
			
		||||
 | 
			
		||||
        if (themeService.templateExists(ThemeService.CUSTOM_POST_PREFIX + post.getTemplate() + HaloConst.SUFFIX_FTL)) {
 | 
			
		||||
            return themeService.render(ThemeService.CUSTOM_POST_PREFIX + post.getTemplate());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return themeService.render("post");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -70,10 +70,15 @@ public interface ThemeService {
 | 
			
		|||
    String THEMES_CACHE_KEY = "themes";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Custom sheet prefix.
 | 
			
		||||
     * Custom sheet template prefix.
 | 
			
		||||
     */
 | 
			
		||||
    String CUSTOM_SHEET_PREFIX = "sheet_";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Custom post template prefix.
 | 
			
		||||
     */
 | 
			
		||||
    String CUSTOM_POST_PREFIX = "post_";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Theme provider remote name.
 | 
			
		||||
     */
 | 
			
		||||
| 
						 | 
				
			
			@ -132,8 +137,18 @@ public interface ThemeService {
 | 
			
		|||
     * @param themeId theme id must not be blank
 | 
			
		||||
     * @return a set of templates
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    Set<String> listCustomTemplates(@NonNull String themeId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Lists a set of custom template, such as sheet_xxx.ftl/post_xxx.ftl, and xxx will be template name
 | 
			
		||||
     *
 | 
			
		||||
     * @param themeId theme id must not be blank
 | 
			
		||||
     * @param prefix  post_ or sheet_
 | 
			
		||||
     * @return a set of templates
 | 
			
		||||
     */
 | 
			
		||||
    Set<String> listCustomTemplates(@NonNull String themeId, @NonNull String prefix);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Judging whether template exists under the specified theme
 | 
			
		||||
     *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -187,6 +187,25 @@ public class ThemeServiceImpl implements ThemeService {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Set<String> listCustomTemplates(String themeId, String prefix) {
 | 
			
		||||
        // Get the theme path
 | 
			
		||||
        Path themePath = Paths.get(getThemeOfNonNullBy(themeId).getThemePath());
 | 
			
		||||
 | 
			
		||||
        try (Stream<Path> pathStream = Files.list(themePath)) {
 | 
			
		||||
            return pathStream.filter(path -> StringUtils.startsWithIgnoreCase(path.getFileName().toString(), prefix))
 | 
			
		||||
                    .map(path -> {
 | 
			
		||||
                        // Remove prefix
 | 
			
		||||
                        String customTemplate = StringUtils.removeStartIgnoreCase(path.getFileName().toString(), prefix);
 | 
			
		||||
                        // Remove suffix
 | 
			
		||||
                        return StringUtils.removeEndIgnoreCase(customTemplate, HaloConst.SUFFIX_FTL);
 | 
			
		||||
                    })
 | 
			
		||||
                    .collect(Collectors.toSet());
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            throw new ServiceException("Failed to list files of path " + themePath.toString(), e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean templateExists(String template) {
 | 
			
		||||
        if (StringUtils.isBlank(template)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue