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 标签追加缩略图"