aboutsummaryrefslogtreecommitdiff
path: root/lib/indexformat.go
diff options
context:
space:
mode:
Diffstat (limited to 'lib/indexformat.go')
-rw-r--r--lib/indexformat.go241
1 files changed, 0 insertions, 241 deletions
diff --git a/lib/indexformat.go b/lib/indexformat.go
deleted file mode 100644
index 34b4d77..0000000
--- a/lib/indexformat.go
+++ /dev/null
@@ -1,241 +0,0 @@
-package lib
-
-import (
- "errors"
- "fmt"
- "strings"
- "unicode"
-
- "git.sr.ht/~sircmpwn/aerc/config"
- "git.sr.ht/~sircmpwn/aerc/models"
-)
-
-func ParseIndexFormat(conf *config.AercConfig, number int,
- msg *models.MessageInfo) (string, []interface{}, error) {
-
- format := conf.Ui.IndexFormat
- retval := make([]byte, 0, len(format))
- var args []interface{}
-
- var c rune
- for i, ni := 0, 0; i < len(format); {
- ni = strings.IndexByte(format[i:], '%')
- if ni < 0 {
- ni = len(format)
- retval = append(retval, []byte(format[i:ni])...)
- break
- }
- ni += i + 1
- // Check for fmt flags
- if ni == len(format) {
- goto handle_end_error
- }
- c = rune(format[ni])
- if c == '+' || c == '-' || c == '#' || c == ' ' || c == '0' {
- ni++
- }
-
- // Check for precision and width
- if ni == len(format) {
- goto handle_end_error
- }
- c = rune(format[ni])
- for unicode.IsDigit(c) {
- ni++
- c = rune(format[ni])
- }
- if c == '.' {
- ni++
- c = rune(format[ni])
- for unicode.IsDigit(c) {
- ni++
- c = rune(format[ni])
- }
- }
-
- retval = append(retval, []byte(format[i:ni])...)
- // Get final format verb
- if ni == len(format) {
- goto handle_end_error
- }
- c = rune(format[ni])
- switch c {
- case '%':
- retval = append(retval, '%')
- case 'a':
- if len(msg.Envelope.From) == 0 {
- return "", nil, errors.New("found no address for sender")
- }
- addr := msg.Envelope.From[0]
- retval = append(retval, 's')
- args = append(args, fmt.Sprintf("%s@%s", addr.Mailbox, addr.Host))
- case 'A':
- var addr *models.Address
- if len(msg.Envelope.ReplyTo) == 0 {
- if len(msg.Envelope.From) == 0 {
- return "", nil,
- errors.New("found no address for sender or reply-to")
- } else {
- addr = msg.Envelope.From[0]
- }
- } else {
- addr = msg.Envelope.ReplyTo[0]
- }
- retval = append(retval, 's')
- args = append(args, fmt.Sprintf("%s@%s", addr.Mailbox, addr.Host))
- case 'C':
- retval = append(retval, 'd')
- args = append(args, number)
- case 'd':
- retval = append(retval, 's')
- args = append(args, msg.InternalDate.Format(conf.Ui.TimestampFormat))
- case 'D':
- retval = append(retval, 's')
- args = append(args, msg.InternalDate.Local().Format(conf.Ui.TimestampFormat))
- case 'f':
- if len(msg.Envelope.From) == 0 {
- return "", nil, errors.New("found no address for sender")
- }
- addr := msg.Envelope.From[0].Format()
- retval = append(retval, 's')
- args = append(args, addr)
- case 'F':
- if len(msg.Envelope.From) == 0 {
- return "", nil, errors.New("found no address for sender")
- }
- addr := msg.Envelope.From[0]
- // TODO: handle case when sender is current user. Then
- // use recipient's name
- var val string
- if addr.Name != "" {
- val = addr.Name
- } else {
- val = fmt.Sprintf("%s@%s", addr.Mailbox, addr.Host)
- }
- retval = append(retval, 's')
- args = append(args, val)
-
- case 'i':
- retval = append(retval, 's')
- args = append(args, msg.Envelope.MessageId)
- case 'n':
- if len(msg.Envelope.From) == 0 {
- return "", nil, errors.New("found no address for sender")
- }
- addr := msg.Envelope.From[0]
- var val string
- if addr.Name != "" {
- val = addr.Name
- } else {
- val = fmt.Sprintf("%s@%s", addr.Mailbox, addr.Host)
- }
- retval = append(retval, 's')
- args = append(args, val)
- case 'r':
- addrs := models.FormatAddresses(msg.Envelope.To)
- retval = append(retval, 's')
- args = append(args, addrs)
- case 'R':
- addrs := models.FormatAddresses(msg.Envelope.Cc)
- retval = append(retval, 's')
- args = append(args, addrs)
- case 's':
- retval = append(retval, 's')
- args = append(args, msg.Envelope.Subject)
- case 'u':
- if len(msg.Envelope.From) == 0 {
- return "", nil, errors.New("found no address for sender")
- }
- addr := msg.Envelope.From[0]
- retval = append(retval, 's')
- args = append(args, addr.Mailbox)
- case 'v':
- if len(msg.Envelope.From) == 0 {
- return "", nil, errors.New("found no address for sender")
- }
- addr := msg.Envelope.From[0]
- // check if message is from current user
- if addr.Name != "" {
- retval = append(retval, 's')
- args = append(args, strings.Split(addr.Name, " ")[0])
- }
- case 'Z':
- // calculate all flags
- var readReplyFlag = ""
- var delFlag = ""
- var flaggedFlag = ""
- seen := false
- recent := false
- answered := false
- for _, flag := range msg.Flags {
- if flag == models.SeenFlag {
- seen = true
- } else if flag == models.RecentFlag {
- recent = true
- } else if flag == models.AnsweredFlag {
- answered = true
- }
- if flag == models.DeletedFlag {
- delFlag = "D"
- // TODO: check if attachments
- }
- if flag == models.FlaggedFlag {
- flaggedFlag = "!"
- }
- // TODO: check gpg stuff
- }
- if seen {
- if answered {
- readReplyFlag = "r" // message has been replied to
- }
- } else {
- if recent {
- readReplyFlag = "N" // message is new
- } else {
- readReplyFlag = "O" // message is old
- }
- }
- retval = append(retval, '3', 's')
- args = append(args, readReplyFlag+delFlag+flaggedFlag)
-
- // Move the below cases to proper alphabetical positions once
- // implemented
- case 'l':
- // TODO: number of lines in the message
- retval = append(retval, 'd')
- args = append(args, msg.Size)
- case 'e':
- // TODO: current message number in thread
- fallthrough
- case 'E':
- // TODO: number of messages in current thread
- fallthrough
- case 'H':
- // TODO: spam attribute(s) of this message
- fallthrough
- case 'L':
- // TODO:
- fallthrough
- case 'X':
- // TODO: number of attachments
- fallthrough
- case 'y':
- // TODO: X-Label field
- fallthrough
- case 'Y':
- // TODO: X-Label field and some other constraints
- fallthrough
- default:
- // Just ignore it and print as is
- // so %k in index format becomes %%k to Printf
- retval = append(retval, '%')
- retval = append(retval, byte(c))
- }
- i = ni + 1
- }
-
- return string(retval), args, nil
-
-handle_end_error:
- return "", nil, errors.New("reached end of string while parsing index format")
-}