~sircmpwn/aerc

Parse headers from template v1 PROPOSED

Robert Günzler: 1
 Parse headers from template

 1 files changed, 39 insertions(+), 3 deletions(-)
Aha, that makes sense. Thanks for clarifying, I'll have this patch
reviewed shortly.
Thanks!

To git.sr.ht:~sircmpwn/aerc
   c1d5797..31e3e9f  master -> master
Whoops, I had to revert this. :reply -q fails with this patch, because
it tries to interpret the message body as headers.
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~sircmpwn/aerc/patches/9146/mbox | git am -3
Learn more about email & git

[PATCH] Parse headers from template Export this patch

Parse the processed template for headers and populates matching header
editors accordingly.
Those are then stripped from the template body before prepending it
and remaining header fields to the composer content.

The motivation for this is keeping receiver, sender and subject
lines in the template file and generating the message subject with the
date functions.
---
 widgets/compose.go | 42 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 39 insertions(+), 3 deletions(-)

diff --git a/widgets/compose.go b/widgets/compose.go
index 62aaafe..6e527cb 100644
--- a/widgets/compose.go
+++ b/widgets/compose.go
@@ -179,8 +179,7 @@ func (c *Composer) AddTemplate(template string, data interface{}) error {
	if err != nil {
		return err
	}
	c.PrependContents(bytes.NewReader(templateText))
	return nil
	return c.addTemplate(bytes.NewReader(templateText))
}

func (c *Composer) AddTemplateFromString(template string, data interface{}) error {
@@ -192,7 +191,44 @@ func (c *Composer) AddTemplateFromString(template string, data interface{}) erro
	if err != nil {
		return err
	}
	c.PrependContents(bytes.NewReader(templateText))
	return c.addTemplate(bytes.NewReader(templateText))
}

func (c *Composer) addTemplate(tmpl io.Reader) error {
	reader, err := mail.CreateReader(tmpl)
	if err != nil {
		return errors.Wrap(err, "mail.CreateReader")
	}
	defer reader.Close()

	// populate header editors
	header := reader.Header
	mhdr := (*message.Header)(&header.Header)
	for _, editor := range c.editors {
		if mhdr.Has(editor.name) {
			editor.input.Set(mhdr.Get(editor.name))
			mhdr.Del(editor.name)
		}
	}

	part, err := reader.NextPart()
	if err != nil {
		return errors.Wrap(err, "reader.NextPart")
	}
	c.PrependContents(part.Body)

	var (
		headers string
		fds     = mhdr.Fields()
	)
	for fds.Next() {
		headers += fmt.Sprintf("%s: %s\n", fds.Key(), fds.Value())
	}
	if headers != "" {
		headers += "\n"
	}

	c.PrependContents(bytes.NewReader([]byte(headers)))
	return nil
}

-- 
2.23.0
View this thread in the archives