~sircmpwn/aerc

bf0f72a533d5c1868b9819f769836ea22d5fa583 — Leszek CimaƂa 4 years ago fe9ec67
template: add exec and wrap
2 files changed, 40 insertions(+), 4 deletions(-)

M doc/aerc-templates.7.scd
M lib/templates/template.go
M doc/aerc-templates.7.scd => doc/aerc-templates.7.scd +17 -4
@@ 72,20 72,33 @@ available always.

	Example:

	_wrapText_ function can be used to wrap the original text to a number
	_wrap_ function can be used to wrap the original text to a number
	of characters per line.
	```
	{{wrapText .OriginalText 72}}
	{{wrap 72 .OriginalText}}
	```

	_quote_ function prepends each line with "> ".
	```
	{{quote .OriginalText}}
	```
	_exec_ function execute external command to process message.
	```
	{{exec `/usr/local/share/aerc/filters/html`}}
	```

	All of the above can be chained together if needed, for example.
	```
	{{exec `/usr/local/share/aerc/filters/html` .OriginalText | wrap 72 | quote}}
	```

	All of the above can be chained together if needed, for example
	Automatic HTML parsing can be achieved.
	```
	{{wrapText .OriginalText 72 | quote}}
	{{if eq .OriginalMIMEType "text/html"}}
	{{exec `/usr/local/share/aerc/filters/html` .OriginalText | wrap 72 | quote}}
	{{else}}
	{{wrap 72 .OriginalText | quote}}
	{{end}}
	```

# SEE ALSO

M lib/templates/template.go => lib/templates/template.go +23 -0
@@ 5,6 5,7 @@ import (
	"errors"
	"net/mail"
	"os"
	"os/exec"
	"path"
	"strings"
	"text/template"


@@ 72,6 73,11 @@ func parseAddressList(list string) []*mail.Address {
	return addrs
}

// wrap allows to chain wrapText
func wrap(lineWidth int, text string) string {
	return wrapText(text, lineWidth)
}

func wrapLine(text string, lineWidth int) string {
	words := strings.Fields(text)
	if len(words) == 0 {


@@ 135,10 141,27 @@ func quote(text string) string {
	return quoted.String()
}

// cmd allow to parse reply by shell command
// text have to be passed by cmd param
// if there is error, original string is returned
func cmd(cmd, text string) string {
	var out bytes.Buffer
	c := exec.Command("sh", "-c", cmd)
	c.Stdin = strings.NewReader(text)
	c.Stdout = &out
	err := c.Run()
	if err != nil {
		return text
	}
	return out.String()
}

var templateFuncs = template.FuncMap{
	"quote":      quote,
	"wrapText":   wrapText,
	"wrap":       wrap,
	"dateFormat": time.Time.Format,
	"exec":       cmd,
}

func findTemplate(templateName string, templateDirs []string) (string, error) {