mirror of
https://github.com/halo-dev/halo.git
synced 2025-12-20 16:44:38 +08:00
#### What type of PR is this?
/kind feature
/milestone 2.7.x
/area core
#### What this PR does / why we need it:
为主题端的文章和自定义页面内容添加扩展点
插件可以通过实现扩展点来干预文章和自定义页面的内容显示,如修改内容的 html 结构,改变特定样式等
使用方式参考:[docs/extension-points/content.md](9b2b9f1837)
#### Which issue(s) this PR fixes:
Fixes #4003
#### Does this PR introduce a user-facing change?
```release-note
为主题端的文章和自定义页面内容添加扩展点
```
3.6 KiB
3.6 KiB
内容扩展点
文章内容扩展点
文章内容扩展点用于在主题端文章内容渲染之前对文章内容进行修改,比如添加广告、添加版权声明、插入脚本等。
使用方式
在插件中通过实现 run.halo.app.theme.ReactivePostContentHandler 接口来实现文章内容扩展。
以下是一个扩展文章内容支持 Katex 的示例:
String katexScript="""
<link rel="stylesheet" href="/plugins/plugin-katex/assets/static/katex.min.css">
<script defer src="/plugins/plugin-katex/assets/static/katex.min.js"></script>
<script defer src="/plugins/plugin-katex/assets/static/contrib/auto-render.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
renderMathInElement(document.body, {
// customised options
// • auto-render specific keys, e.g.:
delimiters: [
{left: '$$', right: '$$', display: true},
{left: '$', right: '$', display: false},
{left: '\\(', right: '\\)', display: false},
{left: '\\[', right: '\\]', display: true}
],
// • rendering keys, e.g.:
throwOnError : false
});
});
</script>
""";
然后在 handle 方法中将 Katex 的脚本字符串插入到内容前面:
@Component
public class KatexPostContentHandler implements ReactivePostContentHandler {
@Override
public Mono<PostContentContext> handle(PostContentContext postContent) {
postContent.setContent(katexScript + "\n" + postContent.getContent());
return Mono.just(postContent);
}
}
定义了扩展点实现(扩展),还需要在插件的 resources/extensions 目录下添加对扩展的声明:
# resources/extensions/extension-definitions.yml
apiVersion: plugin.halo.run/v1alpha1
kind: ExtensionDefinition
metadata:
name: ext-def-katex-post-content
spec:
className: run.halo.katex.KatexPostContentHandler
# 文章内容扩展点的名称,固定值
extensionPointName: reactive-post-content-handler
displayName: "KatexPostContentHandler"
description: "Katex support for post content."
自定义页面内容扩展点
自定义页面(SinglePage)内容扩展点用于在主题端自定义页面内容渲染之前对内容进行修改,比如添加广告、添加版权声明、插入脚本等。
使用方式
在插件中通过实现 run.halo.app.theme.ReactiveSinglePageContentHandler 接口来实现内容扩展。
以下是一个扩展内容支持 Katex 的示例:
@Component
public class KatexSinglePageContentHandler implements ReactiveSinglePageContentHandler {
@Override
public Mono<SinglePageContentContext> handle(SinglePageContentContext pageContent) {
String katexScript = ""; // 参考文章内容扩展点的示例脚本块
pageContent.setContent(katexScript + "\n" + pageContent.getContent());
return Mono.just(pageContent);
}
}
在插件的 resources/extensions 目录下添加对自定义页面内容扩展的声明:
# resources/extensions/extension-definitions.yml
apiVersion: plugin.halo.run/v1alpha1
kind: ExtensionDefinition
metadata:
name: ext-def-katex-singlepage-content
spec:
className: run.halo.katex.KatexSinglePageContentHandler
# 自定义页面内容扩展点的名称,固定值
extensionPointName: reactive-post-content-handler
displayName: "KatexSinglePageContentHandler"
description: "Katex support for single page content."