package services import ( "html" "regexp" "strings" ) var ( mdImageRe = regexp.MustCompile(`!\[([^\]]*)\]\(([^)]+)\)`) mdLinkRe = regexp.MustCompile(`\[([^\]]+)\]\(([^)]+)\)`) ) // ComposeBodyToHTML 将发帖表单正文转为可消毒 HTML。 // 若已含块级 HTML / 门控标签则原样交 Sanitize;否则按纯文本/轻量 Markdown 转段落。 func ComposeBodyToHTML(raw string) string { raw = strings.TrimSpace(raw) if raw == "" { return "" } lower := strings.ToLower(raw) if strings.Contains(lower, "
\n")
b.WriteString("
") b.WriteString(p) b.WriteString("
\n") } return b.String() } func safeComposeURL(u string) bool { u = strings.TrimSpace(u) if strings.HasPrefix(u, "/uploads/") || strings.HasPrefix(u, "/media/") { return true } return strings.HasPrefix(u, "https://") || strings.HasPrefix(u, "http://") } // HTMLToComposePlain 编辑页回显:去掉简单标签便于 textarea 编辑(尽力而为) func HTMLToComposePlain(htmlBody string) string { s := strings.TrimSpace(htmlBody) if s == "" { return "" } lower := strings.ToLower(s) // 含门控块时保留 HTML,避免编辑丢失 if strings.Contains(lower, "`).ReplaceAllString(s, "\n\n")
s = regexp.MustCompile(`(?i)
`).ReplaceAllString(s, "\n")
s = regexp.MustCompile(`(?i)?p[^>]*>`).ReplaceAllString(s, "")
s = regexp.MustCompile(`(?i)<[^>]+>`).ReplaceAllString(s, "")
return strings.TrimSpace(html.UnescapeString(s))
}