You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
superhighway84/tui/helpers.go

99 lines
2.2 KiB
Go

package tui
import (
"errors"
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"strings"
"time"
"github.com/mrusme/superhighway84/models"
)
func MillisecondsToDate(ms int64) (string) {
return time.Unix(0, ms * int64(time.Millisecond)).Format("Mon Jan _2 15:04:05 2006")
}
func (t *TUI) OpenArticle(article *models.Article, readOnly bool) (models.Article, error) {
if editor, exist := os.LookupEnv("EDITOR"); exist == false || editor == "" {
return *article, errors.New("EDITOR environment variable not available, please export!")
}
tmpFile, err := ioutil.TempFile(os.TempDir(), "article-*.txt")
if err != nil {
return *article, err
}
defer os.Remove(tmpFile.Name())
tmpContent := []byte(fmt.Sprintf(
"Subject: %s\nNewsgroup: %s\nFrom: %s\n= = = = = =\n%s",
article.Subject, article.Newsgroup, article.From, article.Body))
if _, err = tmpFile.Write(tmpContent); err != nil {
return *article, err
}
if err := tmpFile.Close(); err != nil {
return *article, err
}
if readOnly == true {
os.Chmod(tmpFile.Name(), 0400)
}
wasSuspended := t.App.Suspend(func() {
cmd := exec.Command(os.Getenv("EDITOR"), tmpFile.Name())
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
err := cmd.Run()
if err != nil {
log.Println(err)
}
return
})
if wasSuspended == false {
return *article, err
}
tmpContent, err = os.ReadFile(tmpFile.Name())
if err != nil {
return *article, err
}
content := strings.SplitAfterN(string(tmpContent), "\n= = = = = =\n", 2)
if len(content) != 2 {
return *article, errors.New("Document malformatted")
}
newArticle := *article
headerPart := strings.TrimSpace(content[0])
headers := strings.Split(headerPart, "\n")
for _, header := range headers {
splitHeader := strings.SplitAfterN(header, ":", 2)
if len(splitHeader) < 2 {
continue
}
headerName := strings.ToLower(strings.TrimSpace(splitHeader[0]))
headerValue := strings.TrimSpace(splitHeader[1])
switch(headerName) {
case "subject:":
newArticle.Subject = headerValue
case "newsgroup:":
newArticle.Newsgroup = headerValue
}
}
newArticle.Body = strings.TrimSpace(content[1])
return newArticle, nil
}