From 9d60b8ae06a534ba095dc39095589f9e9c5fab4a Mon Sep 17 00:00:00 2001
From: guqing <38999863+guqing@users.noreply.github.com>
Date: Wed, 30 Nov 2022 10:31:46 +0800
Subject: [PATCH] feat: theme templates support global seo settings (#2801)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
#### What type of PR is this?
/kind improvement
/area core
/milestone 2.0.0-rc.2
#### What this PR does / why we need it:
适配 SEO 系统设置,此功能之前遗漏
#### Which issue(s) this PR fixes:
Fixes #2797
#### Special notes for your reviewer:
how to test it?
1. seo 设置禁用搜索引擎,会在所有页面的 head 添加 ``
2. seo 设置填写`关键词`和`描述`会在所有页面的 head 标签填充 ``
/cc @halo-dev/sig-halo
#### Does this PR introduce a user-facing change?
```release-note
支持 SEO 全局系统设置
```
---
...java => ContentTemplateHeadProcessor.java} | 37 +++++---
.../app/theme/dialect/GlobalSeoProcessor.java | 59 ++++++++++++
.../dialect/HaloProcessorDialectTest.java | 95 ++++++++++++++++++-
3 files changed, 175 insertions(+), 16 deletions(-)
rename src/main/java/run/halo/app/theme/dialect/{PostTemplateHeadProcessor.java => ContentTemplateHeadProcessor.java} (63%)
create mode 100644 src/main/java/run/halo/app/theme/dialect/GlobalSeoProcessor.java
diff --git a/src/main/java/run/halo/app/theme/dialect/PostTemplateHeadProcessor.java b/src/main/java/run/halo/app/theme/dialect/ContentTemplateHeadProcessor.java
similarity index 63%
rename from src/main/java/run/halo/app/theme/dialect/PostTemplateHeadProcessor.java
rename to src/main/java/run/halo/app/theme/dialect/ContentTemplateHeadProcessor.java
index 9c26c9f47..294a80f42 100644
--- a/src/main/java/run/halo/app/theme/dialect/PostTemplateHeadProcessor.java
+++ b/src/main/java/run/halo/app/theme/dialect/ContentTemplateHeadProcessor.java
@@ -2,6 +2,7 @@ package run.halo.app.theme.dialect;
import java.util.List;
import java.util.Map;
+import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.thymeleaf.context.ITemplateContext;
@@ -11,34 +12,39 @@ import org.thymeleaf.processor.element.IElementModelStructureHandler;
import reactor.core.publisher.Mono;
import run.halo.app.theme.DefaultTemplateEnum;
import run.halo.app.theme.finders.PostFinder;
+import run.halo.app.theme.finders.SinglePageFinder;
import run.halo.app.theme.router.strategy.ModelConst;
/**
- *
The head
html snippet injection processor for post template.
+ * The head
html snippet injection processor for content template such as post
+ * and page.
*
* @author guqing
* @since 2.0.0
*/
@Component
-public class PostTemplateHeadProcessor implements TemplateHeadProcessor {
+@AllArgsConstructor
+public class ContentTemplateHeadProcessor implements TemplateHeadProcessor {
private static final String POST_NAME_VARIABLE = "name";
private final PostFinder postFinder;
-
-
- public PostTemplateHeadProcessor(PostFinder postFinder) {
- this.postFinder = postFinder;
- }
+ private final SinglePageFinder singlePageFinder;
@Override
public Mono process(ITemplateContext context, IModel model,
IElementModelStructureHandler structureHandler) {
- if (!isPostTemplate(context)) {
- return Mono.empty();
+ Mono nameMono = Mono.justOrEmpty((String) context.getVariable(POST_NAME_VARIABLE));
+
+ Mono>> htmlMetasMono = Mono.empty();
+ if (isPostTemplate(context)) {
+ htmlMetasMono = nameMono.flatMap(postFinder::getByName)
+ .map(post -> post.getSpec().getHtmlMetas());
+ } else if (isPageTemplate(context)) {
+ htmlMetasMono = nameMono.flatMap(singlePageFinder::getByName)
+ .map(page -> page.getSpec().getHtmlMetas());
}
- return Mono.justOrEmpty((String) context.getVariable(POST_NAME_VARIABLE))
- .flatMap(postFinder::getByName)
- .doOnNext(postVo -> {
- List