wombat/page/page.go

112 lines
2.4 KiB
Go
Raw Permalink Normal View History

package page
import (
"bytes"
"errors"
"flag"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"text/template"
2024-06-18 23:01:52 +02:00
goutil "git.fireandbrimst.one/aw/goutil/misc"
gen "git.fireandbrimst.one/aw/wombat/generate"
)
var pageStub string = `---
title: {{.Title}}
description: {{.Description}}
---
`
type page struct {
Title string
Description string
}
type pageFlags struct {
title string
description string
path string
noserve bool
}
func ensureDirectory(file string) {
dir := filepath.Dir(file)
err := os.MkdirAll(dir, 0755)
if err != nil {
panic(err)
}
}
func makePageFile(path string, title string, description string, content string) error {
ensureDirectory(path)
page := page{}
page.Title = title
page.Description = description
t := template.Must(template.New("pageStub").Parse(pageStub))
buf := new(bytes.Buffer)
t.Execute(buf, page)
err := goutil.WriteFile(path, buf.String()+content)
return err
}
func newPage(fl pageFlags) error {
var err error
var content string
if fl.path == "" {
return errors.New("need path")
}
if filepath.Ext(fl.path) != ".md" {
fl.path += ".md"
}
if goutil.PathExists(fl.path) {
return errors.New(fl.path + " already exists...")
}
if fl.description != "" && fl.title != "" {
tmpcontent, _ := ioutil.ReadAll(os.Stdin)
content = string(tmpcontent)
}
if fl.title == "" {
fl.title, err = goutil.AskFor("Title")
if err != nil {
return err
}
}
if fl.description == "" {
fl.description, err = goutil.AskFor("Description")
if err != nil {
return err
}
}
err = makePageFile(fl.path, fl.title, fl.description, content)
if err != nil {
return err
}
if content == "" {
wait := true
err = goutil.OpenInEditor(fl.path, wait)
if err != nil {
fmt.Println(err)
fmt.Println("trying default application...")
err = goutil.OpenInDefaultApp(fl.path, wait)
}
}
if err != nil {
return err
}
return gen.Generate(gen.GenerateFlags{Noserve: fl.noserve})
}
func Command() (goutil.CommandFlagsInit, goutil.CommandFunc) {
f := pageFlags{}
flagsInit := func(s *flag.FlagSet) {
s.StringVar(&f.path, "path", "", "file to post to")
s.StringVar(&f.title, "title", "", "if title and description are set: read content from stdin")
s.StringVar(&f.description, "description", "", "if title and description are set: read content from stdin")
s.BoolVar(&f.noserve, "noserve", false, "don't generate and serve afterwards")
}
return flagsInit, func([]string) error { return newPage(f) }
}