package handler import ( "fmt" "html" "strings" "time" "git.iioio.com/freefire/jiang13-forum/embed_static" "git.iioio.com/freefire/jiang13-forum/model" "git.iioio.com/freefire/jiang13-forum/service" ) // 爬虫专用伪静态 HTML(无 SPA;仅 User-Agent 命中爬虫时返回,避免用户刷新闪屏) func renderBotHTML(meta *embed_static.SPAPageMeta, bodyInner string) string { if meta == nil { meta = &embed_static.SPAPageMeta{} } ogType := strings.TrimSpace(meta.OGType) if ogType == "" { ogType = "website" } locale := strings.TrimSpace(meta.Locale) if locale == "" { locale = "zh_CN" } var b strings.Builder b.WriteString("
") b.WriteString("") b.WriteString("") writeEscapedTag(&b, "title", meta.Title) writeEscapedMeta(&b, "name", "description", meta.Description) writeEscapedMeta(&b, "name", "keywords", meta.Keywords) if meta.Robots != "" { writeEscapedMeta(&b, "name", "robots", meta.Robots) } if meta.Canonical != "" { b.WriteString(``) } writeEscapedMeta(&b, "property", "og:type", ogType) writeEscapedMeta(&b, "property", "og:site_name", meta.SiteName) writeEscapedMeta(&b, "property", "og:locale", locale) writeEscapedMeta(&b, "property", "og:title", meta.Title) writeEscapedMeta(&b, "property", "og:description", meta.Description) writeEscapedMeta(&b, "property", "og:url", meta.Canonical) writeEscapedMeta(&b, "property", "og:image", meta.OGImage) card := "summary" if strings.TrimSpace(meta.OGImage) != "" { card = "summary_large_image" } writeEscapedMeta(&b, "name", "twitter:card", card) writeEscapedMeta(&b, "name", "twitter:title", meta.Title) writeEscapedMeta(&b, "name", "twitter:description", meta.Description) writeEscapedMeta(&b, "name", "twitter:image", meta.OGImage) if meta.JSONLD != "" { b.WriteString(``) } b.WriteString(``) b.WriteString("") b.WriteString(bodyInner) b.WriteString(``) b.WriteString("") return b.String() } func writeEscapedTag(b *strings.Builder, tag, text string) { text = strings.TrimSpace(text) if text == "" { return } b.WriteString("<" + tag + ">" + html.EscapeString(text) + "" + tag + ">") } func writeEscapedMeta(b *strings.Builder, attr, key, content string) { content = strings.TrimSpace(content) if content == "" { return } b.WriteString("") } func (h *Handlers) botHomeHTML(meta *embed_static.SPAPageMeta, brand service.SiteBranding) string { name := strings.TrimSpace(brand.Name) if name == "" { name = "姜十三论坛" } intro := brand.MetaDescription() if intro == "" { intro = brand.Slogan } var body strings.Builder body.WriteString("" + html.EscapeString(intro) + "
") } body.WriteString(``) return renderBotHTML(meta, body.String()) } func (h *Handlers) botPostHTML(base, siteName, defaultImage, keywords string, post *model.Post) string { meta := attachSiteSEO(h.postPageMeta(base, siteName, defaultImage, post), siteName, keywords) content := service.RedactMembersOnlyHTML(post.Content) author := service.DisplayName(&post.User) var body strings.Builder body.WriteString("" + html.EscapeString(sig) + "
") } body.WriteString(fmt.Sprintf(``, html.EscapeString(user.CreatedAt.Local().Format(time.DateOnly)))) return renderBotHTML(meta, body.String()) } func botNotFoundHTML(base, siteName, keywords, path string) string { meta := notFoundPageMeta(base, siteName, keywords, path) body := `您访问的页面不存在或已删除。
` return renderBotHTML(meta, body) }