From daec9ff7bbacaf218d642969d2edf5dcd9ce85b2 Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Sat, 8 Mar 2025 22:13:00 +0800 Subject: [PATCH] feat: add image thumbnail support for single pages (#7276) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind improvment /area core /milestone 2.20.x #### What this PR does / why we need it: 为自定义页面的图片增加缩略图支持 image #### Which issue(s) this PR fixes: Fixes #7232 #### Does this PR introduce a user-facing change? ```release-note 为自定义页面的图片增加缩略图支持 ``` --- .../content/PageContentThumbnailHandler.java | 41 +++++++++++++++++++ .../extensions/extension-definitions.yaml | 10 +++++ 2 files changed, 51 insertions(+) create mode 100644 application/src/main/java/run/halo/app/content/PageContentThumbnailHandler.java diff --git a/application/src/main/java/run/halo/app/content/PageContentThumbnailHandler.java b/application/src/main/java/run/halo/app/content/PageContentThumbnailHandler.java new file mode 100644 index 000000000..1cc686454 --- /dev/null +++ b/application/src/main/java/run/halo/app/content/PageContentThumbnailHandler.java @@ -0,0 +1,41 @@ +package run.halo.app.content; + +import static run.halo.app.content.HtmlThumbnailSrcsetInjector.generateSrcset; + +import java.net.URI; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; +import run.halo.app.core.attachment.ThumbnailService; +import run.halo.app.theme.ReactiveSinglePageContentHandler; + +/** + * A single page content handler to handle post html content and generate thumbnail by the img tag. + * + * @author guqing + * @since 2.21.0 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class PageContentThumbnailHandler implements ReactiveSinglePageContentHandler { + private final ThumbnailService thumbnailService; + + @Override + public Mono handle( + @NonNull SinglePageContentContext singlePageContent) { + var html = singlePageContent.getContent(); + return HtmlThumbnailSrcsetInjector.injectSrcset(html, + src -> generateSrcset(URI.create(src), thumbnailService) + ) + .onErrorResume(throwable -> { + log.debug("Failed to inject srcset to page content, fallback to original content", + throwable); + return Mono.just(html); + }) + .doOnNext(singlePageContent::setContent) + .thenReturn(singlePageContent); + } +} diff --git a/application/src/main/resources/extensions/extension-definitions.yaml b/application/src/main/resources/extensions/extension-definitions.yaml index b8f871c4e..747d4af54 100644 --- a/application/src/main/resources/extensions/extension-definitions.yaml +++ b/application/src/main/resources/extensions/extension-definitions.yaml @@ -57,3 +57,13 @@ spec: extensionPointName: reactive-post-content-handler displayName: "文章内容缩略图处理" description: "处理文章的 HTML 内容为 img 标签追加缩略图" +--- +apiVersion: plugin.halo.run/v1alpha1 +kind: ExtensionDefinition +metadata: + name: page-content-thumbnail-handler +spec: + className: run.halo.app.content.PageContentThumbnailHandler + extensionPointName: reactive-page-content-handler + displayName: "自定义页面内容缩略图处理" + description: "处理页面的 HTML 内容为 img 标签追加缩略图"