1
0
Fork 0
forked from Mirrors/gomuks

hicli/html: linkify plaintext matrix: and mxc:// URIs

This commit is contained in:
Tulir Asokan 2024-10-20 13:51:55 +03:00
parent 535393d47f
commit 34346cffec

View file

@ -199,13 +199,6 @@ func writeURL(w *strings.Builder, addr []byte) {
case "bitcoin", "ftp", "geo", "http", "im", "irc", "ircs", "magnet", "mailto", case "bitcoin", "ftp", "geo", "http", "im", "irc", "ircs", "magnet", "mailto",
"mms", "news", "nntp", "openpgp4fpr", "sip", "sftp", "sms", "smsto", "ssh", "mms", "news", "nntp", "openpgp4fpr", "sip", "sftp", "sms", "smsto", "ssh",
"tel", "urn", "webcal", "wtai", "xmpp", "https": "tel", "urn", "webcal", "wtai", "xmpp", "https":
case "mxc", "matrix":
// TODO
fallthrough
default:
writeEscapedBytes(w, addr)
return
}
w.WriteString(`<a`) w.WriteString(`<a`)
if matrixURI, err := id.ProcessMatrixToURL(parsedURL); err == nil { if matrixURI, err := id.ProcessMatrixToURL(parsedURL); err == nil {
writeAttribute(w, "href", matrixURI.String()) writeAttribute(w, "href", matrixURI.String())
@ -218,6 +211,43 @@ func writeURL(w *strings.Builder, addr []byte) {
w.WriteByte('>') w.WriteByte('>')
writeEscapedBytes(w, addr) writeEscapedBytes(w, addr)
w.WriteString("</a>") w.WriteString("</a>")
case "mxc":
mxc := id.ContentURIString(parsedURL.String()).ParseOrIgnore()
if !mxc.IsValid() {
writeEscapedBytes(w, addr)
return
}
w.WriteString("<a")
writeAttribute(w, "class", "hicli-mxc-url")
writeAttribute(w, "data-mxc", mxc.String())
writeAttribute(w, "href", fmt.Sprintf(HTMLSanitizerImgSrcTemplate, mxc.Homeserver, mxc.FileID))
w.WriteByte('>')
writeEscapedBytes(w, addr)
w.WriteString("</a>")
case "matrix":
uri, err := id.ProcessMatrixURI(parsedURL)
if err != nil {
writeEscapedBytes(w, addr)
return
}
w.WriteString("<a")
writeAttribute(w, "class", matrixURIClassName(uri))
writeAttribute(w, "href", uri.String())
w.WriteByte('>')
writeEscapedBytes(w, addr)
w.WriteString("</a>")
default:
writeEscapedBytes(w, addr)
}
}
func init() {
if !slices.Contains(xurls.SchemesNoAuthority, "matrix") {
xurls.SchemesNoAuthority = append(xurls.SchemesNoAuthority, "matrix")
}
if !slices.Contains(xurls.Schemes, "mxc") {
xurls.Schemes = append(xurls.Schemes, "mxc")
}
} }
func linkifyAndWriteBytes(w *strings.Builder, s []byte) { func linkifyAndWriteBytes(w *strings.Builder, s []byte) {
@ -370,6 +400,8 @@ func writeA(w *strings.Builder, attr []html.Attribute) (mxc id.ContentURI) {
mxc = id.ContentURI{} mxc = id.ContentURI{}
return return
} }
writeAttribute(w, "class", "hicli-mxc-url")
writeAttribute(w, "data-mxc", mxc.String())
href = fmt.Sprintf(HTMLSanitizerImgSrcTemplate, mxc.Homeserver, mxc.FileID) href = fmt.Sprintf(HTMLSanitizerImgSrcTemplate, mxc.Homeserver, mxc.FileID)
default: default:
return return