From aaaa0c184fb43879cc84551983309cad06d665ee Mon Sep 17 00:00:00 2001 From: Robin Jarry Date: Wed, 1 Feb 2023 23:35:42 +0100 Subject: triggers: use templates instead of % mini language Since previous commit, all commands now support expanding text/template markup. Reuse that for the new-email trigger command. Update commands.ExecuteCommand to take optional *AccountConfig and *MessageInfo arguments. If these are nil, fallback to using the currently selected account and message (if any). Pass the proper *AccountConfig and *MessageInfo objects when firing the trigger command so that these are used instead of the currently selected ones. If new-email contains % placeholders, try to convert them to template markup reusing the same conversion added in commit 535300cfdbfc ("config: add columns based index format"). Warn the user that they need to update their configuration file. Signed-off-by: Robin Jarry Reviewed-by: Moritz Poldrack --- config/ui.go | 134 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 69 insertions(+), 65 deletions(-) (limited to 'config/ui.go') diff --git a/config/ui.go b/config/ui.go index db596d97..b59c9b09 100644 --- a/config/ui.go +++ b/config/ui.go @@ -391,75 +391,12 @@ func convertIndexFormat(indexFormat string) ([]*ColumnDef, error) { alignWidth := m[1] verb := m[3] - var f string var width float64 = 0 var flags ColumnFlags = ALIGN_LEFT - name := "" - - switch verb { - case "%": - f = verb - case "a": - f = `{{(index .From 0).Address}}` - name = "sender" - case "A": - f = `{{if eq (len .ReplyTo) 0}}{{(index .From 0).Address}}{{else}}{{(index .ReplyTo 0).Address}}{{end}}` - name = "reply-to" - case "C": - f = "{{.Number}}" - name = "num" - case "d", "D": - f = "{{.DateAutoFormat .Date.Local}}" - name = "date" - case "f": - f = `{{index (.From | persons) 0}}` - name = "from" - case "F": - f = `{{.Peer | names | join ", "}}` - name = "peers" - case "g": - f = `{{.Labels | join ", "}}` - name = "labels" - case "i": - f = "{{.MessageId}}" - name = "msg-id" - case "n": - f = `{{index (.From | names) 0}}` - name = "name" - case "r": - f = `{{.To | persons | join ", "}}` - name = "to" - case "R": - f = `{{.Cc | persons | join ", "}}` - name = "cc" - case "s": - f = "{{.Subject}}" - name = "subject" - case "t": - f = "{{(index .To 0).Address}}" - name = "to0" - case "T": - f = "{{.Account}}" - name = "account" - case "u": - f = "{{index (.From | mboxes) 0}}" - name = "mboxes" - case "v": - f = "{{index (.From | names) 0}}" - name = "name" - case "Z": - f = `{{.Flags | join ""}}` - name = "flags" + f, name := indexVerbToTemplate([]rune(verb)[0]) + if verb == "Z" { width = 4 flags = ALIGN_RIGHT - case "l": - f = "{{.Size}}" - name = "size" - default: - f = "%" + verb - } - if name == "" { - name = "wtf" } t, err := templates.ParseTemplate(fmt.Sprintf("column-%s", name), f) @@ -495,6 +432,73 @@ func convertIndexFormat(indexFormat string) ([]*ColumnDef, error) { return columns, nil } +func indexVerbToTemplate(verb rune) (f, name string) { + switch verb { + case '%': + f = string(verb) + case 'a': + f = `{{(index .From 0).Address}}` + name = "sender" + case 'A': + f = `{{if eq (len .ReplyTo) 0}}{{(index .From 0).Address}}{{else}}{{(index .ReplyTo 0).Address}}{{end}}` + name = "reply-to" + case 'C': + f = "{{.Number}}" + name = "num" + case 'd', 'D': + f = "{{.DateAutoFormat .Date.Local}}" + name = "date" + case 'f': + f = `{{index (.From | persons) 0}}` + name = "from" + case 'F': + f = `{{.Peer | names | join ", "}}` + name = "peers" + case 'g': + f = `{{.Labels | join ", "}}` + name = "labels" + case 'i': + f = "{{.MessageId}}" + name = "msg-id" + case 'n': + f = `{{index (.From | names) 0}}` + name = "name" + case 'r': + f = `{{.To | persons | join ", "}}` + name = "to" + case 'R': + f = `{{.Cc | persons | join ", "}}` + name = "cc" + case 's': + f = "{{.Subject}}" + name = "subject" + case 't': + f = "{{(index .To 0).Address}}" + name = "to0" + case 'T': + f = "{{.Account}}" + name = "account" + case 'u': + f = "{{index (.From | mboxes) 0}}" + name = "mboxes" + case 'v': + f = "{{index (.From | names) 0}}" + name = "name" + case 'Z': + f = `{{.Flags | join ""}}` + name = "flags" + case 'l': + f = "{{.Size}}" + name = "size" + default: + f = "%" + string(verb) + } + if name == "" { + name = "wtf" + } + return +} + func (ui *UIConfig) loadStyleSet(styleSetDirs []string) error { ui.style = NewStyleSet() err := ui.style.LoadStyleSet(ui.StyleSetName, styleSetDirs) -- cgit