summaryrefslogtreecommitdiff
path: root/internal/platforms/snonux/snonux.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/platforms/snonux/snonux.go')
-rw-r--r--internal/platforms/snonux/snonux.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/internal/platforms/snonux/snonux.go b/internal/platforms/snonux/snonux.go
new file mode 100644
index 0000000..5773a23
--- /dev/null
+++ b/internal/platforms/snonux/snonux.go
@@ -0,0 +1,70 @@
+package snonux
+
+import (
+ "context"
+ "fmt"
+ "path/filepath"
+ "strings"
+ "time"
+
+ "codeberg.org/snonux/gos/internal/colour"
+ "codeberg.org/snonux/gos/internal/config"
+ "codeberg.org/snonux/gos/internal/entry"
+ "codeberg.org/snonux/gos/internal/oi"
+ "codeberg.org/snonux/gos/internal/prompt"
+ "codeberg.org/snonux/gos/internal/timestamp"
+)
+
+// Post writes the entry body as plain text under <gosDir>/snonux/inbox (filename .md).
+func Post(ctx context.Context, args config.Args, sizeLimit int, en entry.Entry) error {
+ if err := ctx.Err(); err != nil {
+ return err
+ }
+ content, _, err := en.ContentWithLimit(sizeLimit)
+ if err != nil {
+ return err
+ }
+ if args.DryRun {
+ colour.Infoln("Not writing", en, "to Snonux inbox as dry-run enabled")
+ return nil
+ }
+ if _, err = prompt.FileAction("Do you want to post this message to Snonux (save to inbox)?",
+ content, en.Path, prompt.RandomOption); err != nil {
+ return err
+ }
+ path, err := inboxMarkdownPath(args.GosDir, en)
+ if err != nil {
+ return err
+ }
+ if err := oi.EnsureParentDir(path); err != nil {
+ return err
+ }
+ out := strings.TrimSuffix(content, "\n") + "\n"
+ if err := oi.WriteFile(path, out); err != nil {
+ return err
+ }
+ colour.Infoln("Wrote Snonux inbox file", path)
+ return nil
+}
+
+func inboxMarkdownPath(gosDir string, en entry.Entry) (string, error) {
+ inbox := filepath.Join(gosDir, "snonux", "inbox")
+ base := strings.TrimSuffix(filepath.Base(en.Path), ".queued")
+ base = strings.Map(func(r rune) rune {
+ switch {
+ case r >= 'a' && r <= 'z', r >= 'A' && r <= 'Z', r >= '0' && r <= '9', r == '-', r == '_', r == '.':
+ return r
+ default:
+ return '-'
+ }
+ }, base)
+ base = strings.Trim(base, "-.")
+ if base == "" {
+ base = "post"
+ }
+ if len(base) > 120 {
+ base = base[:120]
+ }
+ name := fmt.Sprintf("%s-%09d-%s.md", timestamp.Now(), time.Now().Nanosecond(), base)
+ return filepath.Join(inbox, name), nil
+}