summary refs log tree commit diff stats
path: root/lib/format/format.go
diff options
context:
space:
mode:
Diffstat (limited to 'lib/format/format.go')
-rw-r--r--lib/format/format.go39
1 files changed, 30 insertions, 9 deletions
diff --git a/lib/format/format.go b/lib/format/format.go
index 787821a..e19ca31 100644
--- a/lib/format/format.go
+++ b/lib/format/format.go
@@ -2,25 +2,28 @@ package format
 
 import (
 	"errors"
+	"fmt"
 	"mime"
 	gomail "net/mail"
+	"regexp"
 	"strings"
 	"time"
 	"unicode"
 
 	"git.sr.ht/~sircmpwn/aerc/models"
 	"github.com/emersion/go-message"
+	"github.com/emersion/go-message/mail"
 )
 
-func ParseAddress(address string) (*models.Address, error) {
+func ParseAddress(address string) (*mail.Address, error) {
 	addrs, err := gomail.ParseAddress(address)
 	if err != nil {
 		return nil, err
 	}
-	return (*models.Address)(addrs), nil
+	return (*mail.Address)(addrs), nil
 }
 
-func ParseAddressList(s string) ([]*models.Address, error) {
+func ParseAddressList(s string) ([]*mail.Address, error) {
 	if len(s) == 0 {
 		// we don't consider an empty list to be an error
 		return nil, nil
@@ -33,17 +36,35 @@ func ParseAddressList(s string) ([]*models.Address, error) {
 		return nil, err
 	}
 
-	addrs := make([]*models.Address, len(list))
+	addrs := make([]*mail.Address, len(list))
 	for i, a := range list {
-		addrs[i] = (*models.Address)(a)
+		addrs[i] = (*mail.Address)(a)
 	}
 	return addrs, nil
 }
 
-func FormatAddresses(l []*models.Address) string {
+// AddressForHumans formats the address. If the address's name
+// contains non-ASCII characters it will be quoted but not encoded.
+// Meant for display purposes to the humans, not for sending over the wire.
+func AddressForHumans(a *mail.Address) string {
+	if a.Name != "" {
+		if atom.MatchString(a.Name) {
+			return fmt.Sprintf("%s <%s>", a.Name, a.Address)
+		} else {
+			return fmt.Sprintf("\"%s\" <%s>",
+				strings.ReplaceAll(a.Name, "\"", "'"), a.Address)
+		}
+	} else {
+		return fmt.Sprintf("<%s>", a.Address)
+	}
+}
+
+var atom *regexp.Regexp = regexp.MustCompile("^[a-z0-9!#$%7'*+-/=?^_`{}|~ ]+$")
+
+func FormatAddresses(l []*mail.Address) string {
 	formatted := make([]string, len(l))
 	for i, a := range l {
-		formatted[i] = a.Format()
+		formatted[i] = AddressForHumans(a)
 	}
 	return strings.Join(formatted, ", ")
 }
@@ -130,7 +151,7 @@ func ParseMessageFormat(format string, timeFmt string, ctx Ctx) (string,
 				return "", nil,
 					errors.New("no envelope available for this message")
 			}
-			var addr *models.Address
+			var addr *mail.Address
 			if len(envelope.ReplyTo) == 0 {
 				if len(envelope.From) == 0 {
 					return "", nil,
@@ -171,7 +192,7 @@ func ParseMessageFormat(format string, timeFmt string, ctx Ctx) (string,
 				return "", nil,
 					errors.New("found no address for sender")
 			}
-			addr := envelope.From[0].Format()
+			addr := AddressForHumans(envelope.From[0])
 			retval = append(retval, 's')
 			args = append(args, addr)
 		case 'F':