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(`