package publicbio import ( "github.com/microcosm-cc/bluemonday" "github.com/writeas/saturday" "github.com/writeas/web-core/converter" "html/template" ) // Profile is a publicly-viewable user, containing only the data necessary // to display a profile. type Profile struct { AvatarURL string `json:"avatar_url"` Username string `json:"username"` Name converter.NullJSONString `json:"name"` Header converter.NullJSONString `json:"header"` Bio converter.NullJSONString `json:"bio"` Links []Link `json:"links"` } func (p *Profile) RenderedBio() template.HTML { return template.HTML(applyMarkdown(p.Bio.String)) } func applyMarkdown(data string) string { mdExtensions := 0 | blackfriday.EXTENSION_TABLES | blackfriday.EXTENSION_FENCED_CODE | blackfriday.EXTENSION_AUTOLINK | blackfriday.EXTENSION_STRIKETHROUGH | blackfriday.EXTENSION_SPACE_HEADERS | blackfriday.EXTENSION_HEADER_IDS htmlFlags := 0 | blackfriday.HTML_USE_SMARTYPANTS | blackfriday.HTML_SMARTYPANTS_DASHES // Generate Markdown md := blackfriday.Markdown([]byte(data), blackfriday.HtmlRenderer(htmlFlags, "", ""), mdExtensions) // Strip out bad HTML policy := bluemonday.UGCPolicy() policy.AllowAttrs("target").OnElements("a") policy.AllowAttrs("style", "class", "id").Globally() return string(policy.SanitizeBytes(md)) } type Link struct { Title string `json:"title"` URL string `json:"url"` }