{{/* search.html — 搜索页 定义两个模板: search-page → 完整 HTML 文档 search-results-inner → 仅结果区域片段(HTMX 请求时返回) 数据:utils.SearchPageData .Keyword string .HID uint64 .Results []SearchResultPageItem .Total int64 .Page int .TotalPages int .Helps []HelpPageItem HTMX 搜索流程: 搜索框 hx-get="/search" hx-target="#search-content" hx-swap="innerHTML" 输入防抖 500ms 或按 Enter 触发 服务端检测 HX-Request header,返回 search-results-inner 片段 hx-push-url="true" 自动更新浏览器地址栏 关键词高亮: {{highlight .Title $.Keyword}} ← 模板函数,返回含 的 HTML */}} {{define "search-page"}} {{template "hp-head" .}}
{{template "hp-nav" .}}
{{/* 搜索框(HTMX 实时搜索)*/}}
{{icon "search" 16}}
{{/* 隐藏字段:当前 HID,让 hx-include 带上 */}}
{{/* 结果区(HTMX 片段目标)*/}}
{{template "search-results-inner" .}}
{{template "hp-footer" .}}
{{/* 搜索框前置图标定位修复 */}} {{end}} {{/* search-results-inner — 仅结果内容(无外层 wrapper) HTMX 请求时作为独立片段返回,整页加载时通过 {{template}} 内联 */}} {{define "search-results-inner"}} {{/* 版块筛选 tabs */}} {{if and .Keyword .Helps}}
{{/* 全站 tab */}} {{t "search.all_forums"}} {{range .Helps}} {{.Name}} {{end}}
{{end}} {{/* 结果统计 */}} {{if .Keyword}}
{{if gt .Total 0}} {{tp "search.result_count" "n" (printf "%d" .Total) "q" .Keyword}} {{else}} {{tp "search.no_result" "q" .Keyword}} {{end}}
{{end}} {{/* 结果列表 */}} {{if .Results}}
{{range $i, $item := .Results}}
{{/* 版块标签 */}} {{if $item.HelpName}}
{{icon "folder-open" 11}} {{$item.HelpName}}
{{end}} {{/* 标题(带高亮)*/}} {{highlight $item.Title $.Keyword}} {{/* 摘要(带高亮)*/}} {{if $item.Snippet}}
{{highlight $item.Snippet $.Keyword}}
{{end}} {{/* Meta */}}
{{$item.AuthorName}}
{{$item.AuthorName}}
{{icon "message-square" 12}}{{$item.ReplyCount}} {{icon "eye" 12}}{{$item.ViewCount}} {{reltime $item.CreatedAt}}
{{end}}
{{/* 分页 */}} {{if gt .TotalPages 1}}
{{if gt .Page 1}} {{t "common.prev_page"}} {{end}} {{.Page}} / {{.TotalPages}} {{if lt .Page .TotalPages}} {{t "common.next_page"}} {{end}}
{{end}} {{else if .Keyword}} {{/* 无结果空状态 */}}
{{icon "search" 40}}
{{tp "search.no_result" "q" .Keyword}}
{{if .User}} {{t "search.ask_instead"}} {{end}}
{{end}} {{end}}