feat: 初始化 Halo 暗色模式插件
- Halo Plugin 后端(Java/Gradle),含 DarkModePlugin 主类和测试 - Vue 3 + TypeScript 前端 UI,包含主题切换组件和设置页面 - 暗色模式 CSS 变量和覆盖样式(布局/编辑器/表单/滚动条等) - 设计文档和调查文档 - Halo 插件/主题开发 Agent Skills Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
# TemplateHeadProcessor
|
||||
|
||||
Inject scripts, styles, or meta tags into the theme's `<head>` section.
|
||||
|
||||
> Source: [TemplateHeadProcessor](https://github.com/halo-dev/halo/blob/main/api/src/main/java/run/halo/app/theme/dialect/TemplateHeadProcessor.java)
|
||||
|
||||
## Usage
|
||||
|
||||
```java
|
||||
@Component
|
||||
public class MyHeadProcessor implements TemplateHeadProcessor {
|
||||
|
||||
private final ReactiveSettingFetcher settingFetcher;
|
||||
|
||||
public MyHeadProcessor(ReactiveSettingFetcher settingFetcher) {
|
||||
this.settingFetcher = settingFetcher;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> process(ITemplateContext context, IModel model,
|
||||
IElementModelStructureHandler structureHandler) {
|
||||
return settingFetcher.fetch("basic", MyConfig.class)
|
||||
.flatMap(config -> {
|
||||
if (!config.isEnabled()) {
|
||||
return Mono.empty();
|
||||
}
|
||||
// Add script tag to <head>
|
||||
var script = createScriptTag(config.getTrackingId());
|
||||
model.add(script);
|
||||
return Mono.empty();
|
||||
})
|
||||
.then();
|
||||
}
|
||||
|
||||
private IModel createScriptTag(String trackingId) {
|
||||
// Build Thymeleaf model with script element
|
||||
var modelFactory = new ModelFactory();
|
||||
var script = modelFactory.createOpenElementTag("script");
|
||||
// ... configure attributes
|
||||
var model = modelFactory.createModel();
|
||||
model.add(script);
|
||||
return model;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Ordering
|
||||
|
||||
Use `@Order` to control execution order. Higher values execute first, allowing later processors to override earlier ones.
|
||||
|
||||
```java
|
||||
@Component
|
||||
@Order(100) // Higher = earlier
|
||||
public class HighPriorityHeadProcessor implements TemplateHeadProcessor { ... }
|
||||
|
||||
@Component
|
||||
@Order(200) // Lower = later, can override above
|
||||
public class LowPriorityHeadProcessor implements TemplateHeadProcessor { ... }
|
||||
```
|
||||
|
||||
## Common Use Cases
|
||||
|
||||
- Analytics tracking (Google Analytics, Plausible)
|
||||
- Code highlighting (highlight.js, Prism, Shiki)
|
||||
- Math rendering (KaTeX, MathJax)
|
||||
- SEO meta tags (OpenGraph, Twitter Cards)
|
||||
- Custom CSS/JS injection
|
||||
- Comment widgets
|
||||
Reference in New Issue
Block a user