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 }