summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/triggers.go9
-rw-r--r--lib/format/format.go114
-rw-r--r--widgets/msglist.go11
3 files changed, 74 insertions, 60 deletions
diff --git a/config/triggers.go b/config/triggers.go
index 3187cf7..847a10f 100644
--- a/config/triggers.go
+++ b/config/triggers.go
@@ -37,9 +37,12 @@ func (trig *TriggersConfig) ExecNewEmail(account *AccountConfig,
err := trig.ExecTrigger(trig.NewEmail,
func(part string) (string, error) {
formatstr, args, err := format.ParseMessageFormat(
- account.From,
- part,
- conf.Ui.TimestampFormat, account.Name, 0, msg, false)
+ part, conf.Ui.TimestampFormat,
+ format.Ctx{
+ FromAddress: account.From,
+ AccountName: account.Name,
+ MsgInfo: msg},
+ )
if err != nil {
return "", err
}
diff --git a/lib/format/format.go b/lib/format/format.go
index 66dced1..787821a 100644
--- a/lib/format/format.go
+++ b/lib/format/format.go
@@ -48,20 +48,26 @@ func FormatAddresses(l []*models.Address) string {
return strings.Join(formatted, ", ")
}
-func ParseMessageFormat(
- fromAddress string,
- format string, timestampformat string,
- accountName string, number int, msg *models.MessageInfo,
- marked bool) (string,
+type Ctx struct {
+ FromAddress string
+ AccountName string
+ MsgNum int
+ MsgInfo *models.MessageInfo
+ MsgIsMarked bool
+}
+
+func ParseMessageFormat(format string, timeFmt string, ctx Ctx) (string,
[]interface{}, error) {
retval := make([]byte, 0, len(format))
var args []interface{}
- accountFromAddress, err := ParseAddress(fromAddress)
+ accountFromAddress, err := ParseAddress(ctx.FromAddress)
if err != nil {
return "", nil, err
}
+ envelope := ctx.MsgInfo.Envelope
+
var c rune
for i, ni := 0, 0; i < len(format); {
ni = strings.IndexByte(format[i:], '%')
@@ -108,80 +114,80 @@ func ParseMessageFormat(
case '%':
retval = append(retval, '%')
case 'a':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
- if len(msg.Envelope.From) == 0 {
+ if len(envelope.From) == 0 {
return "", nil,
errors.New("found no address for sender")
}
- addr := msg.Envelope.From[0]
+ addr := envelope.From[0]
retval = append(retval, 's')
args = append(args, addr.Address)
case 'A':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
var addr *models.Address
- if len(msg.Envelope.ReplyTo) == 0 {
- if len(msg.Envelope.From) == 0 {
+ if len(envelope.ReplyTo) == 0 {
+ if len(envelope.From) == 0 {
return "", nil,
errors.New("found no address for sender or reply-to")
} else {
- addr = msg.Envelope.From[0]
+ addr = envelope.From[0]
}
} else {
- addr = msg.Envelope.ReplyTo[0]
+ addr = envelope.ReplyTo[0]
}
retval = append(retval, 's')
args = append(args, addr.Address)
case 'C':
retval = append(retval, 'd')
- args = append(args, number)
+ args = append(args, ctx.MsgNum)
case 'd':
- date := msg.Envelope.Date
+ date := envelope.Date
if date.IsZero() {
- date = msg.InternalDate
+ date = ctx.MsgInfo.InternalDate
}
retval = append(retval, 's')
args = append(args,
- dummyIfZeroDate(date.Local(), timestampformat))
+ dummyIfZeroDate(date.Local(), timeFmt))
case 'D':
- date := msg.Envelope.Date
+ date := envelope.Date
if date.IsZero() {
- date = msg.InternalDate
+ date = ctx.MsgInfo.InternalDate
}
retval = append(retval, 's')
args = append(args,
- dummyIfZeroDate(date.Local(), timestampformat))
+ dummyIfZeroDate(date.Local(), timeFmt))
case 'f':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
- if len(msg.Envelope.From) == 0 {
+ if len(envelope.From) == 0 {
return "", nil,
errors.New("found no address for sender")
}
- addr := msg.Envelope.From[0].Format()
+ addr := envelope.From[0].Format()
retval = append(retval, 's')
args = append(args, addr)
case 'F':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
- if len(msg.Envelope.From) == 0 {
+ if len(envelope.From) == 0 {
return "", nil,
errors.New("found no address for sender")
}
- addr := msg.Envelope.From[0]
+ addr := envelope.From[0]
var val string
- if addr.Name == accountFromAddress.Name && len(msg.Envelope.To) != 0 {
- addr = msg.Envelope.To[0]
+ if addr.Name == accountFromAddress.Name && len(envelope.To) != 0 {
+ addr = envelope.To[0]
}
if addr.Name != "" {
@@ -194,25 +200,25 @@ func ParseMessageFormat(
case 'g':
retval = append(retval, 's')
- args = append(args, strings.Join(msg.Labels, ", "))
+ args = append(args, strings.Join(ctx.MsgInfo.Labels, ", "))
case 'i':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
retval = append(retval, 's')
- args = append(args, msg.Envelope.MessageId)
+ args = append(args, envelope.MessageId)
case 'n':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
- if len(msg.Envelope.From) == 0 {
+ if len(envelope.From) == 0 {
return "", nil,
errors.New("found no address for sender")
}
- addr := msg.Envelope.From[0]
+ addr := envelope.From[0]
var val string
if addr.Name != "" {
val = addr.Name
@@ -222,53 +228,53 @@ func ParseMessageFormat(
retval = append(retval, 's')
args = append(args, val)
case 'r':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
- addrs := FormatAddresses(msg.Envelope.To)
+ addrs := FormatAddresses(envelope.To)
retval = append(retval, 's')
args = append(args, addrs)
case 'R':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
- addrs := FormatAddresses(msg.Envelope.Cc)
+ addrs := FormatAddresses(envelope.Cc)
retval = append(retval, 's')
args = append(args, addrs)
case 's':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
retval = append(retval, 's')
- args = append(args, msg.Envelope.Subject)
+ args = append(args, envelope.Subject)
case 't':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
- if len(msg.Envelope.To) == 0 {
+ if len(envelope.To) == 0 {
return "", nil,
errors.New("found no address for recipient")
}
- addr := msg.Envelope.To[0]
+ addr := envelope.To[0]
retval = append(retval, 's')
args = append(args, addr.Address)
case 'T':
retval = append(retval, 's')
- args = append(args, accountName)
+ args = append(args, ctx.AccountName)
case 'u':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
- if len(msg.Envelope.From) == 0 {
+ if len(envelope.From) == 0 {
return "", nil,
errors.New("found no address for sender")
}
- addr := msg.Envelope.From[0]
+ addr := envelope.From[0]
mailbox := addr.Address // fallback if there's no @ sign
if split := strings.SplitN(addr.Address, "@", 2); len(split) == 2 {
mailbox = split[1]
@@ -276,15 +282,15 @@ func ParseMessageFormat(
retval = append(retval, 's')
args = append(args, mailbox)
case 'v':
- if msg.Envelope == nil {
+ if envelope == nil {
return "", nil,
errors.New("no envelope available for this message")
}
- if len(msg.Envelope.From) == 0 {
+ if len(envelope.From) == 0 {
return "", nil,
errors.New("found no address for sender")
}
- addr := msg.Envelope.From[0]
+ addr := envelope.From[0]
// check if message is from current user
if addr.Name != "" {
retval = append(retval, 's')
@@ -300,7 +306,7 @@ func ParseMessageFormat(
seen := false
recent := false
answered := false
- for _, flag := range msg.Flags {
+ for _, flag := range ctx.MsgInfo.Flags {
if flag == models.SeenFlag {
seen = true
} else if flag == models.RecentFlag {
@@ -328,7 +334,7 @@ func ParseMessageFormat(
readReplyFlag = "O" // message is old
}
}
- if marked {
+ if ctx.MsgIsMarked {
markedFlag = "*"
}
retval = append(retval, '4', 's')
@@ -339,7 +345,7 @@ func ParseMessageFormat(
case 'l':
// TODO: number of lines in the message
retval = append(retval, 'd')
- args = append(args, msg.Size)
+ args = append(args, ctx.MsgInfo.Size)
case 'e':
// TODO: current message number in thread
fallthrough
diff --git a/widgets/msglist.go b/widgets/msglist.go
index 09b0868..b7c10d7 100644
--- a/widgets/msglist.go
+++ b/widgets/msglist.go
@@ -150,9 +150,14 @@ func (ml *MessageList) Draw(ctx *ui.Context) {
ctx.Fill(0, row, ctx.Width(), 1, ' ', style)
fmtStr, args, err := format.ParseMessageFormat(
- ml.aerc.SelectedAccount().acct.From,
- uiConfig.IndexFormat,
- uiConfig.TimestampFormat, "", i, msg, store.IsMarked(uid))
+ uiConfig.IndexFormat, uiConfig.TimestampFormat,
+ format.Ctx{
+ FromAddress: ml.aerc.SelectedAccount().acct.From,
+ AccountName: ml.aerc.SelectedAccount().Name(),
+ MsgInfo: msg,
+ MsgNum: i,
+ MsgIsMarked: store.IsMarked(uid),
+ })
if err != nil {
ctx.Printf(0, row, style, "%v", err)
} else {