diff options
Diffstat (limited to 'plugins/viewtext')
-rw-r--r-- | plugins/viewtext/plugin.go | 10 | ||||
-rw-r--r-- | plugins/viewtext/viewer.go | 49 |
2 files changed, 59 insertions, 0 deletions
diff --git a/plugins/viewtext/plugin.go b/plugins/viewtext/plugin.go new file mode 100644 index 0000000..c7a2bcc --- /dev/null +++ b/plugins/viewtext/plugin.go @@ -0,0 +1,10 @@ +package koushinviewtext + +import ( + "git.sr.ht/~emersion/koushin" +) + +func init() { + p := koushin.GoPlugin{Name: "viewtext"} + koushin.RegisterPluginLoader(p.Loader()) +} diff --git a/plugins/viewtext/viewer.go b/plugins/viewtext/viewer.go new file mode 100644 index 0000000..cca38a8 --- /dev/null +++ b/plugins/viewtext/viewer.go @@ -0,0 +1,49 @@ +package koushinviewtext + +import ( + "bytes" + "fmt" + "html/template" + "io/ioutil" + "strings" + + "git.sr.ht/~emersion/koushin" + koushinbase "git.sr.ht/~emersion/koushin/plugins/base" + "github.com/emersion/go-message" +) + +// TODO: dim quotes and "On xxx, xxx wrote:" lines +// TODO: turn URLs into links + +const tpl = `<pre>{{.}}</pre>` + +type viewer struct{} + +func (viewer) ViewMessagePart(ctx *koushin.Context, msg *koushinbase.IMAPMessage, part *message.Entity) (interface{}, error) { + mimeType, _, err := part.Header.ContentType() + if err != nil { + return nil, err + } + if !strings.EqualFold(mimeType, "text/plain") { + return nil, koushinbase.ErrViewUnsupported + } + + body, err := ioutil.ReadAll(part.Body) + if err != nil { + return nil, fmt.Errorf("failed to read part body: %v", err) + } + + t := template.Must(template.New("view-text.html").Parse(tpl)) + + var buf bytes.Buffer + err = t.Execute(&buf, string(body)) + if err != nil { + return nil, err + } + + return template.HTML(buf.String()), nil +} + +func init() { + koushinbase.RegisterViewer(viewer{}) +} |