feat: using renderer
This commit is contained in:
56
main.go
56
main.go
@ -7,6 +7,7 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
"path/filepath"
|
||||||
"slices"
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
@ -26,8 +27,6 @@ import (
|
|||||||
"github.com/charmbracelet/x/term"
|
"github.com/charmbracelet/x/term"
|
||||||
)
|
)
|
||||||
|
|
||||||
var docStyle = lipgloss.NewStyle().Margin(1, 2)
|
|
||||||
|
|
||||||
type errMsg error
|
type errMsg error
|
||||||
|
|
||||||
type item struct {
|
type item struct {
|
||||||
@ -61,6 +60,9 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type model struct {
|
type model struct {
|
||||||
|
renderer *lipgloss.Renderer
|
||||||
|
termRenderer *glamour.TermRenderer
|
||||||
|
|
||||||
list list.Model
|
list list.Model
|
||||||
allPosts []string
|
allPosts []string
|
||||||
|
|
||||||
@ -75,15 +77,14 @@ type model struct {
|
|||||||
|
|
||||||
page Page
|
page Page
|
||||||
|
|
||||||
viewport viewport.Model
|
viewport viewport.Model
|
||||||
termRenderer *glamour.TermRenderer
|
|
||||||
|
|
||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func getViewPort(width int, height int) viewport.Model {
|
func getViewPort(renderer *lipgloss.Renderer, width int, height int) viewport.Model {
|
||||||
vp := viewport.New(width, height)
|
vp := viewport.New(width, height)
|
||||||
vp.Style = lipgloss.NewStyle().
|
vp.Style = renderer.NewStyle().
|
||||||
BorderStyle(lipgloss.RoundedBorder()).
|
BorderStyle(lipgloss.RoundedBorder()).
|
||||||
BorderForeground(lipgloss.Color("62")).
|
BorderForeground(lipgloss.Color("62")).
|
||||||
PaddingRight(2)
|
PaddingRight(2)
|
||||||
@ -91,8 +92,8 @@ func getViewPort(width int, height int) viewport.Model {
|
|||||||
return vp
|
return vp
|
||||||
}
|
}
|
||||||
|
|
||||||
func initialModel(w int, h int) model {
|
func initialModel(renderer *lipgloss.Renderer, w int, h int) model {
|
||||||
posts, err := getAllPosts("/home/johnc/Code/JohnTech/content/blog")
|
posts, err := getAllPosts(filepath.Join(os.Getenv("BLOG_PATH"), "content/blog"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -111,7 +112,7 @@ func initialModel(w int, h int) model {
|
|||||||
list.SetShowTitle(false)
|
list.SetShowTitle(false)
|
||||||
|
|
||||||
// -1 to allow for the initial height of the nav model
|
// -1 to allow for the initial height of the nav model
|
||||||
vp := getViewPort(w, h-3)
|
vp := getViewPort(renderer, w, h-3)
|
||||||
|
|
||||||
// We need to adjust the width of the glamour render from our main width
|
// We need to adjust the width of the glamour render from our main width
|
||||||
// to account for a few things:
|
// to account for a few things:
|
||||||
@ -124,7 +125,7 @@ func initialModel(w int, h int) model {
|
|||||||
const glamourGutter = 2
|
const glamourGutter = 2
|
||||||
glamourRenderWidth := w - vp.Style.GetHorizontalFrameSize() - glamourGutter
|
glamourRenderWidth := w - vp.Style.GetHorizontalFrameSize() - glamourGutter
|
||||||
|
|
||||||
renderer, err := glamour.NewTermRenderer(
|
termRenderer, err := glamour.NewTermRenderer(
|
||||||
glamour.WithAutoStyle(),
|
glamour.WithAutoStyle(),
|
||||||
glamour.WithWordWrap(glamourRenderWidth),
|
glamour.WithWordWrap(glamourRenderWidth),
|
||||||
)
|
)
|
||||||
@ -132,7 +133,7 @@ func initialModel(w int, h int) model {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
frontPageContent, err := os.ReadFile("/home/johnc/Code/JohnTech/content/_index.md")
|
frontPageContent, err := os.ReadFile(filepath.Join(os.Getenv("BLOG_PATH"), "content/_index.md"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -142,7 +143,7 @@ func initialModel(w int, h int) model {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
frontPageModel, err := createMarkdownPostModel(processedFrontPage, renderer, vp)
|
frontPageModel, err := createMarkdownPostModel(processedFrontPage, termRenderer, vp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -151,13 +152,13 @@ func initialModel(w int, h int) model {
|
|||||||
list: list,
|
list: list,
|
||||||
allPosts: posts,
|
allPosts: posts,
|
||||||
page: FRONT,
|
page: FRONT,
|
||||||
termRenderer: renderer,
|
termRenderer: termRenderer,
|
||||||
viewport: vp,
|
viewport: vp,
|
||||||
frontPageModel: frontPageModel,
|
frontPageModel: frontPageModel,
|
||||||
frontPageContent: processedFrontPage,
|
frontPageContent: processedFrontPage,
|
||||||
width: w,
|
width: w,
|
||||||
height: h,
|
height: h,
|
||||||
navModel: createNavModel(w),
|
navModel: createNavModel(renderer, w),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,11 +213,11 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
case tea.WindowSizeMsg:
|
case tea.WindowSizeMsg:
|
||||||
h, v := docStyle.GetFrameSize()
|
// h, v := m.termRenderer.GetFrameSize()
|
||||||
m.list.SetSize(msg.Width-h, msg.Height-v)
|
// m.list.SetSize(msg.Width-h, msg.Height-v)
|
||||||
|
//
|
||||||
m.height = msg.Height
|
// m.height = msg.Height
|
||||||
m.width = msg.Width
|
// m.width = msg.Width
|
||||||
}
|
}
|
||||||
|
|
||||||
list, cmd := m.list.Update(msg)
|
list, cmd := m.list.Update(msg)
|
||||||
@ -245,7 +246,7 @@ func (m model) View() string {
|
|||||||
case FRONT:
|
case FRONT:
|
||||||
return m.navModel.View() + "\n" + m.frontPageModel.View()
|
return m.navModel.View() + "\n" + m.frontPageModel.View()
|
||||||
case POST_LIST:
|
case POST_LIST:
|
||||||
return m.navModel.View() + docStyle.Render(m.list.View())
|
return m.navModel.View() + m.renderer.NewStyle().Margin(1, 2).Render(m.list.View())
|
||||||
case POST:
|
case POST:
|
||||||
return m.navModel.View() + "\n" + m.postModel.View()
|
return m.navModel.View() + "\n" + m.postModel.View()
|
||||||
default:
|
default:
|
||||||
@ -261,7 +262,7 @@ const (
|
|||||||
func initServer() {
|
func initServer() {
|
||||||
s, err := wish.NewServer(
|
s, err := wish.NewServer(
|
||||||
wish.WithAddress(net.JoinHostPort(host, port)),
|
wish.WithAddress(net.JoinHostPort(host, port)),
|
||||||
wish.WithHostKeyPath(".ssh/id_rsa"),
|
wish.WithHostKeyPath("./.ssh/id_rsa"),
|
||||||
wish.WithMiddleware(
|
wish.WithMiddleware(
|
||||||
bubbletea.Middleware(teaHandler),
|
bubbletea.Middleware(teaHandler),
|
||||||
activeterm.Middleware(), // Bubble Tea apps usually require a PTY.
|
activeterm.Middleware(), // Bubble Tea apps usually require a PTY.
|
||||||
@ -305,7 +306,7 @@ func main() {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p := tea.NewProgram(initialModel(w, h))
|
p := tea.NewProgram(initialModel(lipgloss.DefaultRenderer(), w, h))
|
||||||
if _, err := p.Run(); err != nil {
|
if _, err := p.Run(); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -329,15 +330,8 @@ func teaHandler(s ssh.Session) (tea.Model, []tea.ProgramOption) {
|
|||||||
// use it to create the styles.
|
// use it to create the styles.
|
||||||
// The recommended way to use these styles is to then pass them down to
|
// The recommended way to use these styles is to then pass them down to
|
||||||
// your Bubble Tea model.
|
// your Bubble Tea model.
|
||||||
// renderer := bubbletea.MakeRenderer(s)
|
renderer := bubbletea.MakeRenderer(s)
|
||||||
// txtStyle := renderer.NewStyle().Foreground(lipgloss.Color("10"))
|
|
||||||
// quitStyle := renderer.NewStyle().Foreground(lipgloss.Color("8"))
|
|
||||||
//
|
|
||||||
// bg := "light"
|
|
||||||
// if renderer.HasDarkBackground() {
|
|
||||||
// bg = "dark"
|
|
||||||
// }
|
|
||||||
|
|
||||||
m := initialModel(pty.Window.Width, pty.Window.Height)
|
m := initialModel(renderer, pty.Window.Width, pty.Window.Height)
|
||||||
return m, []tea.ProgramOption{tea.WithAltScreen()}
|
return m, []tea.ProgramOption{tea.WithAltScreen()}
|
||||||
}
|
}
|
||||||
|
16
nav.go
16
nav.go
@ -6,7 +6,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type navModel struct {
|
type navModel struct {
|
||||||
style lipgloss.Style
|
renderer *lipgloss.Renderer
|
||||||
|
style lipgloss.Style
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m navModel) Init() tea.Cmd {
|
func (m navModel) Init() tea.Cmd {
|
||||||
@ -18,13 +19,13 @@ func (m navModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m navModel) View() string {
|
func (m navModel) View() string {
|
||||||
nameStyle := lipgloss.NewStyle().Bold(true)
|
nameStyle := m.renderer.NewStyle().Bold(true)
|
||||||
|
|
||||||
blogStyle := lipgloss.NewStyle().
|
blogStyle := m.renderer.NewStyle().
|
||||||
Bold(true).
|
Bold(true).
|
||||||
Underline(true)
|
Underline(true)
|
||||||
|
|
||||||
shortcutStyle := lipgloss.NewStyle().
|
shortcutStyle := m.renderer.NewStyle().
|
||||||
Faint(true)
|
Faint(true)
|
||||||
|
|
||||||
name := nameStyle.Render("John Costa")
|
name := nameStyle.Render("John Costa")
|
||||||
@ -47,14 +48,15 @@ func (m navModel) View() string {
|
|||||||
return m.style.Render(rightSide)
|
return m.style.Render(rightSide)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createNavModel(width int) navModel {
|
func createNavModel(renderer *lipgloss.Renderer, width int) navModel {
|
||||||
style := lipgloss.NewStyle().
|
style := renderer.NewStyle().
|
||||||
BorderStyle(lipgloss.RoundedBorder()).
|
BorderStyle(lipgloss.RoundedBorder()).
|
||||||
BorderForeground(lipgloss.Color("62"))
|
BorderForeground(lipgloss.Color("62"))
|
||||||
|
|
||||||
style = style.Width(width - style.GetHorizontalFrameSize())
|
style = style.Width(width - style.GetHorizontalFrameSize())
|
||||||
|
|
||||||
return navModel{
|
return navModel{
|
||||||
style: style,
|
renderer: renderer,
|
||||||
|
style: style,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user