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.
zk/internal/cli/cmd/init.go

99 lines
2.1 KiB
Go

package cmd
import (
"fmt"
"path/filepath"
"github.com/AlecAivazis/survey/v2"
"github.com/AlecAivazis/survey/v2/terminal"
"github.com/mickael-menu/zk/internal/cli"
"github.com/mickael-menu/zk/internal/core"
"github.com/mickael-menu/zk/internal/util/strings"
)
// Init creates a notebook in the given directory
type Init struct {
Directory string `arg optional type:"path" default:"." help:"Directory containing the notebook."`
}
func (cmd *Init) Run(container *cli.Container) error {
opts, err := newInitOpts(container)
if err != nil {
if err == terminal.InterruptErr {
return nil
}
return err
}
fmt.Println()
notebook, err := container.Notebooks.Init(cmd.Directory, opts)
if err != nil {
return err
}
index := Index{Quiet: true}
err = index.RunWithNotebook(container, notebook)
if err != nil {
return err
}
path, err := filepath.Abs(cmd.Directory)
if err != nil {
path = cmd.Directory
}
fmt.Printf("Initialized a notebook in %v\n", path)
return nil
}
func newInitOpts(container *cli.Container) (core.InitOpts, error) {
if container.Terminal.NoInput {
return core.NewDefaultInitOpts(), nil
} else {
return startInitWizard()
}
}
func startInitWizard() (core.InitOpts, error) {
answers := struct {
WikiLink bool
Tags []string
}{}
hashtag := "#hashtag"
multiwordTag := "#Bear's multi-word tag#"
colonTag := ":colon:tag:"
questions := []*survey.Question{
{
Name: "wikilink",
Prompt: &survey.Confirm{
Message: "Do you prefer [[WikiLinks]] over regular Markdown links?",
Default: false,
},
},
{
Name: "tags",
Prompt: &survey.MultiSelect{
Message: "Choose your favorite inline tag syntaxes:",
Options: []string{hashtag, multiwordTag, colonTag},
},
},
}
var opts core.InitOpts
err := survey.Ask(questions, &answers)
if err != nil {
return opts, err
}
opts.WikiLinks = answers.WikiLink
opts.Hashtags = strings.Contains(answers.Tags, hashtag)
opts.MultiwordTags = strings.Contains(answers.Tags, multiwordTag)
opts.ColonTags = strings.Contains(answers.Tags, colonTag)
return opts, nil
}