package textfile import ( "bytes" "fmt" "io/ioutil" "os" "path/filepath" "github.com/alecthomas/chroma/formatters" "github.com/alecthomas/chroma/lexers" "github.com/alecthomas/chroma/styles" "github.com/gdamore/tcell" "github.com/rivo/tview" "github.com/senorprogrammer/wtf/wtf" ) const HelpText = ` Keyboard commands for Textfile: /: Show/hide this help window h: Previous text file l: Next text file o: Open the text file in the operating system arrow left: Previous text file arrow right: Next text file ` type Widget struct { wtf.HelpfulWidget wtf.MultiSourceWidget wtf.TextWidget } func NewWidget(app *tview.Application, pages *tview.Pages) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), MultiSourceWidget: wtf.NewMultiSourceWidget("textfile", "filePath", "filePaths"), TextWidget: wtf.NewTextWidget("TextFile", "textfile", true), } widget.LoadSources() widget.SetDisplayFunction(widget.display) widget.HelpfulWidget.SetView(widget.View) widget.View.SetWrap(true) widget.View.SetWordWrap(true) widget.View.SetInputCapture(widget.keyboardIntercept) return &widget } /* -------------------- Exported Functions -------------------- */ // Refresh is called on the interval and refreshes the data func (widget *Widget) Refresh() { widget.UpdateRefreshedAt() widget.display() } /* -------------------- Unexported Functions -------------------- */ func (widget *Widget) display() { title := fmt.Sprintf("[green]%s[white]", widget.CurrentSource()) widget.View.SetTitle(widget.ContextualTitle(title)) text := wtf.SigilStr(len(widget.Sources), widget.Idx, widget.View) + "\n" if wtf.Config.UBool("wtf.mods.textfile.format", false) { text = text + widget.formattedText() } else { text = text + widget.plainText() } widget.View.SetText(text) } func (widget *Widget) fileName() string { return filepath.Base(widget.CurrentSource()) } func (widget *Widget) formattedText() string { filePath, _ := wtf.ExpandHomeDir(widget.CurrentSource()) file, err := os.Open(filePath) if err != nil { return err.Error() } lexer := lexers.Match(filePath) if lexer == nil { lexer = lexers.Fallback } style := styles.Get(wtf.Config.UString("wtf.mods.textfile.formatStyle", "vim")) if style == nil { style = styles.Fallback } formatter := formatters.Get("terminal256") if formatter == nil { formatter = formatters.Fallback } contents, _ := ioutil.ReadAll(file) iterator, _ := lexer.Tokenise(nil, string(contents)) var buf bytes.Buffer formatter.Format(&buf, style, iterator) return tview.TranslateANSI(buf.String()) } func (widget *Widget) plainText() string { filePath, _ := wtf.ExpandHomeDir(widget.CurrentSource()) fmt.Println(filePath) text, err := ioutil.ReadFile(filePath) if err != nil { return err.Error() } return string(text) } func (widget *Widget) keyboardIntercept(event *tcell.EventKey) *tcell.EventKey { switch string(event.Rune()) { case "/": widget.ShowHelp() return nil case "h": widget.Prev() return nil case "l": widget.Next() return nil case "o": wtf.OpenFile(widget.CurrentSource()) return nil } switch event.Key() { case tcell.KeyLeft: widget.Prev() return nil case tcell.KeyRight: widget.Next() return nil default: return event } return event }