theme: 启动日志暴露未登记的主题

新增主题后忘了写进 [theme] available,表现只是"设置页里找不到",
日志里没有任何痕迹。现在启动时会打:
- info  主题注册表已加载 enabled=...
- warn  [theme] available 未登记以下主题 themes=shiroko available=...

discover() 用 fs.Glob 扫内嵌 css/themes/*.css,按 slug 规则过滤掉 _scaffold.css。
示例配置补上 shiroko,文档补「部署后看不到主题」的两步排查。
This commit is contained in:
tamakyi
2026-10-19 21:05:46 +08:00
parent 1a8938f0e1
commit a6059bec1b
5 changed files with 98 additions and 0 deletions
+47
View File
@@ -6,6 +6,7 @@
package theme
import (
"io/fs"
"regexp"
"strings"
"sync"
@@ -83,9 +84,55 @@ func build(defaultSlug, available string) ([]Theme, string, map[string]Theme) {
logrus.WithField("theme", def).Warn("站点默认主题不可用,回退基础外观")
def = ""
}
reportRegistry(list, bySlug)
return list, def, bySlug
}
// reportRegistry 把注册表状态写进启动日志。
// 没有这段时,主题文件已随二进制发布、却忘了在 [theme] available 登记,
// 表现只是"设置页里找不到这个主题",从日志里完全看不出原因。
func reportRegistry(list []Theme, bySlug map[string]Theme) {
enabled := make([]string, 0, len(list))
for _, t := range list {
enabled = append(enabled, t.Slug)
}
logrus.WithField("enabled", strings.Join(enabled, ",")).Info("主题注册表已加载")
var pending []string
for _, slug := range discover() {
if slug == DefaultSlug {
continue
}
if _, ok := bySlug[slug]; ok {
continue
}
pending = append(pending, slug)
}
if len(pending) > 0 {
logrus.WithFields(logrus.Fields{
"themes": strings.Join(pending, ","),
"available": strings.Join(append(enabled, pending...), ","),
}).Warn("[theme] available 未登记以下主题,它们不会出现在设置页")
}
}
// discover 列出内嵌的主题 css(不符合 slug 规则的模板文件如 _scaffold.css 会被跳过)。
func discover() []string {
matches, err := fs.Glob(static.FS, themeCSSDir+"*.css")
if err != nil {
return nil
}
slugs := make([]string, 0, len(matches))
for _, m := range matches {
slug := strings.TrimSuffix(strings.TrimPrefix(m, themeCSSDir), ".css")
if slugRe.MatchString(slug) {
slugs = append(slugs, slug)
}
}
return slugs
}
func normalize(slug string) string {
slug = strings.ToLower(strings.TrimSpace(slug))
if !slugRe.MatchString(slug) {