From e40a97f43b300b51e939279f446730a5835c9d33 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 19 Oct 2024 17:14:59 +0300 Subject: [PATCH] hicli/html: correctly linkify plaintext emails --- pkg/hicli/html.go | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/pkg/hicli/html.go b/pkg/hicli/html.go index fd23ec7..af92864 100644 --- a/pkg/hicli/html.go +++ b/pkg/hicli/html.go @@ -174,19 +174,43 @@ func writeMention(w *strings.Builder, mention []byte) { } func writeURL(w *strings.Builder, addr []byte) { - parsedURL, err := url.Parse(string(addr)) + addrString := string(addr) + parsedURL, err := url.Parse(addrString) if err != nil { writeEscapedBytes(w, addr) return } + if parsedURL.Scheme == "" && parsedURL.Host == "" { + if parsedURL.RawQuery == "" && parsedURL.Fragment == "" && strings.LastIndexByte(parsedURL.Path, '/') == -1 && strings.IndexByte(parsedURL.Path, '@') > 0 { + parsedURL.Scheme = "mailto" + parsedURL.Opaque = parsedURL.Path + parsedURL.Path = "" + } else { + parsedURL, err = url.Parse("https://" + addrString) + if err != nil { + writeEscapedBytes(w, addr) + return + } + } + } else if parsedURL.Scheme == "" { + parsedURL.Scheme = "https" + } + switch parsedURL.Scheme { + case "bitcoin", "ftp", "geo", "http", "im", "irc", "ircs", "magnet", "mailto", + "mms", "news", "nntp", "openpgp4fpr", "sip", "sftp", "sms", "smsto", "ssh", + "tel", "urn", "webcal", "wtai", "xmpp", "https": + case "mxc", "matrix": + // TODO + fallthrough + default: + writeEscapedBytes(w, addr) + return + } w.WriteString(`