mirror of
https://github.com/charmbracelet/glow
synced 2024-11-10 14:14:17 +00:00
Start looking for local files the moment Glow starts
This commit is contained in:
parent
1200b86729
commit
d4f192487c
2 changed files with 83 additions and 85 deletions
82
ui/stash.go
82
ui/stash.go
|
@ -18,7 +18,6 @@ import (
|
|||
"github.com/charmbracelet/charm/ui/common"
|
||||
"github.com/dustin/go-humanize"
|
||||
runewidth "github.com/mattn/go-runewidth"
|
||||
"github.com/muesli/gitcha"
|
||||
te "github.com/muesli/termenv"
|
||||
)
|
||||
|
||||
|
@ -36,12 +35,6 @@ type gotStashMsg []*charm.Markdown
|
|||
type gotNewsMsg []*charm.Markdown
|
||||
type fetchedMarkdownMsg *markdown
|
||||
type deletedStashedItemMsg int
|
||||
type initLocalFileSearchMsg struct {
|
||||
cwd string
|
||||
ch chan string
|
||||
}
|
||||
type foundLocalFileMsg string
|
||||
type localFileSearchFinished struct{}
|
||||
|
||||
// MODEL
|
||||
|
||||
|
@ -117,7 +110,6 @@ type stashModel struct {
|
|||
loaded stashLoadedState // what's loaded? we find out with bitmasking
|
||||
loading bool // are we currently loading something?
|
||||
fullyLoaded bool // Have we loaded everything from the server?
|
||||
cwd string // working directory where glow is running
|
||||
hasStash bool // do we have stashed files to show?
|
||||
hasLocalFiles bool // do we have local files to show?
|
||||
hasNews bool // do we have news to show?
|
||||
|
@ -136,10 +128,6 @@ type stashModel struct {
|
|||
// than we can display at a time so we can paginate locally without having
|
||||
// to fetch every time.
|
||||
page int
|
||||
|
||||
// github.com/muesli/gitcha channel that receives paths to local markdown
|
||||
// files.
|
||||
localFileFinder chan string
|
||||
}
|
||||
|
||||
func (m *stashModel) setSize(width, height int) {
|
||||
|
@ -181,7 +169,7 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) {
|
|||
|
||||
// INIT
|
||||
|
||||
func stashInit(cc *charm.Client) (stashModel, tea.Cmd) {
|
||||
func newStashModel() stashModel {
|
||||
s := spinner.NewModel()
|
||||
s.Frames = spinner.Dot
|
||||
s.ForegroundColor = common.SpinnerColor
|
||||
|
@ -197,19 +185,13 @@ func stashInit(cc *charm.Client) (stashModel, tea.Cmd) {
|
|||
ni.Focus()
|
||||
|
||||
m := stashModel{
|
||||
cc: cc,
|
||||
spinner: s,
|
||||
noteInput: ni,
|
||||
page: 1,
|
||||
paginator: p,
|
||||
}
|
||||
|
||||
return m, tea.Batch(
|
||||
loadLocalFiles,
|
||||
loadStash(m),
|
||||
loadNews(m),
|
||||
spinner.Tick(s),
|
||||
)
|
||||
return m
|
||||
}
|
||||
|
||||
// UPDATE
|
||||
|
@ -222,21 +204,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) {
|
|||
|
||||
switch msg := msg.(type) {
|
||||
|
||||
// We've started looking for local files
|
||||
case initLocalFileSearchMsg:
|
||||
m.localFileFinder = msg.ch
|
||||
m.cwd = msg.cwd
|
||||
cmds = append(cmds, findNextLocalFile(m))
|
||||
|
||||
// We found a local file
|
||||
case foundLocalFileMsg:
|
||||
pathStr, err := localFileToMarkdown(m.cwd, string(msg))
|
||||
if err == nil {
|
||||
m.hasLocalFiles = true
|
||||
m.addMarkdowns(pathStr)
|
||||
}
|
||||
cmds = append(cmds, findNextLocalFile(m))
|
||||
|
||||
// We're finished searching for local files
|
||||
case localFileSearchFinished:
|
||||
m.loaded |= loadedLocalFiles
|
||||
|
@ -588,51 +555,6 @@ func stashHelpView(m stashModel) string {
|
|||
|
||||
// CMD
|
||||
|
||||
func loadLocalFiles() tea.Msg {
|
||||
cwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
return errMsg(err)
|
||||
}
|
||||
|
||||
ch := gitcha.FindFileFromList(cwd, []string{"*.md"})
|
||||
return initLocalFileSearchMsg{
|
||||
ch: ch,
|
||||
cwd: cwd,
|
||||
}
|
||||
}
|
||||
|
||||
func findNextLocalFile(m stashModel) tea.Cmd {
|
||||
return func() tea.Msg {
|
||||
pathStr, ok := <-m.localFileFinder
|
||||
if ok {
|
||||
// Okay now find the next one
|
||||
return foundLocalFileMsg(pathStr)
|
||||
}
|
||||
// We're done
|
||||
return localFileSearchFinished{}
|
||||
}
|
||||
}
|
||||
|
||||
func loadStash(m stashModel) tea.Cmd {
|
||||
return func() tea.Msg {
|
||||
stash, err := m.cc.GetStash(m.page)
|
||||
if err != nil {
|
||||
return errMsg(err)
|
||||
}
|
||||
return gotStashMsg(stash)
|
||||
}
|
||||
}
|
||||
|
||||
func loadNews(m stashModel) tea.Cmd {
|
||||
return func() tea.Msg {
|
||||
news, err := m.cc.GetNews(1) // just fetch the first page
|
||||
if err != nil {
|
||||
return errMsg(err)
|
||||
}
|
||||
return gotNewsMsg(news)
|
||||
}
|
||||
}
|
||||
|
||||
func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd {
|
||||
return func() tea.Msg {
|
||||
var (
|
||||
|
|
86
ui/ui.go
86
ui/ui.go
|
@ -4,6 +4,7 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/charmbracelet/bubbles/spinner"
|
||||
|
@ -11,6 +12,7 @@ import (
|
|||
"github.com/charmbracelet/charm"
|
||||
"github.com/charmbracelet/charm/ui/common"
|
||||
"github.com/charmbracelet/charm/ui/keygen"
|
||||
"github.com/muesli/gitcha"
|
||||
te "github.com/muesli/termenv"
|
||||
)
|
||||
|
||||
|
@ -47,6 +49,12 @@ func NewProgram(style string, cfg UIConfig) *tea.Program {
|
|||
type errMsg error
|
||||
type newCharmClientMsg *charm.Client
|
||||
type sshAuthErrMsg struct{}
|
||||
type initLocalFileSearchMsg struct {
|
||||
cwd string
|
||||
ch chan string
|
||||
}
|
||||
type foundLocalFileMsg string
|
||||
type localFileSearchFinished struct{}
|
||||
|
||||
// MODEL
|
||||
|
||||
|
@ -83,6 +91,11 @@ type model struct {
|
|||
pager pagerModel
|
||||
terminalWidth int
|
||||
terminalHeight int
|
||||
cwd string // directory from which we're running Glow
|
||||
|
||||
// Channel that receives paths to local markdown files
|
||||
// (via the github.com/muesli/gitcha package)
|
||||
localFileFinder chan string
|
||||
}
|
||||
|
||||
func (m *model) unloadDocument() {
|
||||
|
@ -111,9 +124,11 @@ func initialize(style string) func() (tea.Model, tea.Cmd) {
|
|||
|
||||
return model{
|
||||
spinner: s,
|
||||
stash: newStashModel(),
|
||||
pager: newPagerModel(style),
|
||||
state: stateInitCharmClient,
|
||||
}, tea.Batch(
|
||||
findLocalFiles,
|
||||
newCharmClient,
|
||||
spinner.Tick(s),
|
||||
)
|
||||
|
@ -194,6 +209,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) {
|
|||
m.err = msg
|
||||
return m, nil
|
||||
|
||||
// Window size is received when starting up and on every resize
|
||||
case tea.WindowSizeMsg:
|
||||
m.terminalWidth = msg.Width
|
||||
m.terminalHeight = msg.Height
|
||||
|
@ -203,6 +219,21 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) {
|
|||
// TODO: load more stash pages if we've resized, are on the last page,
|
||||
// and haven't loaded more pages yet.
|
||||
|
||||
// We've started looking for local files
|
||||
case initLocalFileSearchMsg:
|
||||
m.localFileFinder = msg.ch
|
||||
m.cwd = msg.cwd
|
||||
cmds = append(cmds, findNextLocalFile(m))
|
||||
|
||||
// We found a local file
|
||||
case foundLocalFileMsg:
|
||||
pathStr, err := localFileToMarkdown(m.cwd, string(msg))
|
||||
if err == nil {
|
||||
m.stash.hasLocalFiles = true
|
||||
m.stash.addMarkdowns(pathStr)
|
||||
}
|
||||
cmds = append(cmds, findNextLocalFile(m))
|
||||
|
||||
case sshAuthErrMsg:
|
||||
// If we haven't run the keygen yet, do that
|
||||
if m.state != stateKeygenFinished {
|
||||
|
@ -223,6 +254,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) {
|
|||
cmds = append(cmds, cmd)
|
||||
|
||||
case keygen.DoneMsg:
|
||||
// The keygen's done, so let's try initializing the charm client again
|
||||
m.state = stateKeygenFinished
|
||||
cmds = append(cmds, newCharmClient)
|
||||
|
||||
|
@ -236,10 +268,9 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) {
|
|||
case newCharmClientMsg:
|
||||
m.cc = msg
|
||||
m.state = stateShowStash
|
||||
m.stash, cmd = stashInit(msg)
|
||||
m.stash.setSize(m.terminalWidth, m.terminalHeight)
|
||||
m.stash.cc = msg
|
||||
m.pager.cc = msg
|
||||
cmds = append(cmds, cmd)
|
||||
cmds = append(cmds, loadStash(m.stash), loadNews(m.stash))
|
||||
|
||||
case fetchedMarkdownMsg:
|
||||
m.pager.currentDocument = msg
|
||||
|
@ -321,6 +352,31 @@ func errorView(err error) string {
|
|||
|
||||
// COMMANDS
|
||||
|
||||
func findLocalFiles() tea.Msg {
|
||||
cwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
return errMsg(err)
|
||||
}
|
||||
|
||||
ch := gitcha.FindFileFromList(cwd, []string{"*.md"})
|
||||
return initLocalFileSearchMsg{
|
||||
ch: ch,
|
||||
cwd: cwd,
|
||||
}
|
||||
}
|
||||
|
||||
func findNextLocalFile(m model) tea.Cmd {
|
||||
return func() tea.Msg {
|
||||
pathStr, ok := <-m.localFileFinder
|
||||
if ok {
|
||||
// Okay now find the next one
|
||||
return foundLocalFileMsg(pathStr)
|
||||
}
|
||||
// We're done
|
||||
return localFileSearchFinished{}
|
||||
}
|
||||
}
|
||||
|
||||
func newCharmClient() tea.Msg {
|
||||
cfg, err := charm.ConfigFromEnv()
|
||||
if err != nil {
|
||||
|
@ -337,6 +393,28 @@ func newCharmClient() tea.Msg {
|
|||
return newCharmClientMsg(cc)
|
||||
}
|
||||
|
||||
func loadStash(m stashModel) tea.Cmd {
|
||||
return func() tea.Msg {
|
||||
stash, err := m.cc.GetStash(m.page)
|
||||
if err != nil {
|
||||
return errMsg(err)
|
||||
}
|
||||
return gotStashMsg(stash)
|
||||
}
|
||||
}
|
||||
|
||||
func loadNews(m stashModel) tea.Cmd {
|
||||
return func() tea.Msg {
|
||||
news, err := m.cc.GetNews(1) // just fetch the first page
|
||||
if err != nil {
|
||||
return errMsg(err)
|
||||
}
|
||||
return gotNewsMsg(news)
|
||||
}
|
||||
}
|
||||
|
||||
// ETC
|
||||
|
||||
func indent(s string, n int) string {
|
||||
if n <= 0 || s == "" {
|
||||
return s
|
||||
|
@ -350,8 +428,6 @@ func indent(s string, n int) string {
|
|||
return b.String()
|
||||
}
|
||||
|
||||
// ETC
|
||||
|
||||
func min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
|
|
Loading…
Reference in a new issue