From bf0f72a533d5c1868b9819f769836ea22d5fa583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leszek=20Cima=C5=82a?= Date: Wed, 8 Jan 2020 21:44:18 +0100 Subject: [PATCH] template: add exec and wrap --- doc/aerc-templates.7.scd | 23 ++++++++++++++++++----- lib/templates/template.go | 23 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/doc/aerc-templates.7.scd b/doc/aerc-templates.7.scd index 9382f2e..adcc85c 100644 --- a/doc/aerc-templates.7.scd +++ b/doc/aerc-templates.7.scd @@ -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}} ``` - - All of the above can be chained together if needed, for example + _exec_ function execute external command to process message. ``` - {{wrapText .OriginalText 72 | quote}} + {{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}} + ``` + + Automatic HTML parsing can be achieved. + ``` + {{if eq .OriginalMIMEType "text/html"}} + {{exec `/usr/local/share/aerc/filters/html` .OriginalText | wrap 72 | quote}} + {{else}} + {{wrap 72 .OriginalText | quote}} + {{end}} ``` # SEE ALSO diff --git a/lib/templates/template.go b/lib/templates/template.go index 5402472..f2765e8 100644 --- a/lib/templates/template.go +++ b/lib/templates/template.go @@ -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) {