~sircmpwn/aerc

cf50b987681d00a37f9457ddfa6f8bffb962af3b — Drew DeVault 1 year, 1 month ago 56b84d3
Fetch plaintext part when replying
1 files changed, 34 insertions(+), 6 deletions(-)

M commands/account/reply.go
M commands/account/reply.go => commands/account/reply.go +34 -6
@@ 180,14 180,24 @@ func Reply(aerc *widgets.Aerc, args []string) error {
		})
	} else {
		if quote {
			// TODO: something more intelligent than fetching the 1st part
			store.FetchBodyPart(msg.Uid, []int{1}, func(reader io.Reader) {
			var (
				path []int
				part *imap.BodyStructure
			)
			if len(msg.BodyStructure.Parts) != 0 {
				part, path = findPlaintext(msg.BodyStructure, path)
			}
			if part == nil {
				part = msg.BodyStructure
				path = []int{1}
			}

			store.FetchBodyPart(msg.Uid, path, func(reader io.Reader) {
				header := message.Header{}
				header.SetText(
					"Content-Transfer-Encoding", msg.BodyStructure.Encoding)
				header.SetContentType(
					msg.BodyStructure.MIMEType, msg.BodyStructure.Params)
				header.SetText("Content-Description", msg.BodyStructure.Description)
					"Content-Transfer-Encoding", part.Encoding)
				header.SetContentType(part.MIMEType, part.Params)
				header.SetText("Content-Description", part.Description)
				entity, err := message.New(header, reader)
				if err != nil {
					// TODO: Do something with the error


@@ 223,3 233,21 @@ func Reply(aerc *widgets.Aerc, args []string) error {

	return nil
}

func findPlaintext(bs *imap.BodyStructure,
	path []int) (*imap.BodyStructure, []int) {

	for i, part := range bs.Parts {
		cur := append(path, i+1)
		if part.MIMEType == "text" && part.MIMESubType == "plain" {
			return part, cur
		}
		if part.MIMEType == "multipart" {
			if part, path := findPlaintext(bs, cur); path != nil {
				return part, path
			}
		}
	}

	return nil, nil
}